xref: /dragonfly/contrib/gcc-8.0/gcc/cp/parser.c (revision 106728aa)
1 /* -*- C++ -*- Parser.
2    Copyright (C) 2000-2018 Free Software Foundation, Inc.
3    Written by Mark Mitchell <mark@codesourcery.com>.
4 
5    This file is part of GCC.
6 
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.
11 
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.
16 
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/>.  */
20 
21 #include "config.h"
22 #define INCLUDE_UNIQUE_PTR
23 #include "system.h"
24 #include "coretypes.h"
25 #include "cp-tree.h"
26 #include "c-family/c-common.h"
27 #include "timevar.h"
28 #include "stringpool.h"
29 #include "cgraph.h"
30 #include "print-tree.h"
31 #include "attribs.h"
32 #include "trans-mem.h"
33 #include "intl.h"
34 #include "decl.h"
35 #include "c-family/c-objc.h"
36 #include "plugin.h"
37 #include "tree-pretty-print.h"
38 #include "parser.h"
39 #include "gomp-constants.h"
40 #include "omp-general.h"
41 #include "omp-offload.h"
42 #include "c-family/c-indentation.h"
43 #include "context.h"
44 #include "gcc-rich-location.h"
45 #include "tree-iterator.h"
46 #include "c-family/name-hint.h"
47 
48 
49 /* The lexer.  */
50 
51 /* The cp_lexer_* routines mediate between the lexer proper (in libcpp
52    and c-lex.c) and the C++ parser.  */
53 
54 static cp_token eof_token =
55 {
56   CPP_EOF, RID_MAX, 0, false, false, false, 0, { NULL }
57 };
58 
59 /* The various kinds of non integral constant we encounter. */
60 enum non_integral_constant {
61   NIC_NONE,
62   /* floating-point literal */
63   NIC_FLOAT,
64   /* %<this%> */
65   NIC_THIS,
66   /* %<__FUNCTION__%> */
67   NIC_FUNC_NAME,
68   /* %<__PRETTY_FUNCTION__%> */
69   NIC_PRETTY_FUNC,
70   /* %<__func__%> */
71   NIC_C99_FUNC,
72   /* "%<va_arg%> */
73   NIC_VA_ARG,
74   /* a cast */
75   NIC_CAST,
76   /* %<typeid%> operator */
77   NIC_TYPEID,
78   /* non-constant compound literals */
79   NIC_NCC,
80   /* a function call */
81   NIC_FUNC_CALL,
82   /* an increment */
83   NIC_INC,
84   /* an decrement */
85   NIC_DEC,
86   /* an array reference */
87   NIC_ARRAY_REF,
88   /* %<->%> */
89   NIC_ARROW,
90   /* %<.%> */
91   NIC_POINT,
92   /* the address of a label */
93   NIC_ADDR_LABEL,
94   /* %<*%> */
95   NIC_STAR,
96   /* %<&%> */
97   NIC_ADDR,
98   /* %<++%> */
99   NIC_PREINCREMENT,
100   /* %<--%> */
101   NIC_PREDECREMENT,
102   /* %<new%> */
103   NIC_NEW,
104   /* %<delete%> */
105   NIC_DEL,
106   /* calls to overloaded operators */
107   NIC_OVERLOADED,
108   /* an assignment */
109   NIC_ASSIGNMENT,
110   /* a comma operator */
111   NIC_COMMA,
112   /* a call to a constructor */
113   NIC_CONSTRUCTOR,
114   /* a transaction expression */
115   NIC_TRANSACTION
116 };
117 
118 /* The various kinds of errors about name-lookup failing. */
119 enum name_lookup_error {
120   /* NULL */
121   NLE_NULL,
122   /* is not a type */
123   NLE_TYPE,
124   /* is not a class or namespace */
125   NLE_CXX98,
126   /* is not a class, namespace, or enumeration */
127   NLE_NOT_CXX98
128 };
129 
130 /* The various kinds of required token */
131 enum required_token {
132   RT_NONE,
133   RT_SEMICOLON,  /* ';' */
134   RT_OPEN_PAREN, /* '(' */
135   RT_CLOSE_BRACE, /* '}' */
136   RT_OPEN_BRACE,  /* '{' */
137   RT_CLOSE_SQUARE, /* ']' */
138   RT_OPEN_SQUARE,  /* '[' */
139   RT_COMMA, /* ',' */
140   RT_SCOPE, /* '::' */
141   RT_LESS, /* '<' */
142   RT_GREATER, /* '>' */
143   RT_EQ, /* '=' */
144   RT_ELLIPSIS, /* '...' */
145   RT_MULT, /* '*' */
146   RT_COMPL, /* '~' */
147   RT_COLON, /* ':' */
148   RT_COLON_SCOPE, /* ':' or '::' */
149   RT_CLOSE_PAREN, /* ')' */
150   RT_COMMA_CLOSE_PAREN, /* ',' or ')' */
151   RT_PRAGMA_EOL, /* end of line */
152   RT_NAME, /* identifier */
153 
154   /* The type is CPP_KEYWORD */
155   RT_NEW, /* new */
156   RT_DELETE, /* delete */
157   RT_RETURN, /* return */
158   RT_WHILE, /* while */
159   RT_EXTERN, /* extern */
160   RT_STATIC_ASSERT, /* static_assert */
161   RT_DECLTYPE, /* decltype */
162   RT_OPERATOR, /* operator */
163   RT_CLASS, /* class */
164   RT_TEMPLATE, /* template */
165   RT_NAMESPACE, /* namespace */
166   RT_USING, /* using */
167   RT_ASM, /* asm */
168   RT_TRY, /* try */
169   RT_CATCH, /* catch */
170   RT_THROW, /* throw */
171   RT_LABEL, /* __label__ */
172   RT_AT_TRY, /* @try */
173   RT_AT_SYNCHRONIZED, /* @synchronized */
174   RT_AT_THROW, /* @throw */
175 
176   RT_SELECT,  /* selection-statement */
177   RT_ITERATION, /* iteration-statement */
178   RT_JUMP, /* jump-statement */
179   RT_CLASS_KEY, /* class-key */
180   RT_CLASS_TYPENAME_TEMPLATE, /* class, typename, or template */
181   RT_TRANSACTION_ATOMIC, /* __transaction_atomic */
182   RT_TRANSACTION_RELAXED, /* __transaction_relaxed */
183   RT_TRANSACTION_CANCEL /* __transaction_cancel */
184 };
185 
186 /* RAII wrapper for parser->in_type_id_in_expr_p, setting it on creation and
187    reverting it on destruction.  */
188 
189 class type_id_in_expr_sentinel
190 {
191   cp_parser *parser;
192   bool saved;
193 public:
194   type_id_in_expr_sentinel (cp_parser *parser, bool set = true)
195     : parser (parser),
196       saved (parser->in_type_id_in_expr_p)
197   { parser->in_type_id_in_expr_p = set; }
198   ~type_id_in_expr_sentinel ()
199   { parser->in_type_id_in_expr_p = saved; }
200 };
201 
202 /* Prototypes.  */
203 
204 static cp_lexer *cp_lexer_new_main
205   (void);
206 static cp_lexer *cp_lexer_new_from_tokens
207   (cp_token_cache *tokens);
208 static void cp_lexer_destroy
209   (cp_lexer *);
210 static int cp_lexer_saving_tokens
211   (const cp_lexer *);
212 static cp_token *cp_lexer_token_at
213   (cp_lexer *, cp_token_position);
214 static void cp_lexer_get_preprocessor_token
215   (cp_lexer *, cp_token *);
216 static inline cp_token *cp_lexer_peek_token
217   (cp_lexer *);
218 static cp_token *cp_lexer_peek_nth_token
219   (cp_lexer *, size_t);
220 static inline bool cp_lexer_next_token_is
221   (cp_lexer *, enum cpp_ttype);
222 static bool cp_lexer_next_token_is_not
223   (cp_lexer *, enum cpp_ttype);
224 static bool cp_lexer_next_token_is_keyword
225   (cp_lexer *, enum rid);
226 static cp_token *cp_lexer_consume_token
227   (cp_lexer *);
228 static void cp_lexer_purge_token
229   (cp_lexer *);
230 static void cp_lexer_purge_tokens_after
231   (cp_lexer *, cp_token_position);
232 static void cp_lexer_save_tokens
233   (cp_lexer *);
234 static void cp_lexer_commit_tokens
235   (cp_lexer *);
236 static void cp_lexer_rollback_tokens
237   (cp_lexer *);
238 static void cp_lexer_print_token
239   (FILE *, cp_token *);
240 static inline bool cp_lexer_debugging_p
241   (cp_lexer *);
242 static void cp_lexer_start_debugging
243   (cp_lexer *) ATTRIBUTE_UNUSED;
244 static void cp_lexer_stop_debugging
245   (cp_lexer *) ATTRIBUTE_UNUSED;
246 
247 static cp_token_cache *cp_token_cache_new
248   (cp_token *, cp_token *);
249 
250 static void cp_parser_initial_pragma
251   (cp_token *);
252 
253 static bool cp_parser_omp_declare_reduction_exprs
254   (tree, cp_parser *);
255 static void cp_finalize_oacc_routine
256   (cp_parser *, tree, bool);
257 
258 /* Manifest constants.  */
259 #define CP_LEXER_BUFFER_SIZE ((256 * 1024) / sizeof (cp_token))
260 #define CP_SAVED_TOKEN_STACK 5
261 
262 /* Variables.  */
263 
264 /* The stream to which debugging output should be written.  */
265 static FILE *cp_lexer_debug_stream;
266 
267 /* Nonzero if we are parsing an unevaluated operand: an operand to
268    sizeof, typeof, or alignof.  */
269 int cp_unevaluated_operand;
270 
271 /* Dump up to NUM tokens in BUFFER to FILE starting with token
272    START_TOKEN.  If START_TOKEN is NULL, the dump starts with the
273    first token in BUFFER.  If NUM is 0, dump all the tokens.  If
274    CURR_TOKEN is set and it is one of the tokens in BUFFER, it will be
275    highlighted by surrounding it in [[ ]].  */
276 
277 static void
278 cp_lexer_dump_tokens (FILE *file, vec<cp_token, va_gc> *buffer,
279 		      cp_token *start_token, unsigned num,
280 		      cp_token *curr_token)
281 {
282   unsigned i, nprinted;
283   cp_token *token;
284   bool do_print;
285 
286   fprintf (file, "%u tokens\n", vec_safe_length (buffer));
287 
288   if (buffer == NULL)
289     return;
290 
291   if (num == 0)
292     num = buffer->length ();
293 
294   if (start_token == NULL)
295     start_token = buffer->address ();
296 
297   if (start_token > buffer->address ())
298     {
299       cp_lexer_print_token (file, &(*buffer)[0]);
300       fprintf (file, " ... ");
301     }
302 
303   do_print = false;
304   nprinted = 0;
305   for (i = 0; buffer->iterate (i, &token) && nprinted < num; i++)
306     {
307       if (token == start_token)
308 	do_print = true;
309 
310       if (!do_print)
311 	continue;
312 
313       nprinted++;
314       if (token == curr_token)
315 	fprintf (file, "[[");
316 
317       cp_lexer_print_token (file, token);
318 
319       if (token == curr_token)
320 	fprintf (file, "]]");
321 
322       switch (token->type)
323 	{
324 	  case CPP_SEMICOLON:
325 	  case CPP_OPEN_BRACE:
326 	  case CPP_CLOSE_BRACE:
327 	  case CPP_EOF:
328 	    fputc ('\n', file);
329 	    break;
330 
331 	  default:
332 	    fputc (' ', file);
333 	}
334     }
335 
336   if (i == num && i < buffer->length ())
337     {
338       fprintf (file, " ... ");
339       cp_lexer_print_token (file, &buffer->last ());
340     }
341 
342   fprintf (file, "\n");
343 }
344 
345 
346 /* Dump all tokens in BUFFER to stderr.  */
347 
348 void
349 cp_lexer_debug_tokens (vec<cp_token, va_gc> *buffer)
350 {
351   cp_lexer_dump_tokens (stderr, buffer, NULL, 0, NULL);
352 }
353 
354 DEBUG_FUNCTION void
355 debug (vec<cp_token, va_gc> &ref)
356 {
357   cp_lexer_dump_tokens (stderr, &ref, NULL, 0, NULL);
358 }
359 
360 DEBUG_FUNCTION void
361 debug (vec<cp_token, va_gc> *ptr)
362 {
363   if (ptr)
364     debug (*ptr);
365   else
366     fprintf (stderr, "<nil>\n");
367 }
368 
369 
370 /* Dump the cp_parser tree field T to FILE if T is non-NULL.  DESC is the
371    description for T.  */
372 
373 static void
374 cp_debug_print_tree_if_set (FILE *file, const char *desc, tree t)
375 {
376   if (t)
377     {
378       fprintf (file, "%s: ", desc);
379       print_node_brief (file, "", t, 0);
380     }
381 }
382 
383 
384 /* Dump parser context C to FILE.  */
385 
386 static void
387 cp_debug_print_context (FILE *file, cp_parser_context *c)
388 {
389   const char *status_s[] = { "OK", "ERROR", "COMMITTED" };
390   fprintf (file, "{ status = %s, scope = ", status_s[c->status]);
391   print_node_brief (file, "", c->object_type, 0);
392   fprintf (file, "}\n");
393 }
394 
395 
396 /* Print the stack of parsing contexts to FILE starting with FIRST.  */
397 
398 static void
399 cp_debug_print_context_stack (FILE *file, cp_parser_context *first)
400 {
401   unsigned i;
402   cp_parser_context *c;
403 
404   fprintf (file, "Parsing context stack:\n");
405   for (i = 0, c = first; c; c = c->next, i++)
406     {
407       fprintf (file, "\t#%u: ", i);
408       cp_debug_print_context (file, c);
409     }
410 }
411 
412 
413 /* Print the value of FLAG to FILE.  DESC is a string describing the flag.  */
414 
415 static void
416 cp_debug_print_flag (FILE *file, const char *desc, bool flag)
417 {
418   if (flag)
419     fprintf (file, "%s: true\n", desc);
420 }
421 
422 
423 /* Print an unparsed function entry UF to FILE.  */
424 
425 static void
426 cp_debug_print_unparsed_function (FILE *file, cp_unparsed_functions_entry *uf)
427 {
428   unsigned i;
429   cp_default_arg_entry *default_arg_fn;
430   tree fn;
431 
432   fprintf (file, "\tFunctions with default args:\n");
433   for (i = 0;
434        vec_safe_iterate (uf->funs_with_default_args, i, &default_arg_fn);
435        i++)
436     {
437       fprintf (file, "\t\tClass type: ");
438       print_node_brief (file, "", default_arg_fn->class_type, 0);
439       fprintf (file, "\t\tDeclaration: ");
440       print_node_brief (file, "", default_arg_fn->decl, 0);
441       fprintf (file, "\n");
442     }
443 
444   fprintf (file, "\n\tFunctions with definitions that require "
445 	   "post-processing\n\t\t");
446   for (i = 0; vec_safe_iterate (uf->funs_with_definitions, i, &fn); i++)
447     {
448       print_node_brief (file, "", fn, 0);
449       fprintf (file, " ");
450     }
451   fprintf (file, "\n");
452 
453   fprintf (file, "\n\tNon-static data members with initializers that require "
454            "post-processing\n\t\t");
455   for (i = 0; vec_safe_iterate (uf->nsdmis, i, &fn); i++)
456     {
457       print_node_brief (file, "", fn, 0);
458       fprintf (file, " ");
459     }
460   fprintf (file, "\n");
461 }
462 
463 
464 /* Print the stack of unparsed member functions S to FILE.  */
465 
466 static void
467 cp_debug_print_unparsed_queues (FILE *file,
468 				vec<cp_unparsed_functions_entry, va_gc> *s)
469 {
470   unsigned i;
471   cp_unparsed_functions_entry *uf;
472 
473   fprintf (file, "Unparsed functions\n");
474   for (i = 0; vec_safe_iterate (s, i, &uf); i++)
475     {
476       fprintf (file, "#%u:\n", i);
477       cp_debug_print_unparsed_function (file, uf);
478     }
479 }
480 
481 
482 /* Dump the tokens in a window of size WINDOW_SIZE around the next_token for
483    the given PARSER.  If FILE is NULL, the output is printed on stderr. */
484 
485 static void
486 cp_debug_parser_tokens (FILE *file, cp_parser *parser, int window_size)
487 {
488   cp_token *next_token, *first_token, *start_token;
489 
490   if (file == NULL)
491     file = stderr;
492 
493   next_token = parser->lexer->next_token;
494   first_token = parser->lexer->buffer->address ();
495   start_token = (next_token > first_token + window_size / 2)
496 		? next_token - window_size / 2
497 		: first_token;
498   cp_lexer_dump_tokens (file, parser->lexer->buffer, start_token, window_size,
499 			next_token);
500 }
501 
502 
503 /* Dump debugging information for the given PARSER.  If FILE is NULL,
504    the output is printed on stderr.  */
505 
506 void
507 cp_debug_parser (FILE *file, cp_parser *parser)
508 {
509   const size_t window_size = 20;
510   cp_token *token;
511   expanded_location eloc;
512 
513   if (file == NULL)
514     file = stderr;
515 
516   fprintf (file, "Parser state\n\n");
517   fprintf (file, "Number of tokens: %u\n",
518 	   vec_safe_length (parser->lexer->buffer));
519   cp_debug_print_tree_if_set (file, "Lookup scope", parser->scope);
520   cp_debug_print_tree_if_set (file, "Object scope",
521 				     parser->object_scope);
522   cp_debug_print_tree_if_set (file, "Qualifying scope",
523 				     parser->qualifying_scope);
524   cp_debug_print_context_stack (file, parser->context);
525   cp_debug_print_flag (file, "Allow GNU extensions",
526 			      parser->allow_gnu_extensions_p);
527   cp_debug_print_flag (file, "'>' token is greater-than",
528 			      parser->greater_than_is_operator_p);
529   cp_debug_print_flag (file, "Default args allowed in current "
530 			      "parameter list", parser->default_arg_ok_p);
531   cp_debug_print_flag (file, "Parsing integral constant-expression",
532 			      parser->integral_constant_expression_p);
533   cp_debug_print_flag (file, "Allow non-constant expression in current "
534 			      "constant-expression",
535 			      parser->allow_non_integral_constant_expression_p);
536   cp_debug_print_flag (file, "Seen non-constant expression",
537 			      parser->non_integral_constant_expression_p);
538   cp_debug_print_flag (file, "Local names and 'this' forbidden in "
539 			      "current context",
540 			      parser->local_variables_forbidden_p);
541   cp_debug_print_flag (file, "In unbraced linkage specification",
542 			      parser->in_unbraced_linkage_specification_p);
543   cp_debug_print_flag (file, "Parsing a declarator",
544 			      parser->in_declarator_p);
545   cp_debug_print_flag (file, "In template argument list",
546 			      parser->in_template_argument_list_p);
547   cp_debug_print_flag (file, "Parsing an iteration statement",
548 			      parser->in_statement & IN_ITERATION_STMT);
549   cp_debug_print_flag (file, "Parsing a switch statement",
550 			      parser->in_statement & IN_SWITCH_STMT);
551   cp_debug_print_flag (file, "Parsing a structured OpenMP block",
552 			      parser->in_statement & IN_OMP_BLOCK);
553   cp_debug_print_flag (file, "Parsing a an OpenMP loop",
554 			      parser->in_statement & IN_OMP_FOR);
555   cp_debug_print_flag (file, "Parsing an if statement",
556 			      parser->in_statement & IN_IF_STMT);
557   cp_debug_print_flag (file, "Parsing a type-id in an expression "
558 			      "context", parser->in_type_id_in_expr_p);
559   cp_debug_print_flag (file, "Declarations are implicitly extern \"C\"",
560 			      parser->implicit_extern_c);
561   cp_debug_print_flag (file, "String expressions should be translated "
562 			      "to execution character set",
563 			      parser->translate_strings_p);
564   cp_debug_print_flag (file, "Parsing function body outside of a "
565 			      "local class", parser->in_function_body);
566   cp_debug_print_flag (file, "Auto correct a colon to a scope operator",
567 			      parser->colon_corrects_to_scope_p);
568   cp_debug_print_flag (file, "Colon doesn't start a class definition",
569 			      parser->colon_doesnt_start_class_def_p);
570   if (parser->type_definition_forbidden_message)
571     fprintf (file, "Error message for forbidden type definitions: %s\n",
572 	     parser->type_definition_forbidden_message);
573   cp_debug_print_unparsed_queues (file, parser->unparsed_queues);
574   fprintf (file, "Number of class definitions in progress: %u\n",
575 	   parser->num_classes_being_defined);
576   fprintf (file, "Number of template parameter lists for the current "
577 	   "declaration: %u\n", parser->num_template_parameter_lists);
578   cp_debug_parser_tokens (file, parser, window_size);
579   token = parser->lexer->next_token;
580   fprintf (file, "Next token to parse:\n");
581   fprintf (file, "\tToken:  ");
582   cp_lexer_print_token (file, token);
583   eloc = expand_location (token->location);
584   fprintf (file, "\n\tFile:   %s\n", eloc.file);
585   fprintf (file, "\tLine:   %d\n", eloc.line);
586   fprintf (file, "\tColumn: %d\n", eloc.column);
587 }
588 
589 DEBUG_FUNCTION void
590 debug (cp_parser &ref)
591 {
592   cp_debug_parser (stderr, &ref);
593 }
594 
595 DEBUG_FUNCTION void
596 debug (cp_parser *ptr)
597 {
598   if (ptr)
599     debug (*ptr);
600   else
601     fprintf (stderr, "<nil>\n");
602 }
603 
604 /* Allocate memory for a new lexer object and return it.  */
605 
606 static cp_lexer *
607 cp_lexer_alloc (void)
608 {
609   cp_lexer *lexer;
610 
611   c_common_no_more_pch ();
612 
613   /* Allocate the memory.  */
614   lexer = ggc_cleared_alloc<cp_lexer> ();
615 
616   /* Initially we are not debugging.  */
617   lexer->debugging_p = false;
618 
619   lexer->saved_tokens.create (CP_SAVED_TOKEN_STACK);
620 
621   /* Create the buffer.  */
622   vec_alloc (lexer->buffer, CP_LEXER_BUFFER_SIZE);
623 
624   return lexer;
625 }
626 
627 
628 /* Create a new main C++ lexer, the lexer that gets tokens from the
629    preprocessor.  */
630 
631 static cp_lexer *
632 cp_lexer_new_main (void)
633 {
634   cp_lexer *lexer;
635   cp_token token;
636 
637   /* It's possible that parsing the first pragma will load a PCH file,
638      which is a GC collection point.  So we have to do that before
639      allocating any memory.  */
640   cp_parser_initial_pragma (&token);
641 
642   lexer = cp_lexer_alloc ();
643 
644   /* Put the first token in the buffer.  */
645   lexer->buffer->quick_push (token);
646 
647   /* Get the remaining tokens from the preprocessor.  */
648   while (token.type != CPP_EOF)
649     {
650       cp_lexer_get_preprocessor_token (lexer, &token);
651       vec_safe_push (lexer->buffer, token);
652     }
653 
654   lexer->last_token = lexer->buffer->address ()
655                       + lexer->buffer->length ()
656 		      - 1;
657   lexer->next_token = lexer->buffer->length ()
658 		      ? lexer->buffer->address ()
659 		      : &eof_token;
660 
661   /* Subsequent preprocessor diagnostics should use compiler
662      diagnostic functions to get the compiler source location.  */
663   done_lexing = true;
664 
665   gcc_assert (!lexer->next_token->purged_p);
666   return lexer;
667 }
668 
669 /* Create a new lexer whose token stream is primed with the tokens in
670    CACHE.  When these tokens are exhausted, no new tokens will be read.  */
671 
672 static cp_lexer *
673 cp_lexer_new_from_tokens (cp_token_cache *cache)
674 {
675   cp_token *first = cache->first;
676   cp_token *last = cache->last;
677   cp_lexer *lexer = ggc_cleared_alloc<cp_lexer> ();
678 
679   /* We do not own the buffer.  */
680   lexer->buffer = NULL;
681   lexer->next_token = first == last ? &eof_token : first;
682   lexer->last_token = last;
683 
684   lexer->saved_tokens.create (CP_SAVED_TOKEN_STACK);
685 
686   /* Initially we are not debugging.  */
687   lexer->debugging_p = false;
688 
689   gcc_assert (!lexer->next_token->purged_p);
690   return lexer;
691 }
692 
693 /* Frees all resources associated with LEXER.  */
694 
695 static void
696 cp_lexer_destroy (cp_lexer *lexer)
697 {
698   vec_free (lexer->buffer);
699   lexer->saved_tokens.release ();
700   ggc_free (lexer);
701 }
702 
703 /* This needs to be set to TRUE before the lexer-debugging infrastructure can
704    be used.  The point of this flag is to help the compiler to fold away calls
705    to cp_lexer_debugging_p within this source file at compile time, when the
706    lexer is not being debugged.  */
707 
708 #define LEXER_DEBUGGING_ENABLED_P false
709 
710 /* Returns nonzero if debugging information should be output.  */
711 
712 static inline bool
713 cp_lexer_debugging_p (cp_lexer *lexer)
714 {
715   if (!LEXER_DEBUGGING_ENABLED_P)
716     return false;
717 
718   return lexer->debugging_p;
719 }
720 
721 
722 static inline cp_token_position
723 cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
724 {
725   gcc_assert (!previous_p || lexer->next_token != &eof_token);
726 
727   return lexer->next_token - previous_p;
728 }
729 
730 static inline cp_token *
731 cp_lexer_token_at (cp_lexer * /*lexer*/, cp_token_position pos)
732 {
733   return pos;
734 }
735 
736 static inline void
737 cp_lexer_set_token_position (cp_lexer *lexer, cp_token_position pos)
738 {
739   lexer->next_token = cp_lexer_token_at (lexer, pos);
740 }
741 
742 static inline cp_token_position
743 cp_lexer_previous_token_position (cp_lexer *lexer)
744 {
745   if (lexer->next_token == &eof_token)
746     return lexer->last_token - 1;
747   else
748     return cp_lexer_token_position (lexer, true);
749 }
750 
751 static inline cp_token *
752 cp_lexer_previous_token (cp_lexer *lexer)
753 {
754   cp_token_position tp = cp_lexer_previous_token_position (lexer);
755 
756   /* Skip past purged tokens.  */
757   while (tp->purged_p)
758     {
759       gcc_assert (tp != vec_safe_address (lexer->buffer));
760       tp--;
761     }
762 
763   return cp_lexer_token_at (lexer, tp);
764 }
765 
766 /* nonzero if we are presently saving tokens.  */
767 
768 static inline int
769 cp_lexer_saving_tokens (const cp_lexer* lexer)
770 {
771   return lexer->saved_tokens.length () != 0;
772 }
773 
774 /* Store the next token from the preprocessor in *TOKEN.  Return true
775    if we reach EOF.  If LEXER is NULL, assume we are handling an
776    initial #pragma pch_preprocess, and thus want the lexer to return
777    processed strings.  */
778 
779 static void
780 cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token)
781 {
782   static int is_extern_c = 0;
783 
784    /* Get a new token from the preprocessor.  */
785   token->type
786     = c_lex_with_flags (&token->u.value, &token->location, &token->flags,
787 			lexer == NULL ? 0 : C_LEX_STRING_NO_JOIN);
788   token->keyword = RID_MAX;
789   token->purged_p = false;
790   token->error_reported = false;
791 
792   /* On some systems, some header files are surrounded by an
793      implicit extern "C" block.  Set a flag in the token if it
794      comes from such a header.  */
795   is_extern_c += pending_lang_change;
796   pending_lang_change = 0;
797   token->implicit_extern_c = is_extern_c > 0;
798 
799   /* Check to see if this token is a keyword.  */
800   if (token->type == CPP_NAME)
801     {
802       if (IDENTIFIER_KEYWORD_P (token->u.value))
803 	{
804 	  /* Mark this token as a keyword.  */
805 	  token->type = CPP_KEYWORD;
806 	  /* Record which keyword.  */
807 	  token->keyword = C_RID_CODE (token->u.value);
808 	}
809       else
810 	{
811           if (warn_cxx11_compat
812               && C_RID_CODE (token->u.value) >= RID_FIRST_CXX11
813               && C_RID_CODE (token->u.value) <= RID_LAST_CXX11)
814             {
815               /* Warn about the C++0x keyword (but still treat it as
816                  an identifier).  */
817               warning (OPT_Wc__11_compat,
818                        "identifier %qE is a keyword in C++11",
819                        token->u.value);
820 
821               /* Clear out the C_RID_CODE so we don't warn about this
822                  particular identifier-turned-keyword again.  */
823               C_SET_RID_CODE (token->u.value, RID_MAX);
824             }
825 
826 	  token->keyword = RID_MAX;
827 	}
828     }
829   else if (token->type == CPP_AT_NAME)
830     {
831       /* This only happens in Objective-C++; it must be a keyword.  */
832       token->type = CPP_KEYWORD;
833       switch (C_RID_CODE (token->u.value))
834 	{
835 	  /* Replace 'class' with '@class', 'private' with '@private',
836 	     etc.  This prevents confusion with the C++ keyword
837 	     'class', and makes the tokens consistent with other
838 	     Objective-C 'AT' keywords.  For example '@class' is
839 	     reported as RID_AT_CLASS which is consistent with
840 	     '@synchronized', which is reported as
841 	     RID_AT_SYNCHRONIZED.
842 	  */
843 	case RID_CLASS:     token->keyword = RID_AT_CLASS; break;
844 	case RID_PRIVATE:   token->keyword = RID_AT_PRIVATE; break;
845 	case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
846 	case RID_PUBLIC:    token->keyword = RID_AT_PUBLIC; break;
847 	case RID_THROW:     token->keyword = RID_AT_THROW; break;
848 	case RID_TRY:       token->keyword = RID_AT_TRY; break;
849 	case RID_CATCH:     token->keyword = RID_AT_CATCH; break;
850 	case RID_SYNCHRONIZED: token->keyword = RID_AT_SYNCHRONIZED; break;
851 	default:            token->keyword = C_RID_CODE (token->u.value);
852 	}
853     }
854 }
855 
856 /* Update the globals input_location and the input file stack from TOKEN.  */
857 static inline void
858 cp_lexer_set_source_position_from_token (cp_token *token)
859 {
860   if (token->type != CPP_EOF)
861     {
862       input_location = token->location;
863     }
864 }
865 
866 /* Update the globals input_location and the input file stack from LEXER.  */
867 static inline void
868 cp_lexer_set_source_position (cp_lexer *lexer)
869 {
870   cp_token *token = cp_lexer_peek_token (lexer);
871   cp_lexer_set_source_position_from_token (token);
872 }
873 
874 /* Return a pointer to the next token in the token stream, but do not
875    consume it.  */
876 
877 static inline cp_token *
878 cp_lexer_peek_token (cp_lexer *lexer)
879 {
880   if (cp_lexer_debugging_p (lexer))
881     {
882       fputs ("cp_lexer: peeking at token: ", cp_lexer_debug_stream);
883       cp_lexer_print_token (cp_lexer_debug_stream, lexer->next_token);
884       putc ('\n', cp_lexer_debug_stream);
885     }
886   return lexer->next_token;
887 }
888 
889 /* Return true if the next token has the indicated TYPE.  */
890 
891 static inline bool
892 cp_lexer_next_token_is (cp_lexer* lexer, enum cpp_ttype type)
893 {
894   return cp_lexer_peek_token (lexer)->type == type;
895 }
896 
897 /* Return true if the next token does not have the indicated TYPE.  */
898 
899 static inline bool
900 cp_lexer_next_token_is_not (cp_lexer* lexer, enum cpp_ttype type)
901 {
902   return !cp_lexer_next_token_is (lexer, type);
903 }
904 
905 /* Return true if the next token is the indicated KEYWORD.  */
906 
907 static inline bool
908 cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword)
909 {
910   return cp_lexer_peek_token (lexer)->keyword == keyword;
911 }
912 
913 static inline bool
914 cp_lexer_nth_token_is (cp_lexer* lexer, size_t n, enum cpp_ttype type)
915 {
916   return cp_lexer_peek_nth_token (lexer, n)->type == type;
917 }
918 
919 static inline bool
920 cp_lexer_nth_token_is_keyword (cp_lexer* lexer, size_t n, enum rid keyword)
921 {
922   return cp_lexer_peek_nth_token (lexer, n)->keyword == keyword;
923 }
924 
925 /* Return true if the next token is not the indicated KEYWORD.  */
926 
927 static inline bool
928 cp_lexer_next_token_is_not_keyword (cp_lexer* lexer, enum rid keyword)
929 {
930   return cp_lexer_peek_token (lexer)->keyword != keyword;
931 }
932 
933 /* Return true if KEYWORD can start a decl-specifier.  */
934 
935 bool
936 cp_keyword_starts_decl_specifier_p (enum rid keyword)
937 {
938   switch (keyword)
939     {
940       /* auto specifier: storage-class-specifier in C++,
941          simple-type-specifier in C++0x.  */
942     case RID_AUTO:
943       /* Storage classes.  */
944     case RID_REGISTER:
945     case RID_STATIC:
946     case RID_EXTERN:
947     case RID_MUTABLE:
948     case RID_THREAD:
949       /* Elaborated type specifiers.  */
950     case RID_ENUM:
951     case RID_CLASS:
952     case RID_STRUCT:
953     case RID_UNION:
954     case RID_TYPENAME:
955       /* Simple type specifiers.  */
956     case RID_CHAR:
957     case RID_CHAR16:
958     case RID_CHAR32:
959     case RID_WCHAR:
960     case RID_BOOL:
961     case RID_SHORT:
962     case RID_INT:
963     case RID_LONG:
964     case RID_SIGNED:
965     case RID_UNSIGNED:
966     case RID_FLOAT:
967     case RID_DOUBLE:
968     case RID_VOID:
969       /* GNU extensions.  */
970     case RID_ATTRIBUTE:
971     case RID_TYPEOF:
972       /* C++0x extensions.  */
973     case RID_DECLTYPE:
974     case RID_UNDERLYING_TYPE:
975     case RID_CONSTEXPR:
976       return true;
977 
978     default:
979       if (keyword >= RID_FIRST_INT_N
980 	  && keyword < RID_FIRST_INT_N + NUM_INT_N_ENTS
981 	  && int_n_enabled_p[keyword - RID_FIRST_INT_N])
982 	return true;
983       return false;
984     }
985 }
986 
987 /* Return true if the next token is a keyword for a decl-specifier.  */
988 
989 static bool
990 cp_lexer_next_token_is_decl_specifier_keyword (cp_lexer *lexer)
991 {
992   cp_token *token;
993 
994   token = cp_lexer_peek_token (lexer);
995   return cp_keyword_starts_decl_specifier_p (token->keyword);
996 }
997 
998 /* Returns TRUE iff the token T begins a decltype type.  */
999 
1000 static bool
1001 token_is_decltype (cp_token *t)
1002 {
1003   return (t->keyword == RID_DECLTYPE
1004 	  || t->type == CPP_DECLTYPE);
1005 }
1006 
1007 /* Returns TRUE iff the next token begins a decltype type.  */
1008 
1009 static bool
1010 cp_lexer_next_token_is_decltype (cp_lexer *lexer)
1011 {
1012   cp_token *t = cp_lexer_peek_token (lexer);
1013   return token_is_decltype (t);
1014 }
1015 
1016 /* Called when processing a token with tree_check_value; perform or defer the
1017    associated checks and return the value.  */
1018 
1019 static tree
1020 saved_checks_value (struct tree_check *check_value)
1021 {
1022   /* Perform any access checks that were deferred.  */
1023   vec<deferred_access_check, va_gc> *checks;
1024   deferred_access_check *chk;
1025   checks = check_value->checks;
1026   if (checks)
1027     {
1028       int i;
1029       FOR_EACH_VEC_SAFE_ELT (checks, i, chk)
1030 	perform_or_defer_access_check (chk->binfo,
1031 				       chk->decl,
1032 				       chk->diag_decl, tf_warning_or_error);
1033     }
1034   /* Return the stored value.  */
1035   return check_value->value;
1036 }
1037 
1038 /* Return a pointer to the Nth token in the token stream.  If N is 1,
1039    then this is precisely equivalent to cp_lexer_peek_token (except
1040    that it is not inline).  One would like to disallow that case, but
1041    there is one case (cp_parser_nth_token_starts_template_id) where
1042    the caller passes a variable for N and it might be 1.  */
1043 
1044 static cp_token *
1045 cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
1046 {
1047   cp_token *token;
1048 
1049   /* N is 1-based, not zero-based.  */
1050   gcc_assert (n > 0);
1051 
1052   if (cp_lexer_debugging_p (lexer))
1053     fprintf (cp_lexer_debug_stream,
1054 	     "cp_lexer: peeking ahead %ld at token: ", (long)n);
1055 
1056   --n;
1057   token = lexer->next_token;
1058   gcc_assert (!n || token != &eof_token);
1059   while (n != 0)
1060     {
1061       ++token;
1062       if (token == lexer->last_token)
1063 	{
1064 	  token = &eof_token;
1065 	  break;
1066 	}
1067 
1068       if (!token->purged_p)
1069 	--n;
1070     }
1071 
1072   if (cp_lexer_debugging_p (lexer))
1073     {
1074       cp_lexer_print_token (cp_lexer_debug_stream, token);
1075       putc ('\n', cp_lexer_debug_stream);
1076     }
1077 
1078   return token;
1079 }
1080 
1081 /* Return the next token, and advance the lexer's next_token pointer
1082    to point to the next non-purged token.  */
1083 
1084 static cp_token *
1085 cp_lexer_consume_token (cp_lexer* lexer)
1086 {
1087   cp_token *token = lexer->next_token;
1088 
1089   gcc_assert (token != &eof_token);
1090   gcc_assert (!lexer->in_pragma || token->type != CPP_PRAGMA_EOL);
1091 
1092   do
1093     {
1094       lexer->next_token++;
1095       if (lexer->next_token == lexer->last_token)
1096 	{
1097 	  lexer->next_token = &eof_token;
1098 	  break;
1099 	}
1100 
1101     }
1102   while (lexer->next_token->purged_p);
1103 
1104   cp_lexer_set_source_position_from_token (token);
1105 
1106   /* Provide debugging output.  */
1107   if (cp_lexer_debugging_p (lexer))
1108     {
1109       fputs ("cp_lexer: consuming token: ", cp_lexer_debug_stream);
1110       cp_lexer_print_token (cp_lexer_debug_stream, token);
1111       putc ('\n', cp_lexer_debug_stream);
1112     }
1113 
1114   return token;
1115 }
1116 
1117 /* Permanently remove the next token from the token stream, and
1118    advance the next_token pointer to refer to the next non-purged
1119    token.  */
1120 
1121 static void
1122 cp_lexer_purge_token (cp_lexer *lexer)
1123 {
1124   cp_token *tok = lexer->next_token;
1125 
1126   gcc_assert (tok != &eof_token);
1127   tok->purged_p = true;
1128   tok->location = UNKNOWN_LOCATION;
1129   tok->u.value = NULL_TREE;
1130   tok->keyword = RID_MAX;
1131 
1132   do
1133     {
1134       tok++;
1135       if (tok == lexer->last_token)
1136 	{
1137 	  tok = &eof_token;
1138 	  break;
1139 	}
1140     }
1141   while (tok->purged_p);
1142   lexer->next_token = tok;
1143 }
1144 
1145 /* Permanently remove all tokens after TOK, up to, but not
1146    including, the token that will be returned next by
1147    cp_lexer_peek_token.  */
1148 
1149 static void
1150 cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
1151 {
1152   cp_token *peek = lexer->next_token;
1153 
1154   if (peek == &eof_token)
1155     peek = lexer->last_token;
1156 
1157   gcc_assert (tok < peek);
1158 
1159   for ( tok += 1; tok != peek; tok += 1)
1160     {
1161       tok->purged_p = true;
1162       tok->location = UNKNOWN_LOCATION;
1163       tok->u.value = NULL_TREE;
1164       tok->keyword = RID_MAX;
1165     }
1166 }
1167 
1168 /* Begin saving tokens.  All tokens consumed after this point will be
1169    preserved.  */
1170 
1171 static void
1172 cp_lexer_save_tokens (cp_lexer* lexer)
1173 {
1174   /* Provide debugging output.  */
1175   if (cp_lexer_debugging_p (lexer))
1176     fprintf (cp_lexer_debug_stream, "cp_lexer: saving tokens\n");
1177 
1178   lexer->saved_tokens.safe_push (lexer->next_token);
1179 }
1180 
1181 /* Commit to the portion of the token stream most recently saved.  */
1182 
1183 static void
1184 cp_lexer_commit_tokens (cp_lexer* lexer)
1185 {
1186   /* Provide debugging output.  */
1187   if (cp_lexer_debugging_p (lexer))
1188     fprintf (cp_lexer_debug_stream, "cp_lexer: committing tokens\n");
1189 
1190   lexer->saved_tokens.pop ();
1191 }
1192 
1193 /* Return all tokens saved since the last call to cp_lexer_save_tokens
1194    to the token stream.  Stop saving tokens.  */
1195 
1196 static void
1197 cp_lexer_rollback_tokens (cp_lexer* lexer)
1198 {
1199   /* Provide debugging output.  */
1200   if (cp_lexer_debugging_p (lexer))
1201     fprintf (cp_lexer_debug_stream, "cp_lexer: restoring tokens\n");
1202 
1203   lexer->next_token = lexer->saved_tokens.pop ();
1204 }
1205 
1206 /* RAII wrapper around the above functions, with sanity checking.  Creating
1207    a variable saves tokens, which are committed when the variable is
1208    destroyed unless they are explicitly rolled back by calling the rollback
1209    member function.  */
1210 
1211 struct saved_token_sentinel
1212 {
1213   cp_lexer *lexer;
1214   unsigned len;
1215   bool commit;
1216   saved_token_sentinel(cp_lexer *lexer): lexer(lexer), commit(true)
1217   {
1218     len = lexer->saved_tokens.length ();
1219     cp_lexer_save_tokens (lexer);
1220   }
1221   void rollback ()
1222   {
1223     cp_lexer_rollback_tokens (lexer);
1224     commit = false;
1225   }
1226   ~saved_token_sentinel()
1227   {
1228     if (commit)
1229       cp_lexer_commit_tokens (lexer);
1230     gcc_assert (lexer->saved_tokens.length () == len);
1231   }
1232 };
1233 
1234 /* Print a representation of the TOKEN on the STREAM.  */
1235 
1236 static void
1237 cp_lexer_print_token (FILE * stream, cp_token *token)
1238 {
1239   /* We don't use cpp_type2name here because the parser defines
1240      a few tokens of its own.  */
1241   static const char *const token_names[] = {
1242     /* cpplib-defined token types */
1243 #define OP(e, s) #e,
1244 #define TK(e, s) #e,
1245     TTYPE_TABLE
1246 #undef OP
1247 #undef TK
1248     /* C++ parser token types - see "Manifest constants", above.  */
1249     "KEYWORD",
1250     "TEMPLATE_ID",
1251     "NESTED_NAME_SPECIFIER",
1252   };
1253 
1254   /* For some tokens, print the associated data.  */
1255   switch (token->type)
1256     {
1257     case CPP_KEYWORD:
1258       /* Some keywords have a value that is not an IDENTIFIER_NODE.
1259 	 For example, `struct' is mapped to an INTEGER_CST.  */
1260       if (!identifier_p (token->u.value))
1261 	break;
1262       /* fall through */
1263     case CPP_NAME:
1264       fputs (IDENTIFIER_POINTER (token->u.value), stream);
1265       break;
1266 
1267     case CPP_STRING:
1268     case CPP_STRING16:
1269     case CPP_STRING32:
1270     case CPP_WSTRING:
1271     case CPP_UTF8STRING:
1272       fprintf (stream, " \"%s\"", TREE_STRING_POINTER (token->u.value));
1273       break;
1274 
1275     case CPP_NUMBER:
1276       print_generic_expr (stream, token->u.value);
1277       break;
1278 
1279     default:
1280       /* If we have a name for the token, print it out.  Otherwise, we
1281 	 simply give the numeric code.  */
1282       if (token->type < ARRAY_SIZE(token_names))
1283 	fputs (token_names[token->type], stream);
1284       else
1285 	fprintf (stream, "[%d]", token->type);
1286       break;
1287     }
1288 }
1289 
1290 DEBUG_FUNCTION void
1291 debug (cp_token &ref)
1292 {
1293   cp_lexer_print_token (stderr, &ref);
1294   fprintf (stderr, "\n");
1295 }
1296 
1297 DEBUG_FUNCTION void
1298 debug (cp_token *ptr)
1299 {
1300   if (ptr)
1301     debug (*ptr);
1302   else
1303     fprintf (stderr, "<nil>\n");
1304 }
1305 
1306 
1307 /* Start emitting debugging information.  */
1308 
1309 static void
1310 cp_lexer_start_debugging (cp_lexer* lexer)
1311 {
1312   if (!LEXER_DEBUGGING_ENABLED_P)
1313     fatal_error (input_location,
1314 		 "LEXER_DEBUGGING_ENABLED_P is not set to true");
1315 
1316   lexer->debugging_p = true;
1317   cp_lexer_debug_stream = stderr;
1318 }
1319 
1320 /* Stop emitting debugging information.  */
1321 
1322 static void
1323 cp_lexer_stop_debugging (cp_lexer* lexer)
1324 {
1325   if (!LEXER_DEBUGGING_ENABLED_P)
1326     fatal_error (input_location,
1327 		 "LEXER_DEBUGGING_ENABLED_P is not set to true");
1328 
1329   lexer->debugging_p = false;
1330   cp_lexer_debug_stream = NULL;
1331 }
1332 
1333 /* Create a new cp_token_cache, representing a range of tokens.  */
1334 
1335 static cp_token_cache *
1336 cp_token_cache_new (cp_token *first, cp_token *last)
1337 {
1338   cp_token_cache *cache = ggc_alloc<cp_token_cache> ();
1339   cache->first = first;
1340   cache->last = last;
1341   return cache;
1342 }
1343 
1344 /* Diagnose if #pragma omp declare simd isn't followed immediately
1345    by function declaration or definition.  */
1346 
1347 static inline void
1348 cp_ensure_no_omp_declare_simd (cp_parser *parser)
1349 {
1350   if (parser->omp_declare_simd && !parser->omp_declare_simd->error_seen)
1351     {
1352       error ("%<#pragma omp declare simd%> not immediately followed by "
1353 	     "function declaration or definition");
1354       parser->omp_declare_simd = NULL;
1355     }
1356 }
1357 
1358 /* Finalize #pragma omp declare simd clauses after FNDECL has been parsed,
1359    and put that into "omp declare simd" attribute.  */
1360 
1361 static inline void
1362 cp_finalize_omp_declare_simd (cp_parser *parser, tree fndecl)
1363 {
1364   if (__builtin_expect (parser->omp_declare_simd != NULL, 0))
1365     {
1366       if (fndecl == error_mark_node)
1367 	{
1368 	  parser->omp_declare_simd = NULL;
1369 	  return;
1370 	}
1371       if (TREE_CODE (fndecl) != FUNCTION_DECL)
1372 	{
1373 	  cp_ensure_no_omp_declare_simd (parser);
1374 	  return;
1375 	}
1376     }
1377 }
1378 
1379 /* Diagnose if #pragma acc routine isn't followed immediately by function
1380    declaration or definition.  */
1381 
1382 static inline void
1383 cp_ensure_no_oacc_routine (cp_parser *parser)
1384 {
1385   if (parser->oacc_routine && !parser->oacc_routine->error_seen)
1386     {
1387       error_at (parser->oacc_routine->loc,
1388 		"%<#pragma acc routine%> not immediately followed by "
1389 		"function declaration or definition");
1390       parser->oacc_routine = NULL;
1391     }
1392 }
1393 
1394 /* Decl-specifiers.  */
1395 
1396 /* Set *DECL_SPECS to represent an empty decl-specifier-seq.  */
1397 
1398 static void
1399 clear_decl_specs (cp_decl_specifier_seq *decl_specs)
1400 {
1401   memset (decl_specs, 0, sizeof (cp_decl_specifier_seq));
1402 }
1403 
1404 /* Declarators.  */
1405 
1406 /* Nothing other than the parser should be creating declarators;
1407    declarators are a semi-syntactic representation of C++ entities.
1408    Other parts of the front end that need to create entities (like
1409    VAR_DECLs or FUNCTION_DECLs) should do that directly.  */
1410 
1411 static cp_declarator *make_call_declarator
1412   (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, cp_ref_qualifier, tree, tree, tree, tree);
1413 static cp_declarator *make_array_declarator
1414   (cp_declarator *, tree);
1415 static cp_declarator *make_pointer_declarator
1416   (cp_cv_quals, cp_declarator *, tree);
1417 static cp_declarator *make_reference_declarator
1418   (cp_cv_quals, cp_declarator *, bool, tree);
1419 static cp_declarator *make_ptrmem_declarator
1420   (cp_cv_quals, tree, cp_declarator *, tree);
1421 
1422 /* An erroneous declarator.  */
1423 static cp_declarator *cp_error_declarator;
1424 
1425 /* The obstack on which declarators and related data structures are
1426    allocated.  */
1427 static struct obstack declarator_obstack;
1428 
1429 /* Alloc BYTES from the declarator memory pool.  */
1430 
1431 static inline void *
1432 alloc_declarator (size_t bytes)
1433 {
1434   return obstack_alloc (&declarator_obstack, bytes);
1435 }
1436 
1437 /* Allocate a declarator of the indicated KIND.  Clear fields that are
1438    common to all declarators.  */
1439 
1440 static cp_declarator *
1441 make_declarator (cp_declarator_kind kind)
1442 {
1443   cp_declarator *declarator;
1444 
1445   declarator = (cp_declarator *) alloc_declarator (sizeof (cp_declarator));
1446   declarator->kind = kind;
1447   declarator->parenthesized = UNKNOWN_LOCATION;
1448   declarator->attributes = NULL_TREE;
1449   declarator->std_attributes = NULL_TREE;
1450   declarator->declarator = NULL;
1451   declarator->parameter_pack_p = false;
1452   declarator->id_loc = UNKNOWN_LOCATION;
1453 
1454   return declarator;
1455 }
1456 
1457 /* Make a declarator for a generalized identifier.  If
1458    QUALIFYING_SCOPE is non-NULL, the identifier is
1459    QUALIFYING_SCOPE::UNQUALIFIED_NAME; otherwise, it is just
1460    UNQUALIFIED_NAME.  SFK indicates the kind of special function this
1461    is, if any.   */
1462 
1463 static cp_declarator *
1464 make_id_declarator (tree qualifying_scope, tree unqualified_name,
1465 		    special_function_kind sfk)
1466 {
1467   cp_declarator *declarator;
1468 
1469   /* It is valid to write:
1470 
1471        class C { void f(); };
1472        typedef C D;
1473        void D::f();
1474 
1475      The standard is not clear about whether `typedef const C D' is
1476      legal; as of 2002-09-15 the committee is considering that
1477      question.  EDG 3.0 allows that syntax.  Therefore, we do as
1478      well.  */
1479   if (qualifying_scope && TYPE_P (qualifying_scope))
1480     qualifying_scope = TYPE_MAIN_VARIANT (qualifying_scope);
1481 
1482   gcc_assert (identifier_p (unqualified_name)
1483 	      || TREE_CODE (unqualified_name) == BIT_NOT_EXPR
1484 	      || TREE_CODE (unqualified_name) == TEMPLATE_ID_EXPR);
1485 
1486   declarator = make_declarator (cdk_id);
1487   declarator->u.id.qualifying_scope = qualifying_scope;
1488   declarator->u.id.unqualified_name = unqualified_name;
1489   declarator->u.id.sfk = sfk;
1490 
1491   return declarator;
1492 }
1493 
1494 /* Make a declarator for a pointer to TARGET.  CV_QUALIFIERS is a list
1495    of modifiers such as const or volatile to apply to the pointer
1496    type, represented as identifiers.  ATTRIBUTES represent the attributes that
1497    appertain to the pointer or reference.  */
1498 
1499 cp_declarator *
1500 make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1501 			 tree attributes)
1502 {
1503   cp_declarator *declarator;
1504 
1505   declarator = make_declarator (cdk_pointer);
1506   declarator->declarator = target;
1507   declarator->u.pointer.qualifiers = cv_qualifiers;
1508   declarator->u.pointer.class_type = NULL_TREE;
1509   if (target)
1510     {
1511       declarator->id_loc = target->id_loc;
1512       declarator->parameter_pack_p = target->parameter_pack_p;
1513       target->parameter_pack_p = false;
1514     }
1515   else
1516     declarator->parameter_pack_p = false;
1517 
1518   declarator->std_attributes = attributes;
1519 
1520   return declarator;
1521 }
1522 
1523 /* Like make_pointer_declarator -- but for references.  ATTRIBUTES
1524    represent the attributes that appertain to the pointer or
1525    reference.  */
1526 
1527 cp_declarator *
1528 make_reference_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1529 			   bool rvalue_ref, tree attributes)
1530 {
1531   cp_declarator *declarator;
1532 
1533   declarator = make_declarator (cdk_reference);
1534   declarator->declarator = target;
1535   declarator->u.reference.qualifiers = cv_qualifiers;
1536   declarator->u.reference.rvalue_ref = rvalue_ref;
1537   if (target)
1538     {
1539       declarator->id_loc = target->id_loc;
1540       declarator->parameter_pack_p = target->parameter_pack_p;
1541       target->parameter_pack_p = false;
1542     }
1543   else
1544     declarator->parameter_pack_p = false;
1545 
1546   declarator->std_attributes = attributes;
1547 
1548   return declarator;
1549 }
1550 
1551 /* Like make_pointer_declarator -- but for a pointer to a non-static
1552    member of CLASS_TYPE.  ATTRIBUTES represent the attributes that
1553    appertain to the pointer or reference.  */
1554 
1555 cp_declarator *
1556 make_ptrmem_declarator (cp_cv_quals cv_qualifiers, tree class_type,
1557 			cp_declarator *pointee,
1558 			tree attributes)
1559 {
1560   cp_declarator *declarator;
1561 
1562   declarator = make_declarator (cdk_ptrmem);
1563   declarator->declarator = pointee;
1564   declarator->u.pointer.qualifiers = cv_qualifiers;
1565   declarator->u.pointer.class_type = class_type;
1566 
1567   if (pointee)
1568     {
1569       declarator->parameter_pack_p = pointee->parameter_pack_p;
1570       pointee->parameter_pack_p = false;
1571     }
1572   else
1573     declarator->parameter_pack_p = false;
1574 
1575   declarator->std_attributes = attributes;
1576 
1577   return declarator;
1578 }
1579 
1580 /* Make a declarator for the function given by TARGET, with the
1581    indicated PARMS.  The CV_QUALIFIERS apply to the function, as in
1582    "const"-qualified member function.  The EXCEPTION_SPECIFICATION
1583    indicates what exceptions can be thrown.  */
1584 
1585 cp_declarator *
1586 make_call_declarator (cp_declarator *target,
1587 		      tree parms,
1588 		      cp_cv_quals cv_qualifiers,
1589 		      cp_virt_specifiers virt_specifiers,
1590 		      cp_ref_qualifier ref_qualifier,
1591 		      tree tx_qualifier,
1592 		      tree exception_specification,
1593 		      tree late_return_type,
1594 		      tree requires_clause)
1595 {
1596   cp_declarator *declarator;
1597 
1598   declarator = make_declarator (cdk_function);
1599   declarator->declarator = target;
1600   declarator->u.function.parameters = parms;
1601   declarator->u.function.qualifiers = cv_qualifiers;
1602   declarator->u.function.virt_specifiers = virt_specifiers;
1603   declarator->u.function.ref_qualifier = ref_qualifier;
1604   declarator->u.function.tx_qualifier = tx_qualifier;
1605   declarator->u.function.exception_specification = exception_specification;
1606   declarator->u.function.late_return_type = late_return_type;
1607   declarator->u.function.requires_clause = requires_clause;
1608   if (target)
1609     {
1610       declarator->id_loc = target->id_loc;
1611       declarator->parameter_pack_p = target->parameter_pack_p;
1612       target->parameter_pack_p = false;
1613     }
1614   else
1615     declarator->parameter_pack_p = false;
1616 
1617   return declarator;
1618 }
1619 
1620 /* Make a declarator for an array of BOUNDS elements, each of which is
1621    defined by ELEMENT.  */
1622 
1623 cp_declarator *
1624 make_array_declarator (cp_declarator *element, tree bounds)
1625 {
1626   cp_declarator *declarator;
1627 
1628   declarator = make_declarator (cdk_array);
1629   declarator->declarator = element;
1630   declarator->u.array.bounds = bounds;
1631   if (element)
1632     {
1633       declarator->id_loc = element->id_loc;
1634       declarator->parameter_pack_p = element->parameter_pack_p;
1635       element->parameter_pack_p = false;
1636     }
1637   else
1638     declarator->parameter_pack_p = false;
1639 
1640   return declarator;
1641 }
1642 
1643 /* Determine whether the declarator we've seen so far can be a
1644    parameter pack, when followed by an ellipsis.  */
1645 static bool
1646 declarator_can_be_parameter_pack (cp_declarator *declarator)
1647 {
1648   if (declarator && declarator->parameter_pack_p)
1649     /* We already saw an ellipsis.  */
1650     return false;
1651 
1652   /* Search for a declarator name, or any other declarator that goes
1653      after the point where the ellipsis could appear in a parameter
1654      pack. If we find any of these, then this declarator can not be
1655      made into a parameter pack.  */
1656   bool found = false;
1657   while (declarator && !found)
1658     {
1659       switch ((int)declarator->kind)
1660 	{
1661 	case cdk_id:
1662 	case cdk_array:
1663 	case cdk_decomp:
1664 	  found = true;
1665 	  break;
1666 
1667 	case cdk_error:
1668 	  return true;
1669 
1670 	default:
1671 	  declarator = declarator->declarator;
1672 	  break;
1673 	}
1674     }
1675 
1676   return !found;
1677 }
1678 
1679 cp_parameter_declarator *no_parameters;
1680 
1681 /* Create a parameter declarator with the indicated DECL_SPECIFIERS,
1682    DECLARATOR and DEFAULT_ARGUMENT.  */
1683 
1684 cp_parameter_declarator *
1685 make_parameter_declarator (cp_decl_specifier_seq *decl_specifiers,
1686 			   cp_declarator *declarator,
1687 			   tree default_argument,
1688 			   location_t loc,
1689 			   bool template_parameter_pack_p = false)
1690 {
1691   cp_parameter_declarator *parameter;
1692 
1693   parameter = ((cp_parameter_declarator *)
1694 	       alloc_declarator (sizeof (cp_parameter_declarator)));
1695   parameter->next = NULL;
1696   if (decl_specifiers)
1697     parameter->decl_specifiers = *decl_specifiers;
1698   else
1699     clear_decl_specs (&parameter->decl_specifiers);
1700   parameter->declarator = declarator;
1701   parameter->default_argument = default_argument;
1702   parameter->template_parameter_pack_p = template_parameter_pack_p;
1703   parameter->loc = loc;
1704 
1705   return parameter;
1706 }
1707 
1708 /* Returns true iff DECLARATOR  is a declaration for a function.  */
1709 
1710 static bool
1711 function_declarator_p (const cp_declarator *declarator)
1712 {
1713   while (declarator)
1714     {
1715       if (declarator->kind == cdk_function
1716 	  && declarator->declarator->kind == cdk_id)
1717 	return true;
1718       if (declarator->kind == cdk_id
1719 	  || declarator->kind == cdk_decomp
1720 	  || declarator->kind == cdk_error)
1721 	return false;
1722       declarator = declarator->declarator;
1723     }
1724   return false;
1725 }
1726 
1727 /* The parser.  */
1728 
1729 /* Overview
1730    --------
1731 
1732    A cp_parser parses the token stream as specified by the C++
1733    grammar.  Its job is purely parsing, not semantic analysis.  For
1734    example, the parser breaks the token stream into declarators,
1735    expressions, statements, and other similar syntactic constructs.
1736    It does not check that the types of the expressions on either side
1737    of an assignment-statement are compatible, or that a function is
1738    not declared with a parameter of type `void'.
1739 
1740    The parser invokes routines elsewhere in the compiler to perform
1741    semantic analysis and to build up the abstract syntax tree for the
1742    code processed.
1743 
1744    The parser (and the template instantiation code, which is, in a
1745    way, a close relative of parsing) are the only parts of the
1746    compiler that should be calling push_scope and pop_scope, or
1747    related functions.  The parser (and template instantiation code)
1748    keeps track of what scope is presently active; everything else
1749    should simply honor that.  (The code that generates static
1750    initializers may also need to set the scope, in order to check
1751    access control correctly when emitting the initializers.)
1752 
1753    Methodology
1754    -----------
1755 
1756    The parser is of the standard recursive-descent variety.  Upcoming
1757    tokens in the token stream are examined in order to determine which
1758    production to use when parsing a non-terminal.  Some C++ constructs
1759    require arbitrary look ahead to disambiguate.  For example, it is
1760    impossible, in the general case, to tell whether a statement is an
1761    expression or declaration without scanning the entire statement.
1762    Therefore, the parser is capable of "parsing tentatively."  When the
1763    parser is not sure what construct comes next, it enters this mode.
1764    Then, while we attempt to parse the construct, the parser queues up
1765    error messages, rather than issuing them immediately, and saves the
1766    tokens it consumes.  If the construct is parsed successfully, the
1767    parser "commits", i.e., it issues any queued error messages and
1768    the tokens that were being preserved are permanently discarded.
1769    If, however, the construct is not parsed successfully, the parser
1770    rolls back its state completely so that it can resume parsing using
1771    a different alternative.
1772 
1773    Future Improvements
1774    -------------------
1775 
1776    The performance of the parser could probably be improved substantially.
1777    We could often eliminate the need to parse tentatively by looking ahead
1778    a little bit.  In some places, this approach might not entirely eliminate
1779    the need to parse tentatively, but it might still speed up the average
1780    case.  */
1781 
1782 /* Flags that are passed to some parsing functions.  These values can
1783    be bitwise-ored together.  */
1784 
1785 enum
1786 {
1787   /* No flags.  */
1788   CP_PARSER_FLAGS_NONE = 0x0,
1789   /* The construct is optional.  If it is not present, then no error
1790      should be issued.  */
1791   CP_PARSER_FLAGS_OPTIONAL = 0x1,
1792   /* When parsing a type-specifier, treat user-defined type-names
1793      as non-type identifiers.  */
1794   CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES = 0x2,
1795   /* When parsing a type-specifier, do not try to parse a class-specifier
1796      or enum-specifier.  */
1797   CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS = 0x4,
1798   /* When parsing a decl-specifier-seq, only allow type-specifier or
1799      constexpr.  */
1800   CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR = 0x8,
1801   /* When parsing a decl-specifier-seq, only allow mutable or constexpr.  */
1802   CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR = 0x10
1803 };
1804 
1805 /* This type is used for parameters and variables which hold
1806    combinations of the above flags.  */
1807 typedef int cp_parser_flags;
1808 
1809 /* The different kinds of declarators we want to parse.  */
1810 
1811 enum cp_parser_declarator_kind
1812 {
1813   /* We want an abstract declarator.  */
1814   CP_PARSER_DECLARATOR_ABSTRACT,
1815   /* We want a named declarator.  */
1816   CP_PARSER_DECLARATOR_NAMED,
1817   /* We don't mind, but the name must be an unqualified-id.  */
1818   CP_PARSER_DECLARATOR_EITHER
1819 };
1820 
1821 /* The precedence values used to parse binary expressions.  The minimum value
1822    of PREC must be 1, because zero is reserved to quickly discriminate
1823    binary operators from other tokens.  */
1824 
1825 enum cp_parser_prec
1826 {
1827   PREC_NOT_OPERATOR,
1828   PREC_LOGICAL_OR_EXPRESSION,
1829   PREC_LOGICAL_AND_EXPRESSION,
1830   PREC_INCLUSIVE_OR_EXPRESSION,
1831   PREC_EXCLUSIVE_OR_EXPRESSION,
1832   PREC_AND_EXPRESSION,
1833   PREC_EQUALITY_EXPRESSION,
1834   PREC_RELATIONAL_EXPRESSION,
1835   PREC_SHIFT_EXPRESSION,
1836   PREC_ADDITIVE_EXPRESSION,
1837   PREC_MULTIPLICATIVE_EXPRESSION,
1838   PREC_PM_EXPRESSION,
1839   NUM_PREC_VALUES = PREC_PM_EXPRESSION
1840 };
1841 
1842 /* A mapping from a token type to a corresponding tree node type, with a
1843    precedence value.  */
1844 
1845 struct cp_parser_binary_operations_map_node
1846 {
1847   /* The token type.  */
1848   enum cpp_ttype token_type;
1849   /* The corresponding tree code.  */
1850   enum tree_code tree_type;
1851   /* The precedence of this operator.  */
1852   enum cp_parser_prec prec;
1853 };
1854 
1855 struct cp_parser_expression_stack_entry
1856 {
1857   /* Left hand side of the binary operation we are currently
1858      parsing.  */
1859   cp_expr lhs;
1860   /* Original tree code for left hand side, if it was a binary
1861      expression itself (used for -Wparentheses).  */
1862   enum tree_code lhs_type;
1863   /* Tree code for the binary operation we are parsing.  */
1864   enum tree_code tree_type;
1865   /* Precedence of the binary operation we are parsing.  */
1866   enum cp_parser_prec prec;
1867   /* Location of the binary operation we are parsing.  */
1868   location_t loc;
1869 };
1870 
1871 /* The stack for storing partial expressions.  We only need NUM_PREC_VALUES
1872    entries because precedence levels on the stack are monotonically
1873    increasing.  */
1874 typedef struct cp_parser_expression_stack_entry
1875   cp_parser_expression_stack[NUM_PREC_VALUES];
1876 
1877 /* Prototypes.  */
1878 
1879 /* Constructors and destructors.  */
1880 
1881 static cp_parser_context *cp_parser_context_new
1882   (cp_parser_context *);
1883 
1884 /* Class variables.  */
1885 
1886 static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
1887 
1888 /* The operator-precedence table used by cp_parser_binary_expression.
1889    Transformed into an associative array (binops_by_token) by
1890    cp_parser_new.  */
1891 
1892 static const cp_parser_binary_operations_map_node binops[] = {
1893   { CPP_DEREF_STAR, MEMBER_REF, PREC_PM_EXPRESSION },
1894   { CPP_DOT_STAR, DOTSTAR_EXPR, PREC_PM_EXPRESSION },
1895 
1896   { CPP_MULT, MULT_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1897   { CPP_DIV, TRUNC_DIV_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1898   { CPP_MOD, TRUNC_MOD_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1899 
1900   { CPP_PLUS, PLUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1901   { CPP_MINUS, MINUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1902 
1903   { CPP_LSHIFT, LSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1904   { CPP_RSHIFT, RSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1905 
1906   { CPP_LESS, LT_EXPR, PREC_RELATIONAL_EXPRESSION },
1907   { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION },
1908   { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION },
1909   { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION },
1910 
1911   { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION },
1912   { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION },
1913 
1914   { CPP_AND, BIT_AND_EXPR, PREC_AND_EXPRESSION },
1915 
1916   { CPP_XOR, BIT_XOR_EXPR, PREC_EXCLUSIVE_OR_EXPRESSION },
1917 
1918   { CPP_OR, BIT_IOR_EXPR, PREC_INCLUSIVE_OR_EXPRESSION },
1919 
1920   { CPP_AND_AND, TRUTH_ANDIF_EXPR, PREC_LOGICAL_AND_EXPRESSION },
1921 
1922   { CPP_OR_OR, TRUTH_ORIF_EXPR, PREC_LOGICAL_OR_EXPRESSION }
1923 };
1924 
1925 /* The same as binops, but initialized by cp_parser_new so that
1926    binops_by_token[N].token_type == N.  Used in cp_parser_binary_expression
1927    for speed.  */
1928 static cp_parser_binary_operations_map_node binops_by_token[N_CP_TTYPES];
1929 
1930 /* Constructors and destructors.  */
1931 
1932 /* Construct a new context.  The context below this one on the stack
1933    is given by NEXT.  */
1934 
1935 static cp_parser_context *
1936 cp_parser_context_new (cp_parser_context* next)
1937 {
1938   cp_parser_context *context;
1939 
1940   /* Allocate the storage.  */
1941   if (cp_parser_context_free_list != NULL)
1942     {
1943       /* Pull the first entry from the free list.  */
1944       context = cp_parser_context_free_list;
1945       cp_parser_context_free_list = context->next;
1946       memset (context, 0, sizeof (*context));
1947     }
1948   else
1949     context = ggc_cleared_alloc<cp_parser_context> ();
1950 
1951   /* No errors have occurred yet in this context.  */
1952   context->status = CP_PARSER_STATUS_KIND_NO_ERROR;
1953   /* If this is not the bottommost context, copy information that we
1954      need from the previous context.  */
1955   if (next)
1956     {
1957       /* If, in the NEXT context, we are parsing an `x->' or `x.'
1958 	 expression, then we are parsing one in this context, too.  */
1959       context->object_type = next->object_type;
1960       /* Thread the stack.  */
1961       context->next = next;
1962     }
1963 
1964   return context;
1965 }
1966 
1967 /* Managing the unparsed function queues.  */
1968 
1969 #define unparsed_funs_with_default_args \
1970   parser->unparsed_queues->last ().funs_with_default_args
1971 #define unparsed_funs_with_definitions \
1972   parser->unparsed_queues->last ().funs_with_definitions
1973 #define unparsed_nsdmis \
1974   parser->unparsed_queues->last ().nsdmis
1975 #define unparsed_classes \
1976   parser->unparsed_queues->last ().classes
1977 
1978 static void
1979 push_unparsed_function_queues (cp_parser *parser)
1980 {
1981   cp_unparsed_functions_entry e = {NULL, make_tree_vector (), NULL, NULL};
1982   vec_safe_push (parser->unparsed_queues, e);
1983 }
1984 
1985 static void
1986 pop_unparsed_function_queues (cp_parser *parser)
1987 {
1988   release_tree_vector (unparsed_funs_with_definitions);
1989   parser->unparsed_queues->pop ();
1990 }
1991 
1992 /* Prototypes.  */
1993 
1994 /* Constructors and destructors.  */
1995 
1996 static cp_parser *cp_parser_new
1997   (void);
1998 
1999 /* Routines to parse various constructs.
2000 
2001    Those that return `tree' will return the error_mark_node (rather
2002    than NULL_TREE) if a parse error occurs, unless otherwise noted.
2003    Sometimes, they will return an ordinary node if error-recovery was
2004    attempted, even though a parse error occurred.  So, to check
2005    whether or not a parse error occurred, you should always use
2006    cp_parser_error_occurred.  If the construct is optional (indicated
2007    either by an `_opt' in the name of the function that does the
2008    parsing or via a FLAGS parameter), then NULL_TREE is returned if
2009    the construct is not present.  */
2010 
2011 /* Lexical conventions [gram.lex]  */
2012 
2013 static cp_expr cp_parser_identifier
2014   (cp_parser *);
2015 static cp_expr cp_parser_string_literal
2016   (cp_parser *, bool, bool, bool);
2017 static cp_expr cp_parser_userdef_char_literal
2018   (cp_parser *);
2019 static tree cp_parser_userdef_string_literal
2020   (tree);
2021 static cp_expr cp_parser_userdef_numeric_literal
2022   (cp_parser *);
2023 
2024 /* Basic concepts [gram.basic]  */
2025 
2026 static bool cp_parser_translation_unit
2027   (cp_parser *);
2028 
2029 /* Expressions [gram.expr]  */
2030 
2031 static cp_expr cp_parser_primary_expression
2032   (cp_parser *, bool, bool, bool, cp_id_kind *);
2033 static cp_expr cp_parser_id_expression
2034   (cp_parser *, bool, bool, bool *, bool, bool);
2035 static cp_expr cp_parser_unqualified_id
2036   (cp_parser *, bool, bool, bool, bool);
2037 static tree cp_parser_nested_name_specifier_opt
2038   (cp_parser *, bool, bool, bool, bool, bool = false);
2039 static tree cp_parser_nested_name_specifier
2040   (cp_parser *, bool, bool, bool, bool);
2041 static tree cp_parser_qualifying_entity
2042   (cp_parser *, bool, bool, bool, bool, bool);
2043 static cp_expr cp_parser_postfix_expression
2044   (cp_parser *, bool, bool, bool, bool, cp_id_kind *);
2045 static tree cp_parser_postfix_open_square_expression
2046   (cp_parser *, tree, bool, bool);
2047 static tree cp_parser_postfix_dot_deref_expression
2048   (cp_parser *, enum cpp_ttype, cp_expr, bool, cp_id_kind *, location_t);
2049 static vec<tree, va_gc> *cp_parser_parenthesized_expression_list
2050   (cp_parser *, int, bool, bool, bool *, location_t * = NULL,
2051    bool = false);
2052 /* Values for the second parameter of cp_parser_parenthesized_expression_list.  */
2053 enum { non_attr = 0, normal_attr = 1, id_attr = 2 };
2054 static void cp_parser_pseudo_destructor_name
2055   (cp_parser *, tree, tree *, tree *);
2056 static cp_expr cp_parser_unary_expression
2057   (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false, bool = false);
2058 static enum tree_code cp_parser_unary_operator
2059   (cp_token *);
2060 static tree cp_parser_new_expression
2061   (cp_parser *);
2062 static vec<tree, va_gc> *cp_parser_new_placement
2063   (cp_parser *);
2064 static tree cp_parser_new_type_id
2065   (cp_parser *, tree *);
2066 static cp_declarator *cp_parser_new_declarator_opt
2067   (cp_parser *);
2068 static cp_declarator *cp_parser_direct_new_declarator
2069   (cp_parser *);
2070 static vec<tree, va_gc> *cp_parser_new_initializer
2071   (cp_parser *);
2072 static tree cp_parser_delete_expression
2073   (cp_parser *);
2074 static cp_expr cp_parser_cast_expression
2075   (cp_parser *, bool, bool, bool, cp_id_kind *);
2076 static cp_expr cp_parser_binary_expression
2077   (cp_parser *, bool, bool, enum cp_parser_prec, cp_id_kind *);
2078 static tree cp_parser_question_colon_clause
2079   (cp_parser *, cp_expr);
2080 static cp_expr cp_parser_assignment_expression
2081   (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false);
2082 static enum tree_code cp_parser_assignment_operator_opt
2083   (cp_parser *);
2084 static cp_expr cp_parser_expression
2085   (cp_parser *, cp_id_kind * = NULL, bool = false, bool = false);
2086 static cp_expr cp_parser_constant_expression
2087   (cp_parser *, bool = false, bool * = NULL, bool = false);
2088 static cp_expr cp_parser_builtin_offsetof
2089   (cp_parser *);
2090 static cp_expr cp_parser_lambda_expression
2091   (cp_parser *);
2092 static void cp_parser_lambda_introducer
2093   (cp_parser *, tree);
2094 static bool cp_parser_lambda_declarator_opt
2095   (cp_parser *, tree);
2096 static void cp_parser_lambda_body
2097   (cp_parser *, tree);
2098 
2099 /* Statements [gram.stmt.stmt]  */
2100 
2101 static void cp_parser_statement
2102   (cp_parser *, tree, bool, bool *, vec<tree> * = NULL, location_t * = NULL);
2103 static void cp_parser_label_for_labeled_statement
2104 (cp_parser *, tree);
2105 static tree cp_parser_expression_statement
2106   (cp_parser *, tree);
2107 static tree cp_parser_compound_statement
2108   (cp_parser *, tree, int, bool);
2109 static void cp_parser_statement_seq_opt
2110   (cp_parser *, tree);
2111 static tree cp_parser_selection_statement
2112   (cp_parser *, bool *, vec<tree> *);
2113 static tree cp_parser_condition
2114   (cp_parser *);
2115 static tree cp_parser_iteration_statement
2116   (cp_parser *, bool *, bool, unsigned short);
2117 static bool cp_parser_init_statement
2118   (cp_parser *, tree *decl);
2119 static tree cp_parser_for
2120   (cp_parser *, bool, unsigned short);
2121 static tree cp_parser_c_for
2122   (cp_parser *, tree, tree, bool, unsigned short);
2123 static tree cp_parser_range_for
2124   (cp_parser *, tree, tree, tree, bool, unsigned short);
2125 static void do_range_for_auto_deduction
2126   (tree, tree);
2127 static tree cp_parser_perform_range_for_lookup
2128   (tree, tree *, tree *);
2129 static tree cp_parser_range_for_member_function
2130   (tree, tree);
2131 static tree cp_parser_jump_statement
2132   (cp_parser *);
2133 static void cp_parser_declaration_statement
2134   (cp_parser *);
2135 
2136 static tree cp_parser_implicitly_scoped_statement
2137   (cp_parser *, bool *, const token_indent_info &, vec<tree> * = NULL);
2138 static void cp_parser_already_scoped_statement
2139   (cp_parser *, bool *, const token_indent_info &);
2140 
2141 /* Declarations [gram.dcl.dcl] */
2142 
2143 static void cp_parser_declaration_seq_opt
2144   (cp_parser *);
2145 static void cp_parser_declaration
2146   (cp_parser *);
2147 static void cp_parser_block_declaration
2148   (cp_parser *, bool);
2149 static void cp_parser_simple_declaration
2150   (cp_parser *, bool, tree *);
2151 static void cp_parser_decl_specifier_seq
2152   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, int *);
2153 static tree cp_parser_storage_class_specifier_opt
2154   (cp_parser *);
2155 static tree cp_parser_function_specifier_opt
2156   (cp_parser *, cp_decl_specifier_seq *);
2157 static tree cp_parser_type_specifier
2158   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, bool,
2159    int *, bool *);
2160 static tree cp_parser_simple_type_specifier
2161   (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
2162 static tree cp_parser_type_name
2163   (cp_parser *, bool);
2164 static tree cp_parser_type_name
2165   (cp_parser *);
2166 static tree cp_parser_nonclass_name
2167   (cp_parser* parser);
2168 static tree cp_parser_elaborated_type_specifier
2169   (cp_parser *, bool, bool);
2170 static tree cp_parser_enum_specifier
2171   (cp_parser *);
2172 static void cp_parser_enumerator_list
2173   (cp_parser *, tree);
2174 static void cp_parser_enumerator_definition
2175   (cp_parser *, tree);
2176 static tree cp_parser_namespace_name
2177   (cp_parser *);
2178 static void cp_parser_namespace_definition
2179   (cp_parser *);
2180 static void cp_parser_namespace_body
2181   (cp_parser *);
2182 static tree cp_parser_qualified_namespace_specifier
2183   (cp_parser *);
2184 static void cp_parser_namespace_alias_definition
2185   (cp_parser *);
2186 static bool cp_parser_using_declaration
2187   (cp_parser *, bool);
2188 static void cp_parser_using_directive
2189   (cp_parser *);
2190 static tree cp_parser_alias_declaration
2191   (cp_parser *);
2192 static void cp_parser_asm_definition
2193   (cp_parser *);
2194 static void cp_parser_linkage_specification
2195   (cp_parser *);
2196 static void cp_parser_static_assert
2197   (cp_parser *, bool);
2198 static tree cp_parser_decltype
2199   (cp_parser *);
2200 static tree cp_parser_decomposition_declaration
2201   (cp_parser *, cp_decl_specifier_seq *, tree *, location_t *);
2202 
2203 /* Declarators [gram.dcl.decl] */
2204 
2205 static tree cp_parser_init_declarator
2206   (cp_parser *, cp_decl_specifier_seq *, vec<deferred_access_check, va_gc> *,
2207    bool, bool, int, bool *, tree *, location_t *, tree *);
2208 static cp_declarator *cp_parser_declarator
2209   (cp_parser *, cp_parser_declarator_kind, int *, bool *, bool, bool);
2210 static cp_declarator *cp_parser_direct_declarator
2211   (cp_parser *, cp_parser_declarator_kind, int *, bool, bool);
2212 static enum tree_code cp_parser_ptr_operator
2213   (cp_parser *, tree *, cp_cv_quals *, tree *);
2214 static cp_cv_quals cp_parser_cv_qualifier_seq_opt
2215   (cp_parser *);
2216 static cp_virt_specifiers cp_parser_virt_specifier_seq_opt
2217   (cp_parser *);
2218 static cp_ref_qualifier cp_parser_ref_qualifier_opt
2219   (cp_parser *);
2220 static tree cp_parser_tx_qualifier_opt
2221   (cp_parser *);
2222 static tree cp_parser_late_return_type_opt
2223   (cp_parser *, cp_declarator *, tree &, cp_cv_quals);
2224 static tree cp_parser_declarator_id
2225   (cp_parser *, bool);
2226 static tree cp_parser_type_id
2227   (cp_parser *);
2228 static tree cp_parser_template_type_arg
2229   (cp_parser *);
2230 static tree cp_parser_trailing_type_id (cp_parser *);
2231 static tree cp_parser_type_id_1
2232   (cp_parser *, bool, bool);
2233 static void cp_parser_type_specifier_seq
2234   (cp_parser *, bool, bool, cp_decl_specifier_seq *);
2235 static tree cp_parser_parameter_declaration_clause
2236   (cp_parser *);
2237 static tree cp_parser_parameter_declaration_list
2238   (cp_parser *, bool *);
2239 static cp_parameter_declarator *cp_parser_parameter_declaration
2240   (cp_parser *, bool, bool *);
2241 static tree cp_parser_default_argument
2242   (cp_parser *, bool);
2243 static void cp_parser_function_body
2244   (cp_parser *, bool);
2245 static tree cp_parser_initializer
2246   (cp_parser *, bool *, bool *);
2247 static cp_expr cp_parser_initializer_clause
2248   (cp_parser *, bool *);
2249 static cp_expr cp_parser_braced_list
2250   (cp_parser*, bool*);
2251 static vec<constructor_elt, va_gc> *cp_parser_initializer_list
2252   (cp_parser *, bool *);
2253 
2254 static void cp_parser_ctor_initializer_opt_and_function_body
2255   (cp_parser *, bool);
2256 
2257 static tree cp_parser_late_parsing_omp_declare_simd
2258   (cp_parser *, tree);
2259 
2260 static tree cp_parser_late_parsing_oacc_routine
2261   (cp_parser *, tree);
2262 
2263 static tree synthesize_implicit_template_parm
2264   (cp_parser *, tree);
2265 static tree finish_fully_implicit_template
2266   (cp_parser *, tree);
2267 static void abort_fully_implicit_template
2268   (cp_parser *);
2269 
2270 /* Classes [gram.class] */
2271 
2272 static tree cp_parser_class_name
2273   (cp_parser *, bool, bool, enum tag_types, bool, bool, bool, bool = false);
2274 static tree cp_parser_class_specifier
2275   (cp_parser *);
2276 static tree cp_parser_class_head
2277   (cp_parser *, bool *);
2278 static enum tag_types cp_parser_class_key
2279   (cp_parser *);
2280 static void cp_parser_type_parameter_key
2281   (cp_parser* parser);
2282 static void cp_parser_member_specification_opt
2283   (cp_parser *);
2284 static void cp_parser_member_declaration
2285   (cp_parser *);
2286 static tree cp_parser_pure_specifier
2287   (cp_parser *);
2288 static tree cp_parser_constant_initializer
2289   (cp_parser *);
2290 
2291 /* Derived classes [gram.class.derived] */
2292 
2293 static tree cp_parser_base_clause
2294   (cp_parser *);
2295 static tree cp_parser_base_specifier
2296   (cp_parser *);
2297 
2298 /* Special member functions [gram.special] */
2299 
2300 static tree cp_parser_conversion_function_id
2301   (cp_parser *);
2302 static tree cp_parser_conversion_type_id
2303   (cp_parser *);
2304 static cp_declarator *cp_parser_conversion_declarator_opt
2305   (cp_parser *);
2306 static void cp_parser_ctor_initializer_opt
2307   (cp_parser *);
2308 static void cp_parser_mem_initializer_list
2309   (cp_parser *);
2310 static tree cp_parser_mem_initializer
2311   (cp_parser *);
2312 static tree cp_parser_mem_initializer_id
2313   (cp_parser *);
2314 
2315 /* Overloading [gram.over] */
2316 
2317 static cp_expr cp_parser_operator_function_id
2318   (cp_parser *);
2319 static cp_expr cp_parser_operator
2320   (cp_parser *);
2321 
2322 /* Templates [gram.temp] */
2323 
2324 static void cp_parser_template_declaration
2325   (cp_parser *, bool);
2326 static tree cp_parser_template_parameter_list
2327   (cp_parser *);
2328 static tree cp_parser_template_parameter
2329   (cp_parser *, bool *, bool *);
2330 static tree cp_parser_type_parameter
2331   (cp_parser *, bool *);
2332 static tree cp_parser_template_id
2333   (cp_parser *, bool, bool, enum tag_types, bool);
2334 static tree cp_parser_template_name
2335   (cp_parser *, bool, bool, bool, enum tag_types, bool *);
2336 static tree cp_parser_template_argument_list
2337   (cp_parser *);
2338 static tree cp_parser_template_argument
2339   (cp_parser *);
2340 static void cp_parser_explicit_instantiation
2341   (cp_parser *);
2342 static void cp_parser_explicit_specialization
2343   (cp_parser *);
2344 
2345 /* Exception handling [gram.exception] */
2346 
2347 static tree cp_parser_try_block
2348   (cp_parser *);
2349 static void cp_parser_function_try_block
2350   (cp_parser *);
2351 static void cp_parser_handler_seq
2352   (cp_parser *);
2353 static void cp_parser_handler
2354   (cp_parser *);
2355 static tree cp_parser_exception_declaration
2356   (cp_parser *);
2357 static tree cp_parser_throw_expression
2358   (cp_parser *);
2359 static tree cp_parser_exception_specification_opt
2360   (cp_parser *);
2361 static tree cp_parser_type_id_list
2362   (cp_parser *);
2363 
2364 /* GNU Extensions */
2365 
2366 static tree cp_parser_asm_specification_opt
2367   (cp_parser *);
2368 static tree cp_parser_asm_operand_list
2369   (cp_parser *);
2370 static tree cp_parser_asm_clobber_list
2371   (cp_parser *);
2372 static tree cp_parser_asm_label_list
2373   (cp_parser *);
2374 static bool cp_next_tokens_can_be_attribute_p
2375   (cp_parser *);
2376 static bool cp_next_tokens_can_be_gnu_attribute_p
2377   (cp_parser *);
2378 static bool cp_next_tokens_can_be_std_attribute_p
2379   (cp_parser *);
2380 static bool cp_nth_tokens_can_be_std_attribute_p
2381   (cp_parser *, size_t);
2382 static bool cp_nth_tokens_can_be_gnu_attribute_p
2383   (cp_parser *, size_t);
2384 static bool cp_nth_tokens_can_be_attribute_p
2385   (cp_parser *, size_t);
2386 static tree cp_parser_attributes_opt
2387   (cp_parser *);
2388 static tree cp_parser_gnu_attributes_opt
2389   (cp_parser *);
2390 static tree cp_parser_gnu_attribute_list
2391   (cp_parser *);
2392 static tree cp_parser_std_attribute
2393   (cp_parser *, tree);
2394 static tree cp_parser_std_attribute_spec
2395   (cp_parser *);
2396 static tree cp_parser_std_attribute_spec_seq
2397   (cp_parser *);
2398 static size_t cp_parser_skip_attributes_opt
2399   (cp_parser *, size_t);
2400 static bool cp_parser_extension_opt
2401   (cp_parser *, int *);
2402 static void cp_parser_label_declaration
2403   (cp_parser *);
2404 
2405 /* Concept Extensions */
2406 
2407 static tree cp_parser_requires_clause
2408   (cp_parser *);
2409 static tree cp_parser_requires_clause_opt
2410   (cp_parser *);
2411 static tree cp_parser_requires_expression
2412   (cp_parser *);
2413 static tree cp_parser_requirement_parameter_list
2414   (cp_parser *);
2415 static tree cp_parser_requirement_body
2416   (cp_parser *);
2417 static tree cp_parser_requirement_list
2418   (cp_parser *);
2419 static tree cp_parser_requirement
2420   (cp_parser *);
2421 static tree cp_parser_simple_requirement
2422   (cp_parser *);
2423 static tree cp_parser_compound_requirement
2424   (cp_parser *);
2425 static tree cp_parser_type_requirement
2426   (cp_parser *);
2427 static tree cp_parser_nested_requirement
2428   (cp_parser *);
2429 
2430 /* Transactional Memory Extensions */
2431 
2432 static tree cp_parser_transaction
2433   (cp_parser *, cp_token *);
2434 static tree cp_parser_transaction_expression
2435   (cp_parser *, enum rid);
2436 static void cp_parser_function_transaction
2437   (cp_parser *, enum rid);
2438 static tree cp_parser_transaction_cancel
2439   (cp_parser *);
2440 
2441 enum pragma_context {
2442   pragma_external,
2443   pragma_member,
2444   pragma_objc_icode,
2445   pragma_stmt,
2446   pragma_compound
2447 };
2448 static bool cp_parser_pragma
2449   (cp_parser *, enum pragma_context, bool *);
2450 
2451 /* Objective-C++ Productions */
2452 
2453 static tree cp_parser_objc_message_receiver
2454   (cp_parser *);
2455 static tree cp_parser_objc_message_args
2456   (cp_parser *);
2457 static tree cp_parser_objc_message_expression
2458   (cp_parser *);
2459 static cp_expr cp_parser_objc_encode_expression
2460   (cp_parser *);
2461 static tree cp_parser_objc_defs_expression
2462   (cp_parser *);
2463 static tree cp_parser_objc_protocol_expression
2464   (cp_parser *);
2465 static tree cp_parser_objc_selector_expression
2466   (cp_parser *);
2467 static cp_expr cp_parser_objc_expression
2468   (cp_parser *);
2469 static bool cp_parser_objc_selector_p
2470   (enum cpp_ttype);
2471 static tree cp_parser_objc_selector
2472   (cp_parser *);
2473 static tree cp_parser_objc_protocol_refs_opt
2474   (cp_parser *);
2475 static void cp_parser_objc_declaration
2476   (cp_parser *, tree);
2477 static tree cp_parser_objc_statement
2478   (cp_parser *);
2479 static bool cp_parser_objc_valid_prefix_attributes
2480   (cp_parser *, tree *);
2481 static void cp_parser_objc_at_property_declaration
2482   (cp_parser *) ;
2483 static void cp_parser_objc_at_synthesize_declaration
2484   (cp_parser *) ;
2485 static void cp_parser_objc_at_dynamic_declaration
2486   (cp_parser *) ;
2487 static tree cp_parser_objc_struct_declaration
2488   (cp_parser *) ;
2489 
2490 /* Utility Routines */
2491 
2492 static cp_expr cp_parser_lookup_name
2493   (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *, location_t);
2494 static tree cp_parser_lookup_name_simple
2495   (cp_parser *, tree, location_t);
2496 static tree cp_parser_maybe_treat_template_as_class
2497   (tree, bool);
2498 static bool cp_parser_check_declarator_template_parameters
2499   (cp_parser *, cp_declarator *, location_t);
2500 static bool cp_parser_check_template_parameters
2501   (cp_parser *, unsigned, bool, location_t, cp_declarator *);
2502 static cp_expr cp_parser_simple_cast_expression
2503   (cp_parser *);
2504 static tree cp_parser_global_scope_opt
2505   (cp_parser *, bool);
2506 static bool cp_parser_constructor_declarator_p
2507   (cp_parser *, bool);
2508 static tree cp_parser_function_definition_from_specifiers_and_declarator
2509   (cp_parser *, cp_decl_specifier_seq *, tree, const cp_declarator *);
2510 static tree cp_parser_function_definition_after_declarator
2511   (cp_parser *, bool);
2512 static bool cp_parser_template_declaration_after_export
2513   (cp_parser *, bool);
2514 static void cp_parser_perform_template_parameter_access_checks
2515   (vec<deferred_access_check, va_gc> *);
2516 static tree cp_parser_single_declaration
2517   (cp_parser *, vec<deferred_access_check, va_gc> *, bool, bool, bool *);
2518 static cp_expr cp_parser_functional_cast
2519   (cp_parser *, tree);
2520 static tree cp_parser_save_member_function_body
2521   (cp_parser *, cp_decl_specifier_seq *, cp_declarator *, tree);
2522 static tree cp_parser_save_nsdmi
2523   (cp_parser *);
2524 static tree cp_parser_enclosed_template_argument_list
2525   (cp_parser *);
2526 static void cp_parser_save_default_args
2527   (cp_parser *, tree);
2528 static void cp_parser_late_parsing_for_member
2529   (cp_parser *, tree);
2530 static tree cp_parser_late_parse_one_default_arg
2531   (cp_parser *, tree, tree, tree);
2532 static void cp_parser_late_parsing_nsdmi
2533   (cp_parser *, tree);
2534 static void cp_parser_late_parsing_default_args
2535   (cp_parser *, tree);
2536 static tree cp_parser_sizeof_operand
2537   (cp_parser *, enum rid);
2538 static cp_expr cp_parser_trait_expr
2539   (cp_parser *, enum rid);
2540 static bool cp_parser_declares_only_class_p
2541   (cp_parser *);
2542 static void cp_parser_set_storage_class
2543   (cp_parser *, cp_decl_specifier_seq *, enum rid, cp_token *);
2544 static void cp_parser_set_decl_spec_type
2545   (cp_decl_specifier_seq *, tree, cp_token *, bool);
2546 static void set_and_check_decl_spec_loc
2547   (cp_decl_specifier_seq *decl_specs,
2548    cp_decl_spec ds, cp_token *);
2549 static bool cp_parser_friend_p
2550   (const cp_decl_specifier_seq *);
2551 static void cp_parser_required_error
2552   (cp_parser *, required_token, bool, location_t);
2553 static cp_token *cp_parser_require
2554   (cp_parser *, enum cpp_ttype, required_token, location_t = UNKNOWN_LOCATION);
2555 static cp_token *cp_parser_require_keyword
2556   (cp_parser *, enum rid, required_token);
2557 static bool cp_parser_token_starts_function_definition_p
2558   (cp_token *);
2559 static bool cp_parser_next_token_starts_class_definition_p
2560   (cp_parser *);
2561 static bool cp_parser_next_token_ends_template_argument_p
2562   (cp_parser *);
2563 static bool cp_parser_nth_token_starts_template_argument_list_p
2564   (cp_parser *, size_t);
2565 static enum tag_types cp_parser_token_is_class_key
2566   (cp_token *);
2567 static enum tag_types cp_parser_token_is_type_parameter_key
2568   (cp_token *);
2569 static void cp_parser_check_class_key
2570   (enum tag_types, tree type);
2571 static void cp_parser_check_access_in_redeclaration
2572   (tree type, location_t location);
2573 static bool cp_parser_optional_template_keyword
2574   (cp_parser *);
2575 static void cp_parser_pre_parsed_nested_name_specifier
2576   (cp_parser *);
2577 static bool cp_parser_cache_group
2578   (cp_parser *, enum cpp_ttype, unsigned);
2579 static tree cp_parser_cache_defarg
2580   (cp_parser *parser, bool nsdmi);
2581 static void cp_parser_parse_tentatively
2582   (cp_parser *);
2583 static void cp_parser_commit_to_tentative_parse
2584   (cp_parser *);
2585 static void cp_parser_commit_to_topmost_tentative_parse
2586   (cp_parser *);
2587 static void cp_parser_abort_tentative_parse
2588   (cp_parser *);
2589 static bool cp_parser_parse_definitely
2590   (cp_parser *);
2591 static inline bool cp_parser_parsing_tentatively
2592   (cp_parser *);
2593 static bool cp_parser_uncommitted_to_tentative_parse_p
2594   (cp_parser *);
2595 static void cp_parser_error
2596   (cp_parser *, const char *);
2597 static void cp_parser_name_lookup_error
2598   (cp_parser *, tree, tree, name_lookup_error, location_t);
2599 static bool cp_parser_simulate_error
2600   (cp_parser *);
2601 static bool cp_parser_check_type_definition
2602   (cp_parser *);
2603 static void cp_parser_check_for_definition_in_return_type
2604   (cp_declarator *, tree, location_t type_location);
2605 static void cp_parser_check_for_invalid_template_id
2606   (cp_parser *, tree, enum tag_types, location_t location);
2607 static bool cp_parser_non_integral_constant_expression
2608   (cp_parser *, non_integral_constant);
2609 static void cp_parser_diagnose_invalid_type_name
2610   (cp_parser *, tree, location_t);
2611 static bool cp_parser_parse_and_diagnose_invalid_type_name
2612   (cp_parser *);
2613 static int cp_parser_skip_to_closing_parenthesis
2614   (cp_parser *, bool, bool, bool);
2615 static void cp_parser_skip_to_end_of_statement
2616   (cp_parser *);
2617 static void cp_parser_consume_semicolon_at_end_of_statement
2618   (cp_parser *);
2619 static void cp_parser_skip_to_end_of_block_or_statement
2620   (cp_parser *);
2621 static bool cp_parser_skip_to_closing_brace
2622   (cp_parser *);
2623 static void cp_parser_skip_to_end_of_template_parameter_list
2624   (cp_parser *);
2625 static void cp_parser_skip_to_pragma_eol
2626   (cp_parser*, cp_token *);
2627 static bool cp_parser_error_occurred
2628   (cp_parser *);
2629 static bool cp_parser_allow_gnu_extensions_p
2630   (cp_parser *);
2631 static bool cp_parser_is_pure_string_literal
2632   (cp_token *);
2633 static bool cp_parser_is_string_literal
2634   (cp_token *);
2635 static bool cp_parser_is_keyword
2636   (cp_token *, enum rid);
2637 static tree cp_parser_make_typename_type
2638   (cp_parser *, tree, location_t location);
2639 static cp_declarator * cp_parser_make_indirect_declarator
2640   (enum tree_code, tree, cp_cv_quals, cp_declarator *, tree);
2641 static bool cp_parser_compound_literal_p
2642   (cp_parser *);
2643 static bool cp_parser_array_designator_p
2644   (cp_parser *);
2645 static bool cp_parser_init_statement_p
2646   (cp_parser *);
2647 static bool cp_parser_skip_to_closing_square_bracket
2648   (cp_parser *);
2649 
2650 /* Concept-related syntactic transformations */
2651 
2652 static tree cp_parser_maybe_concept_name       (cp_parser *, tree);
2653 static tree cp_parser_maybe_partial_concept_id (cp_parser *, tree, tree);
2654 
2655 // -------------------------------------------------------------------------- //
2656 // Unevaluated Operand Guard
2657 //
2658 // Implementation of an RAII helper for unevaluated operand parsing.
2659 cp_unevaluated::cp_unevaluated ()
2660 {
2661   ++cp_unevaluated_operand;
2662   ++c_inhibit_evaluation_warnings;
2663 }
2664 
2665 cp_unevaluated::~cp_unevaluated ()
2666 {
2667   --c_inhibit_evaluation_warnings;
2668   --cp_unevaluated_operand;
2669 }
2670 
2671 // -------------------------------------------------------------------------- //
2672 // Tentative Parsing
2673 
2674 /* Returns nonzero if we are parsing tentatively.  */
2675 
2676 static inline bool
2677 cp_parser_parsing_tentatively (cp_parser* parser)
2678 {
2679   return parser->context->next != NULL;
2680 }
2681 
2682 /* Returns nonzero if TOKEN is a string literal.  */
2683 
2684 static bool
2685 cp_parser_is_pure_string_literal (cp_token* token)
2686 {
2687   return (token->type == CPP_STRING ||
2688 	  token->type == CPP_STRING16 ||
2689 	  token->type == CPP_STRING32 ||
2690 	  token->type == CPP_WSTRING ||
2691 	  token->type == CPP_UTF8STRING);
2692 }
2693 
2694 /* Returns nonzero if TOKEN is a string literal
2695    of a user-defined string literal.  */
2696 
2697 static bool
2698 cp_parser_is_string_literal (cp_token* token)
2699 {
2700   return (cp_parser_is_pure_string_literal (token) ||
2701 	  token->type == CPP_STRING_USERDEF ||
2702 	  token->type == CPP_STRING16_USERDEF ||
2703 	  token->type == CPP_STRING32_USERDEF ||
2704 	  token->type == CPP_WSTRING_USERDEF ||
2705 	  token->type == CPP_UTF8STRING_USERDEF);
2706 }
2707 
2708 /* Returns nonzero if TOKEN is the indicated KEYWORD.  */
2709 
2710 static bool
2711 cp_parser_is_keyword (cp_token* token, enum rid keyword)
2712 {
2713   return token->keyword == keyword;
2714 }
2715 
2716 /* Return TOKEN's pragma_kind if it is CPP_PRAGMA, otherwise
2717    PRAGMA_NONE.  */
2718 
2719 static enum pragma_kind
2720 cp_parser_pragma_kind (cp_token *token)
2721 {
2722   if (token->type != CPP_PRAGMA)
2723     return PRAGMA_NONE;
2724   /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST.  */
2725   return (enum pragma_kind) TREE_INT_CST_LOW (token->u.value);
2726 }
2727 
2728 /* Helper function for cp_parser_error.
2729    Having peeked a token of kind TOK1_KIND that might signify
2730    a conflict marker, peek successor tokens to determine
2731    if we actually do have a conflict marker.
2732    Specifically, we consider a run of 7 '<', '=' or '>' characters
2733    at the start of a line as a conflict marker.
2734    These come through the lexer as three pairs and a single,
2735    e.g. three CPP_LSHIFT tokens ("<<") and a CPP_LESS token ('<').
2736    If it returns true, *OUT_LOC is written to with the location/range
2737    of the marker.  */
2738 
2739 static bool
2740 cp_lexer_peek_conflict_marker (cp_lexer *lexer, enum cpp_ttype tok1_kind,
2741 			       location_t *out_loc)
2742 {
2743   cp_token *token2 = cp_lexer_peek_nth_token (lexer, 2);
2744   if (token2->type != tok1_kind)
2745     return false;
2746   cp_token *token3 = cp_lexer_peek_nth_token (lexer, 3);
2747   if (token3->type != tok1_kind)
2748     return false;
2749   cp_token *token4 = cp_lexer_peek_nth_token (lexer, 4);
2750   if (token4->type != conflict_marker_get_final_tok_kind (tok1_kind))
2751     return false;
2752 
2753   /* It must be at the start of the line.  */
2754   location_t start_loc = cp_lexer_peek_token (lexer)->location;
2755   if (LOCATION_COLUMN (start_loc) != 1)
2756     return false;
2757 
2758   /* We have a conflict marker.  Construct a location of the form:
2759        <<<<<<<
2760        ^~~~~~~
2761      with start == caret, finishing at the end of the marker.  */
2762   location_t finish_loc = get_finish (token4->location);
2763   *out_loc = make_location (start_loc, start_loc, finish_loc);
2764 
2765   return true;
2766 }
2767 
2768 /* Get a description of the matching symbol to TOKEN_DESC e.g. "(" for
2769    RT_CLOSE_PAREN.  */
2770 
2771 static const char *
2772 get_matching_symbol (required_token token_desc)
2773 {
2774   switch (token_desc)
2775     {
2776     default:
2777       gcc_unreachable ();
2778       return "";
2779     case RT_CLOSE_BRACE:
2780       return "{";
2781     case RT_CLOSE_PAREN:
2782       return "(";
2783     }
2784 }
2785 
2786 /* Attempt to convert TOKEN_DESC from a required_token to an
2787    enum cpp_ttype, returning CPP_EOF if there is no good conversion.  */
2788 
2789 static enum cpp_ttype
2790 get_required_cpp_ttype (required_token token_desc)
2791 {
2792   switch (token_desc)
2793     {
2794     case RT_SEMICOLON:
2795       return CPP_SEMICOLON;
2796     case RT_OPEN_PAREN:
2797       return CPP_OPEN_PAREN;
2798     case RT_CLOSE_BRACE:
2799       return CPP_CLOSE_BRACE;
2800     case RT_OPEN_BRACE:
2801       return CPP_OPEN_BRACE;
2802     case RT_CLOSE_SQUARE:
2803       return CPP_CLOSE_SQUARE;
2804     case RT_OPEN_SQUARE:
2805       return CPP_OPEN_SQUARE;
2806     case RT_COMMA:
2807       return CPP_COMMA;
2808     case RT_COLON:
2809       return CPP_COLON;
2810     case RT_CLOSE_PAREN:
2811       return CPP_CLOSE_PAREN;
2812 
2813     default:
2814       /* Use CPP_EOF as a "no completions possible" code.  */
2815       return CPP_EOF;
2816     }
2817 }
2818 
2819 
2820 /* Subroutine of cp_parser_error and cp_parser_required_error.
2821 
2822    Issue a diagnostic of the form
2823       FILE:LINE: MESSAGE before TOKEN
2824    where TOKEN is the next token in the input stream.  MESSAGE
2825    (specified by the caller) is usually of the form "expected
2826    OTHER-TOKEN".
2827 
2828    This bypasses the check for tentative passing, and potentially
2829    adds material needed by cp_parser_required_error.
2830 
2831    If MISSING_TOKEN_DESC is not RT_NONE, then potentially add fix-it hints
2832    suggesting insertion of the missing token.
2833 
2834    Additionally, if MATCHING_LOCATION is not UNKNOWN_LOCATION, then we
2835    have an unmatched symbol at MATCHING_LOCATION; highlight this secondary
2836    location.  */
2837 
2838 static void
2839 cp_parser_error_1 (cp_parser* parser, const char* gmsgid,
2840 		   required_token missing_token_desc,
2841 		   location_t matching_location)
2842 {
2843   cp_token *token = cp_lexer_peek_token (parser->lexer);
2844   /* This diagnostic makes more sense if it is tagged to the line
2845      of the token we just peeked at.  */
2846   cp_lexer_set_source_position_from_token (token);
2847 
2848   if (token->type == CPP_PRAGMA)
2849     {
2850       error_at (token->location,
2851 		"%<#pragma%> is not allowed here");
2852       cp_parser_skip_to_pragma_eol (parser, token);
2853       return;
2854     }
2855 
2856   /* If this is actually a conflict marker, report it as such.  */
2857   if (token->type == CPP_LSHIFT
2858       || token->type == CPP_RSHIFT
2859       || token->type == CPP_EQ_EQ)
2860     {
2861       location_t loc;
2862       if (cp_lexer_peek_conflict_marker (parser->lexer, token->type, &loc))
2863 	{
2864 	  error_at (loc, "version control conflict marker in file");
2865 	  return;
2866 	}
2867     }
2868 
2869   gcc_rich_location richloc (input_location);
2870 
2871   bool added_matching_location = false;
2872 
2873   if (missing_token_desc != RT_NONE)
2874     {
2875       /* Potentially supply a fix-it hint, suggesting to add the
2876 	 missing token immediately after the *previous* token.
2877 	 This may move the primary location within richloc.  */
2878       enum cpp_ttype ttype = get_required_cpp_ttype (missing_token_desc);
2879       location_t prev_token_loc
2880 	= cp_lexer_previous_token (parser->lexer)->location;
2881       maybe_suggest_missing_token_insertion (&richloc, ttype, prev_token_loc);
2882 
2883       /* If matching_location != UNKNOWN_LOCATION, highlight it.
2884 	 Attempt to consolidate diagnostics by printing it as a
2885 	secondary range within the main diagnostic.  */
2886       if (matching_location != UNKNOWN_LOCATION)
2887 	added_matching_location
2888 	  = richloc.add_location_if_nearby (matching_location);
2889     }
2890 
2891   /* Actually emit the error.  */
2892   c_parse_error (gmsgid,
2893 		 /* Because c_parser_error does not understand
2894 		    CPP_KEYWORD, keywords are treated like
2895 		    identifiers.  */
2896 		 (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
2897 		 token->u.value, token->flags, &richloc);
2898 
2899   if (missing_token_desc != RT_NONE)
2900     {
2901       /* If we weren't able to consolidate matching_location, then
2902 	 print it as a secondary diagnostic.  */
2903       if (matching_location != UNKNOWN_LOCATION
2904 	  && !added_matching_location)
2905 	inform (matching_location, "to match this %qs",
2906 		get_matching_symbol (missing_token_desc));
2907     }
2908 }
2909 
2910 /* If not parsing tentatively, issue a diagnostic of the form
2911       FILE:LINE: MESSAGE before TOKEN
2912    where TOKEN is the next token in the input stream.  MESSAGE
2913    (specified by the caller) is usually of the form "expected
2914    OTHER-TOKEN".  */
2915 
2916 static void
2917 cp_parser_error (cp_parser* parser, const char* gmsgid)
2918 {
2919   if (!cp_parser_simulate_error (parser))
2920     cp_parser_error_1 (parser, gmsgid, RT_NONE, UNKNOWN_LOCATION);
2921 }
2922 
2923 /* Issue an error about name-lookup failing.  NAME is the
2924    IDENTIFIER_NODE DECL is the result of
2925    the lookup (as returned from cp_parser_lookup_name).  DESIRED is
2926    the thing that we hoped to find.  */
2927 
2928 static void
2929 cp_parser_name_lookup_error (cp_parser* parser,
2930 			     tree name,
2931 			     tree decl,
2932 			     name_lookup_error desired,
2933 			     location_t location)
2934 {
2935   /* If name lookup completely failed, tell the user that NAME was not
2936      declared.  */
2937   if (decl == error_mark_node)
2938     {
2939       if (parser->scope && parser->scope != global_namespace)
2940 	error_at (location, "%<%E::%E%> has not been declared",
2941 		  parser->scope, name);
2942       else if (parser->scope == global_namespace)
2943 	error_at (location, "%<::%E%> has not been declared", name);
2944       else if (parser->object_scope
2945 	       && !CLASS_TYPE_P (parser->object_scope))
2946 	error_at (location, "request for member %qE in non-class type %qT",
2947 		  name, parser->object_scope);
2948       else if (parser->object_scope)
2949 	error_at (location, "%<%T::%E%> has not been declared",
2950 		  parser->object_scope, name);
2951       else
2952 	error_at (location, "%qE has not been declared", name);
2953     }
2954   else if (parser->scope && parser->scope != global_namespace)
2955     {
2956       switch (desired)
2957 	{
2958 	  case NLE_TYPE:
2959 	    error_at (location, "%<%E::%E%> is not a type",
2960 	    			parser->scope, name);
2961 	    break;
2962 	  case NLE_CXX98:
2963 	    error_at (location, "%<%E::%E%> is not a class or namespace",
2964 	    			parser->scope, name);
2965 	    break;
2966 	  case NLE_NOT_CXX98:
2967 	    error_at (location,
2968 	    	      "%<%E::%E%> is not a class, namespace, or enumeration",
2969 		      parser->scope, name);
2970 	    break;
2971 	  default:
2972 	    gcc_unreachable ();
2973 
2974 	}
2975     }
2976   else if (parser->scope == global_namespace)
2977     {
2978       switch (desired)
2979 	{
2980 	  case NLE_TYPE:
2981 	    error_at (location, "%<::%E%> is not a type", name);
2982 	    break;
2983 	  case NLE_CXX98:
2984 	    error_at (location, "%<::%E%> is not a class or namespace", name);
2985 	    break;
2986 	  case NLE_NOT_CXX98:
2987 	    error_at (location,
2988 		      "%<::%E%> is not a class, namespace, or enumeration",
2989 		      name);
2990 	    break;
2991 	  default:
2992 	    gcc_unreachable ();
2993 	}
2994     }
2995   else
2996     {
2997       switch (desired)
2998 	{
2999 	  case NLE_TYPE:
3000 	    error_at (location, "%qE is not a type", name);
3001 	    break;
3002 	  case NLE_CXX98:
3003 	    error_at (location, "%qE is not a class or namespace", name);
3004 	    break;
3005 	  case NLE_NOT_CXX98:
3006 	    error_at (location,
3007 		      "%qE is not a class, namespace, or enumeration", name);
3008 	    break;
3009 	  default:
3010 	    gcc_unreachable ();
3011 	}
3012     }
3013 }
3014 
3015 /* If we are parsing tentatively, remember that an error has occurred
3016    during this tentative parse.  Returns true if the error was
3017    simulated; false if a message should be issued by the caller.  */
3018 
3019 static bool
3020 cp_parser_simulate_error (cp_parser* parser)
3021 {
3022   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
3023     {
3024       parser->context->status = CP_PARSER_STATUS_KIND_ERROR;
3025       return true;
3026     }
3027   return false;
3028 }
3029 
3030 /* This function is called when a type is defined.  If type
3031    definitions are forbidden at this point, an error message is
3032    issued.  */
3033 
3034 static bool
3035 cp_parser_check_type_definition (cp_parser* parser)
3036 {
3037   /* If types are forbidden here, issue a message.  */
3038   if (parser->type_definition_forbidden_message)
3039     {
3040       /* Don't use `%s' to print the string, because quotations (`%<', `%>')
3041 	 in the message need to be interpreted.  */
3042       error (parser->type_definition_forbidden_message);
3043       return false;
3044     }
3045   return true;
3046 }
3047 
3048 /* This function is called when the DECLARATOR is processed.  The TYPE
3049    was a type defined in the decl-specifiers.  If it is invalid to
3050    define a type in the decl-specifiers for DECLARATOR, an error is
3051    issued. TYPE_LOCATION is the location of TYPE and is used
3052    for error reporting.  */
3053 
3054 static void
3055 cp_parser_check_for_definition_in_return_type (cp_declarator *declarator,
3056 					       tree type, location_t type_location)
3057 {
3058   /* [dcl.fct] forbids type definitions in return types.
3059      Unfortunately, it's not easy to know whether or not we are
3060      processing a return type until after the fact.  */
3061   while (declarator
3062 	 && (declarator->kind == cdk_pointer
3063 	     || declarator->kind == cdk_reference
3064 	     || declarator->kind == cdk_ptrmem))
3065     declarator = declarator->declarator;
3066   if (declarator
3067       && declarator->kind == cdk_function)
3068     {
3069       error_at (type_location,
3070 		"new types may not be defined in a return type");
3071       inform (type_location,
3072 	      "(perhaps a semicolon is missing after the definition of %qT)",
3073 	      type);
3074     }
3075 }
3076 
3077 /* A type-specifier (TYPE) has been parsed which cannot be followed by
3078    "<" in any valid C++ program.  If the next token is indeed "<",
3079    issue a message warning the user about what appears to be an
3080    invalid attempt to form a template-id. LOCATION is the location
3081    of the type-specifier (TYPE) */
3082 
3083 static void
3084 cp_parser_check_for_invalid_template_id (cp_parser* parser,
3085 					 tree type,
3086 					 enum tag_types tag_type,
3087 					 location_t location)
3088 {
3089   cp_token_position start = 0;
3090 
3091   if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3092     {
3093       if (TREE_CODE (type) == TYPE_DECL)
3094 	type = TREE_TYPE (type);
3095       if (TYPE_P (type) && !template_placeholder_p (type))
3096 	error_at (location, "%qT is not a template", type);
3097       else if (identifier_p (type))
3098 	{
3099 	  if (tag_type != none_type)
3100 	    error_at (location, "%qE is not a class template", type);
3101 	  else
3102 	    error_at (location, "%qE is not a template", type);
3103 	}
3104       else
3105 	error_at (location, "invalid template-id");
3106       /* Remember the location of the invalid "<".  */
3107       if (cp_parser_uncommitted_to_tentative_parse_p (parser))
3108 	start = cp_lexer_token_position (parser->lexer, true);
3109       /* Consume the "<".  */
3110       cp_lexer_consume_token (parser->lexer);
3111       /* Parse the template arguments.  */
3112       cp_parser_enclosed_template_argument_list (parser);
3113       /* Permanently remove the invalid template arguments so that
3114 	 this error message is not issued again.  */
3115       if (start)
3116 	cp_lexer_purge_tokens_after (parser->lexer, start);
3117     }
3118 }
3119 
3120 /* If parsing an integral constant-expression, issue an error message
3121    about the fact that THING appeared and return true.  Otherwise,
3122    return false.  In either case, set
3123    PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P.  */
3124 
3125 static bool
3126 cp_parser_non_integral_constant_expression (cp_parser  *parser,
3127 					    non_integral_constant thing)
3128 {
3129   parser->non_integral_constant_expression_p = true;
3130   if (parser->integral_constant_expression_p)
3131     {
3132       if (!parser->allow_non_integral_constant_expression_p)
3133 	{
3134 	  const char *msg = NULL;
3135 	  switch (thing)
3136 	    {
3137   	      case NIC_FLOAT:
3138 		pedwarn (input_location, OPT_Wpedantic,
3139 			 "ISO C++ forbids using a floating-point literal "
3140 			 "in a constant-expression");
3141 		return true;
3142 	      case NIC_CAST:
3143 		error ("a cast to a type other than an integral or "
3144 		       "enumeration type cannot appear in a "
3145 		       "constant-expression");
3146 		return true;
3147 	      case NIC_TYPEID:
3148 		error ("%<typeid%> operator "
3149 		       "cannot appear in a constant-expression");
3150 		return true;
3151 	      case NIC_NCC:
3152 		error ("non-constant compound literals "
3153 		       "cannot appear in a constant-expression");
3154 		return true;
3155 	      case NIC_FUNC_CALL:
3156 		error ("a function call "
3157 		       "cannot appear in a constant-expression");
3158 		return true;
3159 	      case NIC_INC:
3160 		error ("an increment "
3161 		       "cannot appear in a constant-expression");
3162 		return true;
3163 	      case NIC_DEC:
3164 		error ("an decrement "
3165 		       "cannot appear in a constant-expression");
3166 		return true;
3167 	      case NIC_ARRAY_REF:
3168 		error ("an array reference "
3169 		       "cannot appear in a constant-expression");
3170 		return true;
3171 	      case NIC_ADDR_LABEL:
3172 		error ("the address of a label "
3173 		       "cannot appear in a constant-expression");
3174 		return true;
3175 	      case NIC_OVERLOADED:
3176 		error ("calls to overloaded operators "
3177 		       "cannot appear in a constant-expression");
3178 		return true;
3179 	      case NIC_ASSIGNMENT:
3180 		error ("an assignment cannot appear in a constant-expression");
3181 		return true;
3182 	      case NIC_COMMA:
3183 		error ("a comma operator "
3184 		       "cannot appear in a constant-expression");
3185 		return true;
3186 	      case NIC_CONSTRUCTOR:
3187 		error ("a call to a constructor "
3188 		       "cannot appear in a constant-expression");
3189 		return true;
3190 	      case NIC_TRANSACTION:
3191 		error ("a transaction expression "
3192 		       "cannot appear in a constant-expression");
3193 		return true;
3194 	      case NIC_THIS:
3195 		msg = "this";
3196 		break;
3197 	      case NIC_FUNC_NAME:
3198 		msg = "__FUNCTION__";
3199 		break;
3200   	      case NIC_PRETTY_FUNC:
3201 		msg = "__PRETTY_FUNCTION__";
3202 		break;
3203 	      case NIC_C99_FUNC:
3204 		msg = "__func__";
3205 		break;
3206 	      case NIC_VA_ARG:
3207 		msg = "va_arg";
3208 		break;
3209 	      case NIC_ARROW:
3210 		msg = "->";
3211 		break;
3212 	      case NIC_POINT:
3213 		msg = ".";
3214 		break;
3215 	      case NIC_STAR:
3216 		msg = "*";
3217 		break;
3218 	      case NIC_ADDR:
3219 		msg = "&";
3220 		break;
3221 	      case NIC_PREINCREMENT:
3222 		msg = "++";
3223 		break;
3224 	      case NIC_PREDECREMENT:
3225 		msg = "--";
3226 		break;
3227 	      case NIC_NEW:
3228 		msg = "new";
3229 		break;
3230 	      case NIC_DEL:
3231 		msg = "delete";
3232 		break;
3233 	      default:
3234 		gcc_unreachable ();
3235 	    }
3236 	  if (msg)
3237 	    error ("%qs cannot appear in a constant-expression", msg);
3238 	  return true;
3239 	}
3240     }
3241   return false;
3242 }
3243 
3244 /* Emit a diagnostic for an invalid type name.  This function commits
3245    to the current active tentative parse, if any.  (Otherwise, the
3246    problematic construct might be encountered again later, resulting
3247    in duplicate error messages.) LOCATION is the location of ID.  */
3248 
3249 static void
3250 cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree id,
3251 				      location_t location)
3252 {
3253   tree decl, ambiguous_decls;
3254   cp_parser_commit_to_tentative_parse (parser);
3255   /* Try to lookup the identifier.  */
3256   decl = cp_parser_lookup_name (parser, id, none_type,
3257 				/*is_template=*/false,
3258 				/*is_namespace=*/false,
3259 				/*check_dependency=*/true,
3260 				&ambiguous_decls, location);
3261   if (ambiguous_decls)
3262     /* If the lookup was ambiguous, an error will already have
3263        been issued.  */
3264     return;
3265   /* If the lookup found a template-name, it means that the user forgot
3266   to specify an argument list. Emit a useful error message.  */
3267   if (DECL_TYPE_TEMPLATE_P (decl))
3268     {
3269       error_at (location,
3270 		"invalid use of template-name %qE without an argument list",
3271 		decl);
3272       if (DECL_CLASS_TEMPLATE_P (decl) && cxx_dialect < cxx17)
3273 	inform (location, "class template argument deduction is only available "
3274 		"with -std=c++17 or -std=gnu++17");
3275       inform (DECL_SOURCE_LOCATION (decl), "%qD declared here", decl);
3276     }
3277   else if (TREE_CODE (id) == BIT_NOT_EXPR)
3278     error_at (location, "invalid use of destructor %qD as a type", id);
3279   else if (TREE_CODE (decl) == TYPE_DECL)
3280     /* Something like 'unsigned A a;'  */
3281     error_at (location, "invalid combination of multiple type-specifiers");
3282   else if (!parser->scope)
3283     {
3284       /* Issue an error message.  */
3285       name_hint hint;
3286       if (TREE_CODE (id) == IDENTIFIER_NODE)
3287 	hint = lookup_name_fuzzy (id, FUZZY_LOOKUP_TYPENAME, location);
3288       if (hint)
3289 	{
3290 	  gcc_rich_location richloc (location);
3291 	  richloc.add_fixit_replace (hint.suggestion ());
3292 	  error_at (&richloc,
3293 		    "%qE does not name a type; did you mean %qs?",
3294 		    id, hint.suggestion ());
3295 	}
3296       else
3297 	error_at (location, "%qE does not name a type", id);
3298       /* If we're in a template class, it's possible that the user was
3299 	 referring to a type from a base class.  For example:
3300 
3301 	   template <typename T> struct A { typedef T X; };
3302 	   template <typename T> struct B : public A<T> { X x; };
3303 
3304 	 The user should have said "typename A<T>::X".  */
3305       if (cxx_dialect < cxx11 && id == ridpointers[(int)RID_CONSTEXPR])
3306 	inform (location, "C++11 %<constexpr%> only available with "
3307 		"-std=c++11 or -std=gnu++11");
3308       else if (cxx_dialect < cxx11 && id == ridpointers[(int)RID_NOEXCEPT])
3309 	inform (location, "C++11 %<noexcept%> only available with "
3310 		"-std=c++11 or -std=gnu++11");
3311       else if (cxx_dialect < cxx11
3312 	       && TREE_CODE (id) == IDENTIFIER_NODE
3313 	       && id_equal (id, "thread_local"))
3314 	inform (location, "C++11 %<thread_local%> only available with "
3315 		"-std=c++11 or -std=gnu++11");
3316       else if (!flag_concepts && id == ridpointers[(int)RID_CONCEPT])
3317 	inform (location, "%<concept%> only available with -fconcepts");
3318       else if (processing_template_decl && current_class_type
3319 	       && TYPE_BINFO (current_class_type))
3320 	{
3321 	  tree b;
3322 
3323 	  for (b = TREE_CHAIN (TYPE_BINFO (current_class_type));
3324 	       b;
3325 	       b = TREE_CHAIN (b))
3326 	    {
3327 	      tree base_type = BINFO_TYPE (b);
3328 	      if (CLASS_TYPE_P (base_type)
3329 		  && dependent_type_p (base_type))
3330 		{
3331 		  tree field;
3332 		  /* Go from a particular instantiation of the
3333 		     template (which will have an empty TYPE_FIELDs),
3334 		     to the main version.  */
3335 		  base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
3336 		  for (field = TYPE_FIELDS (base_type);
3337 		       field;
3338 		       field = DECL_CHAIN (field))
3339 		    if (TREE_CODE (field) == TYPE_DECL
3340 			&& DECL_NAME (field) == id)
3341 		      {
3342 			inform (location,
3343 				"(perhaps %<typename %T::%E%> was intended)",
3344 				BINFO_TYPE (b), id);
3345 			break;
3346 		      }
3347 		  if (field)
3348 		    break;
3349 		}
3350 	    }
3351 	}
3352     }
3353   /* Here we diagnose qualified-ids where the scope is actually correct,
3354      but the identifier does not resolve to a valid type name.  */
3355   else if (parser->scope != error_mark_node)
3356     {
3357       if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
3358 	{
3359 	  if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3360 	    error_at (location_of (id),
3361 		      "%qE in namespace %qE does not name a template type",
3362 		      id, parser->scope);
3363 	  else if (TREE_CODE (id) == TEMPLATE_ID_EXPR)
3364 	    error_at (location_of (id),
3365 		      "%qE in namespace %qE does not name a template type",
3366 		      TREE_OPERAND (id, 0), parser->scope);
3367 	  else
3368 	    error_at (location_of (id),
3369 		      "%qE in namespace %qE does not name a type",
3370 		      id, parser->scope);
3371 	  if (DECL_P (decl))
3372 	    inform (DECL_SOURCE_LOCATION (decl), "%qD declared here", decl);
3373 	  else if (decl == error_mark_node)
3374 	    suggest_alternative_in_explicit_scope (location, id,
3375 						   parser->scope);
3376 	}
3377       else if (CLASS_TYPE_P (parser->scope)
3378 	       && constructor_name_p (id, parser->scope))
3379 	{
3380 	  /* A<T>::A<T>() */
3381 	  error_at (location, "%<%T::%E%> names the constructor, not"
3382 		    " the type", parser->scope, id);
3383 	  if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3384 	    error_at (location, "and %qT has no template constructors",
3385 		      parser->scope);
3386 	}
3387       else if (TYPE_P (parser->scope)
3388 	       && dependent_scope_p (parser->scope))
3389 	{
3390 	  if (TREE_CODE (parser->scope) == TYPENAME_TYPE)
3391 	    error_at (location,
3392 		      "need %<typename%> before %<%T::%D::%E%> because "
3393 		      "%<%T::%D%> is a dependent scope",
3394 		      TYPE_CONTEXT (parser->scope),
3395 		      TYPENAME_TYPE_FULLNAME (parser->scope),
3396 		      id,
3397 		      TYPE_CONTEXT (parser->scope),
3398 		      TYPENAME_TYPE_FULLNAME (parser->scope));
3399 	  else
3400 	    error_at (location, "need %<typename%> before %<%T::%E%> because "
3401 		      "%qT is a dependent scope",
3402 		      parser->scope, id, parser->scope);
3403 	}
3404       else if (TYPE_P (parser->scope))
3405 	{
3406 	  if (!COMPLETE_TYPE_P (parser->scope))
3407 	    cxx_incomplete_type_error (location_of (id), NULL_TREE,
3408 				       parser->scope);
3409 	  else if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
3410 	    error_at (location_of (id),
3411 		      "%qE in %q#T does not name a template type",
3412 		      id, parser->scope);
3413 	  else if (TREE_CODE (id) == TEMPLATE_ID_EXPR)
3414 	    error_at (location_of (id),
3415 		      "%qE in %q#T does not name a template type",
3416 		      TREE_OPERAND (id, 0), parser->scope);
3417 	  else
3418 	    error_at (location_of (id),
3419 		      "%qE in %q#T does not name a type",
3420 		      id, parser->scope);
3421 	  if (DECL_P (decl))
3422 	    inform (DECL_SOURCE_LOCATION (decl), "%qD declared here", decl);
3423 	}
3424       else
3425 	gcc_unreachable ();
3426     }
3427 }
3428 
3429 /* Check for a common situation where a type-name should be present,
3430    but is not, and issue a sensible error message.  Returns true if an
3431    invalid type-name was detected.
3432 
3433    The situation handled by this function are variable declarations of the
3434    form `ID a', where `ID' is an id-expression and `a' is a plain identifier.
3435    Usually, `ID' should name a type, but if we got here it means that it
3436    does not. We try to emit the best possible error message depending on
3437    how exactly the id-expression looks like.  */
3438 
3439 static bool
3440 cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
3441 {
3442   tree id;
3443   cp_token *token = cp_lexer_peek_token (parser->lexer);
3444 
3445   /* Avoid duplicate error about ambiguous lookup.  */
3446   if (token->type == CPP_NESTED_NAME_SPECIFIER)
3447     {
3448       cp_token *next = cp_lexer_peek_nth_token (parser->lexer, 2);
3449       if (next->type == CPP_NAME && next->error_reported)
3450 	goto out;
3451     }
3452 
3453   cp_parser_parse_tentatively (parser);
3454   id = cp_parser_id_expression (parser,
3455 				/*template_keyword_p=*/false,
3456 				/*check_dependency_p=*/true,
3457 				/*template_p=*/NULL,
3458 				/*declarator_p=*/false,
3459 				/*optional_p=*/false);
3460   /* If the next token is a (, this is a function with no explicit return
3461      type, i.e. constructor, destructor or conversion op.  */
3462   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
3463       || TREE_CODE (id) == TYPE_DECL)
3464     {
3465       cp_parser_abort_tentative_parse (parser);
3466       return false;
3467     }
3468   if (!cp_parser_parse_definitely (parser))
3469     return false;
3470 
3471   /* Emit a diagnostic for the invalid type.  */
3472   cp_parser_diagnose_invalid_type_name (parser, id, token->location);
3473  out:
3474   /* If we aren't in the middle of a declarator (i.e. in a
3475      parameter-declaration-clause), skip to the end of the declaration;
3476      there's no point in trying to process it.  */
3477   if (!parser->in_declarator_p)
3478     cp_parser_skip_to_end_of_block_or_statement (parser);
3479   return true;
3480 }
3481 
3482 /* Consume tokens up to, and including, the next non-nested closing `)'.
3483    Returns 1 iff we found a closing `)'.  RECOVERING is true, if we
3484    are doing error recovery. Returns -1 if OR_TTYPE is not CPP_EOF and we
3485    found an unnested token of that type.  */
3486 
3487 static int
3488 cp_parser_skip_to_closing_parenthesis_1 (cp_parser *parser,
3489 					 bool recovering,
3490 					 cpp_ttype or_ttype,
3491 					 bool consume_paren)
3492 {
3493   unsigned paren_depth = 0;
3494   unsigned brace_depth = 0;
3495   unsigned square_depth = 0;
3496 
3497   if (recovering && or_ttype == CPP_EOF
3498       && cp_parser_uncommitted_to_tentative_parse_p (parser))
3499     return 0;
3500 
3501   while (true)
3502     {
3503       cp_token * token = cp_lexer_peek_token (parser->lexer);
3504 
3505       /* Have we found what we're looking for before the closing paren?  */
3506       if (token->type == or_ttype && or_ttype != CPP_EOF
3507 	  && !brace_depth && !paren_depth && !square_depth)
3508 	return -1;
3509 
3510       switch (token->type)
3511 	{
3512 	case CPP_EOF:
3513 	case CPP_PRAGMA_EOL:
3514 	  /* If we've run out of tokens, then there is no closing `)'.  */
3515 	  return 0;
3516 
3517         /* This is good for lambda expression capture-lists.  */
3518         case CPP_OPEN_SQUARE:
3519           ++square_depth;
3520           break;
3521         case CPP_CLOSE_SQUARE:
3522           if (!square_depth--)
3523             return 0;
3524           break;
3525 
3526 	case CPP_SEMICOLON:
3527 	  /* This matches the processing in skip_to_end_of_statement.  */
3528 	  if (!brace_depth)
3529 	    return 0;
3530 	  break;
3531 
3532 	case CPP_OPEN_BRACE:
3533 	  ++brace_depth;
3534 	  break;
3535 	case CPP_CLOSE_BRACE:
3536 	  if (!brace_depth--)
3537 	    return 0;
3538 	  break;
3539 
3540 	case CPP_OPEN_PAREN:
3541 	  if (!brace_depth)
3542 	    ++paren_depth;
3543 	  break;
3544 
3545 	case CPP_CLOSE_PAREN:
3546 	  if (!brace_depth && !paren_depth--)
3547 	    {
3548 	      if (consume_paren)
3549 		cp_lexer_consume_token (parser->lexer);
3550 	      return 1;
3551 	    }
3552 	  break;
3553 
3554 	default:
3555 	  break;
3556 	}
3557 
3558       /* Consume the token.  */
3559       cp_lexer_consume_token (parser->lexer);
3560     }
3561 }
3562 
3563 /* Consume tokens up to, and including, the next non-nested closing `)'.
3564    Returns 1 iff we found a closing `)'.  RECOVERING is true, if we
3565    are doing error recovery. Returns -1 if OR_COMMA is true and we
3566    found an unnested token of that type.  */
3567 
3568 static int
3569 cp_parser_skip_to_closing_parenthesis (cp_parser *parser,
3570 				       bool recovering,
3571 				       bool or_comma,
3572 				       bool consume_paren)
3573 {
3574   cpp_ttype ttype = or_comma ? CPP_COMMA : CPP_EOF;
3575   return cp_parser_skip_to_closing_parenthesis_1 (parser, recovering,
3576 						  ttype, consume_paren);
3577 }
3578 
3579 /* Consume tokens until we reach the end of the current statement.
3580    Normally, that will be just before consuming a `;'.  However, if a
3581    non-nested `}' comes first, then we stop before consuming that.  */
3582 
3583 static void
3584 cp_parser_skip_to_end_of_statement (cp_parser* parser)
3585 {
3586   unsigned nesting_depth = 0;
3587 
3588   /* Unwind generic function template scope if necessary.  */
3589   if (parser->fully_implicit_function_template_p)
3590     abort_fully_implicit_template (parser);
3591 
3592   while (true)
3593     {
3594       cp_token *token = cp_lexer_peek_token (parser->lexer);
3595 
3596       switch (token->type)
3597 	{
3598 	case CPP_EOF:
3599 	case CPP_PRAGMA_EOL:
3600 	  /* If we've run out of tokens, stop.  */
3601 	  return;
3602 
3603 	case CPP_SEMICOLON:
3604 	  /* If the next token is a `;', we have reached the end of the
3605 	     statement.  */
3606 	  if (!nesting_depth)
3607 	    return;
3608 	  break;
3609 
3610 	case CPP_CLOSE_BRACE:
3611 	  /* If this is a non-nested '}', stop before consuming it.
3612 	     That way, when confronted with something like:
3613 
3614 	       { 3 + }
3615 
3616 	     we stop before consuming the closing '}', even though we
3617 	     have not yet reached a `;'.  */
3618 	  if (nesting_depth == 0)
3619 	    return;
3620 
3621 	  /* If it is the closing '}' for a block that we have
3622 	     scanned, stop -- but only after consuming the token.
3623 	     That way given:
3624 
3625 		void f g () { ... }
3626 		typedef int I;
3627 
3628 	     we will stop after the body of the erroneously declared
3629 	     function, but before consuming the following `typedef'
3630 	     declaration.  */
3631 	  if (--nesting_depth == 0)
3632 	    {
3633 	      cp_lexer_consume_token (parser->lexer);
3634 	      return;
3635 	    }
3636 	  break;
3637 
3638 	case CPP_OPEN_BRACE:
3639 	  ++nesting_depth;
3640 	  break;
3641 
3642 	default:
3643 	  break;
3644 	}
3645 
3646       /* Consume the token.  */
3647       cp_lexer_consume_token (parser->lexer);
3648     }
3649 }
3650 
3651 /* This function is called at the end of a statement or declaration.
3652    If the next token is a semicolon, it is consumed; otherwise, error
3653    recovery is attempted.  */
3654 
3655 static void
3656 cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
3657 {
3658   /* Look for the trailing `;'.  */
3659   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
3660     {
3661       /* If there is additional (erroneous) input, skip to the end of
3662 	 the statement.  */
3663       cp_parser_skip_to_end_of_statement (parser);
3664       /* If the next token is now a `;', consume it.  */
3665       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
3666 	cp_lexer_consume_token (parser->lexer);
3667     }
3668 }
3669 
3670 /* Skip tokens until we have consumed an entire block, or until we
3671    have consumed a non-nested `;'.  */
3672 
3673 static void
3674 cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
3675 {
3676   int nesting_depth = 0;
3677 
3678   /* Unwind generic function template scope if necessary.  */
3679   if (parser->fully_implicit_function_template_p)
3680     abort_fully_implicit_template (parser);
3681 
3682   while (nesting_depth >= 0)
3683     {
3684       cp_token *token = cp_lexer_peek_token (parser->lexer);
3685 
3686       switch (token->type)
3687 	{
3688 	case CPP_EOF:
3689 	case CPP_PRAGMA_EOL:
3690 	  /* If we've run out of tokens, stop.  */
3691 	  return;
3692 
3693 	case CPP_SEMICOLON:
3694 	  /* Stop if this is an unnested ';'. */
3695 	  if (!nesting_depth)
3696 	    nesting_depth = -1;
3697 	  break;
3698 
3699 	case CPP_CLOSE_BRACE:
3700 	  /* Stop if this is an unnested '}', or closes the outermost
3701 	     nesting level.  */
3702 	  nesting_depth--;
3703 	  if (nesting_depth < 0)
3704 	    return;
3705 	  if (!nesting_depth)
3706 	    nesting_depth = -1;
3707 	  break;
3708 
3709 	case CPP_OPEN_BRACE:
3710 	  /* Nest. */
3711 	  nesting_depth++;
3712 	  break;
3713 
3714 	default:
3715 	  break;
3716 	}
3717 
3718       /* Consume the token.  */
3719       cp_lexer_consume_token (parser->lexer);
3720     }
3721 }
3722 
3723 /* Skip tokens until a non-nested closing curly brace is the next
3724    token, or there are no more tokens. Return true in the first case,
3725    false otherwise.  */
3726 
3727 static bool
3728 cp_parser_skip_to_closing_brace (cp_parser *parser)
3729 {
3730   unsigned nesting_depth = 0;
3731 
3732   while (true)
3733     {
3734       cp_token *token = cp_lexer_peek_token (parser->lexer);
3735 
3736       switch (token->type)
3737 	{
3738 	case CPP_EOF:
3739 	case CPP_PRAGMA_EOL:
3740 	  /* If we've run out of tokens, stop.  */
3741 	  return false;
3742 
3743 	case CPP_CLOSE_BRACE:
3744 	  /* If the next token is a non-nested `}', then we have reached
3745 	     the end of the current block.  */
3746 	  if (nesting_depth-- == 0)
3747 	    return true;
3748 	  break;
3749 
3750 	case CPP_OPEN_BRACE:
3751 	  /* If it the next token is a `{', then we are entering a new
3752 	     block.  Consume the entire block.  */
3753 	  ++nesting_depth;
3754 	  break;
3755 
3756 	default:
3757 	  break;
3758 	}
3759 
3760       /* Consume the token.  */
3761       cp_lexer_consume_token (parser->lexer);
3762     }
3763 }
3764 
3765 /* Consume tokens until we reach the end of the pragma.  The PRAGMA_TOK
3766    parameter is the PRAGMA token, allowing us to purge the entire pragma
3767    sequence.  */
3768 
3769 static void
3770 cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
3771 {
3772   cp_token *token;
3773 
3774   parser->lexer->in_pragma = false;
3775 
3776   do
3777     token = cp_lexer_consume_token (parser->lexer);
3778   while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
3779 
3780   /* Ensure that the pragma is not parsed again.  */
3781   cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
3782 }
3783 
3784 /* Require pragma end of line, resyncing with it as necessary.  The
3785    arguments are as for cp_parser_skip_to_pragma_eol.  */
3786 
3787 static void
3788 cp_parser_require_pragma_eol (cp_parser *parser, cp_token *pragma_tok)
3789 {
3790   parser->lexer->in_pragma = false;
3791   if (!cp_parser_require (parser, CPP_PRAGMA_EOL, RT_PRAGMA_EOL))
3792     cp_parser_skip_to_pragma_eol (parser, pragma_tok);
3793 }
3794 
3795 /* This is a simple wrapper around make_typename_type. When the id is
3796    an unresolved identifier node, we can provide a superior diagnostic
3797    using cp_parser_diagnose_invalid_type_name.  */
3798 
3799 static tree
3800 cp_parser_make_typename_type (cp_parser *parser, tree id,
3801 			      location_t id_location)
3802 {
3803   tree result;
3804   if (identifier_p (id))
3805     {
3806       result = make_typename_type (parser->scope, id, typename_type,
3807 				   /*complain=*/tf_none);
3808       if (result == error_mark_node)
3809 	cp_parser_diagnose_invalid_type_name (parser, id, id_location);
3810       return result;
3811     }
3812   return make_typename_type (parser->scope, id, typename_type, tf_error);
3813 }
3814 
3815 /* This is a wrapper around the
3816    make_{pointer,ptrmem,reference}_declarator functions that decides
3817    which one to call based on the CODE and CLASS_TYPE arguments. The
3818    CODE argument should be one of the values returned by
3819    cp_parser_ptr_operator.  ATTRIBUTES represent the attributes that
3820    appertain to the pointer or reference.  */
3821 
3822 static cp_declarator *
3823 cp_parser_make_indirect_declarator (enum tree_code code, tree class_type,
3824 				    cp_cv_quals cv_qualifiers,
3825 				    cp_declarator *target,
3826 				    tree attributes)
3827 {
3828   if (code == ERROR_MARK || target == cp_error_declarator)
3829     return cp_error_declarator;
3830 
3831   if (code == INDIRECT_REF)
3832     if (class_type == NULL_TREE)
3833       return make_pointer_declarator (cv_qualifiers, target, attributes);
3834     else
3835       return make_ptrmem_declarator (cv_qualifiers, class_type,
3836 				     target, attributes);
3837   else if (code == ADDR_EXPR && class_type == NULL_TREE)
3838     return make_reference_declarator (cv_qualifiers, target,
3839 				      false, attributes);
3840   else if (code == NON_LVALUE_EXPR && class_type == NULL_TREE)
3841     return make_reference_declarator (cv_qualifiers, target,
3842 				      true, attributes);
3843   gcc_unreachable ();
3844 }
3845 
3846 /* Create a new C++ parser.  */
3847 
3848 static cp_parser *
3849 cp_parser_new (void)
3850 {
3851   cp_parser *parser;
3852   cp_lexer *lexer;
3853   unsigned i;
3854 
3855   /* cp_lexer_new_main is called before doing GC allocation because
3856      cp_lexer_new_main might load a PCH file.  */
3857   lexer = cp_lexer_new_main ();
3858 
3859   /* Initialize the binops_by_token so that we can get the tree
3860      directly from the token.  */
3861   for (i = 0; i < sizeof (binops) / sizeof (binops[0]); i++)
3862     binops_by_token[binops[i].token_type] = binops[i];
3863 
3864   parser = ggc_cleared_alloc<cp_parser> ();
3865   parser->lexer = lexer;
3866   parser->context = cp_parser_context_new (NULL);
3867 
3868   /* For now, we always accept GNU extensions.  */
3869   parser->allow_gnu_extensions_p = 1;
3870 
3871   /* The `>' token is a greater-than operator, not the end of a
3872      template-id.  */
3873   parser->greater_than_is_operator_p = true;
3874 
3875   parser->default_arg_ok_p = true;
3876 
3877   /* We are not parsing a constant-expression.  */
3878   parser->integral_constant_expression_p = false;
3879   parser->allow_non_integral_constant_expression_p = false;
3880   parser->non_integral_constant_expression_p = false;
3881 
3882   /* Local variable names are not forbidden.  */
3883   parser->local_variables_forbidden_p = false;
3884 
3885   /* We are not processing an `extern "C"' declaration.  */
3886   parser->in_unbraced_linkage_specification_p = false;
3887 
3888   /* We are not processing a declarator.  */
3889   parser->in_declarator_p = false;
3890 
3891   /* We are not processing a template-argument-list.  */
3892   parser->in_template_argument_list_p = false;
3893 
3894   /* We are not in an iteration statement.  */
3895   parser->in_statement = 0;
3896 
3897   /* We are not in a switch statement.  */
3898   parser->in_switch_statement_p = false;
3899 
3900   /* We are not parsing a type-id inside an expression.  */
3901   parser->in_type_id_in_expr_p = false;
3902 
3903   /* Declarations aren't implicitly extern "C".  */
3904   parser->implicit_extern_c = false;
3905 
3906   /* String literals should be translated to the execution character set.  */
3907   parser->translate_strings_p = true;
3908 
3909   /* We are not parsing a function body.  */
3910   parser->in_function_body = false;
3911 
3912   /* We can correct until told otherwise.  */
3913   parser->colon_corrects_to_scope_p = true;
3914 
3915   /* The unparsed function queue is empty.  */
3916   push_unparsed_function_queues (parser);
3917 
3918   /* There are no classes being defined.  */
3919   parser->num_classes_being_defined = 0;
3920 
3921   /* No template parameters apply.  */
3922   parser->num_template_parameter_lists = 0;
3923 
3924   /* Special parsing data structures.  */
3925   parser->omp_declare_simd = NULL;
3926   parser->oacc_routine = NULL;
3927 
3928   /* Not declaring an implicit function template.  */
3929   parser->auto_is_implicit_function_template_parm_p = false;
3930   parser->fully_implicit_function_template_p = false;
3931   parser->implicit_template_parms = 0;
3932   parser->implicit_template_scope = 0;
3933 
3934   /* Allow constrained-type-specifiers. */
3935   parser->prevent_constrained_type_specifiers = 0;
3936 
3937   /* We haven't yet seen an 'extern "C"'.  */
3938   parser->innermost_linkage_specification_location = UNKNOWN_LOCATION;
3939 
3940   return parser;
3941 }
3942 
3943 /* Create a cp_lexer structure which will emit the tokens in CACHE
3944    and push it onto the parser's lexer stack.  This is used for delayed
3945    parsing of in-class method bodies and default arguments, and should
3946    not be confused with tentative parsing.  */
3947 static void
3948 cp_parser_push_lexer_for_tokens (cp_parser *parser, cp_token_cache *cache)
3949 {
3950   cp_lexer *lexer = cp_lexer_new_from_tokens (cache);
3951   lexer->next = parser->lexer;
3952   parser->lexer = lexer;
3953 
3954   /* Move the current source position to that of the first token in the
3955      new lexer.  */
3956   cp_lexer_set_source_position_from_token (lexer->next_token);
3957 }
3958 
3959 /* Pop the top lexer off the parser stack.  This is never used for the
3960    "main" lexer, only for those pushed by cp_parser_push_lexer_for_tokens.  */
3961 static void
3962 cp_parser_pop_lexer (cp_parser *parser)
3963 {
3964   cp_lexer *lexer = parser->lexer;
3965   parser->lexer = lexer->next;
3966   cp_lexer_destroy (lexer);
3967 
3968   /* Put the current source position back where it was before this
3969      lexer was pushed.  */
3970   cp_lexer_set_source_position_from_token (parser->lexer->next_token);
3971 }
3972 
3973 /* Lexical conventions [gram.lex]  */
3974 
3975 /* Parse an identifier.  Returns an IDENTIFIER_NODE representing the
3976    identifier.  */
3977 
3978 static cp_expr
3979 cp_parser_identifier (cp_parser* parser)
3980 {
3981   cp_token *token;
3982 
3983   /* Look for the identifier.  */
3984   token = cp_parser_require (parser, CPP_NAME, RT_NAME);
3985   /* Return the value.  */
3986   if (token)
3987     return cp_expr (token->u.value, token->location);
3988   else
3989     return error_mark_node;
3990 }
3991 
3992 /* Parse a sequence of adjacent string constants.  Returns a
3993    TREE_STRING representing the combined, nul-terminated string
3994    constant.  If TRANSLATE is true, translate the string to the
3995    execution character set.  If WIDE_OK is true, a wide string is
3996    invalid here.
3997 
3998    C++98 [lex.string] says that if a narrow string literal token is
3999    adjacent to a wide string literal token, the behavior is undefined.
4000    However, C99 6.4.5p4 says that this results in a wide string literal.
4001    We follow C99 here, for consistency with the C front end.
4002 
4003    This code is largely lifted from lex_string() in c-lex.c.
4004 
4005    FUTURE: ObjC++ will need to handle @-strings here.  */
4006 static cp_expr
4007 cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok,
4008 			  bool lookup_udlit = true)
4009 {
4010   tree value;
4011   size_t count;
4012   struct obstack str_ob;
4013   cpp_string str, istr, *strs;
4014   cp_token *tok;
4015   enum cpp_ttype type, curr_type;
4016   int have_suffix_p = 0;
4017   tree string_tree;
4018   tree suffix_id = NULL_TREE;
4019   bool curr_tok_is_userdef_p = false;
4020 
4021   tok = cp_lexer_peek_token (parser->lexer);
4022   if (!cp_parser_is_string_literal (tok))
4023     {
4024       cp_parser_error (parser, "expected string-literal");
4025       return error_mark_node;
4026     }
4027 
4028   location_t loc = tok->location;
4029 
4030   if (cpp_userdef_string_p (tok->type))
4031     {
4032       string_tree = USERDEF_LITERAL_VALUE (tok->u.value);
4033       curr_type = cpp_userdef_string_remove_type (tok->type);
4034       curr_tok_is_userdef_p = true;
4035     }
4036   else
4037     {
4038       string_tree = tok->u.value;
4039       curr_type = tok->type;
4040     }
4041   type = curr_type;
4042 
4043   /* Try to avoid the overhead of creating and destroying an obstack
4044      for the common case of just one string.  */
4045   if (!cp_parser_is_string_literal
4046       (cp_lexer_peek_nth_token (parser->lexer, 2)))
4047     {
4048       cp_lexer_consume_token (parser->lexer);
4049 
4050       str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree);
4051       str.len = TREE_STRING_LENGTH (string_tree);
4052       count = 1;
4053 
4054       if (curr_tok_is_userdef_p)
4055 	{
4056 	  suffix_id = USERDEF_LITERAL_SUFFIX_ID (tok->u.value);
4057 	  have_suffix_p = 1;
4058 	  curr_type = cpp_userdef_string_remove_type (tok->type);
4059 	}
4060       else
4061 	curr_type = tok->type;
4062 
4063       strs = &str;
4064     }
4065   else
4066     {
4067       location_t last_tok_loc = tok->location;
4068       gcc_obstack_init (&str_ob);
4069       count = 0;
4070 
4071       do
4072 	{
4073 	  cp_lexer_consume_token (parser->lexer);
4074 	  count++;
4075 	  str.text = (const unsigned char *)TREE_STRING_POINTER (string_tree);
4076 	  str.len = TREE_STRING_LENGTH (string_tree);
4077 
4078 	  if (curr_tok_is_userdef_p)
4079 	    {
4080 	      tree curr_suffix_id = USERDEF_LITERAL_SUFFIX_ID (tok->u.value);
4081 	      if (have_suffix_p == 0)
4082 		{
4083 		  suffix_id = curr_suffix_id;
4084 		  have_suffix_p = 1;
4085 		}
4086 	      else if (have_suffix_p == 1
4087 		       && curr_suffix_id != suffix_id)
4088 		{
4089 		  error ("inconsistent user-defined literal suffixes"
4090 			 " %qD and %qD in string literal",
4091 			 suffix_id, curr_suffix_id);
4092 		  have_suffix_p = -1;
4093 		}
4094 	      curr_type = cpp_userdef_string_remove_type (tok->type);
4095 	    }
4096 	  else
4097 	    curr_type = tok->type;
4098 
4099 	  if (type != curr_type)
4100 	    {
4101 	      if (type == CPP_STRING)
4102 		type = curr_type;
4103 	      else if (curr_type != CPP_STRING)
4104 		{
4105 		  rich_location rich_loc (line_table, tok->location);
4106 		  rich_loc.add_range (last_tok_loc, false);
4107 		  error_at (&rich_loc,
4108 			    "unsupported non-standard concatenation "
4109 			    "of string literals");
4110 		}
4111 	    }
4112 
4113 	  obstack_grow (&str_ob, &str, sizeof (cpp_string));
4114 
4115 	  last_tok_loc = tok->location;
4116 
4117 	  tok = cp_lexer_peek_token (parser->lexer);
4118 	  if (cpp_userdef_string_p (tok->type))
4119 	    {
4120 	      string_tree = USERDEF_LITERAL_VALUE (tok->u.value);
4121 	      curr_type = cpp_userdef_string_remove_type (tok->type);
4122 	      curr_tok_is_userdef_p = true;
4123 	    }
4124 	  else
4125 	    {
4126 	      string_tree = tok->u.value;
4127 	      curr_type = tok->type;
4128 	      curr_tok_is_userdef_p = false;
4129 	    }
4130 	}
4131       while (cp_parser_is_string_literal (tok));
4132 
4133       /* A string literal built by concatenation has its caret=start at
4134 	 the start of the initial string, and its finish at the finish of
4135 	 the final string literal.  */
4136       loc = make_location (loc, loc, get_finish (last_tok_loc));
4137 
4138       strs = (cpp_string *) obstack_finish (&str_ob);
4139     }
4140 
4141   if (type != CPP_STRING && !wide_ok)
4142     {
4143       cp_parser_error (parser, "a wide string is invalid in this context");
4144       type = CPP_STRING;
4145     }
4146 
4147   if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate)
4148       (parse_in, strs, count, &istr, type))
4149     {
4150       value = build_string (istr.len, (const char *)istr.text);
4151       free (CONST_CAST (unsigned char *, istr.text));
4152 
4153       switch (type)
4154 	{
4155 	default:
4156 	case CPP_STRING:
4157 	case CPP_UTF8STRING:
4158 	  TREE_TYPE (value) = char_array_type_node;
4159 	  break;
4160 	case CPP_STRING16:
4161 	  TREE_TYPE (value) = char16_array_type_node;
4162 	  break;
4163 	case CPP_STRING32:
4164 	  TREE_TYPE (value) = char32_array_type_node;
4165 	  break;
4166 	case CPP_WSTRING:
4167 	  TREE_TYPE (value) = wchar_array_type_node;
4168 	  break;
4169 	}
4170 
4171       value = fix_string_type (value);
4172 
4173       if (have_suffix_p)
4174 	{
4175 	  tree literal = build_userdef_literal (suffix_id, value,
4176 						OT_NONE, NULL_TREE);
4177 	  if (lookup_udlit)
4178 	    value = cp_parser_userdef_string_literal (literal);
4179 	  else
4180 	    value = literal;
4181 	}
4182     }
4183   else
4184     /* cpp_interpret_string has issued an error.  */
4185     value = error_mark_node;
4186 
4187   if (count > 1)
4188     obstack_free (&str_ob, 0);
4189 
4190   return cp_expr (value, loc);
4191 }
4192 
4193 /* Look up a literal operator with the name and the exact arguments.  */
4194 
4195 static tree
4196 lookup_literal_operator (tree name, vec<tree, va_gc> *args)
4197 {
4198   tree decl;
4199   decl = lookup_name (name);
4200   if (!decl || !is_overloaded_fn (decl))
4201     return error_mark_node;
4202 
4203   for (lkp_iterator iter (decl); iter; ++iter)
4204     {
4205       unsigned int ix;
4206       bool found = true;
4207       tree fn = *iter;
4208       tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
4209       if (parmtypes != NULL_TREE)
4210 	{
4211 	  for (ix = 0; ix < vec_safe_length (args) && parmtypes != NULL_TREE;
4212 	       ++ix, parmtypes = TREE_CHAIN (parmtypes))
4213 	    {
4214 	      tree tparm = TREE_VALUE (parmtypes);
4215 	      tree targ = TREE_TYPE ((*args)[ix]);
4216 	      bool ptr = TYPE_PTR_P (tparm);
4217 	      bool arr = TREE_CODE (targ) == ARRAY_TYPE;
4218 	      if ((ptr || arr || !same_type_p (tparm, targ))
4219 		  && (!ptr || !arr
4220 		      || !same_type_p (TREE_TYPE (tparm),
4221 				       TREE_TYPE (targ))))
4222 		found = false;
4223 	    }
4224 	  if (found
4225 	      && ix == vec_safe_length (args)
4226 	      /* May be this should be sufficient_parms_p instead,
4227 		 depending on how exactly should user-defined literals
4228 		 work in presence of default arguments on the literal
4229 		 operator parameters.  */
4230 	      && parmtypes == void_list_node)
4231 	    return decl;
4232 	}
4233     }
4234 
4235   return error_mark_node;
4236 }
4237 
4238 /* Parse a user-defined char constant.  Returns a call to a user-defined
4239    literal operator taking the character as an argument.  */
4240 
4241 static cp_expr
4242 cp_parser_userdef_char_literal (cp_parser *parser)
4243 {
4244   cp_token *token = cp_lexer_consume_token (parser->lexer);
4245   tree literal = token->u.value;
4246   tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
4247   tree value = USERDEF_LITERAL_VALUE (literal);
4248   tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
4249   tree decl, result;
4250 
4251   /* Build up a call to the user-defined operator  */
4252   /* Lookup the name we got back from the id-expression.  */
4253   vec<tree, va_gc> *args = make_tree_vector ();
4254   vec_safe_push (args, value);
4255   decl = lookup_literal_operator (name, args);
4256   if (!decl || decl == error_mark_node)
4257     {
4258       error ("unable to find character literal operator %qD with %qT argument",
4259 	     name, TREE_TYPE (value));
4260       release_tree_vector (args);
4261       return error_mark_node;
4262     }
4263   result = finish_call_expr (decl, &args, false, true, tf_warning_or_error);
4264   release_tree_vector (args);
4265   return result;
4266 }
4267 
4268 /* A subroutine of cp_parser_userdef_numeric_literal to
4269    create a char... template parameter pack from a string node.  */
4270 
4271 static tree
4272 make_char_string_pack (tree value)
4273 {
4274   tree charvec;
4275   tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
4276   const char *str = TREE_STRING_POINTER (value);
4277   int i, len = TREE_STRING_LENGTH (value) - 1;
4278   tree argvec = make_tree_vec (1);
4279 
4280   /* Fill in CHARVEC with all of the parameters.  */
4281   charvec = make_tree_vec (len);
4282   for (i = 0; i < len; ++i)
4283     TREE_VEC_ELT (charvec, i) = build_int_cst (char_type_node, str[i]);
4284 
4285   /* Build the argument packs.  */
4286   SET_ARGUMENT_PACK_ARGS (argpack, charvec);
4287 
4288   TREE_VEC_ELT (argvec, 0) = argpack;
4289 
4290   return argvec;
4291 }
4292 
4293 /* A subroutine of cp_parser_userdef_numeric_literal to
4294    create a char... template parameter pack from a string node.  */
4295 
4296 static tree
4297 make_string_pack (tree value)
4298 {
4299   tree charvec;
4300   tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
4301   const unsigned char *str
4302     = (const unsigned char *) TREE_STRING_POINTER (value);
4303   int sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value))));
4304   int len = TREE_STRING_LENGTH (value) / sz - 1;
4305   tree argvec = make_tree_vec (2);
4306 
4307   tree str_char_type_node = TREE_TYPE (TREE_TYPE (value));
4308   str_char_type_node = TYPE_MAIN_VARIANT (str_char_type_node);
4309 
4310   /* First template parm is character type.  */
4311   TREE_VEC_ELT (argvec, 0) = str_char_type_node;
4312 
4313   /* Fill in CHARVEC with all of the parameters.  */
4314   charvec = make_tree_vec (len);
4315   for (int i = 0; i < len; ++i)
4316     TREE_VEC_ELT (charvec, i)
4317       = double_int_to_tree (str_char_type_node,
4318 			    double_int::from_buffer (str + i * sz, sz));
4319 
4320   /* Build the argument packs.  */
4321   SET_ARGUMENT_PACK_ARGS (argpack, charvec);
4322 
4323   TREE_VEC_ELT (argvec, 1) = argpack;
4324 
4325   return argvec;
4326 }
4327 
4328 /* Parse a user-defined numeric constant.  returns a call to a user-defined
4329    literal operator.  */
4330 
4331 static cp_expr
4332 cp_parser_userdef_numeric_literal (cp_parser *parser)
4333 {
4334   cp_token *token = cp_lexer_consume_token (parser->lexer);
4335   tree literal = token->u.value;
4336   tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
4337   tree value = USERDEF_LITERAL_VALUE (literal);
4338   int overflow = USERDEF_LITERAL_OVERFLOW (literal);
4339   tree num_string = USERDEF_LITERAL_NUM_STRING (literal);
4340   tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
4341   tree decl, result;
4342   vec<tree, va_gc> *args;
4343 
4344   /* Look for a literal operator taking the exact type of numeric argument
4345      as the literal value.  */
4346   args = make_tree_vector ();
4347   vec_safe_push (args, value);
4348   decl = lookup_literal_operator (name, args);
4349   if (decl && decl != error_mark_node)
4350     {
4351       result = finish_call_expr (decl, &args, false, true,
4352 				 tf_warning_or_error);
4353 
4354       if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE && overflow > 0)
4355 	{
4356 	  warning_at (token->location, OPT_Woverflow,
4357 		      "integer literal exceeds range of %qT type",
4358 		      long_long_unsigned_type_node);
4359 	}
4360       else
4361 	{
4362 	  if (overflow > 0)
4363 	    warning_at (token->location, OPT_Woverflow,
4364 			"floating literal exceeds range of %qT type",
4365 			long_double_type_node);
4366 	  else if (overflow < 0)
4367 	    warning_at (token->location, OPT_Woverflow,
4368 			"floating literal truncated to zero");
4369 	}
4370 
4371       release_tree_vector (args);
4372       return result;
4373     }
4374   release_tree_vector (args);
4375 
4376   /* If the numeric argument didn't work, look for a raw literal
4377      operator taking a const char* argument consisting of the number
4378      in string format.  */
4379   args = make_tree_vector ();
4380   vec_safe_push (args, num_string);
4381   decl = lookup_literal_operator (name, args);
4382   if (decl && decl != error_mark_node)
4383     {
4384       result = finish_call_expr (decl, &args, false, true,
4385 				 tf_warning_or_error);
4386       release_tree_vector (args);
4387       return result;
4388     }
4389   release_tree_vector (args);
4390 
4391   /* If the raw literal didn't work, look for a non-type template
4392      function with parameter pack char....  Call the function with
4393      template parameter characters representing the number.  */
4394   args = make_tree_vector ();
4395   decl = lookup_literal_operator (name, args);
4396   if (decl && decl != error_mark_node)
4397     {
4398       tree tmpl_args = make_char_string_pack (num_string);
4399       decl = lookup_template_function (decl, tmpl_args);
4400       result = finish_call_expr (decl, &args, false, true,
4401 				 tf_warning_or_error);
4402       release_tree_vector (args);
4403       return result;
4404     }
4405 
4406   release_tree_vector (args);
4407 
4408   /* In C++14 the standard library defines complex number suffixes that
4409      conflict with GNU extensions.  Prefer them if <complex> is #included.  */
4410   bool ext = cpp_get_options (parse_in)->ext_numeric_literals;
4411   bool i14 = (cxx_dialect > cxx11
4412 	      && (id_equal (suffix_id, "i")
4413 		  || id_equal (suffix_id, "if")
4414 		  || id_equal (suffix_id, "il")));
4415   diagnostic_t kind = DK_ERROR;
4416   int opt = 0;
4417 
4418   if (i14 && ext)
4419     {
4420       tree cxlit = lookup_qualified_name (std_node,
4421 					  get_identifier ("complex_literals"),
4422 					  0, false, false);
4423       if (cxlit == error_mark_node)
4424 	{
4425 	  /* No <complex>, so pedwarn and use GNU semantics.  */
4426 	  kind = DK_PEDWARN;
4427 	  opt = OPT_Wpedantic;
4428 	}
4429     }
4430 
4431   bool complained
4432     = emit_diagnostic (kind, input_location, opt,
4433 		       "unable to find numeric literal operator %qD", name);
4434 
4435   if (!complained)
4436     /* Don't inform either.  */;
4437   else if (i14)
4438     {
4439       inform (token->location, "add %<using namespace std::complex_literals%> "
4440 	      "(from <complex>) to enable the C++14 user-defined literal "
4441 	      "suffixes");
4442       if (ext)
4443 	inform (token->location, "or use %<j%> instead of %<i%> for the "
4444 		"GNU built-in suffix");
4445     }
4446   else if (!ext)
4447     inform (token->location, "use -fext-numeric-literals "
4448 	    "to enable more built-in suffixes");
4449 
4450   if (kind == DK_ERROR)
4451     value = error_mark_node;
4452   else
4453     {
4454       /* Use the built-in semantics.  */
4455       tree type;
4456       if (id_equal (suffix_id, "i"))
4457 	{
4458 	  if (TREE_CODE (value) == INTEGER_CST)
4459 	    type = integer_type_node;
4460 	  else
4461 	    type = double_type_node;
4462 	}
4463       else if (id_equal (suffix_id, "if"))
4464 	type = float_type_node;
4465       else /* if (id_equal (suffix_id, "il")) */
4466 	type = long_double_type_node;
4467 
4468       value = build_complex (build_complex_type (type),
4469 			     fold_convert (type, integer_zero_node),
4470 			     fold_convert (type, value));
4471     }
4472 
4473   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
4474     /* Avoid repeated diagnostics.  */
4475     token->u.value = value;
4476   return value;
4477 }
4478 
4479 /* Parse a user-defined string constant.  Returns a call to a user-defined
4480    literal operator taking a character pointer and the length of the string
4481    as arguments.  */
4482 
4483 static tree
4484 cp_parser_userdef_string_literal (tree literal)
4485 {
4486   tree suffix_id = USERDEF_LITERAL_SUFFIX_ID (literal);
4487   tree name = cp_literal_operator_id (IDENTIFIER_POINTER (suffix_id));
4488   tree value = USERDEF_LITERAL_VALUE (literal);
4489   int len = TREE_STRING_LENGTH (value)
4490 	/ TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value)))) - 1;
4491   tree decl, result;
4492   vec<tree, va_gc> *args;
4493 
4494   /* Build up a call to the user-defined operator.  */
4495   /* Lookup the name we got back from the id-expression.  */
4496   args = make_tree_vector ();
4497   vec_safe_push (args, value);
4498   vec_safe_push (args, build_int_cst (size_type_node, len));
4499   decl = lookup_literal_operator (name, args);
4500 
4501   if (decl && decl != error_mark_node)
4502     {
4503       result = finish_call_expr (decl, &args, false, true,
4504 				 tf_warning_or_error);
4505       release_tree_vector (args);
4506       return result;
4507     }
4508   release_tree_vector (args);
4509 
4510   /* Look for a template function with typename parameter CharT
4511      and parameter pack CharT...  Call the function with
4512      template parameter characters representing the string.  */
4513   args = make_tree_vector ();
4514   decl = lookup_literal_operator (name, args);
4515   if (decl && decl != error_mark_node)
4516     {
4517       tree tmpl_args = make_string_pack (value);
4518       decl = lookup_template_function (decl, tmpl_args);
4519       result = finish_call_expr (decl, &args, false, true,
4520 				 tf_warning_or_error);
4521       release_tree_vector (args);
4522       return result;
4523     }
4524   release_tree_vector (args);
4525 
4526   error ("unable to find string literal operator %qD with %qT, %qT arguments",
4527 	 name, TREE_TYPE (value), size_type_node);
4528   return error_mark_node;
4529 }
4530 
4531 
4532 /* Basic concepts [gram.basic]  */
4533 
4534 /* Parse a translation-unit.
4535 
4536    translation-unit:
4537      declaration-seq [opt]
4538 
4539    Returns TRUE if all went well.  */
4540 
4541 static bool
4542 cp_parser_translation_unit (cp_parser* parser)
4543 {
4544   /* The address of the first non-permanent object on the declarator
4545      obstack.  */
4546   static void *declarator_obstack_base;
4547 
4548   bool success;
4549 
4550   /* Create the declarator obstack, if necessary.  */
4551   if (!cp_error_declarator)
4552     {
4553       gcc_obstack_init (&declarator_obstack);
4554       /* Create the error declarator.  */
4555       cp_error_declarator = make_declarator (cdk_error);
4556       /* Create the empty parameter list.  */
4557       no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE,
4558 						 UNKNOWN_LOCATION);
4559       /* Remember where the base of the declarator obstack lies.  */
4560       declarator_obstack_base = obstack_next_free (&declarator_obstack);
4561     }
4562 
4563   cp_parser_declaration_seq_opt (parser);
4564 
4565   /* If there are no tokens left then all went well.  */
4566   if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
4567     {
4568       /* Get rid of the token array; we don't need it any more.  */
4569       cp_lexer_destroy (parser->lexer);
4570       parser->lexer = NULL;
4571 
4572       /* This file might have been a context that's implicitly extern
4573 	 "C".  If so, pop the lang context.  (Only relevant for PCH.) */
4574       if (parser->implicit_extern_c)
4575 	{
4576 	  pop_lang_context ();
4577 	  parser->implicit_extern_c = false;
4578 	}
4579 
4580       /* Finish up.  */
4581       finish_translation_unit ();
4582 
4583       success = true;
4584     }
4585   else
4586     {
4587       cp_parser_error (parser, "expected declaration");
4588       success = false;
4589     }
4590 
4591   /* Make sure the declarator obstack was fully cleaned up.  */
4592   gcc_assert (obstack_next_free (&declarator_obstack)
4593 	      == declarator_obstack_base);
4594 
4595   /* All went well.  */
4596   return success;
4597 }
4598 
4599 /* Return the appropriate tsubst flags for parsing, possibly in N3276
4600    decltype context.  */
4601 
4602 static inline tsubst_flags_t
4603 complain_flags (bool decltype_p)
4604 {
4605   tsubst_flags_t complain = tf_warning_or_error;
4606   if (decltype_p)
4607     complain |= tf_decltype;
4608   return complain;
4609 }
4610 
4611 /* We're about to parse a collection of statements.  If we're currently
4612    parsing tentatively, set up a firewall so that any nested
4613    cp_parser_commit_to_tentative_parse won't affect the current context.  */
4614 
4615 static cp_token_position
4616 cp_parser_start_tentative_firewall (cp_parser *parser)
4617 {
4618   if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4619     return 0;
4620 
4621   cp_parser_parse_tentatively (parser);
4622   cp_parser_commit_to_topmost_tentative_parse (parser);
4623   return cp_lexer_token_position (parser->lexer, false);
4624 }
4625 
4626 /* We've finished parsing the collection of statements.  Wrap up the
4627    firewall and replace the relevant tokens with the parsed form.  */
4628 
4629 static void
4630 cp_parser_end_tentative_firewall (cp_parser *parser, cp_token_position start,
4631 				  tree expr)
4632 {
4633   if (!start)
4634     return;
4635 
4636   /* Finish the firewall level.  */
4637   cp_parser_parse_definitely (parser);
4638   /* And remember the result of the parse for when we try again.  */
4639   cp_token *token = cp_lexer_token_at (parser->lexer, start);
4640   token->type = CPP_PREPARSED_EXPR;
4641   token->u.value = expr;
4642   token->keyword = RID_MAX;
4643   cp_lexer_purge_tokens_after (parser->lexer, start);
4644 }
4645 
4646 /* Like the above functions, but let the user modify the tokens.  Used by
4647    CPP_DECLTYPE and CPP_TEMPLATE_ID, where we are saving the side-effects for
4648    later parses, so it makes sense to localize the effects of
4649    cp_parser_commit_to_tentative_parse.  */
4650 
4651 struct tentative_firewall
4652 {
4653   cp_parser *parser;
4654   bool set;
4655 
4656   tentative_firewall (cp_parser *p): parser(p)
4657   {
4658     /* If we're currently parsing tentatively, start a committed level as a
4659        firewall and then an inner tentative parse.  */
4660     if ((set = cp_parser_uncommitted_to_tentative_parse_p (parser)))
4661       {
4662 	cp_parser_parse_tentatively (parser);
4663 	cp_parser_commit_to_topmost_tentative_parse (parser);
4664 	cp_parser_parse_tentatively (parser);
4665       }
4666   }
4667 
4668   ~tentative_firewall()
4669   {
4670     if (set)
4671       {
4672 	/* Finish the inner tentative parse and the firewall, propagating any
4673 	   uncommitted error state to the outer tentative parse.  */
4674 	bool err = cp_parser_error_occurred (parser);
4675 	cp_parser_parse_definitely (parser);
4676 	cp_parser_parse_definitely (parser);
4677 	if (err)
4678 	  cp_parser_simulate_error (parser);
4679       }
4680   }
4681 };
4682 
4683 /* Some tokens naturally come in pairs e.g.'(' and ')'.
4684    This class is for tracking such a matching pair of symbols.
4685    In particular, it tracks the location of the first token,
4686    so that if the second token is missing, we can highlight the
4687    location of the first token when notifying the user about the
4688    problem.  */
4689 
4690 template <typename traits_t>
4691 class token_pair
4692 {
4693  public:
4694   /* token_pair's ctor.  */
4695   token_pair () : m_open_loc (UNKNOWN_LOCATION) {}
4696 
4697   /* If the next token is the opening symbol for this pair, consume it and
4698      return true.
4699      Otherwise, issue an error and return false.
4700      In either case, record the location of the opening token.  */
4701 
4702   bool require_open (cp_parser *parser)
4703   {
4704     m_open_loc = cp_lexer_peek_token (parser->lexer)->location;
4705     return cp_parser_require (parser, traits_t::open_token_type,
4706 			      traits_t::required_token_open);
4707   }
4708 
4709   /* Consume the next token from PARSER, recording its location as
4710      that of the opening token within the pair.  */
4711 
4712   cp_token * consume_open (cp_parser *parser)
4713   {
4714     cp_token *tok = cp_lexer_consume_token (parser->lexer);
4715     gcc_assert (tok->type == traits_t::open_token_type);
4716     m_open_loc = tok->location;
4717     return tok;
4718   }
4719 
4720   /* If the next token is the closing symbol for this pair, consume it
4721      and return it.
4722      Otherwise, issue an error, highlighting the location of the
4723      corresponding opening token, and return NULL.  */
4724 
4725   cp_token *require_close (cp_parser *parser) const
4726   {
4727     return cp_parser_require (parser, traits_t::close_token_type,
4728 			      traits_t::required_token_close,
4729 			      m_open_loc);
4730   }
4731 
4732  private:
4733   location_t m_open_loc;
4734 };
4735 
4736 /* Traits for token_pair<T> for tracking matching pairs of parentheses.  */
4737 
4738 struct matching_paren_traits
4739 {
4740   static const enum cpp_ttype open_token_type = CPP_OPEN_PAREN;
4741   static const enum required_token required_token_open  = RT_OPEN_PAREN;
4742   static const enum cpp_ttype close_token_type = CPP_CLOSE_PAREN;
4743   static const enum required_token required_token_close = RT_CLOSE_PAREN;
4744 };
4745 
4746 /* "matching_parens" is a token_pair<T> class for tracking matching
4747    pairs of parentheses.  */
4748 
4749 typedef token_pair<matching_paren_traits> matching_parens;
4750 
4751 /* Traits for token_pair<T> for tracking matching pairs of braces.  */
4752 
4753 struct matching_brace_traits
4754 {
4755   static const enum cpp_ttype open_token_type = CPP_OPEN_BRACE;
4756   static const enum required_token required_token_open = RT_OPEN_BRACE;
4757   static const enum cpp_ttype close_token_type = CPP_CLOSE_BRACE;
4758   static const enum required_token required_token_close = RT_CLOSE_BRACE;
4759 };
4760 
4761 /* "matching_braces" is a token_pair<T> class for tracking matching
4762    pairs of braces.  */
4763 
4764 typedef token_pair<matching_brace_traits> matching_braces;
4765 
4766 
4767 /* Parse a GNU statement-expression, i.e. ({ stmts }), except for the
4768    enclosing parentheses.  */
4769 
4770 static cp_expr
4771 cp_parser_statement_expr (cp_parser *parser)
4772 {
4773   cp_token_position start = cp_parser_start_tentative_firewall (parser);
4774 
4775   /* Consume the '('.  */
4776   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
4777   matching_parens parens;
4778   parens.consume_open (parser);
4779   /* Start the statement-expression.  */
4780   tree expr = begin_stmt_expr ();
4781   /* Parse the compound-statement.  */
4782   cp_parser_compound_statement (parser, expr, BCS_NORMAL, false);
4783   /* Finish up.  */
4784   expr = finish_stmt_expr (expr, false);
4785   /* Consume the ')'.  */
4786   location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location;
4787   if (!parens.require_close (parser))
4788     cp_parser_skip_to_end_of_statement (parser);
4789 
4790   cp_parser_end_tentative_firewall (parser, start, expr);
4791   location_t combined_loc = make_location (start_loc, start_loc, finish_loc);
4792   return cp_expr (expr, combined_loc);
4793 }
4794 
4795 /* Expressions [gram.expr] */
4796 
4797 /* Parse a fold-operator.
4798 
4799     fold-operator:
4800         -  *  /  %  ^  &  |  =  <  >  <<  >>
4801       =  -=  *=  /=  %=  ^=  &=  |=  <<=  >>=
4802       ==  !=  <=  >=  &&  ||  ,  .*  ->*
4803 
4804    This returns the tree code corresponding to the matched operator
4805    as an int. When the current token matches a compound assignment
4806    opertor, the resulting tree code is the negative value of the
4807    non-assignment operator. */
4808 
4809 static int
4810 cp_parser_fold_operator (cp_token *token)
4811 {
4812   switch (token->type)
4813     {
4814     case CPP_PLUS: return PLUS_EXPR;
4815     case CPP_MINUS: return MINUS_EXPR;
4816     case CPP_MULT: return MULT_EXPR;
4817     case CPP_DIV: return TRUNC_DIV_EXPR;
4818     case CPP_MOD: return TRUNC_MOD_EXPR;
4819     case CPP_XOR: return BIT_XOR_EXPR;
4820     case CPP_AND: return BIT_AND_EXPR;
4821     case CPP_OR: return BIT_IOR_EXPR;
4822     case CPP_LSHIFT: return LSHIFT_EXPR;
4823     case CPP_RSHIFT: return RSHIFT_EXPR;
4824 
4825     case CPP_EQ: return -NOP_EXPR;
4826     case CPP_PLUS_EQ: return -PLUS_EXPR;
4827     case CPP_MINUS_EQ: return -MINUS_EXPR;
4828     case CPP_MULT_EQ: return -MULT_EXPR;
4829     case CPP_DIV_EQ: return -TRUNC_DIV_EXPR;
4830     case CPP_MOD_EQ: return -TRUNC_MOD_EXPR;
4831     case CPP_XOR_EQ: return -BIT_XOR_EXPR;
4832     case CPP_AND_EQ: return -BIT_AND_EXPR;
4833     case CPP_OR_EQ: return -BIT_IOR_EXPR;
4834     case CPP_LSHIFT_EQ: return -LSHIFT_EXPR;
4835     case CPP_RSHIFT_EQ: return -RSHIFT_EXPR;
4836 
4837     case CPP_EQ_EQ: return EQ_EXPR;
4838     case CPP_NOT_EQ: return NE_EXPR;
4839     case CPP_LESS: return LT_EXPR;
4840     case CPP_GREATER: return GT_EXPR;
4841     case CPP_LESS_EQ: return LE_EXPR;
4842     case CPP_GREATER_EQ: return GE_EXPR;
4843 
4844     case CPP_AND_AND: return TRUTH_ANDIF_EXPR;
4845     case CPP_OR_OR: return TRUTH_ORIF_EXPR;
4846 
4847     case CPP_COMMA: return COMPOUND_EXPR;
4848 
4849     case CPP_DOT_STAR: return DOTSTAR_EXPR;
4850     case CPP_DEREF_STAR: return MEMBER_REF;
4851 
4852     default: return ERROR_MARK;
4853     }
4854 }
4855 
4856 /* Returns true if CODE indicates a binary expression, which is not allowed in
4857    the LHS of a fold-expression.  More codes will need to be added to use this
4858    function in other contexts.  */
4859 
4860 static bool
4861 is_binary_op (tree_code code)
4862 {
4863   switch (code)
4864     {
4865     case PLUS_EXPR:
4866     case POINTER_PLUS_EXPR:
4867     case MINUS_EXPR:
4868     case MULT_EXPR:
4869     case TRUNC_DIV_EXPR:
4870     case TRUNC_MOD_EXPR:
4871     case BIT_XOR_EXPR:
4872     case BIT_AND_EXPR:
4873     case BIT_IOR_EXPR:
4874     case LSHIFT_EXPR:
4875     case RSHIFT_EXPR:
4876 
4877     case MODOP_EXPR:
4878 
4879     case EQ_EXPR:
4880     case NE_EXPR:
4881     case LE_EXPR:
4882     case GE_EXPR:
4883     case LT_EXPR:
4884     case GT_EXPR:
4885 
4886     case TRUTH_ANDIF_EXPR:
4887     case TRUTH_ORIF_EXPR:
4888 
4889     case COMPOUND_EXPR:
4890 
4891     case DOTSTAR_EXPR:
4892     case MEMBER_REF:
4893       return true;
4894 
4895     default:
4896       return false;
4897     }
4898 }
4899 
4900 /* If the next token is a suitable fold operator, consume it and return as
4901    the function above.  */
4902 
4903 static int
4904 cp_parser_fold_operator (cp_parser *parser)
4905 {
4906   cp_token* token = cp_lexer_peek_token (parser->lexer);
4907   int code = cp_parser_fold_operator (token);
4908   if (code != ERROR_MARK)
4909     cp_lexer_consume_token (parser->lexer);
4910   return code;
4911 }
4912 
4913 /* Parse a fold-expression.
4914 
4915      fold-expression:
4916        ( ... folding-operator cast-expression)
4917        ( cast-expression folding-operator ... )
4918        ( cast-expression folding operator ... folding-operator cast-expression)
4919 
4920    Note that the '(' and ')' are matched in primary expression. */
4921 
4922 static cp_expr
4923 cp_parser_fold_expression (cp_parser *parser, tree expr1)
4924 {
4925   cp_id_kind pidk;
4926 
4927   // Left fold.
4928   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
4929     {
4930       cp_lexer_consume_token (parser->lexer);
4931       int op = cp_parser_fold_operator (parser);
4932       if (op == ERROR_MARK)
4933         {
4934           cp_parser_error (parser, "expected binary operator");
4935           return error_mark_node;
4936         }
4937 
4938       tree expr = cp_parser_cast_expression (parser, false, false,
4939 					     false, &pidk);
4940       if (expr == error_mark_node)
4941         return error_mark_node;
4942       return finish_left_unary_fold_expr (expr, op);
4943     }
4944 
4945   const cp_token* token = cp_lexer_peek_token (parser->lexer);
4946   int op = cp_parser_fold_operator (parser);
4947   if (op == ERROR_MARK)
4948     {
4949       cp_parser_error (parser, "expected binary operator");
4950       return error_mark_node;
4951     }
4952 
4953   if (cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS))
4954     {
4955       cp_parser_error (parser, "expected ...");
4956       return error_mark_node;
4957     }
4958   cp_lexer_consume_token (parser->lexer);
4959 
4960   /* The operands of a fold-expression are cast-expressions, so binary or
4961      conditional expressions are not allowed.  We check this here to avoid
4962      tentative parsing.  */
4963   if (EXPR_P (expr1) && TREE_NO_WARNING (expr1))
4964     /* OK, the expression was parenthesized.  */;
4965   else if (is_binary_op (TREE_CODE (expr1)))
4966     error_at (location_of (expr1),
4967 	      "binary expression in operand of fold-expression");
4968   else if (TREE_CODE (expr1) == COND_EXPR
4969 	   || (REFERENCE_REF_P (expr1)
4970 	       && TREE_CODE (TREE_OPERAND (expr1, 0)) == COND_EXPR))
4971     error_at (location_of (expr1),
4972 	      "conditional expression in operand of fold-expression");
4973 
4974   // Right fold.
4975   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
4976     return finish_right_unary_fold_expr (expr1, op);
4977 
4978   if (cp_lexer_next_token_is_not (parser->lexer, token->type))
4979     {
4980       cp_parser_error (parser, "mismatched operator in fold-expression");
4981       return error_mark_node;
4982     }
4983   cp_lexer_consume_token (parser->lexer);
4984 
4985   // Binary left or right fold.
4986   tree expr2 = cp_parser_cast_expression (parser, false, false, false, &pidk);
4987   if (expr2 == error_mark_node)
4988     return error_mark_node;
4989   return finish_binary_fold_expr (expr1, expr2, op);
4990 }
4991 
4992 /* Parse a primary-expression.
4993 
4994    primary-expression:
4995      literal
4996      this
4997      ( expression )
4998      id-expression
4999      lambda-expression (C++11)
5000 
5001    GNU Extensions:
5002 
5003    primary-expression:
5004      ( compound-statement )
5005      __builtin_va_arg ( assignment-expression , type-id )
5006      __builtin_offsetof ( type-id , offsetof-expression )
5007 
5008    C++ Extensions:
5009      __has_nothrow_assign ( type-id )
5010      __has_nothrow_constructor ( type-id )
5011      __has_nothrow_copy ( type-id )
5012      __has_trivial_assign ( type-id )
5013      __has_trivial_constructor ( type-id )
5014      __has_trivial_copy ( type-id )
5015      __has_trivial_destructor ( type-id )
5016      __has_virtual_destructor ( type-id )
5017      __is_abstract ( type-id )
5018      __is_base_of ( type-id , type-id )
5019      __is_class ( type-id )
5020      __is_empty ( type-id )
5021      __is_enum ( type-id )
5022      __is_final ( type-id )
5023      __is_literal_type ( type-id )
5024      __is_pod ( type-id )
5025      __is_polymorphic ( type-id )
5026      __is_std_layout ( type-id )
5027      __is_trivial ( type-id )
5028      __is_union ( type-id )
5029 
5030    Objective-C++ Extension:
5031 
5032    primary-expression:
5033      objc-expression
5034 
5035    literal:
5036      __null
5037 
5038    ADDRESS_P is true iff this expression was immediately preceded by
5039    "&" and therefore might denote a pointer-to-member.  CAST_P is true
5040    iff this expression is the target of a cast.  TEMPLATE_ARG_P is
5041    true iff this expression is a template argument.
5042 
5043    Returns a representation of the expression.  Upon return, *IDK
5044    indicates what kind of id-expression (if any) was present.  */
5045 
5046 static cp_expr
5047 cp_parser_primary_expression (cp_parser *parser,
5048 			      bool address_p,
5049 			      bool cast_p,
5050 			      bool template_arg_p,
5051 			      bool decltype_p,
5052 			      cp_id_kind *idk)
5053 {
5054   cp_token *token = NULL;
5055 
5056   /* Assume the primary expression is not an id-expression.  */
5057   *idk = CP_ID_KIND_NONE;
5058 
5059   /* Peek at the next token.  */
5060   token = cp_lexer_peek_token (parser->lexer);
5061   switch ((int) token->type)
5062     {
5063       /* literal:
5064 	   integer-literal
5065 	   character-literal
5066 	   floating-literal
5067 	   string-literal
5068 	   boolean-literal
5069 	   pointer-literal
5070 	   user-defined-literal  */
5071     case CPP_CHAR:
5072     case CPP_CHAR16:
5073     case CPP_CHAR32:
5074     case CPP_WCHAR:
5075     case CPP_UTF8CHAR:
5076     case CPP_NUMBER:
5077     case CPP_PREPARSED_EXPR:
5078       if (TREE_CODE (token->u.value) == USERDEF_LITERAL)
5079 	return cp_parser_userdef_numeric_literal (parser);
5080       token = cp_lexer_consume_token (parser->lexer);
5081       if (TREE_CODE (token->u.value) == FIXED_CST)
5082 	{
5083 	  error_at (token->location,
5084 		    "fixed-point types not supported in C++");
5085 	  return error_mark_node;
5086 	}
5087       /* Floating-point literals are only allowed in an integral
5088 	 constant expression if they are cast to an integral or
5089 	 enumeration type.  */
5090       if (TREE_CODE (token->u.value) == REAL_CST
5091 	  && parser->integral_constant_expression_p
5092 	  && pedantic)
5093 	{
5094 	  /* CAST_P will be set even in invalid code like "int(2.7 +
5095 	     ...)".   Therefore, we have to check that the next token
5096 	     is sure to end the cast.  */
5097 	  if (cast_p)
5098 	    {
5099 	      cp_token *next_token;
5100 
5101 	      next_token = cp_lexer_peek_token (parser->lexer);
5102 	      if (/* The comma at the end of an
5103 		     enumerator-definition.  */
5104 		  next_token->type != CPP_COMMA
5105 		  /* The curly brace at the end of an enum-specifier.  */
5106 		  && next_token->type != CPP_CLOSE_BRACE
5107 		  /* The end of a statement.  */
5108 		  && next_token->type != CPP_SEMICOLON
5109 		  /* The end of the cast-expression.  */
5110 		  && next_token->type != CPP_CLOSE_PAREN
5111 		  /* The end of an array bound.  */
5112 		  && next_token->type != CPP_CLOSE_SQUARE
5113 		  /* The closing ">" in a template-argument-list.  */
5114 		  && (next_token->type != CPP_GREATER
5115 		      || parser->greater_than_is_operator_p)
5116 		  /* C++0x only: A ">>" treated like two ">" tokens,
5117                      in a template-argument-list.  */
5118 		  && (next_token->type != CPP_RSHIFT
5119                       || (cxx_dialect == cxx98)
5120 		      || parser->greater_than_is_operator_p))
5121 		cast_p = false;
5122 	    }
5123 
5124 	  /* If we are within a cast, then the constraint that the
5125 	     cast is to an integral or enumeration type will be
5126 	     checked at that point.  If we are not within a cast, then
5127 	     this code is invalid.  */
5128 	  if (!cast_p)
5129 	    cp_parser_non_integral_constant_expression (parser, NIC_FLOAT);
5130 	}
5131       return cp_expr (token->u.value, token->location);
5132 
5133     case CPP_CHAR_USERDEF:
5134     case CPP_CHAR16_USERDEF:
5135     case CPP_CHAR32_USERDEF:
5136     case CPP_WCHAR_USERDEF:
5137     case CPP_UTF8CHAR_USERDEF:
5138       return cp_parser_userdef_char_literal (parser);
5139 
5140     case CPP_STRING:
5141     case CPP_STRING16:
5142     case CPP_STRING32:
5143     case CPP_WSTRING:
5144     case CPP_UTF8STRING:
5145     case CPP_STRING_USERDEF:
5146     case CPP_STRING16_USERDEF:
5147     case CPP_STRING32_USERDEF:
5148     case CPP_WSTRING_USERDEF:
5149     case CPP_UTF8STRING_USERDEF:
5150       /* ??? Should wide strings be allowed when parser->translate_strings_p
5151 	 is false (i.e. in attributes)?  If not, we can kill the third
5152 	 argument to cp_parser_string_literal.  */
5153       return cp_parser_string_literal (parser,
5154 				       parser->translate_strings_p,
5155 				       true);
5156 
5157     case CPP_OPEN_PAREN:
5158       /* If we see `( { ' then we are looking at the beginning of
5159 	 a GNU statement-expression.  */
5160       if (cp_parser_allow_gnu_extensions_p (parser)
5161 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_BRACE))
5162 	{
5163 	  /* Statement-expressions are not allowed by the standard.  */
5164 	  pedwarn (token->location, OPT_Wpedantic,
5165 		   "ISO C++ forbids braced-groups within expressions");
5166 
5167 	  /* And they're not allowed outside of a function-body; you
5168 	     cannot, for example, write:
5169 
5170 	     int i = ({ int j = 3; j + 1; });
5171 
5172 	     at class or namespace scope.  */
5173 	  if (!parser->in_function_body
5174 	      || parser->in_template_argument_list_p)
5175 	    {
5176 	      error_at (token->location,
5177 			"statement-expressions are not allowed outside "
5178 			"functions nor in template-argument lists");
5179 	      cp_parser_skip_to_end_of_block_or_statement (parser);
5180 	      if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
5181 		cp_lexer_consume_token (parser->lexer);
5182 	      return error_mark_node;
5183 	    }
5184 	  else
5185 	    return cp_parser_statement_expr (parser);
5186 	}
5187       /* Otherwise it's a normal parenthesized expression.  */
5188       {
5189 	cp_expr expr;
5190 	bool saved_greater_than_is_operator_p;
5191 
5192 	location_t open_paren_loc = token->location;
5193 
5194 	/* Consume the `('.  */
5195 	matching_parens parens;
5196 	parens.consume_open (parser);
5197 	/* Within a parenthesized expression, a `>' token is always
5198 	   the greater-than operator.  */
5199 	saved_greater_than_is_operator_p
5200 	  = parser->greater_than_is_operator_p;
5201 	parser->greater_than_is_operator_p = true;
5202 
5203 	if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
5204 	  /* Left fold expression. */
5205 	  expr = NULL_TREE;
5206 	else
5207 	  /* Parse the parenthesized expression.  */
5208 	  expr = cp_parser_expression (parser, idk, cast_p, decltype_p);
5209 
5210 	token = cp_lexer_peek_token (parser->lexer);
5211 	if (token->type == CPP_ELLIPSIS || cp_parser_fold_operator (token))
5212 	  {
5213 	    expr = cp_parser_fold_expression (parser, expr);
5214 	    if (expr != error_mark_node
5215 		&& cxx_dialect < cxx17
5216 		&& !in_system_header_at (input_location))
5217 	      pedwarn (input_location, 0, "fold-expressions only available "
5218 		       "with -std=c++17 or -std=gnu++17");
5219 	  }
5220 	else
5221 	  /* Let the front end know that this expression was
5222 	     enclosed in parentheses. This matters in case, for
5223 	     example, the expression is of the form `A::B', since
5224 	     `&A::B' might be a pointer-to-member, but `&(A::B)' is
5225 	     not.  */
5226 	  expr = finish_parenthesized_expr (expr);
5227 
5228 	/* DR 705: Wrapping an unqualified name in parentheses
5229 	   suppresses arg-dependent lookup.  We want to pass back
5230 	   CP_ID_KIND_QUALIFIED for suppressing vtable lookup
5231 	   (c++/37862), but none of the others.  */
5232 	if (*idk != CP_ID_KIND_QUALIFIED)
5233 	  *idk = CP_ID_KIND_NONE;
5234 
5235 	/* The `>' token might be the end of a template-id or
5236 	   template-parameter-list now.  */
5237 	parser->greater_than_is_operator_p
5238 	  = saved_greater_than_is_operator_p;
5239 
5240 	/* Consume the `)'.  */
5241 	token = cp_lexer_peek_token (parser->lexer);
5242 	location_t close_paren_loc = token->location;
5243 	expr.set_range (open_paren_loc, close_paren_loc);
5244 	if (!parens.require_close (parser)
5245 	    && !cp_parser_uncommitted_to_tentative_parse_p (parser))
5246 	  cp_parser_skip_to_end_of_statement (parser);
5247 
5248 	return expr;
5249       }
5250 
5251     case CPP_OPEN_SQUARE:
5252       {
5253 	if (c_dialect_objc ())
5254 	  {
5255 	    /* We might have an Objective-C++ message. */
5256 	    cp_parser_parse_tentatively (parser);
5257 	    tree msg = cp_parser_objc_message_expression (parser);
5258 	    /* If that works out, we're done ... */
5259 	    if (cp_parser_parse_definitely (parser))
5260 	      return msg;
5261 	    /* ... else, fall though to see if it's a lambda.  */
5262 	  }
5263 	cp_expr lam = cp_parser_lambda_expression (parser);
5264 	/* Don't warn about a failed tentative parse.  */
5265 	if (cp_parser_error_occurred (parser))
5266 	  return error_mark_node;
5267 	maybe_warn_cpp0x (CPP0X_LAMBDA_EXPR);
5268 	return lam;
5269       }
5270 
5271     case CPP_OBJC_STRING:
5272       if (c_dialect_objc ())
5273 	/* We have an Objective-C++ string literal. */
5274         return cp_parser_objc_expression (parser);
5275       cp_parser_error (parser, "expected primary-expression");
5276       return error_mark_node;
5277 
5278     case CPP_KEYWORD:
5279       switch (token->keyword)
5280 	{
5281 	  /* These two are the boolean literals.  */
5282 	case RID_TRUE:
5283 	  cp_lexer_consume_token (parser->lexer);
5284 	  return cp_expr (boolean_true_node, token->location);
5285 	case RID_FALSE:
5286 	  cp_lexer_consume_token (parser->lexer);
5287 	  return cp_expr (boolean_false_node, token->location);
5288 
5289 	  /* The `__null' literal.  */
5290 	case RID_NULL:
5291 	  cp_lexer_consume_token (parser->lexer);
5292 	  return cp_expr (null_node, token->location);
5293 
5294 	  /* The `nullptr' literal.  */
5295 	case RID_NULLPTR:
5296 	  cp_lexer_consume_token (parser->lexer);
5297 	  return cp_expr (nullptr_node, token->location);
5298 
5299 	  /* Recognize the `this' keyword.  */
5300 	case RID_THIS:
5301 	  cp_lexer_consume_token (parser->lexer);
5302 	  if (parser->local_variables_forbidden_p)
5303 	    {
5304 	      error_at (token->location,
5305 			"%<this%> may not be used in this context");
5306 	      return error_mark_node;
5307 	    }
5308 	  /* Pointers cannot appear in constant-expressions.  */
5309 	  if (cp_parser_non_integral_constant_expression (parser, NIC_THIS))
5310 	    return error_mark_node;
5311 	  return cp_expr (finish_this_expr (), token->location);
5312 
5313 	  /* The `operator' keyword can be the beginning of an
5314 	     id-expression.  */
5315 	case RID_OPERATOR:
5316 	  goto id_expression;
5317 
5318 	case RID_FUNCTION_NAME:
5319 	case RID_PRETTY_FUNCTION_NAME:
5320 	case RID_C99_FUNCTION_NAME:
5321 	  {
5322 	    non_integral_constant name;
5323 
5324 	    /* The symbols __FUNCTION__, __PRETTY_FUNCTION__, and
5325 	       __func__ are the names of variables -- but they are
5326 	       treated specially.  Therefore, they are handled here,
5327 	       rather than relying on the generic id-expression logic
5328 	       below.  Grammatically, these names are id-expressions.
5329 
5330 	       Consume the token.  */
5331 	    token = cp_lexer_consume_token (parser->lexer);
5332 
5333 	    switch (token->keyword)
5334 	      {
5335 	      case RID_FUNCTION_NAME:
5336 		name = NIC_FUNC_NAME;
5337 		break;
5338 	      case RID_PRETTY_FUNCTION_NAME:
5339 		name = NIC_PRETTY_FUNC;
5340 		break;
5341 	      case RID_C99_FUNCTION_NAME:
5342 		name = NIC_C99_FUNC;
5343 		break;
5344 	      default:
5345 		gcc_unreachable ();
5346 	      }
5347 
5348 	    if (cp_parser_non_integral_constant_expression (parser, name))
5349 	      return error_mark_node;
5350 
5351 	    /* Look up the name.  */
5352 	    return finish_fname (token->u.value);
5353 	  }
5354 
5355 	case RID_VA_ARG:
5356 	  {
5357 	    tree expression;
5358 	    tree type;
5359 	    source_location type_location;
5360 	    location_t start_loc
5361 	      = cp_lexer_peek_token (parser->lexer)->location;
5362 	    /* The `__builtin_va_arg' construct is used to handle
5363 	       `va_arg'.  Consume the `__builtin_va_arg' token.  */
5364 	    cp_lexer_consume_token (parser->lexer);
5365 	    /* Look for the opening `('.  */
5366 	    matching_parens parens;
5367 	    parens.require_open (parser);
5368 	    /* Now, parse the assignment-expression.  */
5369 	    expression = cp_parser_assignment_expression (parser);
5370 	    /* Look for the `,'.  */
5371 	    cp_parser_require (parser, CPP_COMMA, RT_COMMA);
5372 	    type_location = cp_lexer_peek_token (parser->lexer)->location;
5373 	    /* Parse the type-id.  */
5374 	    {
5375 	      type_id_in_expr_sentinel s (parser);
5376 	      type = cp_parser_type_id (parser);
5377 	    }
5378 	    /* Look for the closing `)'.  */
5379 	    location_t finish_loc
5380 	      = cp_lexer_peek_token (parser->lexer)->location;
5381 	    parens.require_close (parser);
5382 	    /* Using `va_arg' in a constant-expression is not
5383 	       allowed.  */
5384 	    if (cp_parser_non_integral_constant_expression (parser,
5385 							    NIC_VA_ARG))
5386 	      return error_mark_node;
5387 	    /* Construct a location of the form:
5388 		 __builtin_va_arg (v, int)
5389 		 ~~~~~~~~~~~~~~~~~~~~~^~~~
5390 	       with the caret at the type, ranging from the start of the
5391 	       "__builtin_va_arg" token to the close paren.  */
5392 	    location_t combined_loc
5393 	      = make_location (type_location, start_loc, finish_loc);
5394 	    return build_x_va_arg (combined_loc, expression, type);
5395 	  }
5396 
5397 	case RID_OFFSETOF:
5398 	  return cp_parser_builtin_offsetof (parser);
5399 
5400 	case RID_HAS_NOTHROW_ASSIGN:
5401 	case RID_HAS_NOTHROW_CONSTRUCTOR:
5402 	case RID_HAS_NOTHROW_COPY:
5403 	case RID_HAS_TRIVIAL_ASSIGN:
5404 	case RID_HAS_TRIVIAL_CONSTRUCTOR:
5405 	case RID_HAS_TRIVIAL_COPY:
5406 	case RID_HAS_TRIVIAL_DESTRUCTOR:
5407 	case RID_HAS_UNIQUE_OBJ_REPRESENTATIONS:
5408 	case RID_HAS_VIRTUAL_DESTRUCTOR:
5409 	case RID_IS_ABSTRACT:
5410 	case RID_IS_AGGREGATE:
5411 	case RID_IS_BASE_OF:
5412 	case RID_IS_CLASS:
5413 	case RID_IS_EMPTY:
5414 	case RID_IS_ENUM:
5415 	case RID_IS_FINAL:
5416 	case RID_IS_LITERAL_TYPE:
5417 	case RID_IS_POD:
5418 	case RID_IS_POLYMORPHIC:
5419 	case RID_IS_SAME_AS:
5420 	case RID_IS_STD_LAYOUT:
5421 	case RID_IS_TRIVIAL:
5422 	case RID_IS_TRIVIALLY_ASSIGNABLE:
5423 	case RID_IS_TRIVIALLY_CONSTRUCTIBLE:
5424 	case RID_IS_TRIVIALLY_COPYABLE:
5425 	case RID_IS_UNION:
5426 	case RID_IS_ASSIGNABLE:
5427 	case RID_IS_CONSTRUCTIBLE:
5428 	  return cp_parser_trait_expr (parser, token->keyword);
5429 
5430 	// C++ concepts
5431 	case RID_REQUIRES:
5432 	  return cp_parser_requires_expression (parser);
5433 
5434 	/* Objective-C++ expressions.  */
5435 	case RID_AT_ENCODE:
5436 	case RID_AT_PROTOCOL:
5437 	case RID_AT_SELECTOR:
5438 	  return cp_parser_objc_expression (parser);
5439 
5440 	case RID_TEMPLATE:
5441 	  if (parser->in_function_body
5442 	      && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
5443 	      	  == CPP_LESS))
5444 	    {
5445 	      error_at (token->location,
5446 			"a template declaration cannot appear at block scope");
5447 	      cp_parser_skip_to_end_of_block_or_statement (parser);
5448 	      return error_mark_node;
5449 	    }
5450 	  /* FALLTHRU */
5451 	default:
5452 	  cp_parser_error (parser, "expected primary-expression");
5453 	  return error_mark_node;
5454 	}
5455 
5456       /* An id-expression can start with either an identifier, a
5457 	 `::' as the beginning of a qualified-id, or the "operator"
5458 	 keyword.  */
5459     case CPP_NAME:
5460     case CPP_SCOPE:
5461     case CPP_TEMPLATE_ID:
5462     case CPP_NESTED_NAME_SPECIFIER:
5463       {
5464       id_expression:
5465 	cp_expr id_expression;
5466 	cp_expr decl;
5467 	const char *error_msg;
5468 	bool template_p;
5469 	bool done;
5470 	cp_token *id_expr_token;
5471 
5472 	/* Parse the id-expression.  */
5473 	id_expression
5474 	  = cp_parser_id_expression (parser,
5475 				     /*template_keyword_p=*/false,
5476 				     /*check_dependency_p=*/true,
5477 				     &template_p,
5478 				     /*declarator_p=*/false,
5479 				     /*optional_p=*/false);
5480 	if (id_expression == error_mark_node)
5481 	  return error_mark_node;
5482 	id_expr_token = token;
5483 	token = cp_lexer_peek_token (parser->lexer);
5484 	done = (token->type != CPP_OPEN_SQUARE
5485 		&& token->type != CPP_OPEN_PAREN
5486 		&& token->type != CPP_DOT
5487 		&& token->type != CPP_DEREF
5488 		&& token->type != CPP_PLUS_PLUS
5489 		&& token->type != CPP_MINUS_MINUS);
5490 	/* If we have a template-id, then no further lookup is
5491 	   required.  If the template-id was for a template-class, we
5492 	   will sometimes have a TYPE_DECL at this point.  */
5493 	if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR
5494 		 || TREE_CODE (id_expression) == TYPE_DECL)
5495 	  decl = id_expression;
5496 	/* Look up the name.  */
5497 	else
5498 	  {
5499 	    tree ambiguous_decls;
5500 
5501 	    /* If we already know that this lookup is ambiguous, then
5502 	       we've already issued an error message; there's no reason
5503 	       to check again.  */
5504 	    if (id_expr_token->type == CPP_NAME
5505 		&& id_expr_token->error_reported)
5506 	      {
5507 		cp_parser_simulate_error (parser);
5508 		return error_mark_node;
5509 	      }
5510 
5511 	    decl = cp_parser_lookup_name (parser, id_expression,
5512 					  none_type,
5513 					  template_p,
5514 					  /*is_namespace=*/false,
5515 					  /*check_dependency=*/true,
5516 					  &ambiguous_decls,
5517 					  id_expr_token->location);
5518 	    /* If the lookup was ambiguous, an error will already have
5519 	       been issued.  */
5520 	    if (ambiguous_decls)
5521 	      return error_mark_node;
5522 
5523 	    /* In Objective-C++, we may have an Objective-C 2.0
5524 	       dot-syntax for classes here.  */
5525 	    if (c_dialect_objc ()
5526 		&& cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
5527 		&& TREE_CODE (decl) == TYPE_DECL
5528 		&& objc_is_class_name (decl))
5529 	      {
5530 		tree component;
5531 		cp_lexer_consume_token (parser->lexer);
5532 		component = cp_parser_identifier (parser);
5533 		if (component == error_mark_node)
5534 		  return error_mark_node;
5535 
5536 		tree result = objc_build_class_component_ref (id_expression,
5537 							      component);
5538 		/* Build a location of the form:
5539 		     expr.component
5540 		     ~~~~~^~~~~~~~~
5541 		   with caret at the start of the component name (at
5542 		   input_location), ranging from the start of the id_expression
5543 		   to the end of the component name.  */
5544 		location_t combined_loc
5545 		  = make_location (input_location, id_expression.get_start (),
5546 				   get_finish (input_location));
5547 		protected_set_expr_location (result, combined_loc);
5548 		return result;
5549 	      }
5550 
5551 	    /* In Objective-C++, an instance variable (ivar) may be preferred
5552 	       to whatever cp_parser_lookup_name() found.
5553 	       Call objc_lookup_ivar.  To avoid exposing cp_expr to the
5554 	       rest of c-family, we have to do a little extra work to preserve
5555 	       any location information in cp_expr "decl".  Given that
5556 	       objc_lookup_ivar is implemented in "c-family" and "objc", we
5557 	       have a trip through the pure "tree" type, rather than cp_expr.
5558 	       Naively copying it back to "decl" would implicitly give the
5559 	       new cp_expr value an UNKNOWN_LOCATION for nodes that don't
5560 	       store an EXPR_LOCATION.  Hence we only update "decl" (and
5561 	       hence its location_t) if we get back a different tree node.  */
5562 	    tree decl_tree = objc_lookup_ivar (decl.get_value (),
5563 					       id_expression);
5564 	    if (decl_tree != decl.get_value ())
5565 	      decl = cp_expr (decl_tree);
5566 
5567 	    /* If name lookup gives us a SCOPE_REF, then the
5568 	       qualifying scope was dependent.  */
5569 	    if (TREE_CODE (decl) == SCOPE_REF)
5570 	      {
5571 		/* At this point, we do not know if DECL is a valid
5572 		   integral constant expression.  We assume that it is
5573 		   in fact such an expression, so that code like:
5574 
5575 		      template <int N> struct A {
5576 			int a[B<N>::i];
5577 		      };
5578 
5579 		   is accepted.  At template-instantiation time, we
5580 		   will check that B<N>::i is actually a constant.  */
5581 		return decl;
5582 	      }
5583 	    /* Check to see if DECL is a local variable in a context
5584 	       where that is forbidden.  */
5585 	    if (parser->local_variables_forbidden_p
5586 		&& local_variable_p (decl))
5587 	      {
5588 		/* It might be that we only found DECL because we are
5589 		   trying to be generous with pre-ISO scoping rules.
5590 		   For example, consider:
5591 
5592 		     int i;
5593 		     void g() {
5594 		       for (int i = 0; i < 10; ++i) {}
5595 		       extern void f(int j = i);
5596 		     }
5597 
5598 		   Here, name look up will originally find the out
5599 		   of scope `i'.  We need to issue a warning message,
5600 		   but then use the global `i'.  */
5601 		decl = check_for_out_of_scope_variable (decl);
5602 		if (local_variable_p (decl))
5603 		  {
5604 		    error_at (id_expr_token->location,
5605 			      "local variable %qD may not appear in this context",
5606 			      decl.get_value ());
5607 		    return error_mark_node;
5608 		  }
5609 	      }
5610 	  }
5611 
5612 	decl = (finish_id_expression
5613 		(id_expression, decl, parser->scope,
5614 		 idk,
5615 		 parser->integral_constant_expression_p,
5616 		 parser->allow_non_integral_constant_expression_p,
5617 		 &parser->non_integral_constant_expression_p,
5618 		 template_p, done, address_p,
5619 		 template_arg_p,
5620 		 &error_msg,
5621 		 id_expression.get_location ()));
5622 	if (error_msg)
5623 	  cp_parser_error (parser, error_msg);
5624 	decl.set_location (id_expr_token->location);
5625 	return decl;
5626       }
5627 
5628       /* Anything else is an error.  */
5629     default:
5630       cp_parser_error (parser, "expected primary-expression");
5631       return error_mark_node;
5632     }
5633 }
5634 
5635 static inline cp_expr
5636 cp_parser_primary_expression (cp_parser *parser,
5637 			      bool address_p,
5638 			      bool cast_p,
5639 			      bool template_arg_p,
5640 			      cp_id_kind *idk)
5641 {
5642   return cp_parser_primary_expression (parser, address_p, cast_p, template_arg_p,
5643 				       /*decltype*/false, idk);
5644 }
5645 
5646 /* Parse an id-expression.
5647 
5648    id-expression:
5649      unqualified-id
5650      qualified-id
5651 
5652    qualified-id:
5653      :: [opt] nested-name-specifier template [opt] unqualified-id
5654      :: identifier
5655      :: operator-function-id
5656      :: template-id
5657 
5658    Return a representation of the unqualified portion of the
5659    identifier.  Sets PARSER->SCOPE to the qualifying scope if there is
5660    a `::' or nested-name-specifier.
5661 
5662    Often, if the id-expression was a qualified-id, the caller will
5663    want to make a SCOPE_REF to represent the qualified-id.  This
5664    function does not do this in order to avoid wastefully creating
5665    SCOPE_REFs when they are not required.
5666 
5667    If TEMPLATE_KEYWORD_P is true, then we have just seen the
5668    `template' keyword.
5669 
5670    If CHECK_DEPENDENCY_P is false, then names are looked up inside
5671    uninstantiated templates.
5672 
5673    If *TEMPLATE_P is non-NULL, it is set to true iff the
5674    `template' keyword is used to explicitly indicate that the entity
5675    named is a template.
5676 
5677    If DECLARATOR_P is true, the id-expression is appearing as part of
5678    a declarator, rather than as part of an expression.  */
5679 
5680 static cp_expr
5681 cp_parser_id_expression (cp_parser *parser,
5682 			 bool template_keyword_p,
5683 			 bool check_dependency_p,
5684 			 bool *template_p,
5685 			 bool declarator_p,
5686 			 bool optional_p)
5687 {
5688   bool global_scope_p;
5689   bool nested_name_specifier_p;
5690 
5691   /* Assume the `template' keyword was not used.  */
5692   if (template_p)
5693     *template_p = template_keyword_p;
5694 
5695   /* Look for the optional `::' operator.  */
5696   global_scope_p
5697     = (!template_keyword_p
5698        && (cp_parser_global_scope_opt (parser,
5699 				       /*current_scope_valid_p=*/false)
5700 	   != NULL_TREE));
5701 
5702   /* Look for the optional nested-name-specifier.  */
5703   nested_name_specifier_p
5704     = (cp_parser_nested_name_specifier_opt (parser,
5705 					    /*typename_keyword_p=*/false,
5706 					    check_dependency_p,
5707 					    /*type_p=*/false,
5708 					    declarator_p,
5709 					    template_keyword_p)
5710        != NULL_TREE);
5711 
5712   /* If there is a nested-name-specifier, then we are looking at
5713      the first qualified-id production.  */
5714   if (nested_name_specifier_p)
5715     {
5716       tree saved_scope;
5717       tree saved_object_scope;
5718       tree saved_qualifying_scope;
5719       cp_expr unqualified_id;
5720       bool is_template;
5721 
5722       /* See if the next token is the `template' keyword.  */
5723       if (!template_p)
5724 	template_p = &is_template;
5725       *template_p = cp_parser_optional_template_keyword (parser);
5726       /* Name lookup we do during the processing of the
5727 	 unqualified-id might obliterate SCOPE.  */
5728       saved_scope = parser->scope;
5729       saved_object_scope = parser->object_scope;
5730       saved_qualifying_scope = parser->qualifying_scope;
5731       /* Process the final unqualified-id.  */
5732       unqualified_id = cp_parser_unqualified_id (parser, *template_p,
5733 						 check_dependency_p,
5734 						 declarator_p,
5735 						 /*optional_p=*/false);
5736       /* Restore the SAVED_SCOPE for our caller.  */
5737       parser->scope = saved_scope;
5738       parser->object_scope = saved_object_scope;
5739       parser->qualifying_scope = saved_qualifying_scope;
5740 
5741       return unqualified_id;
5742     }
5743   /* Otherwise, if we are in global scope, then we are looking at one
5744      of the other qualified-id productions.  */
5745   else if (global_scope_p)
5746     {
5747       cp_token *token;
5748       tree id;
5749 
5750       /* Peek at the next token.  */
5751       token = cp_lexer_peek_token (parser->lexer);
5752 
5753       /* If it's an identifier, and the next token is not a "<", then
5754 	 we can avoid the template-id case.  This is an optimization
5755 	 for this common case.  */
5756       if (token->type == CPP_NAME
5757 	  && !cp_parser_nth_token_starts_template_argument_list_p
5758 	       (parser, 2))
5759 	return cp_parser_identifier (parser);
5760 
5761       cp_parser_parse_tentatively (parser);
5762       /* Try a template-id.  */
5763       id = cp_parser_template_id (parser,
5764 				  /*template_keyword_p=*/false,
5765 				  /*check_dependency_p=*/true,
5766 				  none_type,
5767 				  declarator_p);
5768       /* If that worked, we're done.  */
5769       if (cp_parser_parse_definitely (parser))
5770 	return id;
5771 
5772       /* Peek at the next token.  (Changes in the token buffer may
5773 	 have invalidated the pointer obtained above.)  */
5774       token = cp_lexer_peek_token (parser->lexer);
5775 
5776       switch (token->type)
5777 	{
5778 	case CPP_NAME:
5779 	  return cp_parser_identifier (parser);
5780 
5781 	case CPP_KEYWORD:
5782 	  if (token->keyword == RID_OPERATOR)
5783 	    return cp_parser_operator_function_id (parser);
5784 	  /* Fall through.  */
5785 
5786 	default:
5787 	  cp_parser_error (parser, "expected id-expression");
5788 	  return error_mark_node;
5789 	}
5790     }
5791   else
5792     return cp_parser_unqualified_id (parser, template_keyword_p,
5793 				     /*check_dependency_p=*/true,
5794 				     declarator_p,
5795 				     optional_p);
5796 }
5797 
5798 /* Parse an unqualified-id.
5799 
5800    unqualified-id:
5801      identifier
5802      operator-function-id
5803      conversion-function-id
5804      ~ class-name
5805      template-id
5806 
5807    If TEMPLATE_KEYWORD_P is TRUE, we have just seen the `template'
5808    keyword, in a construct like `A::template ...'.
5809 
5810    Returns a representation of unqualified-id.  For the `identifier'
5811    production, an IDENTIFIER_NODE is returned.  For the `~ class-name'
5812    production a BIT_NOT_EXPR is returned; the operand of the
5813    BIT_NOT_EXPR is an IDENTIFIER_NODE for the class-name.  For the
5814    other productions, see the documentation accompanying the
5815    corresponding parsing functions.  If CHECK_DEPENDENCY_P is false,
5816    names are looked up in uninstantiated templates.  If DECLARATOR_P
5817    is true, the unqualified-id is appearing as part of a declarator,
5818    rather than as part of an expression.  */
5819 
5820 static cp_expr
5821 cp_parser_unqualified_id (cp_parser* parser,
5822 			  bool template_keyword_p,
5823 			  bool check_dependency_p,
5824 			  bool declarator_p,
5825 			  bool optional_p)
5826 {
5827   cp_token *token;
5828 
5829   /* Peek at the next token.  */
5830   token = cp_lexer_peek_token (parser->lexer);
5831 
5832   switch ((int) token->type)
5833     {
5834     case CPP_NAME:
5835       {
5836 	tree id;
5837 
5838 	/* We don't know yet whether or not this will be a
5839 	   template-id.  */
5840 	cp_parser_parse_tentatively (parser);
5841 	/* Try a template-id.  */
5842 	id = cp_parser_template_id (parser, template_keyword_p,
5843 				    check_dependency_p,
5844 				    none_type,
5845 				    declarator_p);
5846 	/* If it worked, we're done.  */
5847 	if (cp_parser_parse_definitely (parser))
5848 	  return id;
5849 	/* Otherwise, it's an ordinary identifier.  */
5850 	return cp_parser_identifier (parser);
5851       }
5852 
5853     case CPP_TEMPLATE_ID:
5854       return cp_parser_template_id (parser, template_keyword_p,
5855 				    check_dependency_p,
5856 				    none_type,
5857 				    declarator_p);
5858 
5859     case CPP_COMPL:
5860       {
5861 	tree type_decl;
5862 	tree qualifying_scope;
5863 	tree object_scope;
5864 	tree scope;
5865 	bool done;
5866 
5867 	/* Consume the `~' token.  */
5868 	cp_lexer_consume_token (parser->lexer);
5869 	/* Parse the class-name.  The standard, as written, seems to
5870 	   say that:
5871 
5872 	     template <typename T> struct S { ~S (); };
5873 	     template <typename T> S<T>::~S() {}
5874 
5875 	   is invalid, since `~' must be followed by a class-name, but
5876 	   `S<T>' is dependent, and so not known to be a class.
5877 	   That's not right; we need to look in uninstantiated
5878 	   templates.  A further complication arises from:
5879 
5880 	     template <typename T> void f(T t) {
5881 	       t.T::~T();
5882 	     }
5883 
5884 	   Here, it is not possible to look up `T' in the scope of `T'
5885 	   itself.  We must look in both the current scope, and the
5886 	   scope of the containing complete expression.
5887 
5888 	   Yet another issue is:
5889 
5890 	     struct S {
5891 	       int S;
5892 	       ~S();
5893 	     };
5894 
5895 	     S::~S() {}
5896 
5897 	   The standard does not seem to say that the `S' in `~S'
5898 	   should refer to the type `S' and not the data member
5899 	   `S::S'.  */
5900 
5901 	/* DR 244 says that we look up the name after the "~" in the
5902 	   same scope as we looked up the qualifying name.  That idea
5903 	   isn't fully worked out; it's more complicated than that.  */
5904 	scope = parser->scope;
5905 	object_scope = parser->object_scope;
5906 	qualifying_scope = parser->qualifying_scope;
5907 
5908 	/* Check for invalid scopes.  */
5909 	if (scope == error_mark_node)
5910 	  {
5911 	    if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
5912 	      cp_lexer_consume_token (parser->lexer);
5913 	    return error_mark_node;
5914 	  }
5915 	if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
5916 	  {
5917 	    if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
5918 	      error_at (token->location,
5919 			"scope %qT before %<~%> is not a class-name",
5920 			scope);
5921 	    cp_parser_simulate_error (parser);
5922 	    if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
5923 	      cp_lexer_consume_token (parser->lexer);
5924 	    return error_mark_node;
5925 	  }
5926 	gcc_assert (!scope || TYPE_P (scope));
5927 
5928 	/* If the name is of the form "X::~X" it's OK even if X is a
5929 	   typedef.  */
5930 	token = cp_lexer_peek_token (parser->lexer);
5931 	if (scope
5932 	    && token->type == CPP_NAME
5933 	    && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
5934 		!= CPP_LESS)
5935 	    && (token->u.value == TYPE_IDENTIFIER (scope)
5936 		|| (CLASS_TYPE_P (scope)
5937 		    && constructor_name_p (token->u.value, scope))))
5938 	  {
5939 	    cp_lexer_consume_token (parser->lexer);
5940 	    return build_nt (BIT_NOT_EXPR, scope);
5941 	  }
5942 
5943 	/* ~auto means the destructor of whatever the object is.  */
5944 	if (cp_parser_is_keyword (token, RID_AUTO))
5945 	  {
5946 	    if (cxx_dialect < cxx14)
5947 	      pedwarn (input_location, 0,
5948 		       "%<~auto%> only available with "
5949 		       "-std=c++14 or -std=gnu++14");
5950 	    cp_lexer_consume_token (parser->lexer);
5951 	    return build_nt (BIT_NOT_EXPR, make_auto ());
5952 	  }
5953 
5954 	/* If there was an explicit qualification (S::~T), first look
5955 	   in the scope given by the qualification (i.e., S).
5956 
5957 	   Note: in the calls to cp_parser_class_name below we pass
5958 	   typename_type so that lookup finds the injected-class-name
5959 	   rather than the constructor.  */
5960 	done = false;
5961 	type_decl = NULL_TREE;
5962 	if (scope)
5963 	  {
5964 	    cp_parser_parse_tentatively (parser);
5965 	    type_decl = cp_parser_class_name (parser,
5966 					      /*typename_keyword_p=*/false,
5967 					      /*template_keyword_p=*/false,
5968 					      typename_type,
5969 					      /*check_dependency=*/false,
5970 					      /*class_head_p=*/false,
5971 					      declarator_p);
5972 	    if (cp_parser_parse_definitely (parser))
5973 	      done = true;
5974 	  }
5975 	/* In "N::S::~S", look in "N" as well.  */
5976 	if (!done && scope && qualifying_scope)
5977 	  {
5978 	    cp_parser_parse_tentatively (parser);
5979 	    parser->scope = qualifying_scope;
5980 	    parser->object_scope = NULL_TREE;
5981 	    parser->qualifying_scope = NULL_TREE;
5982 	    type_decl
5983 	      = cp_parser_class_name (parser,
5984 				      /*typename_keyword_p=*/false,
5985 				      /*template_keyword_p=*/false,
5986 				      typename_type,
5987 				      /*check_dependency=*/false,
5988 				      /*class_head_p=*/false,
5989 				      declarator_p);
5990 	    if (cp_parser_parse_definitely (parser))
5991 	      done = true;
5992 	  }
5993 	/* In "p->S::~T", look in the scope given by "*p" as well.  */
5994 	else if (!done && object_scope)
5995 	  {
5996 	    cp_parser_parse_tentatively (parser);
5997 	    parser->scope = object_scope;
5998 	    parser->object_scope = NULL_TREE;
5999 	    parser->qualifying_scope = NULL_TREE;
6000 	    type_decl
6001 	      = cp_parser_class_name (parser,
6002 				      /*typename_keyword_p=*/false,
6003 				      /*template_keyword_p=*/false,
6004 				      typename_type,
6005 				      /*check_dependency=*/false,
6006 				      /*class_head_p=*/false,
6007 				      declarator_p);
6008 	    if (cp_parser_parse_definitely (parser))
6009 	      done = true;
6010 	  }
6011 	/* Look in the surrounding context.  */
6012 	if (!done)
6013 	  {
6014 	    parser->scope = NULL_TREE;
6015 	    parser->object_scope = NULL_TREE;
6016 	    parser->qualifying_scope = NULL_TREE;
6017 	    if (processing_template_decl)
6018 	      cp_parser_parse_tentatively (parser);
6019 	    type_decl
6020 	      = cp_parser_class_name (parser,
6021 				      /*typename_keyword_p=*/false,
6022 				      /*template_keyword_p=*/false,
6023 				      typename_type,
6024 				      /*check_dependency=*/false,
6025 				      /*class_head_p=*/false,
6026 				      declarator_p);
6027 	    if (processing_template_decl
6028 		&& ! cp_parser_parse_definitely (parser))
6029 	      {
6030 		/* We couldn't find a type with this name.  If we're parsing
6031 		   tentatively, fail and try something else.  */
6032 		if (cp_parser_uncommitted_to_tentative_parse_p (parser))
6033 		  {
6034 		    cp_parser_simulate_error (parser);
6035 		    return error_mark_node;
6036 		  }
6037 		/* Otherwise, accept it and check for a match at instantiation
6038 		   time.  */
6039 		type_decl = cp_parser_identifier (parser);
6040 		if (type_decl != error_mark_node)
6041 		  type_decl = build_nt (BIT_NOT_EXPR, type_decl);
6042 		return type_decl;
6043 	      }
6044 	  }
6045 	/* If an error occurred, assume that the name of the
6046 	   destructor is the same as the name of the qualifying
6047 	   class.  That allows us to keep parsing after running
6048 	   into ill-formed destructor names.  */
6049 	if (type_decl == error_mark_node && scope)
6050 	  return build_nt (BIT_NOT_EXPR, scope);
6051 	else if (type_decl == error_mark_node)
6052 	  return error_mark_node;
6053 
6054 	/* Check that destructor name and scope match.  */
6055 	if (declarator_p && scope && !check_dtor_name (scope, type_decl))
6056 	  {
6057 	    if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
6058 	      error_at (token->location,
6059 			"declaration of %<~%T%> as member of %qT",
6060 			type_decl, scope);
6061 	    cp_parser_simulate_error (parser);
6062 	    return error_mark_node;
6063 	  }
6064 
6065 	/* [class.dtor]
6066 
6067 	   A typedef-name that names a class shall not be used as the
6068 	   identifier in the declarator for a destructor declaration.  */
6069 	if (declarator_p
6070 	    && !DECL_IMPLICIT_TYPEDEF_P (type_decl)
6071 	    && !DECL_SELF_REFERENCE_P (type_decl)
6072 	    && !cp_parser_uncommitted_to_tentative_parse_p (parser))
6073 	  error_at (token->location,
6074 		    "typedef-name %qD used as destructor declarator",
6075 		    type_decl);
6076 
6077 	return build_nt (BIT_NOT_EXPR, TREE_TYPE (type_decl));
6078       }
6079 
6080     case CPP_KEYWORD:
6081       if (token->keyword == RID_OPERATOR)
6082 	{
6083 	  cp_expr id;
6084 
6085 	  /* This could be a template-id, so we try that first.  */
6086 	  cp_parser_parse_tentatively (parser);
6087 	  /* Try a template-id.  */
6088 	  id = cp_parser_template_id (parser, template_keyword_p,
6089 				      /*check_dependency_p=*/true,
6090 				      none_type,
6091 				      declarator_p);
6092 	  /* If that worked, we're done.  */
6093 	  if (cp_parser_parse_definitely (parser))
6094 	    return id;
6095 	  /* We still don't know whether we're looking at an
6096 	     operator-function-id or a conversion-function-id.  */
6097 	  cp_parser_parse_tentatively (parser);
6098 	  /* Try an operator-function-id.  */
6099 	  id = cp_parser_operator_function_id (parser);
6100 	  /* If that didn't work, try a conversion-function-id.  */
6101 	  if (!cp_parser_parse_definitely (parser))
6102 	    id = cp_parser_conversion_function_id (parser);
6103 
6104 	  return id;
6105 	}
6106       /* Fall through.  */
6107 
6108     default:
6109       if (optional_p)
6110 	return NULL_TREE;
6111       cp_parser_error (parser, "expected unqualified-id");
6112       return error_mark_node;
6113     }
6114 }
6115 
6116 /* Parse an (optional) nested-name-specifier.
6117 
6118    nested-name-specifier: [C++98]
6119      class-or-namespace-name :: nested-name-specifier [opt]
6120      class-or-namespace-name :: template nested-name-specifier [opt]
6121 
6122    nested-name-specifier: [C++0x]
6123      type-name ::
6124      namespace-name ::
6125      nested-name-specifier identifier ::
6126      nested-name-specifier template [opt] simple-template-id ::
6127 
6128    PARSER->SCOPE should be set appropriately before this function is
6129    called.  TYPENAME_KEYWORD_P is TRUE if the `typename' keyword is in
6130    effect.  TYPE_P is TRUE if we non-type bindings should be ignored
6131    in name lookups.
6132 
6133    Sets PARSER->SCOPE to the class (TYPE) or namespace
6134    (NAMESPACE_DECL) specified by the nested-name-specifier, or leaves
6135    it unchanged if there is no nested-name-specifier.  Returns the new
6136    scope iff there is a nested-name-specifier, or NULL_TREE otherwise.
6137 
6138    If IS_DECLARATION is TRUE, the nested-name-specifier is known to be
6139    part of a declaration and/or decl-specifier.  */
6140 
6141 static tree
6142 cp_parser_nested_name_specifier_opt (cp_parser *parser,
6143 				     bool typename_keyword_p,
6144 				     bool check_dependency_p,
6145 				     bool type_p,
6146 				     bool is_declaration,
6147 				     bool template_keyword_p /* = false */)
6148 {
6149   bool success = false;
6150   cp_token_position start = 0;
6151   cp_token *token;
6152 
6153   /* Remember where the nested-name-specifier starts.  */
6154   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
6155     {
6156       start = cp_lexer_token_position (parser->lexer, false);
6157       push_deferring_access_checks (dk_deferred);
6158     }
6159 
6160   while (true)
6161     {
6162       tree new_scope;
6163       tree old_scope;
6164       tree saved_qualifying_scope;
6165 
6166       /* Spot cases that cannot be the beginning of a
6167 	 nested-name-specifier.  */
6168       token = cp_lexer_peek_token (parser->lexer);
6169 
6170       /* If the next token is CPP_NESTED_NAME_SPECIFIER, just process
6171 	 the already parsed nested-name-specifier.  */
6172       if (token->type == CPP_NESTED_NAME_SPECIFIER)
6173 	{
6174 	  /* Grab the nested-name-specifier and continue the loop.  */
6175 	  cp_parser_pre_parsed_nested_name_specifier (parser);
6176 	  /* If we originally encountered this nested-name-specifier
6177 	     with IS_DECLARATION set to false, we will not have
6178 	     resolved TYPENAME_TYPEs, so we must do so here.  */
6179 	  if (is_declaration
6180 	      && TREE_CODE (parser->scope) == TYPENAME_TYPE)
6181 	    {
6182 	      new_scope = resolve_typename_type (parser->scope,
6183 						 /*only_current_p=*/false);
6184 	      if (TREE_CODE (new_scope) != TYPENAME_TYPE)
6185 		parser->scope = new_scope;
6186 	    }
6187 	  success = true;
6188 	  continue;
6189 	}
6190 
6191       /* Spot cases that cannot be the beginning of a
6192 	 nested-name-specifier.  On the second and subsequent times
6193 	 through the loop, we look for the `template' keyword.  */
6194       if (success && token->keyword == RID_TEMPLATE)
6195 	;
6196       /* A template-id can start a nested-name-specifier.  */
6197       else if (token->type == CPP_TEMPLATE_ID)
6198 	;
6199       /* DR 743: decltype can be used in a nested-name-specifier.  */
6200       else if (token_is_decltype (token))
6201 	;
6202       else
6203 	{
6204 	  /* If the next token is not an identifier, then it is
6205 	     definitely not a type-name or namespace-name.  */
6206 	  if (token->type != CPP_NAME)
6207 	    break;
6208 	  /* If the following token is neither a `<' (to begin a
6209 	     template-id), nor a `::', then we are not looking at a
6210 	     nested-name-specifier.  */
6211 	  token = cp_lexer_peek_nth_token (parser->lexer, 2);
6212 
6213 	  if (token->type == CPP_COLON
6214 	      && parser->colon_corrects_to_scope_p
6215 	      && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME)
6216 	    {
6217 	      gcc_rich_location richloc (token->location);
6218 	      richloc.add_fixit_replace ("::");
6219 	      error_at (&richloc,
6220 			"found %<:%> in nested-name-specifier, "
6221 			"expected %<::%>");
6222 	      token->type = CPP_SCOPE;
6223 	    }
6224 
6225 	  if (token->type != CPP_SCOPE
6226 	      && !cp_parser_nth_token_starts_template_argument_list_p
6227 		  (parser, 2))
6228 	    break;
6229 	}
6230 
6231       /* The nested-name-specifier is optional, so we parse
6232 	 tentatively.  */
6233       cp_parser_parse_tentatively (parser);
6234 
6235       /* Look for the optional `template' keyword, if this isn't the
6236 	 first time through the loop.  */
6237       if (success)
6238 	template_keyword_p = cp_parser_optional_template_keyword (parser);
6239 
6240       /* Save the old scope since the name lookup we are about to do
6241 	 might destroy it.  */
6242       old_scope = parser->scope;
6243       saved_qualifying_scope = parser->qualifying_scope;
6244       /* In a declarator-id like "X<T>::I::Y<T>" we must be able to
6245 	 look up names in "X<T>::I" in order to determine that "Y" is
6246 	 a template.  So, if we have a typename at this point, we make
6247 	 an effort to look through it.  */
6248       if (is_declaration
6249 	  && !typename_keyword_p
6250 	  && parser->scope
6251 	  && TREE_CODE (parser->scope) == TYPENAME_TYPE)
6252 	parser->scope = resolve_typename_type (parser->scope,
6253 					       /*only_current_p=*/false);
6254       /* Parse the qualifying entity.  */
6255       new_scope
6256 	= cp_parser_qualifying_entity (parser,
6257                                        typename_keyword_p,
6258                                        template_keyword_p,
6259                                        check_dependency_p,
6260                                        type_p,
6261                                        is_declaration);
6262       /* Look for the `::' token.  */
6263       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
6264 
6265       /* If we found what we wanted, we keep going; otherwise, we're
6266 	 done.  */
6267       if (!cp_parser_parse_definitely (parser))
6268 	{
6269 	  bool error_p = false;
6270 
6271 	  /* Restore the OLD_SCOPE since it was valid before the
6272 	     failed attempt at finding the last
6273 	     class-or-namespace-name.  */
6274 	  parser->scope = old_scope;
6275 	  parser->qualifying_scope = saved_qualifying_scope;
6276 
6277 	  /* If the next token is a decltype, and the one after that is a
6278 	     `::', then the decltype has failed to resolve to a class or
6279 	     enumeration type.  Give this error even when parsing
6280 	     tentatively since it can't possibly be valid--and we're going
6281 	     to replace it with a CPP_NESTED_NAME_SPECIFIER below, so we
6282 	     won't get another chance.*/
6283 	  if (cp_lexer_next_token_is (parser->lexer, CPP_DECLTYPE)
6284 	      && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
6285 		  == CPP_SCOPE))
6286 	    {
6287 	      token = cp_lexer_consume_token (parser->lexer);
6288 	      error_at (token->location, "decltype evaluates to %qT, "
6289 			"which is not a class or enumeration type",
6290 			token->u.tree_check_value->value);
6291 	      parser->scope = error_mark_node;
6292 	      error_p = true;
6293 	      /* As below.  */
6294 	      success = true;
6295 	      cp_lexer_consume_token (parser->lexer);
6296 	    }
6297 
6298 	  if (cp_lexer_next_token_is (parser->lexer, CPP_TEMPLATE_ID)
6299 	      && cp_lexer_nth_token_is (parser->lexer, 2, CPP_SCOPE))
6300 	    {
6301 	      /* If we have a non-type template-id followed by ::, it can't
6302 		 possibly be valid.  */
6303 	      token = cp_lexer_peek_token (parser->lexer);
6304 	      tree tid = token->u.tree_check_value->value;
6305 	      if (TREE_CODE (tid) == TEMPLATE_ID_EXPR
6306 		  && TREE_CODE (TREE_OPERAND (tid, 0)) != IDENTIFIER_NODE)
6307 		{
6308 		  tree tmpl = NULL_TREE;
6309 		  if (is_overloaded_fn (tid))
6310 		    {
6311 		      tree fns = get_fns (tid);
6312 		      if (OVL_SINGLE_P (fns))
6313 			tmpl = OVL_FIRST (fns);
6314 		      error_at (token->location, "function template-id %qD "
6315 				"in nested-name-specifier", tid);
6316 		    }
6317 		  else
6318 		    {
6319 		      /* Variable template.  */
6320 		      tmpl = TREE_OPERAND (tid, 0);
6321 		      gcc_assert (variable_template_p (tmpl));
6322 		      error_at (token->location, "variable template-id %qD "
6323 				"in nested-name-specifier", tid);
6324 		    }
6325 		  if (tmpl)
6326 		    inform (DECL_SOURCE_LOCATION (tmpl),
6327 			    "%qD declared here", tmpl);
6328 
6329 		  parser->scope = error_mark_node;
6330 		  error_p = true;
6331 		  /* As below.  */
6332 		  success = true;
6333 		  cp_lexer_consume_token (parser->lexer);
6334 		  cp_lexer_consume_token (parser->lexer);
6335 		}
6336 	    }
6337 
6338 	  if (cp_parser_uncommitted_to_tentative_parse_p (parser))
6339 	    break;
6340 	  /* If the next token is an identifier, and the one after
6341 	     that is a `::', then any valid interpretation would have
6342 	     found a class-or-namespace-name.  */
6343 	  while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
6344 		 && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
6345 		     == CPP_SCOPE)
6346 		 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
6347 		     != CPP_COMPL))
6348 	    {
6349 	      token = cp_lexer_consume_token (parser->lexer);
6350 	      if (!error_p)
6351 		{
6352 		  if (!token->error_reported)
6353 		    {
6354 		      tree decl;
6355 		      tree ambiguous_decls;
6356 
6357 		      decl = cp_parser_lookup_name (parser, token->u.value,
6358 						    none_type,
6359 						    /*is_template=*/false,
6360 						    /*is_namespace=*/false,
6361 						    /*check_dependency=*/true,
6362 						    &ambiguous_decls,
6363 						    token->location);
6364 		      if (TREE_CODE (decl) == TEMPLATE_DECL)
6365 			error_at (token->location,
6366 				  "%qD used without template parameters",
6367 				  decl);
6368 		      else if (ambiguous_decls)
6369 			{
6370 			  // cp_parser_lookup_name has the same diagnostic,
6371 			  // thus make sure to emit it at most once.
6372 			  if (cp_parser_uncommitted_to_tentative_parse_p
6373 			      (parser))
6374 			    {
6375 			      error_at (token->location,
6376 					"reference to %qD is ambiguous",
6377 					token->u.value);
6378 			      print_candidates (ambiguous_decls);
6379 			    }
6380 			  decl = error_mark_node;
6381 			}
6382 		      else
6383                         {
6384                           if (cxx_dialect != cxx98)
6385                             cp_parser_name_lookup_error
6386                             (parser, token->u.value, decl, NLE_NOT_CXX98,
6387 	  		     token->location);
6388 			  else
6389 			    cp_parser_name_lookup_error
6390 			    (parser, token->u.value, decl, NLE_CXX98,
6391 			     token->location);
6392                         }
6393 		    }
6394 		  parser->scope = error_mark_node;
6395 		  error_p = true;
6396 		  /* Treat this as a successful nested-name-specifier
6397 		     due to:
6398 
6399 		     [basic.lookup.qual]
6400 
6401 		     If the name found is not a class-name (clause
6402 		     _class_) or namespace-name (_namespace.def_), the
6403 		     program is ill-formed.  */
6404 		  success = true;
6405 		}
6406 	      cp_lexer_consume_token (parser->lexer);
6407 	    }
6408 	  break;
6409 	}
6410       /* We've found one valid nested-name-specifier.  */
6411       success = true;
6412       /* Name lookup always gives us a DECL.  */
6413       if (TREE_CODE (new_scope) == TYPE_DECL)
6414 	new_scope = TREE_TYPE (new_scope);
6415       /* Uses of "template" must be followed by actual templates.  */
6416       if (template_keyword_p
6417 	  && !(CLASS_TYPE_P (new_scope)
6418 	       && ((CLASSTYPE_USE_TEMPLATE (new_scope)
6419 		    && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (new_scope)))
6420 		   || CLASSTYPE_IS_TEMPLATE (new_scope)))
6421 	  && !(TREE_CODE (new_scope) == TYPENAME_TYPE
6422 	       && (TREE_CODE (TYPENAME_TYPE_FULLNAME (new_scope))
6423 		   == TEMPLATE_ID_EXPR)))
6424 	permerror (input_location, TYPE_P (new_scope)
6425 		   ? G_("%qT is not a template")
6426 		   : G_("%qD is not a template"),
6427 		   new_scope);
6428       /* If it is a class scope, try to complete it; we are about to
6429 	 be looking up names inside the class.  */
6430       if (TYPE_P (new_scope)
6431 	  /* Since checking types for dependency can be expensive,
6432 	     avoid doing it if the type is already complete.  */
6433 	  && !COMPLETE_TYPE_P (new_scope)
6434 	  /* Do not try to complete dependent types.  */
6435 	  && !dependent_type_p (new_scope))
6436 	{
6437 	  new_scope = complete_type (new_scope);
6438 	  /* If it is a typedef to current class, use the current
6439 	     class instead, as the typedef won't have any names inside
6440 	     it yet.  */
6441 	  if (!COMPLETE_TYPE_P (new_scope)
6442 	      && currently_open_class (new_scope))
6443 	    new_scope = TYPE_MAIN_VARIANT (new_scope);
6444 	}
6445       /* Make sure we look in the right scope the next time through
6446 	 the loop.  */
6447       parser->scope = new_scope;
6448     }
6449 
6450   /* If parsing tentatively, replace the sequence of tokens that makes
6451      up the nested-name-specifier with a CPP_NESTED_NAME_SPECIFIER
6452      token.  That way, should we re-parse the token stream, we will
6453      not have to repeat the effort required to do the parse, nor will
6454      we issue duplicate error messages.  */
6455   if (success && start)
6456     {
6457       cp_token *token;
6458 
6459       token = cp_lexer_token_at (parser->lexer, start);
6460       /* Reset the contents of the START token.  */
6461       token->type = CPP_NESTED_NAME_SPECIFIER;
6462       /* Retrieve any deferred checks.  Do not pop this access checks yet
6463 	 so the memory will not be reclaimed during token replacing below.  */
6464       token->u.tree_check_value = ggc_cleared_alloc<struct tree_check> ();
6465       token->u.tree_check_value->value = parser->scope;
6466       token->u.tree_check_value->checks = get_deferred_access_checks ();
6467       token->u.tree_check_value->qualifying_scope =
6468 	parser->qualifying_scope;
6469       token->keyword = RID_MAX;
6470 
6471       /* Purge all subsequent tokens.  */
6472       cp_lexer_purge_tokens_after (parser->lexer, start);
6473     }
6474 
6475   if (start)
6476     pop_to_parent_deferring_access_checks ();
6477 
6478   return success ? parser->scope : NULL_TREE;
6479 }
6480 
6481 /* Parse a nested-name-specifier.  See
6482    cp_parser_nested_name_specifier_opt for details.  This function
6483    behaves identically, except that it will an issue an error if no
6484    nested-name-specifier is present.  */
6485 
6486 static tree
6487 cp_parser_nested_name_specifier (cp_parser *parser,
6488 				 bool typename_keyword_p,
6489 				 bool check_dependency_p,
6490 				 bool type_p,
6491 				 bool is_declaration)
6492 {
6493   tree scope;
6494 
6495   /* Look for the nested-name-specifier.  */
6496   scope = cp_parser_nested_name_specifier_opt (parser,
6497 					       typename_keyword_p,
6498 					       check_dependency_p,
6499 					       type_p,
6500 					       is_declaration);
6501   /* If it was not present, issue an error message.  */
6502   if (!scope)
6503     {
6504       cp_parser_error (parser, "expected nested-name-specifier");
6505       parser->scope = NULL_TREE;
6506     }
6507 
6508   return scope;
6509 }
6510 
6511 /* Parse the qualifying entity in a nested-name-specifier. For C++98,
6512    this is either a class-name or a namespace-name (which corresponds
6513    to the class-or-namespace-name production in the grammar). For
6514    C++0x, it can also be a type-name that refers to an enumeration
6515    type or a simple-template-id.
6516 
6517    TYPENAME_KEYWORD_P is TRUE iff the `typename' keyword is in effect.
6518    TEMPLATE_KEYWORD_P is TRUE iff the `template' keyword is in effect.
6519    CHECK_DEPENDENCY_P is FALSE iff dependent names should be looked up.
6520    TYPE_P is TRUE iff the next name should be taken as a class-name,
6521    even the same name is declared to be another entity in the same
6522    scope.
6523 
6524    Returns the class (TYPE_DECL) or namespace (NAMESPACE_DECL)
6525    specified by the class-or-namespace-name.  If neither is found the
6526    ERROR_MARK_NODE is returned.  */
6527 
6528 static tree
6529 cp_parser_qualifying_entity (cp_parser *parser,
6530 			     bool typename_keyword_p,
6531 			     bool template_keyword_p,
6532 			     bool check_dependency_p,
6533 			     bool type_p,
6534 			     bool is_declaration)
6535 {
6536   tree saved_scope;
6537   tree saved_qualifying_scope;
6538   tree saved_object_scope;
6539   tree scope;
6540   bool only_class_p;
6541   bool successful_parse_p;
6542 
6543   /* DR 743: decltype can appear in a nested-name-specifier.  */
6544   if (cp_lexer_next_token_is_decltype (parser->lexer))
6545     {
6546       scope = cp_parser_decltype (parser);
6547       if (TREE_CODE (scope) != ENUMERAL_TYPE
6548 	  && !MAYBE_CLASS_TYPE_P (scope))
6549 	{
6550 	  cp_parser_simulate_error (parser);
6551 	  return error_mark_node;
6552 	}
6553       if (TYPE_NAME (scope))
6554 	scope = TYPE_NAME (scope);
6555       return scope;
6556     }
6557 
6558   /* Before we try to parse the class-name, we must save away the
6559      current PARSER->SCOPE since cp_parser_class_name will destroy
6560      it.  */
6561   saved_scope = parser->scope;
6562   saved_qualifying_scope = parser->qualifying_scope;
6563   saved_object_scope = parser->object_scope;
6564   /* Try for a class-name first.  If the SAVED_SCOPE is a type, then
6565      there is no need to look for a namespace-name.  */
6566   only_class_p = template_keyword_p
6567     || (saved_scope && TYPE_P (saved_scope) && cxx_dialect == cxx98);
6568   if (!only_class_p)
6569     cp_parser_parse_tentatively (parser);
6570   scope = cp_parser_class_name (parser,
6571 				typename_keyword_p,
6572 				template_keyword_p,
6573 				type_p ? class_type : none_type,
6574 				check_dependency_p,
6575 				/*class_head_p=*/false,
6576 				is_declaration,
6577 				/*enum_ok=*/cxx_dialect > cxx98);
6578   successful_parse_p = only_class_p || cp_parser_parse_definitely (parser);
6579   /* If that didn't work, try for a namespace-name.  */
6580   if (!only_class_p && !successful_parse_p)
6581     {
6582       /* Restore the saved scope.  */
6583       parser->scope = saved_scope;
6584       parser->qualifying_scope = saved_qualifying_scope;
6585       parser->object_scope = saved_object_scope;
6586       /* If we are not looking at an identifier followed by the scope
6587 	 resolution operator, then this is not part of a
6588 	 nested-name-specifier.  (Note that this function is only used
6589 	 to parse the components of a nested-name-specifier.)  */
6590       if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)
6591 	  || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
6592 	return error_mark_node;
6593       scope = cp_parser_namespace_name (parser);
6594     }
6595 
6596   return scope;
6597 }
6598 
6599 /* Return true if we are looking at a compound-literal, false otherwise.  */
6600 
6601 static bool
6602 cp_parser_compound_literal_p (cp_parser *parser)
6603 {
6604   cp_lexer_save_tokens (parser->lexer);
6605 
6606   /* Skip tokens until the next token is a closing parenthesis.
6607      If we find the closing `)', and the next token is a `{', then
6608      we are looking at a compound-literal.  */
6609   bool compound_literal_p
6610     = (cp_parser_skip_to_closing_parenthesis (parser, false, false,
6611 					      /*consume_paren=*/true)
6612        && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
6613 
6614   /* Roll back the tokens we skipped.  */
6615   cp_lexer_rollback_tokens (parser->lexer);
6616 
6617   return compound_literal_p;
6618 }
6619 
6620 /* Return true if EXPR is the integer constant zero or a complex constant
6621    of zero, without any folding, but ignoring location wrappers.  */
6622 
6623 static bool
6624 literal_integer_zerop (const_tree expr)
6625 {
6626   STRIP_ANY_LOCATION_WRAPPER (expr);
6627   return integer_zerop (expr);
6628 }
6629 
6630 /* Parse a postfix-expression.
6631 
6632    postfix-expression:
6633      primary-expression
6634      postfix-expression [ expression ]
6635      postfix-expression ( expression-list [opt] )
6636      simple-type-specifier ( expression-list [opt] )
6637      typename :: [opt] nested-name-specifier identifier
6638        ( expression-list [opt] )
6639      typename :: [opt] nested-name-specifier template [opt] template-id
6640        ( expression-list [opt] )
6641      postfix-expression . template [opt] id-expression
6642      postfix-expression -> template [opt] id-expression
6643      postfix-expression . pseudo-destructor-name
6644      postfix-expression -> pseudo-destructor-name
6645      postfix-expression ++
6646      postfix-expression --
6647      dynamic_cast < type-id > ( expression )
6648      static_cast < type-id > ( expression )
6649      reinterpret_cast < type-id > ( expression )
6650      const_cast < type-id > ( expression )
6651      typeid ( expression )
6652      typeid ( type-id )
6653 
6654    GNU Extension:
6655 
6656    postfix-expression:
6657      ( type-id ) { initializer-list , [opt] }
6658 
6659    This extension is a GNU version of the C99 compound-literal
6660    construct.  (The C99 grammar uses `type-name' instead of `type-id',
6661    but they are essentially the same concept.)
6662 
6663    If ADDRESS_P is true, the postfix expression is the operand of the
6664    `&' operator.  CAST_P is true if this expression is the target of a
6665    cast.
6666 
6667    If MEMBER_ACCESS_ONLY_P, we only allow postfix expressions that are
6668    class member access expressions [expr.ref].
6669 
6670    Returns a representation of the expression.  */
6671 
6672 static cp_expr
6673 cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
6674                               bool member_access_only_p, bool decltype_p,
6675 			      cp_id_kind * pidk_return)
6676 {
6677   cp_token *token;
6678   location_t loc;
6679   enum rid keyword;
6680   cp_id_kind idk = CP_ID_KIND_NONE;
6681   cp_expr postfix_expression = NULL_TREE;
6682   bool is_member_access = false;
6683 
6684   /* Peek at the next token.  */
6685   token = cp_lexer_peek_token (parser->lexer);
6686   loc = token->location;
6687   location_t start_loc = get_range_from_loc (line_table, loc).m_start;
6688 
6689   /* Some of the productions are determined by keywords.  */
6690   keyword = token->keyword;
6691   switch (keyword)
6692     {
6693     case RID_DYNCAST:
6694     case RID_STATCAST:
6695     case RID_REINTCAST:
6696     case RID_CONSTCAST:
6697       {
6698 	tree type;
6699 	cp_expr expression;
6700 	const char *saved_message;
6701 	bool saved_in_type_id_in_expr_p;
6702 
6703 	/* All of these can be handled in the same way from the point
6704 	   of view of parsing.  Begin by consuming the token
6705 	   identifying the cast.  */
6706 	cp_lexer_consume_token (parser->lexer);
6707 
6708 	/* New types cannot be defined in the cast.  */
6709 	saved_message = parser->type_definition_forbidden_message;
6710 	parser->type_definition_forbidden_message
6711 	  = G_("types may not be defined in casts");
6712 
6713 	/* Look for the opening `<'.  */
6714 	cp_parser_require (parser, CPP_LESS, RT_LESS);
6715 	/* Parse the type to which we are casting.  */
6716 	saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6717 	parser->in_type_id_in_expr_p = true;
6718 	type = cp_parser_type_id (parser);
6719 	parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6720 	/* Look for the closing `>'.  */
6721 	cp_parser_require (parser, CPP_GREATER, RT_GREATER);
6722 	/* Restore the old message.  */
6723 	parser->type_definition_forbidden_message = saved_message;
6724 
6725 	bool saved_greater_than_is_operator_p
6726 	  = parser->greater_than_is_operator_p;
6727 	parser->greater_than_is_operator_p = true;
6728 
6729 	/* And the expression which is being cast.  */
6730 	matching_parens parens;
6731 	parens.require_open (parser);
6732 	expression = cp_parser_expression (parser, & idk, /*cast_p=*/true);
6733 	cp_token *close_paren = cp_parser_require (parser, CPP_CLOSE_PAREN,
6734 						   RT_CLOSE_PAREN);
6735 	location_t end_loc = close_paren ?
6736 	  close_paren->location : UNKNOWN_LOCATION;
6737 
6738 	parser->greater_than_is_operator_p
6739 	  = saved_greater_than_is_operator_p;
6740 
6741 	/* Only type conversions to integral or enumeration types
6742 	   can be used in constant-expressions.  */
6743 	if (!cast_valid_in_integral_constant_expression_p (type)
6744 	    && cp_parser_non_integral_constant_expression (parser, NIC_CAST))
6745 	  {
6746 	    postfix_expression = error_mark_node;
6747 	    break;
6748 	  }
6749 
6750 	switch (keyword)
6751 	  {
6752 	  case RID_DYNCAST:
6753 	    postfix_expression
6754 	      = build_dynamic_cast (type, expression, tf_warning_or_error);
6755 	    break;
6756 	  case RID_STATCAST:
6757 	    postfix_expression
6758 	      = build_static_cast (type, expression, tf_warning_or_error);
6759 	    break;
6760 	  case RID_REINTCAST:
6761 	    postfix_expression
6762 	      = build_reinterpret_cast (type, expression,
6763                                         tf_warning_or_error);
6764 	    break;
6765 	  case RID_CONSTCAST:
6766 	    postfix_expression
6767 	      = build_const_cast (type, expression, tf_warning_or_error);
6768 	    break;
6769 	  default:
6770 	    gcc_unreachable ();
6771 	  }
6772 
6773 	/* Construct a location e.g. :
6774 	     reinterpret_cast <int *> (expr)
6775 	     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6776 	   ranging from the start of the "*_cast" token to the final closing
6777 	   paren, with the caret at the start.  */
6778 	location_t cp_cast_loc = make_location (start_loc, start_loc, end_loc);
6779 	postfix_expression.set_location (cp_cast_loc);
6780       }
6781       break;
6782 
6783     case RID_TYPEID:
6784       {
6785 	tree type;
6786 	const char *saved_message;
6787 	bool saved_in_type_id_in_expr_p;
6788 
6789 	/* Consume the `typeid' token.  */
6790 	cp_lexer_consume_token (parser->lexer);
6791 	/* Look for the `(' token.  */
6792 	matching_parens parens;
6793 	parens.require_open (parser);
6794 	/* Types cannot be defined in a `typeid' expression.  */
6795 	saved_message = parser->type_definition_forbidden_message;
6796 	parser->type_definition_forbidden_message
6797 	  = G_("types may not be defined in a %<typeid%> expression");
6798 	/* We can't be sure yet whether we're looking at a type-id or an
6799 	   expression.  */
6800 	cp_parser_parse_tentatively (parser);
6801 	/* Try a type-id first.  */
6802 	saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6803 	parser->in_type_id_in_expr_p = true;
6804 	type = cp_parser_type_id (parser);
6805 	parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6806 	/* Look for the `)' token.  Otherwise, we can't be sure that
6807 	   we're not looking at an expression: consider `typeid (int
6808 	   (3))', for example.  */
6809 	cp_token *close_paren = parens.require_close (parser);
6810 	/* If all went well, simply lookup the type-id.  */
6811 	if (cp_parser_parse_definitely (parser))
6812 	  postfix_expression = get_typeid (type, tf_warning_or_error);
6813 	/* Otherwise, fall back to the expression variant.  */
6814 	else
6815 	  {
6816 	    tree expression;
6817 
6818 	    /* Look for an expression.  */
6819 	    expression = cp_parser_expression (parser, & idk);
6820 	    /* Compute its typeid.  */
6821 	    postfix_expression = build_typeid (expression, tf_warning_or_error);
6822 	    /* Look for the `)' token.  */
6823 	    close_paren = parens.require_close (parser);
6824 	  }
6825 	/* Restore the saved message.  */
6826 	parser->type_definition_forbidden_message = saved_message;
6827 	/* `typeid' may not appear in an integral constant expression.  */
6828 	if (cp_parser_non_integral_constant_expression (parser, NIC_TYPEID))
6829 	  postfix_expression = error_mark_node;
6830 
6831 	/* Construct a location e.g. :
6832 	     typeid (expr)
6833 	     ^~~~~~~~~~~~~
6834 	   ranging from the start of the "typeid" token to the final closing
6835 	   paren, with the caret at the start.  */
6836 	if (close_paren)
6837 	  {
6838 	    location_t typeid_loc
6839 	      = make_location (start_loc, start_loc, close_paren->location);
6840 	    postfix_expression.set_location (typeid_loc);
6841 	    postfix_expression.maybe_add_location_wrapper ();
6842 	  }
6843       }
6844       break;
6845 
6846     case RID_TYPENAME:
6847       {
6848 	tree type;
6849 	/* The syntax permitted here is the same permitted for an
6850 	   elaborated-type-specifier.  */
6851         ++parser->prevent_constrained_type_specifiers;
6852 	type = cp_parser_elaborated_type_specifier (parser,
6853 						    /*is_friend=*/false,
6854 						    /*is_declaration=*/false);
6855         --parser->prevent_constrained_type_specifiers;
6856 	postfix_expression = cp_parser_functional_cast (parser, type);
6857       }
6858       break;
6859 
6860     case RID_ADDRESSOF:
6861     case RID_BUILTIN_SHUFFLE:
6862     case RID_BUILTIN_LAUNDER:
6863       {
6864 	vec<tree, va_gc> *vec;
6865 	unsigned int i;
6866 	tree p;
6867 
6868 	cp_lexer_consume_token (parser->lexer);
6869 	vec = cp_parser_parenthesized_expression_list (parser, non_attr,
6870 		    /*cast_p=*/false, /*allow_expansion_p=*/true,
6871 		    /*non_constant_p=*/NULL);
6872 	if (vec == NULL)
6873 	  {
6874 	    postfix_expression = error_mark_node;
6875 	    break;
6876 	  }
6877 
6878 	FOR_EACH_VEC_ELT (*vec, i, p)
6879 	  mark_exp_read (p);
6880 
6881 	switch (keyword)
6882 	  {
6883 	  case RID_ADDRESSOF:
6884 	    if (vec->length () == 1)
6885 	      postfix_expression
6886 		= cp_build_addressof (loc, (*vec)[0], tf_warning_or_error);
6887 	    else
6888 	      {
6889 		error_at (loc, "wrong number of arguments to "
6890 			       "%<__builtin_addressof%>");
6891 		postfix_expression = error_mark_node;
6892 	      }
6893 	    break;
6894 
6895 	  case RID_BUILTIN_LAUNDER:
6896 	    if (vec->length () == 1)
6897 	      postfix_expression = finish_builtin_launder (loc, (*vec)[0],
6898 							   tf_warning_or_error);
6899 	    else
6900 	      {
6901 		error_at (loc, "wrong number of arguments to "
6902 			       "%<__builtin_launder%>");
6903 		postfix_expression = error_mark_node;
6904 	      }
6905 	    break;
6906 
6907 	  case RID_BUILTIN_SHUFFLE:
6908 	    if (vec->length () == 2)
6909 	      postfix_expression
6910 		= build_x_vec_perm_expr (loc, (*vec)[0], NULL_TREE,
6911 					 (*vec)[1], tf_warning_or_error);
6912 	    else if (vec->length () == 3)
6913 	      postfix_expression
6914 		= build_x_vec_perm_expr (loc, (*vec)[0], (*vec)[1],
6915 					 (*vec)[2], tf_warning_or_error);
6916 	    else
6917 	      {
6918 		error_at (loc, "wrong number of arguments to "
6919 			       "%<__builtin_shuffle%>");
6920 		postfix_expression = error_mark_node;
6921 	      }
6922 	    break;
6923 
6924 	  default:
6925 	    gcc_unreachable ();
6926 	  }
6927 	break;
6928       }
6929 
6930     default:
6931       {
6932 	tree type;
6933 
6934 	/* If the next thing is a simple-type-specifier, we may be
6935 	   looking at a functional cast.  We could also be looking at
6936 	   an id-expression.  So, we try the functional cast, and if
6937 	   that doesn't work we fall back to the primary-expression.  */
6938 	cp_parser_parse_tentatively (parser);
6939 	/* Look for the simple-type-specifier.  */
6940         ++parser->prevent_constrained_type_specifiers;
6941 	type = cp_parser_simple_type_specifier (parser,
6942 						/*decl_specs=*/NULL,
6943 						CP_PARSER_FLAGS_NONE);
6944         --parser->prevent_constrained_type_specifiers;
6945 	/* Parse the cast itself.  */
6946 	if (!cp_parser_error_occurred (parser))
6947 	  postfix_expression
6948 	    = cp_parser_functional_cast (parser, type);
6949 	/* If that worked, we're done.  */
6950 	if (cp_parser_parse_definitely (parser))
6951 	  break;
6952 
6953 	/* If the functional-cast didn't work out, try a
6954 	   compound-literal.  */
6955 	if (cp_parser_allow_gnu_extensions_p (parser)
6956 	    && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
6957 	  {
6958 	    cp_expr initializer = NULL_TREE;
6959 
6960 	    cp_parser_parse_tentatively (parser);
6961 
6962 	    matching_parens parens;
6963 	    parens.consume_open (parser);
6964 
6965 	    /* Avoid calling cp_parser_type_id pointlessly, see comment
6966 	       in cp_parser_cast_expression about c++/29234.  */
6967 	    if (!cp_parser_compound_literal_p (parser))
6968 	      cp_parser_simulate_error (parser);
6969 	    else
6970 	      {
6971 		/* Parse the type.  */
6972 		bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6973 		parser->in_type_id_in_expr_p = true;
6974 		type = cp_parser_type_id (parser);
6975 		parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6976 		parens.require_close (parser);
6977 	      }
6978 
6979 	    /* If things aren't going well, there's no need to
6980 	       keep going.  */
6981 	    if (!cp_parser_error_occurred (parser))
6982 	      {
6983 		bool non_constant_p;
6984 		/* Parse the brace-enclosed initializer list.  */
6985 		initializer = cp_parser_braced_list (parser,
6986 						     &non_constant_p);
6987 	      }
6988 	    /* If that worked, we're definitely looking at a
6989 	       compound-literal expression.  */
6990 	    if (cp_parser_parse_definitely (parser))
6991 	      {
6992 		/* Warn the user that a compound literal is not
6993 		   allowed in standard C++.  */
6994 		pedwarn (input_location, OPT_Wpedantic,
6995 			 "ISO C++ forbids compound-literals");
6996 		/* For simplicity, we disallow compound literals in
6997 		   constant-expressions.  We could
6998 		   allow compound literals of integer type, whose
6999 		   initializer was a constant, in constant
7000 		   expressions.  Permitting that usage, as a further
7001 		   extension, would not change the meaning of any
7002 		   currently accepted programs.  (Of course, as
7003 		   compound literals are not part of ISO C++, the
7004 		   standard has nothing to say.)  */
7005 		if (cp_parser_non_integral_constant_expression (parser,
7006 								NIC_NCC))
7007 		  {
7008 		    postfix_expression = error_mark_node;
7009 		    break;
7010 		  }
7011 		/* Form the representation of the compound-literal.  */
7012 		postfix_expression
7013 		  = finish_compound_literal (type, initializer,
7014 					     tf_warning_or_error, fcl_c99);
7015 		postfix_expression.set_location (initializer.get_location ());
7016 		break;
7017 	      }
7018 	  }
7019 
7020 	/* It must be a primary-expression.  */
7021 	postfix_expression
7022 	  = cp_parser_primary_expression (parser, address_p, cast_p,
7023 					  /*template_arg_p=*/false,
7024 					  decltype_p,
7025 					  &idk);
7026       }
7027       break;
7028     }
7029 
7030   /* Note that we don't need to worry about calling build_cplus_new on a
7031      class-valued CALL_EXPR in decltype when it isn't the end of the
7032      postfix-expression; unary_complex_lvalue will take care of that for
7033      all these cases.  */
7034 
7035   /* Keep looping until the postfix-expression is complete.  */
7036   while (true)
7037     {
7038       if (idk == CP_ID_KIND_UNQUALIFIED
7039 	  && identifier_p (postfix_expression)
7040 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
7041 	/* It is not a Koenig lookup function call.  */
7042 	postfix_expression
7043 	  = unqualified_name_lookup_error (postfix_expression);
7044 
7045       /* Peek at the next token.  */
7046       token = cp_lexer_peek_token (parser->lexer);
7047 
7048       switch (token->type)
7049 	{
7050 	case CPP_OPEN_SQUARE:
7051 	  if (cp_next_tokens_can_be_std_attribute_p (parser))
7052 	    {
7053 	      cp_parser_error (parser,
7054 			       "two consecutive %<[%> shall "
7055 			       "only introduce an attribute");
7056 	      return error_mark_node;
7057 	    }
7058 	  postfix_expression
7059 	    = cp_parser_postfix_open_square_expression (parser,
7060 							postfix_expression,
7061 							false,
7062 							decltype_p);
7063 	  postfix_expression.set_range (start_loc,
7064 					postfix_expression.get_location ());
7065 
7066 	  idk = CP_ID_KIND_NONE;
7067           is_member_access = false;
7068 	  break;
7069 
7070 	case CPP_OPEN_PAREN:
7071 	  /* postfix-expression ( expression-list [opt] ) */
7072 	  {
7073 	    bool koenig_p;
7074 	    bool is_builtin_constant_p;
7075 	    bool saved_integral_constant_expression_p = false;
7076 	    bool saved_non_integral_constant_expression_p = false;
7077 	    tsubst_flags_t complain = complain_flags (decltype_p);
7078 	    vec<tree, va_gc> *args;
7079 	    location_t close_paren_loc = UNKNOWN_LOCATION;
7080 
7081             is_member_access = false;
7082 
7083 	    is_builtin_constant_p
7084 	      = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
7085 	    if (is_builtin_constant_p)
7086 	      {
7087 		/* The whole point of __builtin_constant_p is to allow
7088 		   non-constant expressions to appear as arguments.  */
7089 		saved_integral_constant_expression_p
7090 		  = parser->integral_constant_expression_p;
7091 		saved_non_integral_constant_expression_p
7092 		  = parser->non_integral_constant_expression_p;
7093 		parser->integral_constant_expression_p = false;
7094 	      }
7095 	    args = (cp_parser_parenthesized_expression_list
7096 		    (parser, non_attr,
7097 		     /*cast_p=*/false, /*allow_expansion_p=*/true,
7098 		     /*non_constant_p=*/NULL,
7099 		     /*close_paren_loc=*/&close_paren_loc,
7100 		     /*wrap_locations_p=*/true));
7101 	    if (is_builtin_constant_p)
7102 	      {
7103 		parser->integral_constant_expression_p
7104 		  = saved_integral_constant_expression_p;
7105 		parser->non_integral_constant_expression_p
7106 		  = saved_non_integral_constant_expression_p;
7107 	      }
7108 
7109 	    if (args == NULL)
7110 	      {
7111 		postfix_expression = error_mark_node;
7112 		break;
7113 	      }
7114 
7115 	    /* Function calls are not permitted in
7116 	       constant-expressions.  */
7117 	    if (! builtin_valid_in_constant_expr_p (postfix_expression)
7118 		&& cp_parser_non_integral_constant_expression (parser,
7119 							       NIC_FUNC_CALL))
7120 	      {
7121 		postfix_expression = error_mark_node;
7122 		release_tree_vector (args);
7123 		break;
7124 	      }
7125 
7126 	    koenig_p = false;
7127 	    if (idk == CP_ID_KIND_UNQUALIFIED
7128 		|| idk == CP_ID_KIND_TEMPLATE_ID)
7129 	      {
7130 		if (identifier_p (postfix_expression))
7131 		  {
7132 		    if (!args->is_empty ())
7133 		      {
7134 			koenig_p = true;
7135 			if (!any_type_dependent_arguments_p (args))
7136 			  postfix_expression
7137 			    = perform_koenig_lookup (postfix_expression, args,
7138 						     complain);
7139 		      }
7140 		    else
7141 		      postfix_expression
7142 			= unqualified_fn_lookup_error (postfix_expression);
7143 		  }
7144 		/* We do not perform argument-dependent lookup if
7145 		   normal lookup finds a non-function, in accordance
7146 		   with the expected resolution of DR 218.  */
7147 		else if (!args->is_empty ()
7148 			 && is_overloaded_fn (postfix_expression))
7149 		  {
7150 		    tree fn = get_first_fn (postfix_expression);
7151 		    fn = STRIP_TEMPLATE (fn);
7152 
7153 		    /* Do not do argument dependent lookup if regular
7154 		       lookup finds a member function or a block-scope
7155 		       function declaration.  [basic.lookup.argdep]/3  */
7156 		    if (!DECL_FUNCTION_MEMBER_P (fn)
7157 			&& !DECL_LOCAL_FUNCTION_P (fn))
7158 		      {
7159 			koenig_p = true;
7160 			if (!any_type_dependent_arguments_p (args))
7161 			  postfix_expression
7162 			    = perform_koenig_lookup (postfix_expression, args,
7163 						     complain);
7164 		      }
7165 		  }
7166 	      }
7167 
7168 	    if (TREE_CODE (postfix_expression) == FUNCTION_DECL
7169 		&& DECL_BUILT_IN_CLASS (postfix_expression) == BUILT_IN_NORMAL
7170 		&& DECL_FUNCTION_CODE (postfix_expression) == BUILT_IN_MEMSET
7171 		&& vec_safe_length (args) == 3)
7172 	      {
7173 		tree arg0 = (*args)[0];
7174 		tree arg1 = (*args)[1];
7175 		tree arg2 = (*args)[2];
7176 		int literal_mask = ((literal_integer_zerop (arg1) << 1)
7177 				    | (literal_integer_zerop (arg2) << 2));
7178 		warn_for_memset (input_location, arg0, arg2, literal_mask);
7179 	      }
7180 
7181 	    if (TREE_CODE (postfix_expression) == COMPONENT_REF)
7182 	      {
7183 		tree instance = TREE_OPERAND (postfix_expression, 0);
7184 		tree fn = TREE_OPERAND (postfix_expression, 1);
7185 
7186 		if (processing_template_decl
7187 		    && (type_dependent_object_expression_p (instance)
7188 			|| (!BASELINK_P (fn)
7189 			    && TREE_CODE (fn) != FIELD_DECL)
7190 			|| type_dependent_expression_p (fn)
7191 			|| any_type_dependent_arguments_p (args)))
7192 		  {
7193 		    maybe_generic_this_capture (instance, fn);
7194 		    postfix_expression
7195 		      = build_min_nt_call_vec (postfix_expression, args);
7196 		    release_tree_vector (args);
7197 		    break;
7198 		  }
7199 
7200 		if (BASELINK_P (fn))
7201 		  {
7202 		  postfix_expression
7203 		    = (build_new_method_call
7204 		       (instance, fn, &args, NULL_TREE,
7205 			(idk == CP_ID_KIND_QUALIFIED
7206 			 ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
7207 			 : LOOKUP_NORMAL),
7208 			/*fn_p=*/NULL,
7209 			complain));
7210 		  }
7211 		else
7212 		  postfix_expression
7213 		    = finish_call_expr (postfix_expression, &args,
7214 					/*disallow_virtual=*/false,
7215 					/*koenig_p=*/false,
7216 					complain);
7217 	      }
7218 	    else if (TREE_CODE (postfix_expression) == OFFSET_REF
7219 		     || TREE_CODE (postfix_expression) == MEMBER_REF
7220 		     || TREE_CODE (postfix_expression) == DOTSTAR_EXPR)
7221 	      postfix_expression = (build_offset_ref_call_from_tree
7222 				    (postfix_expression, &args,
7223 				     complain));
7224 	    else if (idk == CP_ID_KIND_QUALIFIED)
7225 	      /* A call to a static class member, or a namespace-scope
7226 		 function.  */
7227 	      postfix_expression
7228 		= finish_call_expr (postfix_expression, &args,
7229 				    /*disallow_virtual=*/true,
7230 				    koenig_p,
7231 				    complain);
7232 	    else
7233 	      /* All other function calls.  */
7234 	      postfix_expression
7235 		= finish_call_expr (postfix_expression, &args,
7236 				    /*disallow_virtual=*/false,
7237 				    koenig_p,
7238 				    complain);
7239 
7240 	    if (close_paren_loc != UNKNOWN_LOCATION)
7241 	      {
7242 		location_t combined_loc = make_location (token->location,
7243 							 start_loc,
7244 							 close_paren_loc);
7245 		postfix_expression.set_location (combined_loc);
7246 	      }
7247 
7248 	    /* The POSTFIX_EXPRESSION is certainly no longer an id.  */
7249 	    idk = CP_ID_KIND_NONE;
7250 
7251 	    release_tree_vector (args);
7252 	  }
7253 	  break;
7254 
7255 	case CPP_DOT:
7256 	case CPP_DEREF:
7257 	  /* postfix-expression . template [opt] id-expression
7258 	     postfix-expression . pseudo-destructor-name
7259 	     postfix-expression -> template [opt] id-expression
7260 	     postfix-expression -> pseudo-destructor-name */
7261 
7262 	  /* Consume the `.' or `->' operator.  */
7263 	  cp_lexer_consume_token (parser->lexer);
7264 
7265 	  postfix_expression
7266 	    = cp_parser_postfix_dot_deref_expression (parser, token->type,
7267 						      postfix_expression,
7268 						      false, &idk, loc);
7269 
7270           is_member_access = true;
7271 	  break;
7272 
7273 	case CPP_PLUS_PLUS:
7274 	  /* postfix-expression ++  */
7275 	  /* Consume the `++' token.  */
7276 	  cp_lexer_consume_token (parser->lexer);
7277 	  /* Generate a representation for the complete expression.  */
7278 	  postfix_expression
7279 	    = finish_increment_expr (postfix_expression,
7280 				     POSTINCREMENT_EXPR);
7281 	  /* Increments may not appear in constant-expressions.  */
7282 	  if (cp_parser_non_integral_constant_expression (parser, NIC_INC))
7283 	    postfix_expression = error_mark_node;
7284 	  idk = CP_ID_KIND_NONE;
7285           is_member_access = false;
7286 	  break;
7287 
7288 	case CPP_MINUS_MINUS:
7289 	  /* postfix-expression -- */
7290 	  /* Consume the `--' token.  */
7291 	  cp_lexer_consume_token (parser->lexer);
7292 	  /* Generate a representation for the complete expression.  */
7293 	  postfix_expression
7294 	    = finish_increment_expr (postfix_expression,
7295 				     POSTDECREMENT_EXPR);
7296 	  /* Decrements may not appear in constant-expressions.  */
7297 	  if (cp_parser_non_integral_constant_expression (parser, NIC_DEC))
7298 	    postfix_expression = error_mark_node;
7299 	  idk = CP_ID_KIND_NONE;
7300           is_member_access = false;
7301 	  break;
7302 
7303 	default:
7304 	  if (pidk_return != NULL)
7305 	    * pidk_return = idk;
7306           if (member_access_only_p)
7307             return is_member_access
7308               ? postfix_expression
7309               : cp_expr (error_mark_node);
7310           else
7311             return postfix_expression;
7312 	}
7313     }
7314 
7315   /* We should never get here.  */
7316   gcc_unreachable ();
7317   return error_mark_node;
7318 }
7319 
7320 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
7321    by cp_parser_builtin_offsetof.  We're looking for
7322 
7323      postfix-expression [ expression ]
7324      postfix-expression [ braced-init-list ] (C++11)
7325 
7326    FOR_OFFSETOF is set if we're being called in that context, which
7327    changes how we deal with integer constant expressions.  */
7328 
7329 static tree
7330 cp_parser_postfix_open_square_expression (cp_parser *parser,
7331 					  tree postfix_expression,
7332 					  bool for_offsetof,
7333 					  bool decltype_p)
7334 {
7335   tree index = NULL_TREE;
7336   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
7337   bool saved_greater_than_is_operator_p;
7338 
7339   /* Consume the `[' token.  */
7340   cp_lexer_consume_token (parser->lexer);
7341 
7342   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
7343   parser->greater_than_is_operator_p = true;
7344 
7345   /* Parse the index expression.  */
7346   /* ??? For offsetof, there is a question of what to allow here.  If
7347      offsetof is not being used in an integral constant expression context,
7348      then we *could* get the right answer by computing the value at runtime.
7349      If we are in an integral constant expression context, then we might
7350      could accept any constant expression; hard to say without analysis.
7351      Rather than open the barn door too wide right away, allow only integer
7352      constant expressions here.  */
7353   if (for_offsetof)
7354     index = cp_parser_constant_expression (parser);
7355   else
7356     {
7357       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
7358 	{
7359 	  bool expr_nonconst_p;
7360 	  cp_lexer_set_source_position (parser->lexer);
7361 	  maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
7362 	  index = cp_parser_braced_list (parser, &expr_nonconst_p);
7363 	}
7364       else
7365 	index = cp_parser_expression (parser);
7366     }
7367 
7368   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
7369 
7370   /* Look for the closing `]'.  */
7371   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7372 
7373   /* Build the ARRAY_REF.  */
7374   postfix_expression = grok_array_decl (loc, postfix_expression,
7375 					index, decltype_p);
7376 
7377   /* When not doing offsetof, array references are not permitted in
7378      constant-expressions.  */
7379   if (!for_offsetof
7380       && (cp_parser_non_integral_constant_expression (parser, NIC_ARRAY_REF)))
7381     postfix_expression = error_mark_node;
7382 
7383   return postfix_expression;
7384 }
7385 
7386 /* A subroutine of cp_parser_postfix_dot_deref_expression.  Handle dot
7387    dereference of incomplete type, returns true if error_mark_node should
7388    be returned from caller, otherwise adjusts *SCOPE, *POSTFIX_EXPRESSION
7389    and *DEPENDENT_P.  */
7390 
7391 bool
7392 cp_parser_dot_deref_incomplete (tree *scope, cp_expr *postfix_expression,
7393 				bool *dependent_p)
7394 {
7395   /* In a template, be permissive by treating an object expression
7396      of incomplete type as dependent (after a pedwarn).  */
7397   diagnostic_t kind = (processing_template_decl
7398 		       && MAYBE_CLASS_TYPE_P (*scope) ? DK_PEDWARN : DK_ERROR);
7399 
7400   switch (TREE_CODE (*postfix_expression))
7401     {
7402     case CAST_EXPR:
7403     case REINTERPRET_CAST_EXPR:
7404     case CONST_CAST_EXPR:
7405     case STATIC_CAST_EXPR:
7406     case DYNAMIC_CAST_EXPR:
7407     case IMPLICIT_CONV_EXPR:
7408     case VIEW_CONVERT_EXPR:
7409     case NON_LVALUE_EXPR:
7410       kind = DK_ERROR;
7411       break;
7412     case OVERLOAD:
7413       /* Don't emit any diagnostic for OVERLOADs.  */
7414       kind = DK_IGNORED;
7415       break;
7416     default:
7417       /* Avoid clobbering e.g. DECLs.  */
7418       if (!EXPR_P (*postfix_expression))
7419 	kind = DK_ERROR;
7420       break;
7421     }
7422 
7423   if (kind == DK_IGNORED)
7424     return false;
7425 
7426   location_t exploc = location_of (*postfix_expression);
7427   cxx_incomplete_type_diagnostic (exploc, *postfix_expression, *scope, kind);
7428   if (!MAYBE_CLASS_TYPE_P (*scope))
7429     return true;
7430   if (kind == DK_ERROR)
7431     *scope = *postfix_expression = error_mark_node;
7432   else if (processing_template_decl)
7433     {
7434       *dependent_p = true;
7435       *scope = TREE_TYPE (*postfix_expression) = NULL_TREE;
7436     }
7437   return false;
7438 }
7439 
7440 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
7441    by cp_parser_builtin_offsetof.  We're looking for
7442 
7443      postfix-expression . template [opt] id-expression
7444      postfix-expression . pseudo-destructor-name
7445      postfix-expression -> template [opt] id-expression
7446      postfix-expression -> pseudo-destructor-name
7447 
7448    FOR_OFFSETOF is set if we're being called in that context.  That sorta
7449    limits what of the above we'll actually accept, but nevermind.
7450    TOKEN_TYPE is the "." or "->" token, which will already have been
7451    removed from the stream.  */
7452 
7453 static tree
7454 cp_parser_postfix_dot_deref_expression (cp_parser *parser,
7455 					enum cpp_ttype token_type,
7456 					cp_expr postfix_expression,
7457 					bool for_offsetof, cp_id_kind *idk,
7458 					location_t location)
7459 {
7460   tree name;
7461   bool dependent_p;
7462   bool pseudo_destructor_p;
7463   tree scope = NULL_TREE;
7464   location_t start_loc = postfix_expression.get_start ();
7465 
7466   /* If this is a `->' operator, dereference the pointer.  */
7467   if (token_type == CPP_DEREF)
7468     postfix_expression = build_x_arrow (location, postfix_expression,
7469 					tf_warning_or_error);
7470   /* Check to see whether or not the expression is type-dependent and
7471      not the current instantiation.  */
7472   dependent_p = type_dependent_object_expression_p (postfix_expression);
7473   /* The identifier following the `->' or `.' is not qualified.  */
7474   parser->scope = NULL_TREE;
7475   parser->qualifying_scope = NULL_TREE;
7476   parser->object_scope = NULL_TREE;
7477   *idk = CP_ID_KIND_NONE;
7478 
7479   /* Enter the scope corresponding to the type of the object
7480      given by the POSTFIX_EXPRESSION.  */
7481   if (!dependent_p)
7482     {
7483       scope = TREE_TYPE (postfix_expression);
7484       /* According to the standard, no expression should ever have
7485 	 reference type.  Unfortunately, we do not currently match
7486 	 the standard in this respect in that our internal representation
7487 	 of an expression may have reference type even when the standard
7488 	 says it does not.  Therefore, we have to manually obtain the
7489 	 underlying type here.  */
7490       scope = non_reference (scope);
7491       /* The type of the POSTFIX_EXPRESSION must be complete.  */
7492       /* Unlike the object expression in other contexts, *this is not
7493 	 required to be of complete type for purposes of class member
7494 	 access (5.2.5) outside the member function body.  */
7495       if (postfix_expression != current_class_ref
7496 	  && scope != error_mark_node
7497 	  && !(processing_template_decl
7498 	       && current_class_type
7499 	       && (same_type_ignoring_top_level_qualifiers_p
7500 		   (scope, current_class_type))))
7501 	{
7502 	  scope = complete_type (scope);
7503 	  if (!COMPLETE_TYPE_P (scope)
7504 	      && cp_parser_dot_deref_incomplete (&scope, &postfix_expression,
7505 						 &dependent_p))
7506 	    return error_mark_node;
7507 	}
7508 
7509       if (!dependent_p)
7510 	{
7511 	  /* Let the name lookup machinery know that we are processing a
7512 	     class member access expression.  */
7513 	  parser->context->object_type = scope;
7514 	  /* If something went wrong, we want to be able to discern that case,
7515 	     as opposed to the case where there was no SCOPE due to the type
7516 	     of expression being dependent.  */
7517 	  if (!scope)
7518 	    scope = error_mark_node;
7519 	  /* If the SCOPE was erroneous, make the various semantic analysis
7520 	     functions exit quickly -- and without issuing additional error
7521 	     messages.  */
7522 	  if (scope == error_mark_node)
7523 	    postfix_expression = error_mark_node;
7524 	}
7525     }
7526 
7527   if (dependent_p)
7528     /* Tell cp_parser_lookup_name that there was an object, even though it's
7529        type-dependent.  */
7530     parser->context->object_type = unknown_type_node;
7531 
7532   /* Assume this expression is not a pseudo-destructor access.  */
7533   pseudo_destructor_p = false;
7534 
7535   /* If the SCOPE is a scalar type, then, if this is a valid program,
7536      we must be looking at a pseudo-destructor-name.  If POSTFIX_EXPRESSION
7537      is type dependent, it can be pseudo-destructor-name or something else.
7538      Try to parse it as pseudo-destructor-name first.  */
7539   if ((scope && SCALAR_TYPE_P (scope)) || dependent_p)
7540     {
7541       tree s;
7542       tree type;
7543 
7544       cp_parser_parse_tentatively (parser);
7545       /* Parse the pseudo-destructor-name.  */
7546       s = NULL_TREE;
7547       cp_parser_pseudo_destructor_name (parser, postfix_expression,
7548 					&s, &type);
7549       if (dependent_p
7550 	  && (cp_parser_error_occurred (parser)
7551 	      || !SCALAR_TYPE_P (type)))
7552 	cp_parser_abort_tentative_parse (parser);
7553       else if (cp_parser_parse_definitely (parser))
7554 	{
7555 	  pseudo_destructor_p = true;
7556 	  postfix_expression
7557 	    = finish_pseudo_destructor_expr (postfix_expression,
7558 					     s, type, location);
7559 	}
7560     }
7561 
7562   if (!pseudo_destructor_p)
7563     {
7564       /* If the SCOPE is not a scalar type, we are looking at an
7565 	 ordinary class member access expression, rather than a
7566 	 pseudo-destructor-name.  */
7567       bool template_p;
7568       cp_token *token = cp_lexer_peek_token (parser->lexer);
7569       /* Parse the id-expression.  */
7570       name = (cp_parser_id_expression
7571 	      (parser,
7572 	       cp_parser_optional_template_keyword (parser),
7573 	       /*check_dependency_p=*/true,
7574 	       &template_p,
7575 	       /*declarator_p=*/false,
7576 	       /*optional_p=*/false));
7577       /* In general, build a SCOPE_REF if the member name is qualified.
7578 	 However, if the name was not dependent and has already been
7579 	 resolved; there is no need to build the SCOPE_REF.  For example;
7580 
7581 	     struct X { void f(); };
7582 	     template <typename T> void f(T* t) { t->X::f(); }
7583 
7584 	 Even though "t" is dependent, "X::f" is not and has been resolved
7585 	 to a BASELINK; there is no need to include scope information.  */
7586 
7587       /* But we do need to remember that there was an explicit scope for
7588 	 virtual function calls.  */
7589       if (parser->scope)
7590 	*idk = CP_ID_KIND_QUALIFIED;
7591 
7592       /* If the name is a template-id that names a type, we will get a
7593 	 TYPE_DECL here.  That is invalid code.  */
7594       if (TREE_CODE (name) == TYPE_DECL)
7595 	{
7596 	  error_at (token->location, "invalid use of %qD", name);
7597 	  postfix_expression = error_mark_node;
7598 	}
7599       else
7600 	{
7601 	  if (name != error_mark_node && !BASELINK_P (name) && parser->scope)
7602 	    {
7603 	      if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
7604 		{
7605 		  error_at (token->location, "%<%D::%D%> is not a class member",
7606 			    parser->scope, name);
7607 		  postfix_expression = error_mark_node;
7608 		}
7609 	      else
7610 		name = build_qualified_name (/*type=*/NULL_TREE,
7611 					     parser->scope,
7612 					     name,
7613 					     template_p);
7614 	      parser->scope = NULL_TREE;
7615 	      parser->qualifying_scope = NULL_TREE;
7616 	      parser->object_scope = NULL_TREE;
7617 	    }
7618 	  if (parser->scope && name && BASELINK_P (name))
7619 	    adjust_result_of_qualified_name_lookup
7620 	      (name, parser->scope, scope);
7621 	  postfix_expression
7622 	    = finish_class_member_access_expr (postfix_expression, name,
7623 					       template_p,
7624 					       tf_warning_or_error);
7625 	  /* Build a location e.g.:
7626 	       ptr->access_expr
7627 	       ~~~^~~~~~~~~~~~~
7628 	     where the caret is at the deref token, ranging from
7629 	     the start of postfix_expression to the end of the access expr.  */
7630 	  location_t end_loc
7631 	    = get_finish (cp_lexer_previous_token (parser->lexer)->location);
7632 	  location_t combined_loc
7633 	    = make_location (input_location, start_loc, end_loc);
7634 	  protected_set_expr_location (postfix_expression, combined_loc);
7635 	}
7636     }
7637 
7638   /* We no longer need to look up names in the scope of the object on
7639      the left-hand side of the `.' or `->' operator.  */
7640   parser->context->object_type = NULL_TREE;
7641 
7642   /* Outside of offsetof, these operators may not appear in
7643      constant-expressions.  */
7644   if (!for_offsetof
7645       && (cp_parser_non_integral_constant_expression
7646 	  (parser, token_type == CPP_DEREF ? NIC_ARROW : NIC_POINT)))
7647     postfix_expression = error_mark_node;
7648 
7649   return postfix_expression;
7650 }
7651 
7652 /* Parse a parenthesized expression-list.
7653 
7654    expression-list:
7655      assignment-expression
7656      expression-list, assignment-expression
7657 
7658    attribute-list:
7659      expression-list
7660      identifier
7661      identifier, expression-list
7662 
7663    CAST_P is true if this expression is the target of a cast.
7664 
7665    ALLOW_EXPANSION_P is true if this expression allows expansion of an
7666    argument pack.
7667 
7668    WRAP_LOCATIONS_P is true if expressions within this list for which
7669    CAN_HAVE_LOCATION_P is false should be wrapped with nodes expressing
7670    their source locations.
7671 
7672    Returns a vector of trees.  Each element is a representation of an
7673    assignment-expression.  NULL is returned if the ( and or ) are
7674    missing.  An empty, but allocated, vector is returned on no
7675    expressions.  The parentheses are eaten.  IS_ATTRIBUTE_LIST is id_attr
7676    if we are parsing an attribute list for an attribute that wants a
7677    plain identifier argument, normal_attr for an attribute that wants
7678    an expression, or non_attr if we aren't parsing an attribute list.  If
7679    NON_CONSTANT_P is non-NULL, *NON_CONSTANT_P indicates whether or
7680    not all of the expressions in the list were constant.
7681    If CLOSE_PAREN_LOC is non-NULL, and no errors occur, then *CLOSE_PAREN_LOC
7682    will be written to with the location of the closing parenthesis.  If
7683    an error occurs, it may or may not be written to.  */
7684 
7685 static vec<tree, va_gc> *
7686 cp_parser_parenthesized_expression_list (cp_parser* parser,
7687 					 int is_attribute_list,
7688 					 bool cast_p,
7689                                          bool allow_expansion_p,
7690 					 bool *non_constant_p,
7691 					 location_t *close_paren_loc,
7692 					 bool wrap_locations_p)
7693 {
7694   vec<tree, va_gc> *expression_list;
7695   bool fold_expr_p = is_attribute_list != non_attr;
7696   tree identifier = NULL_TREE;
7697   bool saved_greater_than_is_operator_p;
7698 
7699   /* Assume all the expressions will be constant.  */
7700   if (non_constant_p)
7701     *non_constant_p = false;
7702 
7703   matching_parens parens;
7704   if (!parens.require_open (parser))
7705     return NULL;
7706 
7707   expression_list = make_tree_vector ();
7708 
7709   /* Within a parenthesized expression, a `>' token is always
7710      the greater-than operator.  */
7711   saved_greater_than_is_operator_p
7712     = parser->greater_than_is_operator_p;
7713   parser->greater_than_is_operator_p = true;
7714 
7715   cp_expr expr (NULL_TREE);
7716 
7717   /* Consume expressions until there are no more.  */
7718   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
7719     while (true)
7720       {
7721 	/* At the beginning of attribute lists, check to see if the
7722 	   next token is an identifier.  */
7723 	if (is_attribute_list == id_attr
7724 	    && cp_lexer_peek_token (parser->lexer)->type == CPP_NAME)
7725 	  {
7726 	    cp_token *token;
7727 
7728 	    /* Consume the identifier.  */
7729 	    token = cp_lexer_consume_token (parser->lexer);
7730 	    /* Save the identifier.  */
7731 	    identifier = token->u.value;
7732 	  }
7733 	else
7734 	  {
7735 	    bool expr_non_constant_p;
7736 
7737 	    /* Parse the next assignment-expression.  */
7738 	    if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
7739 	      {
7740 		/* A braced-init-list.  */
7741 		cp_lexer_set_source_position (parser->lexer);
7742 		maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
7743 		expr = cp_parser_braced_list (parser, &expr_non_constant_p);
7744 		if (non_constant_p && expr_non_constant_p)
7745 		  *non_constant_p = true;
7746 	      }
7747 	    else if (non_constant_p)
7748 	      {
7749 		expr = (cp_parser_constant_expression
7750 			(parser, /*allow_non_constant_p=*/true,
7751 			 &expr_non_constant_p));
7752 		if (expr_non_constant_p)
7753 		  *non_constant_p = true;
7754 	      }
7755 	    else
7756 	      expr = cp_parser_assignment_expression (parser, /*pidk=*/NULL,
7757 						      cast_p);
7758 
7759 	    if (fold_expr_p)
7760 	      expr = instantiate_non_dependent_expr (expr);
7761 
7762             /* If we have an ellipsis, then this is an expression
7763 	       expansion.  */
7764             if (allow_expansion_p
7765                 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
7766               {
7767                 /* Consume the `...'.  */
7768                 cp_lexer_consume_token (parser->lexer);
7769 
7770                 /* Build the argument pack.  */
7771                 expr = make_pack_expansion (expr);
7772               }
7773 
7774 	    if (wrap_locations_p)
7775 	      expr.maybe_add_location_wrapper ();
7776 
7777 	     /* Add it to the list.  We add error_mark_node
7778 		expressions to the list, so that we can still tell if
7779 		the correct form for a parenthesized expression-list
7780 		is found. That gives better errors.  */
7781 	    vec_safe_push (expression_list, expr.get_value ());
7782 
7783 	    if (expr == error_mark_node)
7784 	      goto skip_comma;
7785 	  }
7786 
7787 	/* After the first item, attribute lists look the same as
7788 	   expression lists.  */
7789 	is_attribute_list = non_attr;
7790 
7791       get_comma:;
7792 	/* If the next token isn't a `,', then we are done.  */
7793 	if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
7794 	  break;
7795 
7796 	/* Otherwise, consume the `,' and keep going.  */
7797 	cp_lexer_consume_token (parser->lexer);
7798       }
7799 
7800   if (close_paren_loc)
7801     *close_paren_loc = cp_lexer_peek_token (parser->lexer)->location;
7802 
7803   if (!parens.require_close (parser))
7804     {
7805       int ending;
7806 
7807     skip_comma:;
7808       /* We try and resync to an unnested comma, as that will give the
7809 	 user better diagnostics.  */
7810       ending = cp_parser_skip_to_closing_parenthesis (parser,
7811 						      /*recovering=*/true,
7812 						      /*or_comma=*/true,
7813 						      /*consume_paren=*/true);
7814       if (ending < 0)
7815 	goto get_comma;
7816       if (!ending)
7817 	{
7818 	  parser->greater_than_is_operator_p
7819 	    = saved_greater_than_is_operator_p;
7820 	  return NULL;
7821 	}
7822     }
7823 
7824   parser->greater_than_is_operator_p
7825     = saved_greater_than_is_operator_p;
7826 
7827   if (identifier)
7828     vec_safe_insert (expression_list, 0, identifier);
7829 
7830   return expression_list;
7831 }
7832 
7833 /* Parse a pseudo-destructor-name.
7834 
7835    pseudo-destructor-name:
7836      :: [opt] nested-name-specifier [opt] type-name :: ~ type-name
7837      :: [opt] nested-name-specifier template template-id :: ~ type-name
7838      :: [opt] nested-name-specifier [opt] ~ type-name
7839 
7840    If either of the first two productions is used, sets *SCOPE to the
7841    TYPE specified before the final `::'.  Otherwise, *SCOPE is set to
7842    NULL_TREE.  *TYPE is set to the TYPE_DECL for the final type-name,
7843    or ERROR_MARK_NODE if the parse fails.  */
7844 
7845 static void
7846 cp_parser_pseudo_destructor_name (cp_parser* parser,
7847 				  tree object,
7848 				  tree* scope,
7849 				  tree* type)
7850 {
7851   bool nested_name_specifier_p;
7852 
7853   /* Handle ~auto.  */
7854   if (cp_lexer_next_token_is (parser->lexer, CPP_COMPL)
7855       && cp_lexer_nth_token_is_keyword (parser->lexer, 2, RID_AUTO)
7856       && !type_dependent_expression_p (object))
7857     {
7858       if (cxx_dialect < cxx14)
7859 	pedwarn (input_location, 0,
7860 		 "%<~auto%> only available with "
7861 		 "-std=c++14 or -std=gnu++14");
7862       cp_lexer_consume_token (parser->lexer);
7863       cp_lexer_consume_token (parser->lexer);
7864       *scope = NULL_TREE;
7865       *type = TREE_TYPE (object);
7866       return;
7867     }
7868 
7869   /* Assume that things will not work out.  */
7870   *type = error_mark_node;
7871 
7872   /* Look for the optional `::' operator.  */
7873   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
7874   /* Look for the optional nested-name-specifier.  */
7875   nested_name_specifier_p
7876     = (cp_parser_nested_name_specifier_opt (parser,
7877 					    /*typename_keyword_p=*/false,
7878 					    /*check_dependency_p=*/true,
7879 					    /*type_p=*/false,
7880 					    /*is_declaration=*/false)
7881        != NULL_TREE);
7882   /* Now, if we saw a nested-name-specifier, we might be doing the
7883      second production.  */
7884   if (nested_name_specifier_p
7885       && cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
7886     {
7887       /* Consume the `template' keyword.  */
7888       cp_lexer_consume_token (parser->lexer);
7889       /* Parse the template-id.  */
7890       cp_parser_template_id (parser,
7891 			     /*template_keyword_p=*/true,
7892 			     /*check_dependency_p=*/false,
7893 			     class_type,
7894 			     /*is_declaration=*/true);
7895       /* Look for the `::' token.  */
7896       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
7897     }
7898   /* If the next token is not a `~', then there might be some
7899      additional qualification.  */
7900   else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL))
7901     {
7902       /* At this point, we're looking for "type-name :: ~".  The type-name
7903 	 must not be a class-name, since this is a pseudo-destructor.  So,
7904 	 it must be either an enum-name, or a typedef-name -- both of which
7905 	 are just identifiers.  So, we peek ahead to check that the "::"
7906 	 and "~" tokens are present; if they are not, then we can avoid
7907 	 calling type_name.  */
7908       if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME
7909 	  || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE
7910 	  || cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_COMPL)
7911 	{
7912 	  cp_parser_error (parser, "non-scalar type");
7913 	  return;
7914 	}
7915 
7916       /* Look for the type-name.  */
7917       *scope = TREE_TYPE (cp_parser_nonclass_name (parser));
7918       if (*scope == error_mark_node)
7919 	return;
7920 
7921       /* Look for the `::' token.  */
7922       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
7923     }
7924   else
7925     *scope = NULL_TREE;
7926 
7927   /* Look for the `~'.  */
7928   cp_parser_require (parser, CPP_COMPL, RT_COMPL);
7929 
7930   /* Once we see the ~, this has to be a pseudo-destructor.  */
7931   if (!processing_template_decl && !cp_parser_error_occurred (parser))
7932     cp_parser_commit_to_topmost_tentative_parse (parser);
7933 
7934   /* Look for the type-name again.  We are not responsible for
7935      checking that it matches the first type-name.  */
7936   *type = TREE_TYPE (cp_parser_nonclass_name (parser));
7937 }
7938 
7939 /* Parse a unary-expression.
7940 
7941    unary-expression:
7942      postfix-expression
7943      ++ cast-expression
7944      -- cast-expression
7945      unary-operator cast-expression
7946      sizeof unary-expression
7947      sizeof ( type-id )
7948      alignof ( type-id )  [C++0x]
7949      new-expression
7950      delete-expression
7951 
7952    GNU Extensions:
7953 
7954    unary-expression:
7955      __extension__ cast-expression
7956      __alignof__ unary-expression
7957      __alignof__ ( type-id )
7958      alignof unary-expression  [C++0x]
7959      __real__ cast-expression
7960      __imag__ cast-expression
7961      && identifier
7962      sizeof ( type-id ) { initializer-list , [opt] }
7963      alignof ( type-id ) { initializer-list , [opt] } [C++0x]
7964      __alignof__ ( type-id ) { initializer-list , [opt] }
7965 
7966    ADDRESS_P is true iff the unary-expression is appearing as the
7967    operand of the `&' operator.   CAST_P is true if this expression is
7968    the target of a cast.
7969 
7970    Returns a representation of the expression.  */
7971 
7972 static cp_expr
7973 cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
7974 			    bool address_p, bool cast_p, bool decltype_p)
7975 {
7976   cp_token *token;
7977   enum tree_code unary_operator;
7978 
7979   /* Peek at the next token.  */
7980   token = cp_lexer_peek_token (parser->lexer);
7981   /* Some keywords give away the kind of expression.  */
7982   if (token->type == CPP_KEYWORD)
7983     {
7984       enum rid keyword = token->keyword;
7985 
7986       switch (keyword)
7987 	{
7988 	case RID_ALIGNOF:
7989 	case RID_SIZEOF:
7990 	  {
7991 	    tree operand, ret;
7992 	    enum tree_code op;
7993 	    location_t start_loc = token->location;
7994 
7995 	    op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
7996 	    bool std_alignof = id_equal (token->u.value, "alignof");
7997 
7998 	    /* Consume the token.  */
7999 	    cp_lexer_consume_token (parser->lexer);
8000 	    /* Parse the operand.  */
8001 	    operand = cp_parser_sizeof_operand (parser, keyword);
8002 
8003 	    if (TYPE_P (operand))
8004 	      ret = cxx_sizeof_or_alignof_type (operand, op, std_alignof,
8005 						true);
8006 	    else
8007 	      {
8008 		/* ISO C++ defines alignof only with types, not with
8009 		   expressions. So pedwarn if alignof is used with a non-
8010 		   type expression. However, __alignof__ is ok.  */
8011 		if (std_alignof)
8012 		  pedwarn (token->location, OPT_Wpedantic,
8013 			   "ISO C++ does not allow %<alignof%> "
8014 			   "with a non-type");
8015 
8016 		ret = cxx_sizeof_or_alignof_expr (operand, op, true);
8017 	      }
8018 	    /* For SIZEOF_EXPR, just issue diagnostics, but keep
8019 	       SIZEOF_EXPR with the original operand.  */
8020 	    if (op == SIZEOF_EXPR && ret != error_mark_node)
8021 	      {
8022 		if (TREE_CODE (ret) != SIZEOF_EXPR || TYPE_P (operand))
8023 		  {
8024 		    if (!processing_template_decl && TYPE_P (operand))
8025 		      {
8026 			ret = build_min (SIZEOF_EXPR, size_type_node,
8027 					 build1 (NOP_EXPR, operand,
8028 						 error_mark_node));
8029 			SIZEOF_EXPR_TYPE_P (ret) = 1;
8030 		      }
8031 		    else
8032 		      ret = build_min (SIZEOF_EXPR, size_type_node, operand);
8033 		    TREE_SIDE_EFFECTS (ret) = 0;
8034 		    TREE_READONLY (ret) = 1;
8035 		  }
8036 	      }
8037 
8038 	    /* Construct a location e.g. :
8039 	       alignof (expr)
8040 	       ^~~~~~~~~~~~~~
8041 	       with start == caret at the start of the "alignof"/"sizeof"
8042 	       token, with the endpoint at the final closing paren.  */
8043 	    location_t finish_loc
8044 	      = cp_lexer_previous_token (parser->lexer)->location;
8045 	    location_t compound_loc
8046 	      = make_location (start_loc, start_loc, finish_loc);
8047 
8048 	    cp_expr ret_expr (ret);
8049 	    ret_expr.set_location (compound_loc);
8050 	    ret_expr = ret_expr.maybe_add_location_wrapper ();
8051 	    return ret_expr;
8052 	  }
8053 
8054 	case RID_NEW:
8055 	  return cp_parser_new_expression (parser);
8056 
8057 	case RID_DELETE:
8058 	  return cp_parser_delete_expression (parser);
8059 
8060 	case RID_EXTENSION:
8061 	  {
8062 	    /* The saved value of the PEDANTIC flag.  */
8063 	    int saved_pedantic;
8064 	    tree expr;
8065 
8066 	    /* Save away the PEDANTIC flag.  */
8067 	    cp_parser_extension_opt (parser, &saved_pedantic);
8068 	    /* Parse the cast-expression.  */
8069 	    expr = cp_parser_simple_cast_expression (parser);
8070 	    /* Restore the PEDANTIC flag.  */
8071 	    pedantic = saved_pedantic;
8072 
8073 	    return expr;
8074 	  }
8075 
8076 	case RID_REALPART:
8077 	case RID_IMAGPART:
8078 	  {
8079 	    tree expression;
8080 
8081 	    /* Consume the `__real__' or `__imag__' token.  */
8082 	    cp_lexer_consume_token (parser->lexer);
8083 	    /* Parse the cast-expression.  */
8084 	    expression = cp_parser_simple_cast_expression (parser);
8085 	    /* Create the complete representation.  */
8086 	    return build_x_unary_op (token->location,
8087 				     (keyword == RID_REALPART
8088 				      ? REALPART_EXPR : IMAGPART_EXPR),
8089 				     expression,
8090                                      tf_warning_or_error);
8091 	  }
8092 	  break;
8093 
8094 	case RID_TRANSACTION_ATOMIC:
8095 	case RID_TRANSACTION_RELAXED:
8096 	  return cp_parser_transaction_expression (parser, keyword);
8097 
8098 	case RID_NOEXCEPT:
8099 	  {
8100 	    tree expr;
8101 	    const char *saved_message;
8102 	    bool saved_integral_constant_expression_p;
8103 	    bool saved_non_integral_constant_expression_p;
8104 	    bool saved_greater_than_is_operator_p;
8105 
8106 	    location_t start_loc = token->location;
8107 
8108 	    cp_lexer_consume_token (parser->lexer);
8109 	    matching_parens parens;
8110 	    parens.require_open (parser);
8111 
8112 	    saved_message = parser->type_definition_forbidden_message;
8113 	    parser->type_definition_forbidden_message
8114 	      = G_("types may not be defined in %<noexcept%> expressions");
8115 
8116 	    saved_integral_constant_expression_p
8117 	      = parser->integral_constant_expression_p;
8118 	    saved_non_integral_constant_expression_p
8119 	      = parser->non_integral_constant_expression_p;
8120 	    parser->integral_constant_expression_p = false;
8121 
8122 	    saved_greater_than_is_operator_p
8123 	      = parser->greater_than_is_operator_p;
8124 	    parser->greater_than_is_operator_p = true;
8125 
8126 	    ++cp_unevaluated_operand;
8127 	    ++c_inhibit_evaluation_warnings;
8128 	    ++cp_noexcept_operand;
8129 	    expr = cp_parser_expression (parser);
8130 	    --cp_noexcept_operand;
8131 	    --c_inhibit_evaluation_warnings;
8132 	    --cp_unevaluated_operand;
8133 
8134 	    parser->greater_than_is_operator_p
8135 	      = saved_greater_than_is_operator_p;
8136 
8137 	    parser->integral_constant_expression_p
8138 	      = saved_integral_constant_expression_p;
8139 	    parser->non_integral_constant_expression_p
8140 	      = saved_non_integral_constant_expression_p;
8141 
8142 	    parser->type_definition_forbidden_message = saved_message;
8143 
8144 	    location_t finish_loc
8145 	      = cp_lexer_peek_token (parser->lexer)->location;
8146 	    parens.require_close (parser);
8147 
8148 	    /* Construct a location of the form:
8149 	       noexcept (expr)
8150 	       ^~~~~~~~~~~~~~~
8151 	       with start == caret, finishing at the close-paren.  */
8152 	    location_t noexcept_loc
8153 	      = make_location (start_loc, start_loc, finish_loc);
8154 
8155 	    return cp_expr (finish_noexcept_expr (expr, tf_warning_or_error),
8156 			    noexcept_loc);
8157 	  }
8158 
8159 	default:
8160 	  break;
8161 	}
8162     }
8163 
8164   /* Look for the `:: new' and `:: delete', which also signal the
8165      beginning of a new-expression, or delete-expression,
8166      respectively.  If the next token is `::', then it might be one of
8167      these.  */
8168   if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
8169     {
8170       enum rid keyword;
8171 
8172       /* See if the token after the `::' is one of the keywords in
8173 	 which we're interested.  */
8174       keyword = cp_lexer_peek_nth_token (parser->lexer, 2)->keyword;
8175       /* If it's `new', we have a new-expression.  */
8176       if (keyword == RID_NEW)
8177 	return cp_parser_new_expression (parser);
8178       /* Similarly, for `delete'.  */
8179       else if (keyword == RID_DELETE)
8180 	return cp_parser_delete_expression (parser);
8181     }
8182 
8183   /* Look for a unary operator.  */
8184   unary_operator = cp_parser_unary_operator (token);
8185   /* The `++' and `--' operators can be handled similarly, even though
8186      they are not technically unary-operators in the grammar.  */
8187   if (unary_operator == ERROR_MARK)
8188     {
8189       if (token->type == CPP_PLUS_PLUS)
8190 	unary_operator = PREINCREMENT_EXPR;
8191       else if (token->type == CPP_MINUS_MINUS)
8192 	unary_operator = PREDECREMENT_EXPR;
8193       /* Handle the GNU address-of-label extension.  */
8194       else if (cp_parser_allow_gnu_extensions_p (parser)
8195 	       && token->type == CPP_AND_AND)
8196 	{
8197 	  tree identifier;
8198 	  tree expression;
8199 	  location_t start_loc = token->location;
8200 
8201 	  /* Consume the '&&' token.  */
8202 	  cp_lexer_consume_token (parser->lexer);
8203 	  /* Look for the identifier.  */
8204 	  location_t finish_loc
8205 	    = get_finish (cp_lexer_peek_token (parser->lexer)->location);
8206 	  identifier = cp_parser_identifier (parser);
8207 	  /* Construct a location of the form:
8208 	       &&label
8209 	       ^~~~~~~
8210 	     with caret==start at the "&&", finish at the end of the label.  */
8211 	  location_t combined_loc
8212 	    = make_location (start_loc, start_loc, finish_loc);
8213 	  /* Create an expression representing the address.  */
8214 	  expression = finish_label_address_expr (identifier, combined_loc);
8215 	  if (cp_parser_non_integral_constant_expression (parser,
8216 							  NIC_ADDR_LABEL))
8217 	    expression = error_mark_node;
8218 	  return expression;
8219 	}
8220     }
8221   if (unary_operator != ERROR_MARK)
8222     {
8223       cp_expr cast_expression;
8224       cp_expr expression = error_mark_node;
8225       non_integral_constant non_constant_p = NIC_NONE;
8226       location_t loc = token->location;
8227       tsubst_flags_t complain = complain_flags (decltype_p);
8228 
8229       /* Consume the operator token.  */
8230       token = cp_lexer_consume_token (parser->lexer);
8231       enum cpp_ttype op_ttype = cp_lexer_peek_token (parser->lexer)->type;
8232 
8233       /* Parse the cast-expression.  */
8234       cast_expression
8235 	= cp_parser_cast_expression (parser,
8236 				     unary_operator == ADDR_EXPR,
8237 				     /*cast_p=*/false,
8238 				     /*decltype*/false,
8239 				     pidk);
8240 
8241       /* Make a location:
8242 	    OP_TOKEN  CAST_EXPRESSION
8243 	    ^~~~~~~~~~~~~~~~~~~~~~~~~
8244 	 with start==caret at the operator token, and
8245 	 extending to the end of the cast_expression.  */
8246       loc = make_location (loc, loc, cast_expression.get_finish ());
8247 
8248       /* Now, build an appropriate representation.  */
8249       switch (unary_operator)
8250 	{
8251 	case INDIRECT_REF:
8252 	  non_constant_p = NIC_STAR;
8253 	  expression = build_x_indirect_ref (loc, cast_expression,
8254 					     RO_UNARY_STAR,
8255                                              complain);
8256           /* TODO: build_x_indirect_ref does not always honor the
8257              location, so ensure it is set.  */
8258           expression.set_location (loc);
8259 	  break;
8260 
8261 	case ADDR_EXPR:
8262 	   non_constant_p = NIC_ADDR;
8263 	  /* Fall through.  */
8264 	case BIT_NOT_EXPR:
8265 	  expression = build_x_unary_op (loc, unary_operator,
8266 					 cast_expression,
8267                                          complain);
8268           /* TODO: build_x_unary_op does not always honor the location,
8269              so ensure it is set.  */
8270           expression.set_location (loc);
8271 	  break;
8272 
8273 	case PREINCREMENT_EXPR:
8274 	case PREDECREMENT_EXPR:
8275 	  non_constant_p = unary_operator == PREINCREMENT_EXPR
8276 			   ? NIC_PREINCREMENT : NIC_PREDECREMENT;
8277 	  /* Fall through.  */
8278 	case NEGATE_EXPR:
8279 	  /* Immediately fold negation of a constant, unless the constant is 0
8280 	     (since -0 == 0) or it would overflow.  */
8281 	  if (unary_operator == NEGATE_EXPR && op_ttype == CPP_NUMBER
8282 	      && CONSTANT_CLASS_P (cast_expression)
8283 	      && !integer_zerop (cast_expression)
8284 	      && !TREE_OVERFLOW (cast_expression))
8285 	    {
8286 	      tree folded = fold_build1 (unary_operator,
8287 					 TREE_TYPE (cast_expression),
8288 					 cast_expression);
8289 	      if (CONSTANT_CLASS_P (folded) && !TREE_OVERFLOW (folded))
8290 		{
8291 		  expression = cp_expr (folded, loc);
8292 		  break;
8293 		}
8294 	    }
8295 	  /* Fall through.  */
8296 	case UNARY_PLUS_EXPR:
8297 	case TRUTH_NOT_EXPR:
8298 	  expression = finish_unary_op_expr (loc, unary_operator,
8299 					     cast_expression, complain);
8300 	  break;
8301 
8302 	default:
8303 	  gcc_unreachable ();
8304 	}
8305 
8306       if (non_constant_p != NIC_NONE
8307 	  && cp_parser_non_integral_constant_expression (parser,
8308 							 non_constant_p))
8309 	expression = error_mark_node;
8310 
8311       return expression;
8312     }
8313 
8314   return cp_parser_postfix_expression (parser, address_p, cast_p,
8315                                        /*member_access_only_p=*/false,
8316 				       decltype_p,
8317 				       pidk);
8318 }
8319 
8320 /* Returns ERROR_MARK if TOKEN is not a unary-operator.  If TOKEN is a
8321    unary-operator, the corresponding tree code is returned.  */
8322 
8323 static enum tree_code
8324 cp_parser_unary_operator (cp_token* token)
8325 {
8326   switch (token->type)
8327     {
8328     case CPP_MULT:
8329       return INDIRECT_REF;
8330 
8331     case CPP_AND:
8332       return ADDR_EXPR;
8333 
8334     case CPP_PLUS:
8335       return UNARY_PLUS_EXPR;
8336 
8337     case CPP_MINUS:
8338       return NEGATE_EXPR;
8339 
8340     case CPP_NOT:
8341       return TRUTH_NOT_EXPR;
8342 
8343     case CPP_COMPL:
8344       return BIT_NOT_EXPR;
8345 
8346     default:
8347       return ERROR_MARK;
8348     }
8349 }
8350 
8351 /* Parse a new-expression.
8352 
8353    new-expression:
8354      :: [opt] new new-placement [opt] new-type-id new-initializer [opt]
8355      :: [opt] new new-placement [opt] ( type-id ) new-initializer [opt]
8356 
8357    Returns a representation of the expression.  */
8358 
8359 static tree
8360 cp_parser_new_expression (cp_parser* parser)
8361 {
8362   bool global_scope_p;
8363   vec<tree, va_gc> *placement;
8364   tree type;
8365   vec<tree, va_gc> *initializer;
8366   tree nelts = NULL_TREE;
8367   tree ret;
8368 
8369   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
8370 
8371   /* Look for the optional `::' operator.  */
8372   global_scope_p
8373     = (cp_parser_global_scope_opt (parser,
8374 				   /*current_scope_valid_p=*/false)
8375        != NULL_TREE);
8376   /* Look for the `new' operator.  */
8377   cp_parser_require_keyword (parser, RID_NEW, RT_NEW);
8378   /* There's no easy way to tell a new-placement from the
8379      `( type-id )' construct.  */
8380   cp_parser_parse_tentatively (parser);
8381   /* Look for a new-placement.  */
8382   placement = cp_parser_new_placement (parser);
8383   /* If that didn't work out, there's no new-placement.  */
8384   if (!cp_parser_parse_definitely (parser))
8385     {
8386       if (placement != NULL)
8387 	release_tree_vector (placement);
8388       placement = NULL;
8389     }
8390 
8391   /* If the next token is a `(', then we have a parenthesized
8392      type-id.  */
8393   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
8394     {
8395       cp_token *token;
8396       const char *saved_message = parser->type_definition_forbidden_message;
8397 
8398       /* Consume the `('.  */
8399       matching_parens parens;
8400       parens.consume_open (parser);
8401 
8402       /* Parse the type-id.  */
8403       parser->type_definition_forbidden_message
8404 	= G_("types may not be defined in a new-expression");
8405       {
8406 	type_id_in_expr_sentinel s (parser);
8407 	type = cp_parser_type_id (parser);
8408       }
8409       parser->type_definition_forbidden_message = saved_message;
8410 
8411       /* Look for the closing `)'.  */
8412       parens.require_close (parser);
8413       token = cp_lexer_peek_token (parser->lexer);
8414       /* There should not be a direct-new-declarator in this production,
8415 	 but GCC used to allowed this, so we check and emit a sensible error
8416 	 message for this case.  */
8417       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
8418 	{
8419 	  error_at (token->location,
8420 		    "array bound forbidden after parenthesized type-id");
8421 	  inform (token->location,
8422 		  "try removing the parentheses around the type-id");
8423 	  cp_parser_direct_new_declarator (parser);
8424 	}
8425     }
8426   /* Otherwise, there must be a new-type-id.  */
8427   else
8428     type = cp_parser_new_type_id (parser, &nelts);
8429 
8430   /* If the next token is a `(' or '{', then we have a new-initializer.  */
8431   cp_token *token = cp_lexer_peek_token (parser->lexer);
8432   if (token->type == CPP_OPEN_PAREN
8433       || token->type == CPP_OPEN_BRACE)
8434     initializer = cp_parser_new_initializer (parser);
8435   else
8436     initializer = NULL;
8437 
8438   /* A new-expression may not appear in an integral constant
8439      expression.  */
8440   if (cp_parser_non_integral_constant_expression (parser, NIC_NEW))
8441     ret = error_mark_node;
8442   /* 5.3.4/2: "If the auto type-specifier appears in the type-specifier-seq
8443      of a new-type-id or type-id of a new-expression, the new-expression shall
8444      contain a new-initializer of the form ( assignment-expression )".
8445      Additionally, consistently with the spirit of DR 1467, we want to accept
8446      'new auto { 2 }' too.  */
8447   else if ((ret = type_uses_auto (type))
8448 	   && !CLASS_PLACEHOLDER_TEMPLATE (ret)
8449 	   && (vec_safe_length (initializer) != 1
8450 	       || (BRACE_ENCLOSED_INITIALIZER_P ((*initializer)[0])
8451 		   && CONSTRUCTOR_NELTS ((*initializer)[0]) != 1)))
8452     {
8453       error_at (token->location,
8454 		"initialization of new-expression for type %<auto%> "
8455 		"requires exactly one element");
8456       ret = error_mark_node;
8457     }
8458   else
8459     {
8460       /* Construct a location e.g.:
8461            ptr = new int[100]
8462                  ^~~~~~~~~~~~
8463          with caret == start at the start of the "new" token, and the end
8464          at the end of the final token we consumed.  */
8465       cp_token *end_tok = cp_lexer_previous_token (parser->lexer);
8466       location_t end_loc = get_finish (end_tok->location);
8467       location_t combined_loc = make_location (start_loc, start_loc, end_loc);
8468 
8469       /* Create a representation of the new-expression.  */
8470       ret = build_new (&placement, type, nelts, &initializer, global_scope_p,
8471 		       tf_warning_or_error);
8472       protected_set_expr_location (ret, combined_loc);
8473     }
8474 
8475   if (placement != NULL)
8476     release_tree_vector (placement);
8477   if (initializer != NULL)
8478     release_tree_vector (initializer);
8479 
8480   return ret;
8481 }
8482 
8483 /* Parse a new-placement.
8484 
8485    new-placement:
8486      ( expression-list )
8487 
8488    Returns the same representation as for an expression-list.  */
8489 
8490 static vec<tree, va_gc> *
8491 cp_parser_new_placement (cp_parser* parser)
8492 {
8493   vec<tree, va_gc> *expression_list;
8494 
8495   /* Parse the expression-list.  */
8496   expression_list = (cp_parser_parenthesized_expression_list
8497 		     (parser, non_attr, /*cast_p=*/false,
8498 		      /*allow_expansion_p=*/true,
8499 		      /*non_constant_p=*/NULL));
8500 
8501   if (expression_list && expression_list->is_empty ())
8502     error ("expected expression-list or type-id");
8503 
8504   return expression_list;
8505 }
8506 
8507 /* Parse a new-type-id.
8508 
8509    new-type-id:
8510      type-specifier-seq new-declarator [opt]
8511 
8512    Returns the TYPE allocated.  If the new-type-id indicates an array
8513    type, *NELTS is set to the number of elements in the last array
8514    bound; the TYPE will not include the last array bound.  */
8515 
8516 static tree
8517 cp_parser_new_type_id (cp_parser* parser, tree *nelts)
8518 {
8519   cp_decl_specifier_seq type_specifier_seq;
8520   cp_declarator *new_declarator;
8521   cp_declarator *declarator;
8522   cp_declarator *outer_declarator;
8523   const char *saved_message;
8524 
8525   /* The type-specifier sequence must not contain type definitions.
8526      (It cannot contain declarations of new types either, but if they
8527      are not definitions we will catch that because they are not
8528      complete.)  */
8529   saved_message = parser->type_definition_forbidden_message;
8530   parser->type_definition_forbidden_message
8531     = G_("types may not be defined in a new-type-id");
8532   /* Parse the type-specifier-seq.  */
8533   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
8534 				/*is_trailing_return=*/false,
8535 				&type_specifier_seq);
8536   /* Restore the old message.  */
8537   parser->type_definition_forbidden_message = saved_message;
8538 
8539   if (type_specifier_seq.type == error_mark_node)
8540     return error_mark_node;
8541 
8542   /* Parse the new-declarator.  */
8543   new_declarator = cp_parser_new_declarator_opt (parser);
8544 
8545   /* Determine the number of elements in the last array dimension, if
8546      any.  */
8547   *nelts = NULL_TREE;
8548   /* Skip down to the last array dimension.  */
8549   declarator = new_declarator;
8550   outer_declarator = NULL;
8551   while (declarator && (declarator->kind == cdk_pointer
8552 			|| declarator->kind == cdk_ptrmem))
8553     {
8554       outer_declarator = declarator;
8555       declarator = declarator->declarator;
8556     }
8557   while (declarator
8558 	 && declarator->kind == cdk_array
8559 	 && declarator->declarator
8560 	 && declarator->declarator->kind == cdk_array)
8561     {
8562       outer_declarator = declarator;
8563       declarator = declarator->declarator;
8564     }
8565 
8566   if (declarator && declarator->kind == cdk_array)
8567     {
8568       *nelts = declarator->u.array.bounds;
8569       if (*nelts == error_mark_node)
8570 	*nelts = integer_one_node;
8571 
8572       if (outer_declarator)
8573 	outer_declarator->declarator = declarator->declarator;
8574       else
8575 	new_declarator = NULL;
8576     }
8577 
8578   return groktypename (&type_specifier_seq, new_declarator, false);
8579 }
8580 
8581 /* Parse an (optional) new-declarator.
8582 
8583    new-declarator:
8584      ptr-operator new-declarator [opt]
8585      direct-new-declarator
8586 
8587    Returns the declarator.  */
8588 
8589 static cp_declarator *
8590 cp_parser_new_declarator_opt (cp_parser* parser)
8591 {
8592   enum tree_code code;
8593   tree type, std_attributes = NULL_TREE;
8594   cp_cv_quals cv_quals;
8595 
8596   /* We don't know if there's a ptr-operator next, or not.  */
8597   cp_parser_parse_tentatively (parser);
8598   /* Look for a ptr-operator.  */
8599   code = cp_parser_ptr_operator (parser, &type, &cv_quals, &std_attributes);
8600   /* If that worked, look for more new-declarators.  */
8601   if (cp_parser_parse_definitely (parser))
8602     {
8603       cp_declarator *declarator;
8604 
8605       /* Parse another optional declarator.  */
8606       declarator = cp_parser_new_declarator_opt (parser);
8607 
8608       declarator = cp_parser_make_indirect_declarator
8609 	(code, type, cv_quals, declarator, std_attributes);
8610 
8611       return declarator;
8612     }
8613 
8614   /* If the next token is a `[', there is a direct-new-declarator.  */
8615   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
8616     return cp_parser_direct_new_declarator (parser);
8617 
8618   return NULL;
8619 }
8620 
8621 /* Parse a direct-new-declarator.
8622 
8623    direct-new-declarator:
8624      [ expression ]
8625      direct-new-declarator [constant-expression]
8626 
8627    */
8628 
8629 static cp_declarator *
8630 cp_parser_direct_new_declarator (cp_parser* parser)
8631 {
8632   cp_declarator *declarator = NULL;
8633 
8634   while (true)
8635     {
8636       tree expression;
8637       cp_token *token;
8638 
8639       /* Look for the opening `['.  */
8640       cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
8641 
8642       token = cp_lexer_peek_token (parser->lexer);
8643       expression = cp_parser_expression (parser);
8644       /* The standard requires that the expression have integral
8645 	 type.  DR 74 adds enumeration types.  We believe that the
8646 	 real intent is that these expressions be handled like the
8647 	 expression in a `switch' condition, which also allows
8648 	 classes with a single conversion to integral or
8649 	 enumeration type.  */
8650       if (!processing_template_decl)
8651 	{
8652 	  expression
8653 	    = build_expr_type_conversion (WANT_INT | WANT_ENUM,
8654 					  expression,
8655 					  /*complain=*/true);
8656 	  if (!expression)
8657 	    {
8658 	      error_at (token->location,
8659 			"expression in new-declarator must have integral "
8660 			"or enumeration type");
8661 	      expression = error_mark_node;
8662 	    }
8663 	}
8664 
8665       /* Look for the closing `]'.  */
8666       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
8667 
8668       /* Add this bound to the declarator.  */
8669       declarator = make_array_declarator (declarator, expression);
8670 
8671       /* If the next token is not a `[', then there are no more
8672 	 bounds.  */
8673       if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
8674 	break;
8675     }
8676 
8677   return declarator;
8678 }
8679 
8680 /* Parse a new-initializer.
8681 
8682    new-initializer:
8683      ( expression-list [opt] )
8684      braced-init-list
8685 
8686    Returns a representation of the expression-list.  */
8687 
8688 static vec<tree, va_gc> *
8689 cp_parser_new_initializer (cp_parser* parser)
8690 {
8691   vec<tree, va_gc> *expression_list;
8692 
8693   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8694     {
8695       tree t;
8696       bool expr_non_constant_p;
8697       cp_lexer_set_source_position (parser->lexer);
8698       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
8699       t = cp_parser_braced_list (parser, &expr_non_constant_p);
8700       CONSTRUCTOR_IS_DIRECT_INIT (t) = 1;
8701       expression_list = make_tree_vector_single (t);
8702     }
8703   else
8704     expression_list = (cp_parser_parenthesized_expression_list
8705 		       (parser, non_attr, /*cast_p=*/false,
8706 			/*allow_expansion_p=*/true,
8707 			/*non_constant_p=*/NULL));
8708 
8709   return expression_list;
8710 }
8711 
8712 /* Parse a delete-expression.
8713 
8714    delete-expression:
8715      :: [opt] delete cast-expression
8716      :: [opt] delete [ ] cast-expression
8717 
8718    Returns a representation of the expression.  */
8719 
8720 static tree
8721 cp_parser_delete_expression (cp_parser* parser)
8722 {
8723   bool global_scope_p;
8724   bool array_p;
8725   tree expression;
8726 
8727   /* Look for the optional `::' operator.  */
8728   global_scope_p
8729     = (cp_parser_global_scope_opt (parser,
8730 				   /*current_scope_valid_p=*/false)
8731        != NULL_TREE);
8732   /* Look for the `delete' keyword.  */
8733   cp_parser_require_keyword (parser, RID_DELETE, RT_DELETE);
8734   /* See if the array syntax is in use.  */
8735   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
8736     {
8737       /* Consume the `[' token.  */
8738       cp_lexer_consume_token (parser->lexer);
8739       /* Look for the `]' token.  */
8740       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
8741       /* Remember that this is the `[]' construct.  */
8742       array_p = true;
8743     }
8744   else
8745     array_p = false;
8746 
8747   /* Parse the cast-expression.  */
8748   expression = cp_parser_simple_cast_expression (parser);
8749 
8750   /* A delete-expression may not appear in an integral constant
8751      expression.  */
8752   if (cp_parser_non_integral_constant_expression (parser, NIC_DEL))
8753     return error_mark_node;
8754 
8755   return delete_sanity (expression, NULL_TREE, array_p, global_scope_p,
8756 			tf_warning_or_error);
8757 }
8758 
8759 /* Returns 1 if TOKEN may start a cast-expression and isn't '++', '--',
8760    neither '[' in C++11; -1 if TOKEN is '++', '--', or '[' in C++11;
8761    0 otherwise.  */
8762 
8763 static int
8764 cp_parser_tokens_start_cast_expression (cp_parser *parser)
8765 {
8766   cp_token *token = cp_lexer_peek_token (parser->lexer);
8767   switch (token->type)
8768     {
8769     case CPP_COMMA:
8770     case CPP_SEMICOLON:
8771     case CPP_QUERY:
8772     case CPP_COLON:
8773     case CPP_CLOSE_SQUARE:
8774     case CPP_CLOSE_PAREN:
8775     case CPP_CLOSE_BRACE:
8776     case CPP_OPEN_BRACE:
8777     case CPP_DOT:
8778     case CPP_DOT_STAR:
8779     case CPP_DEREF:
8780     case CPP_DEREF_STAR:
8781     case CPP_DIV:
8782     case CPP_MOD:
8783     case CPP_LSHIFT:
8784     case CPP_RSHIFT:
8785     case CPP_LESS:
8786     case CPP_GREATER:
8787     case CPP_LESS_EQ:
8788     case CPP_GREATER_EQ:
8789     case CPP_EQ_EQ:
8790     case CPP_NOT_EQ:
8791     case CPP_EQ:
8792     case CPP_MULT_EQ:
8793     case CPP_DIV_EQ:
8794     case CPP_MOD_EQ:
8795     case CPP_PLUS_EQ:
8796     case CPP_MINUS_EQ:
8797     case CPP_RSHIFT_EQ:
8798     case CPP_LSHIFT_EQ:
8799     case CPP_AND_EQ:
8800     case CPP_XOR_EQ:
8801     case CPP_OR_EQ:
8802     case CPP_XOR:
8803     case CPP_OR:
8804     case CPP_OR_OR:
8805     case CPP_EOF:
8806     case CPP_ELLIPSIS:
8807       return 0;
8808 
8809     case CPP_OPEN_PAREN:
8810       /* In ((type ()) () the last () isn't a valid cast-expression,
8811 	 so the whole must be parsed as postfix-expression.  */
8812       return cp_lexer_peek_nth_token (parser->lexer, 2)->type
8813 	     != CPP_CLOSE_PAREN;
8814 
8815     case CPP_OPEN_SQUARE:
8816       /* '[' may start a primary-expression in obj-c++ and in C++11,
8817 	 as a lambda-expression, eg, '(void)[]{}'.  */
8818       if (cxx_dialect >= cxx11)
8819 	return -1;
8820       return c_dialect_objc ();
8821 
8822     case CPP_PLUS_PLUS:
8823     case CPP_MINUS_MINUS:
8824       /* '++' and '--' may or may not start a cast-expression:
8825 
8826 	 struct T { void operator++(int); };
8827 	 void f() { (T())++; }
8828 
8829 	 vs
8830 
8831 	 int a;
8832 	 (int)++a;  */
8833       return -1;
8834 
8835     default:
8836       return 1;
8837     }
8838 }
8839 
8840 /* Try to find a legal C++-style cast to DST_TYPE for ORIG_EXPR, trying them
8841    in the order: const_cast, static_cast, reinterpret_cast.
8842 
8843    Don't suggest dynamic_cast.
8844 
8845    Return the first legal cast kind found, or NULL otherwise.  */
8846 
8847 static const char *
8848 get_cast_suggestion (tree dst_type, tree orig_expr)
8849 {
8850   tree trial;
8851 
8852   /* Reuse the parser logic by attempting to build the various kinds of
8853      cast, with "complain" disabled.
8854      Identify the first such cast that is valid.  */
8855 
8856   /* Don't attempt to run such logic within template processing.  */
8857   if (processing_template_decl)
8858     return NULL;
8859 
8860   /* First try const_cast.  */
8861   trial = build_const_cast (dst_type, orig_expr, tf_none);
8862   if (trial != error_mark_node)
8863     return "const_cast";
8864 
8865   /* If that fails, try static_cast.  */
8866   trial = build_static_cast (dst_type, orig_expr, tf_none);
8867   if (trial != error_mark_node)
8868     return "static_cast";
8869 
8870   /* Finally, try reinterpret_cast.  */
8871   trial = build_reinterpret_cast (dst_type, orig_expr, tf_none);
8872   if (trial != error_mark_node)
8873     return "reinterpret_cast";
8874 
8875   /* No such cast possible.  */
8876   return NULL;
8877 }
8878 
8879 /* If -Wold-style-cast is enabled, add fix-its to RICHLOC,
8880    suggesting how to convert a C-style cast of the form:
8881 
8882      (DST_TYPE)ORIG_EXPR
8883 
8884    to a C++-style cast.
8885 
8886    The primary range of RICHLOC is asssumed to be that of the original
8887    expression.  OPEN_PAREN_LOC and CLOSE_PAREN_LOC give the locations
8888    of the parens in the C-style cast.  */
8889 
8890 static void
8891 maybe_add_cast_fixit (rich_location *rich_loc, location_t open_paren_loc,
8892 		      location_t close_paren_loc, tree orig_expr,
8893 		      tree dst_type)
8894 {
8895   /* This function is non-trivial, so bail out now if the warning isn't
8896      going to be emitted.  */
8897   if (!warn_old_style_cast)
8898     return;
8899 
8900   /* Try to find a legal C++ cast, trying them in order:
8901      const_cast, static_cast, reinterpret_cast.  */
8902   const char *cast_suggestion = get_cast_suggestion (dst_type, orig_expr);
8903   if (!cast_suggestion)
8904     return;
8905 
8906   /* Replace the open paren with "CAST_SUGGESTION<".  */
8907   pretty_printer pp;
8908   pp_printf (&pp, "%s<", cast_suggestion);
8909   rich_loc->add_fixit_replace (open_paren_loc, pp_formatted_text (&pp));
8910 
8911   /* Replace the close paren with "> (".  */
8912   rich_loc->add_fixit_replace (close_paren_loc, "> (");
8913 
8914   /* Add a closing paren after the expr (the primary range of RICH_LOC).  */
8915   rich_loc->add_fixit_insert_after (")");
8916 }
8917 
8918 
8919 /* Parse a cast-expression.
8920 
8921    cast-expression:
8922      unary-expression
8923      ( type-id ) cast-expression
8924 
8925    ADDRESS_P is true iff the unary-expression is appearing as the
8926    operand of the `&' operator.   CAST_P is true if this expression is
8927    the target of a cast.
8928 
8929    Returns a representation of the expression.  */
8930 
8931 static cp_expr
8932 cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p,
8933 			   bool decltype_p, cp_id_kind * pidk)
8934 {
8935   /* If it's a `(', then we might be looking at a cast.  */
8936   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
8937     {
8938       tree type = NULL_TREE;
8939       cp_expr expr (NULL_TREE);
8940       int cast_expression = 0;
8941       const char *saved_message;
8942 
8943       /* There's no way to know yet whether or not this is a cast.
8944 	 For example, `(int (3))' is a unary-expression, while `(int)
8945 	 3' is a cast.  So, we resort to parsing tentatively.  */
8946       cp_parser_parse_tentatively (parser);
8947       /* Types may not be defined in a cast.  */
8948       saved_message = parser->type_definition_forbidden_message;
8949       parser->type_definition_forbidden_message
8950 	= G_("types may not be defined in casts");
8951       /* Consume the `('.  */
8952       matching_parens parens;
8953       cp_token *open_paren = parens.consume_open (parser);
8954       location_t open_paren_loc = open_paren->location;
8955       location_t close_paren_loc = UNKNOWN_LOCATION;
8956 
8957       /* A very tricky bit is that `(struct S) { 3 }' is a
8958 	 compound-literal (which we permit in C++ as an extension).
8959 	 But, that construct is not a cast-expression -- it is a
8960 	 postfix-expression.  (The reason is that `(struct S) { 3 }.i'
8961 	 is legal; if the compound-literal were a cast-expression,
8962 	 you'd need an extra set of parentheses.)  But, if we parse
8963 	 the type-id, and it happens to be a class-specifier, then we
8964 	 will commit to the parse at that point, because we cannot
8965 	 undo the action that is done when creating a new class.  So,
8966 	 then we cannot back up and do a postfix-expression.
8967 
8968 	 Another tricky case is the following (c++/29234):
8969 
8970          struct S { void operator () (); };
8971 
8972          void foo ()
8973          {
8974            ( S()() );
8975          }
8976 
8977 	 As a type-id we parse the parenthesized S()() as a function
8978 	 returning a function, groktypename complains and we cannot
8979 	 back up in this case either.
8980 
8981 	 Therefore, we scan ahead to the closing `)', and check to see
8982 	 if the tokens after the `)' can start a cast-expression.  Otherwise
8983 	 we are dealing with an unary-expression, a postfix-expression
8984 	 or something else.
8985 
8986 	 Yet another tricky case, in C++11, is the following (c++/54891):
8987 
8988 	 (void)[]{};
8989 
8990          The issue is that usually, besides the case of lambda-expressions,
8991 	 the parenthesized type-id cannot be followed by '[', and, eg, we
8992 	 want to parse '(C ())[2];' in parse/pr26997.C as unary-expression.
8993 	 Thus, if cp_parser_tokens_start_cast_expression returns -1, below
8994 	 we don't commit, we try a cast-expression, then an unary-expression.
8995 
8996 	 Save tokens so that we can put them back.  */
8997       cp_lexer_save_tokens (parser->lexer);
8998 
8999       /* We may be looking at a cast-expression.  */
9000       if (cp_parser_skip_to_closing_parenthesis (parser, false, false,
9001 						 /*consume_paren=*/true))
9002 	cast_expression
9003 	  = cp_parser_tokens_start_cast_expression (parser);
9004 
9005       /* Roll back the tokens we skipped.  */
9006       cp_lexer_rollback_tokens (parser->lexer);
9007       /* If we aren't looking at a cast-expression, simulate an error so
9008 	 that the call to cp_parser_error_occurred below returns true.  */
9009       if (!cast_expression)
9010 	cp_parser_simulate_error (parser);
9011       else
9012 	{
9013 	  bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
9014 	  parser->in_type_id_in_expr_p = true;
9015 	  /* Look for the type-id.  */
9016 	  type = cp_parser_type_id (parser);
9017 	  /* Look for the closing `)'.  */
9018 	  cp_token *close_paren = parens.require_close (parser);
9019 	  if (close_paren)
9020 	    close_paren_loc = close_paren->location;
9021 	  parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
9022 	}
9023 
9024       /* Restore the saved message.  */
9025       parser->type_definition_forbidden_message = saved_message;
9026 
9027       /* At this point this can only be either a cast or a
9028 	 parenthesized ctor such as `(T ())' that looks like a cast to
9029 	 function returning T.  */
9030       if (!cp_parser_error_occurred (parser))
9031 	{
9032 	  /* Only commit if the cast-expression doesn't start with
9033 	     '++', '--', or '[' in C++11.  */
9034 	  if (cast_expression > 0)
9035 	    cp_parser_commit_to_topmost_tentative_parse (parser);
9036 
9037 	  expr = cp_parser_cast_expression (parser,
9038 					    /*address_p=*/false,
9039 					    /*cast_p=*/true,
9040 					    /*decltype_p=*/false,
9041 					    pidk);
9042 
9043 	  if (cp_parser_parse_definitely (parser))
9044 	    {
9045 	      /* Warn about old-style casts, if so requested.  */
9046 	      if (warn_old_style_cast
9047 		  && !in_system_header_at (input_location)
9048 		  && !VOID_TYPE_P (type)
9049 		  && current_lang_name != lang_name_c)
9050 		{
9051 		  gcc_rich_location rich_loc (input_location);
9052 		  maybe_add_cast_fixit (&rich_loc, open_paren_loc, close_paren_loc,
9053 					expr, type);
9054 		  warning_at (&rich_loc, OPT_Wold_style_cast,
9055 			      "use of old-style cast to %q#T", type);
9056 		}
9057 
9058 	      /* Only type conversions to integral or enumeration types
9059 		 can be used in constant-expressions.  */
9060 	      if (!cast_valid_in_integral_constant_expression_p (type)
9061 		  && cp_parser_non_integral_constant_expression (parser,
9062 								 NIC_CAST))
9063 		return error_mark_node;
9064 
9065 	      /* Perform the cast.  */
9066 	      /* Make a location:
9067 		   (TYPE) EXPR
9068 		   ^~~~~~~~~~~
9069 		 with start==caret at the open paren, extending to the
9070 		 end of "expr".  */
9071 	      location_t cast_loc = make_location (open_paren_loc,
9072 						   open_paren_loc,
9073 						   expr.get_finish ());
9074 	      expr = build_c_cast (cast_loc, type, expr);
9075 	      return expr;
9076 	    }
9077 	}
9078       else
9079         cp_parser_abort_tentative_parse (parser);
9080     }
9081 
9082   /* If we get here, then it's not a cast, so it must be a
9083      unary-expression.  */
9084   return cp_parser_unary_expression (parser, pidk, address_p,
9085 				     cast_p, decltype_p);
9086 }
9087 
9088 /* Parse a binary expression of the general form:
9089 
9090    pm-expression:
9091      cast-expression
9092      pm-expression .* cast-expression
9093      pm-expression ->* cast-expression
9094 
9095    multiplicative-expression:
9096      pm-expression
9097      multiplicative-expression * pm-expression
9098      multiplicative-expression / pm-expression
9099      multiplicative-expression % pm-expression
9100 
9101    additive-expression:
9102      multiplicative-expression
9103      additive-expression + multiplicative-expression
9104      additive-expression - multiplicative-expression
9105 
9106    shift-expression:
9107      additive-expression
9108      shift-expression << additive-expression
9109      shift-expression >> additive-expression
9110 
9111    relational-expression:
9112      shift-expression
9113      relational-expression < shift-expression
9114      relational-expression > shift-expression
9115      relational-expression <= shift-expression
9116      relational-expression >= shift-expression
9117 
9118   GNU Extension:
9119 
9120    relational-expression:
9121      relational-expression <? shift-expression
9122      relational-expression >? shift-expression
9123 
9124    equality-expression:
9125      relational-expression
9126      equality-expression == relational-expression
9127      equality-expression != relational-expression
9128 
9129    and-expression:
9130      equality-expression
9131      and-expression & equality-expression
9132 
9133    exclusive-or-expression:
9134      and-expression
9135      exclusive-or-expression ^ and-expression
9136 
9137    inclusive-or-expression:
9138      exclusive-or-expression
9139      inclusive-or-expression | exclusive-or-expression
9140 
9141    logical-and-expression:
9142      inclusive-or-expression
9143      logical-and-expression && inclusive-or-expression
9144 
9145    logical-or-expression:
9146      logical-and-expression
9147      logical-or-expression || logical-and-expression
9148 
9149    All these are implemented with a single function like:
9150 
9151    binary-expression:
9152      simple-cast-expression
9153      binary-expression <token> binary-expression
9154 
9155    CAST_P is true if this expression is the target of a cast.
9156 
9157    The binops_by_token map is used to get the tree codes for each <token> type.
9158    binary-expressions are associated according to a precedence table.  */
9159 
9160 #define TOKEN_PRECEDENCE(token)				     \
9161 (((token->type == CPP_GREATER				     \
9162    || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT)) \
9163   && !parser->greater_than_is_operator_p)		     \
9164  ? PREC_NOT_OPERATOR					     \
9165  : binops_by_token[token->type].prec)
9166 
9167 static cp_expr
9168 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
9169 			     bool no_toplevel_fold_p,
9170 			     bool decltype_p,
9171 			     enum cp_parser_prec prec,
9172 			     cp_id_kind * pidk)
9173 {
9174   cp_parser_expression_stack stack;
9175   cp_parser_expression_stack_entry *sp = &stack[0];
9176   cp_parser_expression_stack_entry current;
9177   cp_expr rhs;
9178   cp_token *token;
9179   enum tree_code rhs_type;
9180   enum cp_parser_prec new_prec, lookahead_prec;
9181   tree overload;
9182 
9183   /* Parse the first expression.  */
9184   current.lhs_type = (cp_lexer_next_token_is (parser->lexer, CPP_NOT)
9185 		      ? TRUTH_NOT_EXPR : ERROR_MARK);
9186   current.lhs = cp_parser_cast_expression (parser, /*address_p=*/false,
9187 					   cast_p, decltype_p, pidk);
9188   current.prec = prec;
9189 
9190   if (cp_parser_error_occurred (parser))
9191     return error_mark_node;
9192 
9193   for (;;)
9194     {
9195       /* Get an operator token.  */
9196       token = cp_lexer_peek_token (parser->lexer);
9197 
9198       if (warn_cxx11_compat
9199           && token->type == CPP_RSHIFT
9200           && !parser->greater_than_is_operator_p)
9201         {
9202           if (warning_at (token->location, OPT_Wc__11_compat,
9203 			  "%<>>%> operator is treated"
9204 			  " as two right angle brackets in C++11"))
9205 	    inform (token->location,
9206 		    "suggest parentheses around %<>>%> expression");
9207         }
9208 
9209       new_prec = TOKEN_PRECEDENCE (token);
9210       if (new_prec != PREC_NOT_OPERATOR
9211 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_ELLIPSIS))
9212 	/* This is a fold-expression; handle it later.  */
9213 	new_prec = PREC_NOT_OPERATOR;
9214 
9215       /* Popping an entry off the stack means we completed a subexpression:
9216 	 - either we found a token which is not an operator (`>' where it is not
9217 	   an operator, or prec == PREC_NOT_OPERATOR), in which case popping
9218 	   will happen repeatedly;
9219 	 - or, we found an operator which has lower priority.  This is the case
9220 	   where the recursive descent *ascends*, as in `3 * 4 + 5' after
9221 	   parsing `3 * 4'.  */
9222       if (new_prec <= current.prec)
9223 	{
9224 	  if (sp == stack)
9225 	    break;
9226 	  else
9227 	    goto pop;
9228 	}
9229 
9230      get_rhs:
9231       current.tree_type = binops_by_token[token->type].tree_type;
9232       current.loc = token->location;
9233 
9234       /* We used the operator token.  */
9235       cp_lexer_consume_token (parser->lexer);
9236 
9237       /* For "false && x" or "true || x", x will never be executed;
9238 	 disable warnings while evaluating it.  */
9239       if (current.tree_type == TRUTH_ANDIF_EXPR)
9240 	c_inhibit_evaluation_warnings +=
9241 	  cp_fully_fold (current.lhs) == truthvalue_false_node;
9242       else if (current.tree_type == TRUTH_ORIF_EXPR)
9243 	c_inhibit_evaluation_warnings +=
9244 	  cp_fully_fold (current.lhs) == truthvalue_true_node;
9245 
9246       /* Extract another operand.  It may be the RHS of this expression
9247 	 or the LHS of a new, higher priority expression.  */
9248       rhs_type = (cp_lexer_next_token_is (parser->lexer, CPP_NOT)
9249 		  ? TRUTH_NOT_EXPR : ERROR_MARK);
9250       rhs = cp_parser_simple_cast_expression (parser);
9251 
9252       /* Get another operator token.  Look up its precedence to avoid
9253 	 building a useless (immediately popped) stack entry for common
9254 	 cases such as 3 + 4 + 5 or 3 * 4 + 5.  */
9255       token = cp_lexer_peek_token (parser->lexer);
9256       lookahead_prec = TOKEN_PRECEDENCE (token);
9257       if (lookahead_prec != PREC_NOT_OPERATOR
9258 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_ELLIPSIS))
9259 	lookahead_prec = PREC_NOT_OPERATOR;
9260       if (lookahead_prec > new_prec)
9261 	{
9262 	  /* ... and prepare to parse the RHS of the new, higher priority
9263 	     expression.  Since precedence levels on the stack are
9264 	     monotonically increasing, we do not have to care about
9265 	     stack overflows.  */
9266 	  *sp = current;
9267 	  ++sp;
9268 	  current.lhs = rhs;
9269 	  current.lhs_type = rhs_type;
9270 	  current.prec = new_prec;
9271 	  new_prec = lookahead_prec;
9272 	  goto get_rhs;
9273 
9274 	 pop:
9275 	  lookahead_prec = new_prec;
9276 	  /* If the stack is not empty, we have parsed into LHS the right side
9277 	     (`4' in the example above) of an expression we had suspended.
9278 	     We can use the information on the stack to recover the LHS (`3')
9279 	     from the stack together with the tree code (`MULT_EXPR'), and
9280 	     the precedence of the higher level subexpression
9281 	     (`PREC_ADDITIVE_EXPRESSION').  TOKEN is the CPP_PLUS token,
9282 	     which will be used to actually build the additive expression.  */
9283 	  rhs = current.lhs;
9284 	  rhs_type = current.lhs_type;
9285 	  --sp;
9286 	  current = *sp;
9287 	}
9288 
9289       /* Undo the disabling of warnings done above.  */
9290       if (current.tree_type == TRUTH_ANDIF_EXPR)
9291 	c_inhibit_evaluation_warnings -=
9292 	  cp_fully_fold (current.lhs) == truthvalue_false_node;
9293       else if (current.tree_type == TRUTH_ORIF_EXPR)
9294 	c_inhibit_evaluation_warnings -=
9295 	  cp_fully_fold (current.lhs) == truthvalue_true_node;
9296 
9297       if (warn_logical_not_paren
9298 	  && TREE_CODE_CLASS (current.tree_type) == tcc_comparison
9299 	  && current.lhs_type == TRUTH_NOT_EXPR
9300 	  /* Avoid warning for !!x == y.  */
9301 	  && (TREE_CODE (current.lhs) != NE_EXPR
9302 	      || !integer_zerop (TREE_OPERAND (current.lhs, 1)))
9303 	  && (TREE_CODE (current.lhs) != TRUTH_NOT_EXPR
9304 	      || (TREE_CODE (TREE_OPERAND (current.lhs, 0)) != TRUTH_NOT_EXPR
9305 		  /* Avoid warning for !b == y where b is boolean.  */
9306 		  && (TREE_TYPE (TREE_OPERAND (current.lhs, 0)) == NULL_TREE
9307 		      || (TREE_CODE (TREE_TYPE (TREE_OPERAND (current.lhs, 0)))
9308 			  != BOOLEAN_TYPE))))
9309 	  /* Avoid warning for !!b == y where b is boolean.  */
9310 	  && (!DECL_P (current.lhs)
9311 	      || TREE_TYPE (current.lhs) == NULL_TREE
9312 	      || TREE_CODE (TREE_TYPE (current.lhs)) != BOOLEAN_TYPE))
9313 	warn_logical_not_parentheses (current.loc, current.tree_type,
9314 				      current.lhs, maybe_constant_value (rhs));
9315 
9316       overload = NULL;
9317 
9318       location_t combined_loc = make_location (current.loc,
9319 					       current.lhs.get_start (),
9320 					       rhs.get_finish ());
9321 
9322       /* ??? Currently we pass lhs_type == ERROR_MARK and rhs_type ==
9323 	 ERROR_MARK for everything that is not a binary expression.
9324 	 This makes warn_about_parentheses miss some warnings that
9325 	 involve unary operators.  For unary expressions we should
9326 	 pass the correct tree_code unless the unary expression was
9327 	 surrounded by parentheses.
9328       */
9329       if (no_toplevel_fold_p
9330 	  && lookahead_prec <= current.prec
9331 	  && sp == stack)
9332 	{
9333 	  if (current.lhs == error_mark_node || rhs == error_mark_node)
9334 	    current.lhs = error_mark_node;
9335 	  else
9336 	    {
9337 	      current.lhs
9338 		= build_min (current.tree_type,
9339 			     TREE_CODE_CLASS (current.tree_type)
9340 			     == tcc_comparison
9341 			     ? boolean_type_node : TREE_TYPE (current.lhs),
9342 			     current.lhs.get_value (), rhs.get_value ());
9343 	      SET_EXPR_LOCATION (current.lhs, combined_loc);
9344 	    }
9345 	}
9346       else
9347         {
9348           current.lhs = build_x_binary_op (combined_loc, current.tree_type,
9349                                            current.lhs, current.lhs_type,
9350                                            rhs, rhs_type, &overload,
9351                                            complain_flags (decltype_p));
9352           /* TODO: build_x_binary_op doesn't always honor the location.  */
9353           current.lhs.set_location (combined_loc);
9354         }
9355       current.lhs_type = current.tree_type;
9356 
9357       /* If the binary operator required the use of an overloaded operator,
9358 	 then this expression cannot be an integral constant-expression.
9359 	 An overloaded operator can be used even if both operands are
9360 	 otherwise permissible in an integral constant-expression if at
9361 	 least one of the operands is of enumeration type.  */
9362 
9363       if (overload
9364 	  && cp_parser_non_integral_constant_expression (parser,
9365 							 NIC_OVERLOADED))
9366 	return error_mark_node;
9367     }
9368 
9369   return current.lhs;
9370 }
9371 
9372 static cp_expr
9373 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
9374 			     bool no_toplevel_fold_p,
9375 			     enum cp_parser_prec prec,
9376 			     cp_id_kind * pidk)
9377 {
9378   return cp_parser_binary_expression (parser, cast_p, no_toplevel_fold_p,
9379 				      /*decltype*/false, prec, pidk);
9380 }
9381 
9382 /* Parse the `? expression : assignment-expression' part of a
9383    conditional-expression.  The LOGICAL_OR_EXPR is the
9384    logical-or-expression that started the conditional-expression.
9385    Returns a representation of the entire conditional-expression.
9386 
9387    This routine is used by cp_parser_assignment_expression.
9388 
9389      ? expression : assignment-expression
9390 
9391    GNU Extensions:
9392 
9393      ? : assignment-expression */
9394 
9395 static tree
9396 cp_parser_question_colon_clause (cp_parser* parser, cp_expr logical_or_expr)
9397 {
9398   tree expr, folded_logical_or_expr = cp_fully_fold (logical_or_expr);
9399   cp_expr assignment_expr;
9400   struct cp_token *token;
9401   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9402 
9403   /* Consume the `?' token.  */
9404   cp_lexer_consume_token (parser->lexer);
9405   token = cp_lexer_peek_token (parser->lexer);
9406   if (cp_parser_allow_gnu_extensions_p (parser)
9407       && token->type == CPP_COLON)
9408     {
9409       pedwarn (token->location, OPT_Wpedantic,
9410                "ISO C++ does not allow ?: with omitted middle operand");
9411       /* Implicit true clause.  */
9412       expr = NULL_TREE;
9413       c_inhibit_evaluation_warnings +=
9414 	folded_logical_or_expr == truthvalue_true_node;
9415       warn_for_omitted_condop (token->location, logical_or_expr);
9416     }
9417   else
9418     {
9419       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
9420       parser->colon_corrects_to_scope_p = false;
9421       /* Parse the expression.  */
9422       c_inhibit_evaluation_warnings +=
9423 	folded_logical_or_expr == truthvalue_false_node;
9424       expr = cp_parser_expression (parser);
9425       c_inhibit_evaluation_warnings +=
9426 	((folded_logical_or_expr == truthvalue_true_node)
9427 	 - (folded_logical_or_expr == truthvalue_false_node));
9428       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
9429     }
9430 
9431   /* The next token should be a `:'.  */
9432   cp_parser_require (parser, CPP_COLON, RT_COLON);
9433   /* Parse the assignment-expression.  */
9434   assignment_expr = cp_parser_assignment_expression (parser);
9435   c_inhibit_evaluation_warnings -=
9436     folded_logical_or_expr == truthvalue_true_node;
9437 
9438   /* Make a location:
9439        LOGICAL_OR_EXPR ? EXPR : ASSIGNMENT_EXPR
9440        ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
9441      with the caret at the "?", ranging from the start of
9442      the logical_or_expr to the end of the assignment_expr.  */
9443   loc = make_location (loc,
9444 		       logical_or_expr.get_start (),
9445 		       assignment_expr.get_finish ());
9446 
9447   /* Build the conditional-expression.  */
9448   return build_x_conditional_expr (loc, logical_or_expr,
9449 				   expr,
9450 				   assignment_expr,
9451                                    tf_warning_or_error);
9452 }
9453 
9454 /* Parse an assignment-expression.
9455 
9456    assignment-expression:
9457      conditional-expression
9458      logical-or-expression assignment-operator assignment_expression
9459      throw-expression
9460 
9461    CAST_P is true if this expression is the target of a cast.
9462    DECLTYPE_P is true if this expression is the operand of decltype.
9463 
9464    Returns a representation for the expression.  */
9465 
9466 static cp_expr
9467 cp_parser_assignment_expression (cp_parser* parser, cp_id_kind * pidk,
9468 				 bool cast_p, bool decltype_p)
9469 {
9470   cp_expr expr;
9471 
9472   /* If the next token is the `throw' keyword, then we're looking at
9473      a throw-expression.  */
9474   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THROW))
9475     expr = cp_parser_throw_expression (parser);
9476   /* Otherwise, it must be that we are looking at a
9477      logical-or-expression.  */
9478   else
9479     {
9480       /* Parse the binary expressions (logical-or-expression).  */
9481       expr = cp_parser_binary_expression (parser, cast_p, false,
9482 					  decltype_p,
9483 					  PREC_NOT_OPERATOR, pidk);
9484       /* If the next token is a `?' then we're actually looking at a
9485 	 conditional-expression.  */
9486       if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
9487 	return cp_parser_question_colon_clause (parser, expr);
9488       else
9489 	{
9490 	  location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9491 
9492 	  /* If it's an assignment-operator, we're using the second
9493 	     production.  */
9494 	  enum tree_code assignment_operator
9495 	    = cp_parser_assignment_operator_opt (parser);
9496 	  if (assignment_operator != ERROR_MARK)
9497 	    {
9498 	      bool non_constant_p;
9499 
9500 	      /* Parse the right-hand side of the assignment.  */
9501 	      cp_expr rhs = cp_parser_initializer_clause (parser,
9502 							  &non_constant_p);
9503 
9504 	      if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
9505 		maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
9506 
9507 	      /* An assignment may not appear in a
9508 		 constant-expression.  */
9509 	      if (cp_parser_non_integral_constant_expression (parser,
9510 							      NIC_ASSIGNMENT))
9511 		return error_mark_node;
9512 	      /* Build the assignment expression.  Its default
9513 		 location:
9514 		   LHS = RHS
9515 		   ~~~~^~~~~
9516 		 is the location of the '=' token as the
9517 		 caret, ranging from the start of the lhs to the
9518 		 end of the rhs.  */
9519 	      loc = make_location (loc,
9520 				   expr.get_start (),
9521 				   rhs.get_finish ());
9522 	      expr = build_x_modify_expr (loc, expr,
9523 					  assignment_operator,
9524 					  rhs,
9525 					  complain_flags (decltype_p));
9526               /* TODO: build_x_modify_expr doesn't honor the location,
9527                  so we must set it here.  */
9528               expr.set_location (loc);
9529 	    }
9530 	}
9531     }
9532 
9533   return expr;
9534 }
9535 
9536 /* Parse an (optional) assignment-operator.
9537 
9538    assignment-operator: one of
9539      = *= /= %= += -= >>= <<= &= ^= |=
9540 
9541    GNU Extension:
9542 
9543    assignment-operator: one of
9544      <?= >?=
9545 
9546    If the next token is an assignment operator, the corresponding tree
9547    code is returned, and the token is consumed.  For example, for
9548    `+=', PLUS_EXPR is returned.  For `=' itself, the code returned is
9549    NOP_EXPR.  For `/', TRUNC_DIV_EXPR is returned; for `%',
9550    TRUNC_MOD_EXPR is returned.  If TOKEN is not an assignment
9551    operator, ERROR_MARK is returned.  */
9552 
9553 static enum tree_code
9554 cp_parser_assignment_operator_opt (cp_parser* parser)
9555 {
9556   enum tree_code op;
9557   cp_token *token;
9558 
9559   /* Peek at the next token.  */
9560   token = cp_lexer_peek_token (parser->lexer);
9561 
9562   switch (token->type)
9563     {
9564     case CPP_EQ:
9565       op = NOP_EXPR;
9566       break;
9567 
9568     case CPP_MULT_EQ:
9569       op = MULT_EXPR;
9570       break;
9571 
9572     case CPP_DIV_EQ:
9573       op = TRUNC_DIV_EXPR;
9574       break;
9575 
9576     case CPP_MOD_EQ:
9577       op = TRUNC_MOD_EXPR;
9578       break;
9579 
9580     case CPP_PLUS_EQ:
9581       op = PLUS_EXPR;
9582       break;
9583 
9584     case CPP_MINUS_EQ:
9585       op = MINUS_EXPR;
9586       break;
9587 
9588     case CPP_RSHIFT_EQ:
9589       op = RSHIFT_EXPR;
9590       break;
9591 
9592     case CPP_LSHIFT_EQ:
9593       op = LSHIFT_EXPR;
9594       break;
9595 
9596     case CPP_AND_EQ:
9597       op = BIT_AND_EXPR;
9598       break;
9599 
9600     case CPP_XOR_EQ:
9601       op = BIT_XOR_EXPR;
9602       break;
9603 
9604     case CPP_OR_EQ:
9605       op = BIT_IOR_EXPR;
9606       break;
9607 
9608     default:
9609       /* Nothing else is an assignment operator.  */
9610       op = ERROR_MARK;
9611     }
9612 
9613   /* An operator followed by ... is a fold-expression, handled elsewhere.  */
9614   if (op != ERROR_MARK
9615       && cp_lexer_nth_token_is (parser->lexer, 2, CPP_ELLIPSIS))
9616     op = ERROR_MARK;
9617 
9618   /* If it was an assignment operator, consume it.  */
9619   if (op != ERROR_MARK)
9620     cp_lexer_consume_token (parser->lexer);
9621 
9622   return op;
9623 }
9624 
9625 /* Parse an expression.
9626 
9627    expression:
9628      assignment-expression
9629      expression , assignment-expression
9630 
9631    CAST_P is true if this expression is the target of a cast.
9632    DECLTYPE_P is true if this expression is the immediate operand of decltype,
9633      except possibly parenthesized or on the RHS of a comma (N3276).
9634 
9635    Returns a representation of the expression.  */
9636 
9637 static cp_expr
9638 cp_parser_expression (cp_parser* parser, cp_id_kind * pidk,
9639 		      bool cast_p, bool decltype_p)
9640 {
9641   cp_expr expression = NULL_TREE;
9642   location_t loc = UNKNOWN_LOCATION;
9643 
9644   while (true)
9645     {
9646       cp_expr assignment_expression;
9647 
9648       /* Parse the next assignment-expression.  */
9649       assignment_expression
9650 	= cp_parser_assignment_expression (parser, pidk, cast_p, decltype_p);
9651 
9652       /* We don't create a temporary for a call that is the immediate operand
9653 	 of decltype or on the RHS of a comma.  But when we see a comma, we
9654 	 need to create a temporary for a call on the LHS.  */
9655       if (decltype_p && !processing_template_decl
9656 	  && TREE_CODE (assignment_expression) == CALL_EXPR
9657 	  && CLASS_TYPE_P (TREE_TYPE (assignment_expression))
9658 	  && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
9659 	assignment_expression
9660 	  = build_cplus_new (TREE_TYPE (assignment_expression),
9661 			     assignment_expression, tf_warning_or_error);
9662 
9663       /* If this is the first assignment-expression, we can just
9664 	 save it away.  */
9665       if (!expression)
9666 	expression = assignment_expression;
9667       else
9668 	{
9669 	  /* Create a location with caret at the comma, ranging
9670 	     from the start of the LHS to the end of the RHS.  */
9671 	  loc = make_location (loc,
9672 			       expression.get_start (),
9673 			       assignment_expression.get_finish ());
9674 	  expression = build_x_compound_expr (loc, expression,
9675 					      assignment_expression,
9676 					      complain_flags (decltype_p));
9677 	  expression.set_location (loc);
9678 	}
9679       /* If the next token is not a comma, or we're in a fold-expression, then
9680 	 we are done with the expression.  */
9681       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA)
9682 	  || cp_lexer_nth_token_is (parser->lexer, 2, CPP_ELLIPSIS))
9683 	break;
9684       /* Consume the `,'.  */
9685       loc = cp_lexer_peek_token (parser->lexer)->location;
9686       cp_lexer_consume_token (parser->lexer);
9687       /* A comma operator cannot appear in a constant-expression.  */
9688       if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA))
9689 	expression = error_mark_node;
9690     }
9691 
9692   return expression;
9693 }
9694 
9695 /* Parse a constant-expression.
9696 
9697    constant-expression:
9698      conditional-expression
9699 
9700   If ALLOW_NON_CONSTANT_P a non-constant expression is silently
9701   accepted.  If ALLOW_NON_CONSTANT_P is true and the expression is not
9702   constant, *NON_CONSTANT_P is set to TRUE.  If ALLOW_NON_CONSTANT_P
9703   is false, NON_CONSTANT_P should be NULL.  If STRICT_P is true,
9704   only parse a conditional-expression, otherwise parse an
9705   assignment-expression.  See below for rationale.  */
9706 
9707 static cp_expr
9708 cp_parser_constant_expression (cp_parser* parser,
9709 			       bool allow_non_constant_p,
9710 			       bool *non_constant_p,
9711 			       bool strict_p)
9712 {
9713   bool saved_integral_constant_expression_p;
9714   bool saved_allow_non_integral_constant_expression_p;
9715   bool saved_non_integral_constant_expression_p;
9716   cp_expr expression;
9717 
9718   /* It might seem that we could simply parse the
9719      conditional-expression, and then check to see if it were
9720      TREE_CONSTANT.  However, an expression that is TREE_CONSTANT is
9721      one that the compiler can figure out is constant, possibly after
9722      doing some simplifications or optimizations.  The standard has a
9723      precise definition of constant-expression, and we must honor
9724      that, even though it is somewhat more restrictive.
9725 
9726      For example:
9727 
9728        int i[(2, 3)];
9729 
9730      is not a legal declaration, because `(2, 3)' is not a
9731      constant-expression.  The `,' operator is forbidden in a
9732      constant-expression.  However, GCC's constant-folding machinery
9733      will fold this operation to an INTEGER_CST for `3'.  */
9734 
9735   /* Save the old settings.  */
9736   saved_integral_constant_expression_p = parser->integral_constant_expression_p;
9737   saved_allow_non_integral_constant_expression_p
9738     = parser->allow_non_integral_constant_expression_p;
9739   saved_non_integral_constant_expression_p = parser->non_integral_constant_expression_p;
9740   /* We are now parsing a constant-expression.  */
9741   parser->integral_constant_expression_p = true;
9742   parser->allow_non_integral_constant_expression_p
9743     = (allow_non_constant_p || cxx_dialect >= cxx11);
9744   parser->non_integral_constant_expression_p = false;
9745   /* Although the grammar says "conditional-expression", when not STRICT_P,
9746      we parse an "assignment-expression", which also permits
9747      "throw-expression" and the use of assignment operators.  In the case
9748      that ALLOW_NON_CONSTANT_P is false, we get better errors than we would
9749      otherwise.  In the case that ALLOW_NON_CONSTANT_P is true, it is
9750      actually essential that we look for an assignment-expression.
9751      For example, cp_parser_initializer_clauses uses this function to
9752      determine whether a particular assignment-expression is in fact
9753      constant.  */
9754   if (strict_p)
9755     {
9756       /* Parse the binary expressions (logical-or-expression).  */
9757       expression = cp_parser_binary_expression (parser, false, false, false,
9758 						PREC_NOT_OPERATOR, NULL);
9759       /* If the next token is a `?' then we're actually looking at
9760 	 a conditional-expression; otherwise we're done.  */
9761       if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
9762 	expression = cp_parser_question_colon_clause (parser, expression);
9763     }
9764   else
9765     expression = cp_parser_assignment_expression (parser);
9766   /* Restore the old settings.  */
9767   parser->integral_constant_expression_p
9768     = saved_integral_constant_expression_p;
9769   parser->allow_non_integral_constant_expression_p
9770     = saved_allow_non_integral_constant_expression_p;
9771   if (cxx_dialect >= cxx11)
9772     {
9773       /* Require an rvalue constant expression here; that's what our
9774 	 callers expect.  Reference constant expressions are handled
9775 	 separately in e.g. cp_parser_template_argument.  */
9776       tree decay = expression;
9777       if (TREE_TYPE (expression)
9778 	  && TREE_CODE (TREE_TYPE (expression)) == ARRAY_TYPE)
9779 	decay = build_address (expression);
9780       bool is_const = potential_rvalue_constant_expression (decay);
9781       parser->non_integral_constant_expression_p = !is_const;
9782       if (!is_const && !allow_non_constant_p)
9783 	require_potential_rvalue_constant_expression (decay);
9784     }
9785   if (allow_non_constant_p)
9786     *non_constant_p = parser->non_integral_constant_expression_p;
9787   parser->non_integral_constant_expression_p
9788     = saved_non_integral_constant_expression_p;
9789 
9790   return expression;
9791 }
9792 
9793 /* Parse __builtin_offsetof.
9794 
9795    offsetof-expression:
9796      "__builtin_offsetof" "(" type-id "," offsetof-member-designator ")"
9797 
9798    offsetof-member-designator:
9799      id-expression
9800      | offsetof-member-designator "." id-expression
9801      | offsetof-member-designator "[" expression "]"
9802      | offsetof-member-designator "->" id-expression  */
9803 
9804 static cp_expr
9805 cp_parser_builtin_offsetof (cp_parser *parser)
9806 {
9807   int save_ice_p, save_non_ice_p;
9808   tree type;
9809   cp_expr expr;
9810   cp_id_kind dummy;
9811   cp_token *token;
9812   location_t finish_loc;
9813 
9814   /* We're about to accept non-integral-constant things, but will
9815      definitely yield an integral constant expression.  Save and
9816      restore these values around our local parsing.  */
9817   save_ice_p = parser->integral_constant_expression_p;
9818   save_non_ice_p = parser->non_integral_constant_expression_p;
9819 
9820   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
9821 
9822   /* Consume the "__builtin_offsetof" token.  */
9823   cp_lexer_consume_token (parser->lexer);
9824   /* Consume the opening `('.  */
9825   matching_parens parens;
9826   parens.require_open (parser);
9827   /* Parse the type-id.  */
9828   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9829   {
9830     const char *saved_message = parser->type_definition_forbidden_message;
9831     parser->type_definition_forbidden_message
9832       = G_("types may not be defined within __builtin_offsetof");
9833     type = cp_parser_type_id (parser);
9834     parser->type_definition_forbidden_message = saved_message;
9835   }
9836   /* Look for the `,'.  */
9837   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
9838   token = cp_lexer_peek_token (parser->lexer);
9839 
9840   /* Build the (type *)null that begins the traditional offsetof macro.  */
9841   tree object_ptr
9842     = build_static_cast (build_pointer_type (type), null_pointer_node,
9843 			 tf_warning_or_error);
9844 
9845   /* Parse the offsetof-member-designator.  We begin as if we saw "expr->".  */
9846   expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DEREF, object_ptr,
9847 						 true, &dummy, token->location);
9848   while (true)
9849     {
9850       token = cp_lexer_peek_token (parser->lexer);
9851       switch (token->type)
9852 	{
9853 	case CPP_OPEN_SQUARE:
9854 	  /* offsetof-member-designator "[" expression "]" */
9855 	  expr = cp_parser_postfix_open_square_expression (parser, expr,
9856 							   true, false);
9857 	  break;
9858 
9859 	case CPP_DEREF:
9860 	  /* offsetof-member-designator "->" identifier */
9861 	  expr = grok_array_decl (token->location, expr,
9862 				  integer_zero_node, false);
9863 	  /* FALLTHRU */
9864 
9865 	case CPP_DOT:
9866 	  /* offsetof-member-designator "." identifier */
9867 	  cp_lexer_consume_token (parser->lexer);
9868 	  expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
9869 							 expr, true, &dummy,
9870 							 token->location);
9871 	  break;
9872 
9873 	case CPP_CLOSE_PAREN:
9874 	  /* Consume the ")" token.  */
9875 	  finish_loc = cp_lexer_peek_token (parser->lexer)->location;
9876 	  cp_lexer_consume_token (parser->lexer);
9877 	  goto success;
9878 
9879 	default:
9880 	  /* Error.  We know the following require will fail, but
9881 	     that gives the proper error message.  */
9882 	  parens.require_close (parser);
9883 	  cp_parser_skip_to_closing_parenthesis (parser, true, false, true);
9884 	  expr = error_mark_node;
9885 	  goto failure;
9886 	}
9887     }
9888 
9889  success:
9890   /* Make a location of the form:
9891        __builtin_offsetof (struct s, f)
9892        ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
9893      with caret at the type-id, ranging from the start of the
9894      "_builtin_offsetof" token to the close paren.  */
9895   loc = make_location (loc, start_loc, finish_loc);
9896   /* The result will be an INTEGER_CST, so we need to explicitly
9897      preserve the location.  */
9898   expr = cp_expr (finish_offsetof (object_ptr, expr, loc), loc);
9899 
9900  failure:
9901   parser->integral_constant_expression_p = save_ice_p;
9902   parser->non_integral_constant_expression_p = save_non_ice_p;
9903 
9904   expr = expr.maybe_add_location_wrapper ();
9905   return expr;
9906 }
9907 
9908 /* Parse a trait expression.
9909 
9910    Returns a representation of the expression, the underlying type
9911    of the type at issue when KEYWORD is RID_UNDERLYING_TYPE.  */
9912 
9913 static cp_expr
9914 cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
9915 {
9916   cp_trait_kind kind;
9917   tree type1, type2 = NULL_TREE;
9918   bool binary = false;
9919   bool variadic = false;
9920 
9921   switch (keyword)
9922     {
9923     case RID_HAS_NOTHROW_ASSIGN:
9924       kind = CPTK_HAS_NOTHROW_ASSIGN;
9925       break;
9926     case RID_HAS_NOTHROW_CONSTRUCTOR:
9927       kind = CPTK_HAS_NOTHROW_CONSTRUCTOR;
9928       break;
9929     case RID_HAS_NOTHROW_COPY:
9930       kind = CPTK_HAS_NOTHROW_COPY;
9931       break;
9932     case RID_HAS_TRIVIAL_ASSIGN:
9933       kind = CPTK_HAS_TRIVIAL_ASSIGN;
9934       break;
9935     case RID_HAS_TRIVIAL_CONSTRUCTOR:
9936       kind = CPTK_HAS_TRIVIAL_CONSTRUCTOR;
9937       break;
9938     case RID_HAS_TRIVIAL_COPY:
9939       kind = CPTK_HAS_TRIVIAL_COPY;
9940       break;
9941     case RID_HAS_TRIVIAL_DESTRUCTOR:
9942       kind = CPTK_HAS_TRIVIAL_DESTRUCTOR;
9943       break;
9944     case RID_HAS_UNIQUE_OBJ_REPRESENTATIONS:
9945       kind = CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS;
9946       break;
9947     case RID_HAS_VIRTUAL_DESTRUCTOR:
9948       kind = CPTK_HAS_VIRTUAL_DESTRUCTOR;
9949       break;
9950     case RID_IS_ABSTRACT:
9951       kind = CPTK_IS_ABSTRACT;
9952       break;
9953     case RID_IS_AGGREGATE:
9954       kind = CPTK_IS_AGGREGATE;
9955       break;
9956     case RID_IS_BASE_OF:
9957       kind = CPTK_IS_BASE_OF;
9958       binary = true;
9959       break;
9960     case RID_IS_CLASS:
9961       kind = CPTK_IS_CLASS;
9962       break;
9963     case RID_IS_EMPTY:
9964       kind = CPTK_IS_EMPTY;
9965       break;
9966     case RID_IS_ENUM:
9967       kind = CPTK_IS_ENUM;
9968       break;
9969     case RID_IS_FINAL:
9970       kind = CPTK_IS_FINAL;
9971       break;
9972     case RID_IS_LITERAL_TYPE:
9973       kind = CPTK_IS_LITERAL_TYPE;
9974       break;
9975     case RID_IS_POD:
9976       kind = CPTK_IS_POD;
9977       break;
9978     case RID_IS_POLYMORPHIC:
9979       kind = CPTK_IS_POLYMORPHIC;
9980       break;
9981     case RID_IS_SAME_AS:
9982       kind = CPTK_IS_SAME_AS;
9983       binary = true;
9984       break;
9985     case RID_IS_STD_LAYOUT:
9986       kind = CPTK_IS_STD_LAYOUT;
9987       break;
9988     case RID_IS_TRIVIAL:
9989       kind = CPTK_IS_TRIVIAL;
9990       break;
9991     case RID_IS_TRIVIALLY_ASSIGNABLE:
9992       kind = CPTK_IS_TRIVIALLY_ASSIGNABLE;
9993       binary = true;
9994       break;
9995     case RID_IS_TRIVIALLY_CONSTRUCTIBLE:
9996       kind = CPTK_IS_TRIVIALLY_CONSTRUCTIBLE;
9997       variadic = true;
9998       break;
9999     case RID_IS_TRIVIALLY_COPYABLE:
10000       kind = CPTK_IS_TRIVIALLY_COPYABLE;
10001       break;
10002     case RID_IS_UNION:
10003       kind = CPTK_IS_UNION;
10004       break;
10005     case RID_UNDERLYING_TYPE:
10006       kind = CPTK_UNDERLYING_TYPE;
10007       break;
10008     case RID_BASES:
10009       kind = CPTK_BASES;
10010       break;
10011     case RID_DIRECT_BASES:
10012       kind = CPTK_DIRECT_BASES;
10013       break;
10014     case RID_IS_ASSIGNABLE:
10015       kind = CPTK_IS_ASSIGNABLE;
10016       binary = true;
10017       break;
10018     case RID_IS_CONSTRUCTIBLE:
10019       kind = CPTK_IS_CONSTRUCTIBLE;
10020       variadic = true;
10021       break;
10022     default:
10023       gcc_unreachable ();
10024     }
10025 
10026   /* Get location of initial token.  */
10027   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
10028 
10029   /* Consume the token.  */
10030   cp_lexer_consume_token (parser->lexer);
10031 
10032   matching_parens parens;
10033   parens.require_open (parser);
10034 
10035   {
10036     type_id_in_expr_sentinel s (parser);
10037     type1 = cp_parser_type_id (parser);
10038   }
10039 
10040   if (type1 == error_mark_node)
10041     return error_mark_node;
10042 
10043   if (binary)
10044     {
10045       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
10046 
10047       {
10048 	type_id_in_expr_sentinel s (parser);
10049 	type2 = cp_parser_type_id (parser);
10050       }
10051 
10052       if (type2 == error_mark_node)
10053 	return error_mark_node;
10054     }
10055   else if (variadic)
10056     {
10057       while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
10058 	{
10059 	  cp_lexer_consume_token (parser->lexer);
10060 	  tree elt = cp_parser_type_id (parser);
10061 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
10062 	    {
10063 	      cp_lexer_consume_token (parser->lexer);
10064 	      elt = make_pack_expansion (elt);
10065 	    }
10066 	  if (elt == error_mark_node)
10067 	    return error_mark_node;
10068 	  type2 = tree_cons (NULL_TREE, elt, type2);
10069 	}
10070     }
10071 
10072   location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location;
10073   parens.require_close (parser);
10074 
10075   /* Construct a location of the form:
10076        __is_trivially_copyable(_Tp)
10077        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
10078      with start == caret, finishing at the close-paren.  */
10079   location_t trait_loc = make_location (start_loc, start_loc, finish_loc);
10080 
10081   /* Complete the trait expression, which may mean either processing
10082      the trait expr now or saving it for template instantiation.  */
10083   switch (kind)
10084     {
10085     case CPTK_UNDERLYING_TYPE:
10086       return cp_expr (finish_underlying_type (type1), trait_loc);
10087     case CPTK_BASES:
10088       return cp_expr (finish_bases (type1, false), trait_loc);
10089     case CPTK_DIRECT_BASES:
10090       return cp_expr (finish_bases (type1, true), trait_loc);
10091     default:
10092       return cp_expr (finish_trait_expr (kind, type1, type2), trait_loc);
10093     }
10094 }
10095 
10096 /* Parse a lambda expression.
10097 
10098    lambda-expression:
10099      lambda-introducer lambda-declarator [opt] compound-statement
10100 
10101    Returns a representation of the expression.  */
10102 
10103 static cp_expr
10104 cp_parser_lambda_expression (cp_parser* parser)
10105 {
10106   tree lambda_expr = build_lambda_expr ();
10107   tree type;
10108   bool ok = true;
10109   cp_token *token = cp_lexer_peek_token (parser->lexer);
10110   cp_token_position start = 0;
10111 
10112   LAMBDA_EXPR_LOCATION (lambda_expr) = token->location;
10113 
10114   if (cp_unevaluated_operand)
10115     {
10116       if (!token->error_reported)
10117 	{
10118 	  error_at (LAMBDA_EXPR_LOCATION (lambda_expr),
10119 		    "lambda-expression in unevaluated context");
10120 	  token->error_reported = true;
10121 	}
10122       ok = false;
10123     }
10124   else if (parser->in_template_argument_list_p)
10125     {
10126       if (!token->error_reported)
10127 	{
10128 	  error_at (token->location, "lambda-expression in template-argument");
10129 	  token->error_reported = true;
10130 	}
10131       ok = false;
10132     }
10133 
10134   /* We may be in the middle of deferred access check.  Disable
10135      it now.  */
10136   push_deferring_access_checks (dk_no_deferred);
10137 
10138   cp_parser_lambda_introducer (parser, lambda_expr);
10139 
10140   type = begin_lambda_type (lambda_expr);
10141   if (type == error_mark_node)
10142     return error_mark_node;
10143 
10144   record_lambda_scope (lambda_expr);
10145 
10146   /* Do this again now that LAMBDA_EXPR_EXTRA_SCOPE is set.  */
10147   determine_visibility (TYPE_NAME (type));
10148 
10149   /* Now that we've started the type, add the capture fields for any
10150      explicit captures.  */
10151   register_capture_members (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
10152 
10153   {
10154     /* Inside the class, surrounding template-parameter-lists do not apply.  */
10155     unsigned int saved_num_template_parameter_lists
10156         = parser->num_template_parameter_lists;
10157     unsigned char in_statement = parser->in_statement;
10158     bool in_switch_statement_p = parser->in_switch_statement_p;
10159     bool fully_implicit_function_template_p
10160         = parser->fully_implicit_function_template_p;
10161     tree implicit_template_parms = parser->implicit_template_parms;
10162     cp_binding_level* implicit_template_scope = parser->implicit_template_scope;
10163     bool auto_is_implicit_function_template_parm_p
10164         = parser->auto_is_implicit_function_template_parm_p;
10165 
10166     parser->num_template_parameter_lists = 0;
10167     parser->in_statement = 0;
10168     parser->in_switch_statement_p = false;
10169     parser->fully_implicit_function_template_p = false;
10170     parser->implicit_template_parms = 0;
10171     parser->implicit_template_scope = 0;
10172     parser->auto_is_implicit_function_template_parm_p = false;
10173 
10174     /* By virtue of defining a local class, a lambda expression has access to
10175        the private variables of enclosing classes.  */
10176 
10177     ok &= cp_parser_lambda_declarator_opt (parser, lambda_expr);
10178 
10179     if (ok && cp_parser_error_occurred (parser))
10180       ok = false;
10181 
10182     if (ok)
10183       {
10184 	if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
10185 	    && cp_parser_start_tentative_firewall (parser))
10186 	  start = token;
10187 	cp_parser_lambda_body (parser, lambda_expr);
10188       }
10189     else if (cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
10190       {
10191 	if (cp_parser_skip_to_closing_brace (parser))
10192 	  cp_lexer_consume_token (parser->lexer);
10193       }
10194 
10195     /* The capture list was built up in reverse order; fix that now.  */
10196     LAMBDA_EXPR_CAPTURE_LIST (lambda_expr)
10197       = nreverse (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
10198 
10199     if (ok)
10200       maybe_add_lambda_conv_op (type);
10201 
10202     type = finish_struct (type, /*attributes=*/NULL_TREE);
10203 
10204     parser->num_template_parameter_lists = saved_num_template_parameter_lists;
10205     parser->in_statement = in_statement;
10206     parser->in_switch_statement_p = in_switch_statement_p;
10207     parser->fully_implicit_function_template_p
10208 	= fully_implicit_function_template_p;
10209     parser->implicit_template_parms = implicit_template_parms;
10210     parser->implicit_template_scope = implicit_template_scope;
10211     parser->auto_is_implicit_function_template_parm_p
10212 	= auto_is_implicit_function_template_parm_p;
10213   }
10214 
10215   /* This field is only used during parsing of the lambda.  */
10216   LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
10217 
10218   /* This lambda shouldn't have any proxies left at this point.  */
10219   gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (lambda_expr) == NULL);
10220   /* And now that we're done, push proxies for an enclosing lambda.  */
10221   insert_pending_capture_proxies ();
10222 
10223   if (ok)
10224     lambda_expr = build_lambda_object (lambda_expr);
10225   else
10226     lambda_expr = error_mark_node;
10227 
10228   cp_parser_end_tentative_firewall (parser, start, lambda_expr);
10229 
10230   pop_deferring_access_checks ();
10231 
10232   return lambda_expr;
10233 }
10234 
10235 /* Parse the beginning of a lambda expression.
10236 
10237    lambda-introducer:
10238      [ lambda-capture [opt] ]
10239 
10240    LAMBDA_EXPR is the current representation of the lambda expression.  */
10241 
10242 static void
10243 cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
10244 {
10245   /* Need commas after the first capture.  */
10246   bool first = true;
10247 
10248   /* Eat the leading `['.  */
10249   cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
10250 
10251   /* Record default capture mode.  "[&" "[=" "[&," "[=,"  */
10252   if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
10253       && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_NAME)
10254     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_REFERENCE;
10255   else if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
10256     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_COPY;
10257 
10258   if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE)
10259     {
10260       cp_lexer_consume_token (parser->lexer);
10261       first = false;
10262     }
10263 
10264   while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_SQUARE))
10265     {
10266       cp_token* capture_token;
10267       tree capture_id;
10268       tree capture_init_expr;
10269       cp_id_kind idk = CP_ID_KIND_NONE;
10270       bool explicit_init_p = false;
10271 
10272       enum capture_kind_type
10273       {
10274 	BY_COPY,
10275 	BY_REFERENCE
10276       };
10277       enum capture_kind_type capture_kind = BY_COPY;
10278 
10279       if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
10280 	{
10281 	  error ("expected end of capture-list");
10282 	  return;
10283 	}
10284 
10285       if (first)
10286 	first = false;
10287       else
10288 	cp_parser_require (parser, CPP_COMMA, RT_COMMA);
10289 
10290       /* Possibly capture `this'.  */
10291       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THIS))
10292 	{
10293 	  location_t loc = cp_lexer_peek_token (parser->lexer)->location;
10294 	  if (cxx_dialect < cxx2a
10295 	      && LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
10296 	    pedwarn (loc, 0, "explicit by-copy capture of %<this%> redundant "
10297 		     "with by-copy capture default");
10298 	  cp_lexer_consume_token (parser->lexer);
10299 	  add_capture (lambda_expr,
10300 		       /*id=*/this_identifier,
10301 		       /*initializer=*/finish_this_expr (),
10302 		       /*by_reference_p=*/true,
10303 		       explicit_init_p);
10304 	  continue;
10305 	}
10306 
10307       /* Possibly capture `*this'.  */
10308       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT)
10309 	  && cp_lexer_nth_token_is_keyword (parser->lexer, 2, RID_THIS))
10310 	{
10311 	  location_t loc = cp_lexer_peek_token (parser->lexer)->location;
10312 	  if (cxx_dialect < cxx17)
10313 	    pedwarn (loc, 0, "%<*this%> capture only available with "
10314 			     "-std=c++17 or -std=gnu++17");
10315 	  cp_lexer_consume_token (parser->lexer);
10316 	  cp_lexer_consume_token (parser->lexer);
10317 	  add_capture (lambda_expr,
10318 		       /*id=*/this_identifier,
10319 		       /*initializer=*/finish_this_expr (),
10320 		       /*by_reference_p=*/false,
10321 		       explicit_init_p);
10322 	  continue;
10323 	}
10324 
10325       /* Remember whether we want to capture as a reference or not.  */
10326       if (cp_lexer_next_token_is (parser->lexer, CPP_AND))
10327 	{
10328 	  capture_kind = BY_REFERENCE;
10329 	  cp_lexer_consume_token (parser->lexer);
10330 	}
10331 
10332       /* Get the identifier.  */
10333       capture_token = cp_lexer_peek_token (parser->lexer);
10334       capture_id = cp_parser_identifier (parser);
10335 
10336       if (capture_id == error_mark_node)
10337 	/* Would be nice to have a cp_parser_skip_to_closing_x for general
10338            delimiters, but I modified this to stop on unnested ']' as well.  It
10339            was already changed to stop on unnested '}', so the
10340            "closing_parenthesis" name is no more misleading with my change.  */
10341 	{
10342 	  cp_parser_skip_to_closing_parenthesis (parser,
10343 						 /*recovering=*/true,
10344 						 /*or_comma=*/true,
10345 						 /*consume_paren=*/true);
10346 	  break;
10347 	}
10348 
10349       /* Find the initializer for this capture.  */
10350       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ)
10351 	  || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
10352 	  || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10353 	{
10354 	  bool direct, non_constant;
10355 	  /* An explicit initializer exists.  */
10356 	  if (cxx_dialect < cxx14)
10357 	    pedwarn (input_location, 0,
10358 		     "lambda capture initializers "
10359 		     "only available with -std=c++14 or -std=gnu++14");
10360 	  capture_init_expr = cp_parser_initializer (parser, &direct,
10361 						     &non_constant);
10362 	  explicit_init_p = true;
10363 	  if (capture_init_expr == NULL_TREE)
10364 	    {
10365 	      error ("empty initializer for lambda init-capture");
10366 	      capture_init_expr = error_mark_node;
10367 	    }
10368 	}
10369       else
10370 	{
10371 	  const char* error_msg;
10372 
10373 	  /* Turn the identifier into an id-expression.  */
10374 	  capture_init_expr
10375 	    = cp_parser_lookup_name_simple (parser, capture_id,
10376 					    capture_token->location);
10377 
10378 	  if (capture_init_expr == error_mark_node)
10379 	    {
10380 	      unqualified_name_lookup_error (capture_id);
10381 	      continue;
10382 	    }
10383 	  else if (!VAR_P (capture_init_expr)
10384 		   && TREE_CODE (capture_init_expr) != PARM_DECL)
10385 	    {
10386 	      error_at (capture_token->location,
10387 			"capture of non-variable %qE",
10388 			capture_init_expr);
10389 	      if (DECL_P (capture_init_expr))
10390 		inform (DECL_SOURCE_LOCATION (capture_init_expr),
10391 			"%q#D declared here", capture_init_expr);
10392 	      continue;
10393 	    }
10394 	  if (VAR_P (capture_init_expr)
10395 	      && decl_storage_duration (capture_init_expr) != dk_auto)
10396 	    {
10397 	      if (pedwarn (capture_token->location, 0, "capture of variable "
10398 			   "%qD with non-automatic storage duration",
10399 			   capture_init_expr))
10400 		inform (DECL_SOURCE_LOCATION (capture_init_expr),
10401 			"%q#D declared here", capture_init_expr);
10402 	      continue;
10403 	    }
10404 
10405 	  capture_init_expr
10406             = finish_id_expression
10407                 (capture_id,
10408 		 capture_init_expr,
10409                  parser->scope,
10410                  &idk,
10411                  /*integral_constant_expression_p=*/false,
10412                  /*allow_non_integral_constant_expression_p=*/false,
10413                  /*non_integral_constant_expression_p=*/NULL,
10414                  /*template_p=*/false,
10415                  /*done=*/true,
10416                  /*address_p=*/false,
10417                  /*template_arg_p=*/false,
10418                  &error_msg,
10419                  capture_token->location);
10420 
10421 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
10422 	    {
10423 	      cp_lexer_consume_token (parser->lexer);
10424 	      capture_init_expr = make_pack_expansion (capture_init_expr);
10425 	    }
10426 	}
10427 
10428       if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE
10429 	  && !explicit_init_p)
10430 	{
10431 	  if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY
10432 	      && capture_kind == BY_COPY)
10433 	    pedwarn (capture_token->location, 0, "explicit by-copy capture "
10434 		     "of %qD redundant with by-copy capture default",
10435 		     capture_id);
10436 	  if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_REFERENCE
10437 	      && capture_kind == BY_REFERENCE)
10438 	    pedwarn (capture_token->location, 0, "explicit by-reference "
10439 		     "capture of %qD redundant with by-reference capture "
10440 		     "default", capture_id);
10441 	}
10442 
10443       add_capture (lambda_expr,
10444 		   capture_id,
10445 		   capture_init_expr,
10446 		   /*by_reference_p=*/capture_kind == BY_REFERENCE,
10447 		   explicit_init_p);
10448 
10449       /* If there is any qualification still in effect, clear it
10450 	 now; we will be starting fresh with the next capture.  */
10451       parser->scope = NULL_TREE;
10452       parser->qualifying_scope = NULL_TREE;
10453       parser->object_scope = NULL_TREE;
10454     }
10455 
10456   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10457 }
10458 
10459 /* Parse the (optional) middle of a lambda expression.
10460 
10461    lambda-declarator:
10462      < template-parameter-list [opt] >
10463      ( parameter-declaration-clause [opt] )
10464        attribute-specifier [opt]
10465        decl-specifier-seq [opt]
10466        exception-specification [opt]
10467        lambda-return-type-clause [opt]
10468 
10469    LAMBDA_EXPR is the current representation of the lambda expression.  */
10470 
10471 static bool
10472 cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
10473 {
10474   /* 5.1.1.4 of the standard says:
10475        If a lambda-expression does not include a lambda-declarator, it is as if
10476        the lambda-declarator were ().
10477      This means an empty parameter list, no attributes, and no exception
10478      specification.  */
10479   tree param_list = void_list_node;
10480   tree attributes = NULL_TREE;
10481   tree exception_spec = NULL_TREE;
10482   tree template_param_list = NULL_TREE;
10483   tree tx_qual = NULL_TREE;
10484   tree return_type = NULL_TREE;
10485   cp_decl_specifier_seq lambda_specs;
10486   clear_decl_specs (&lambda_specs);
10487 
10488   /* The template-parameter-list is optional, but must begin with
10489      an opening angle if present.  */
10490   if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
10491     {
10492       if (cxx_dialect < cxx14)
10493 	pedwarn (parser->lexer->next_token->location, 0,
10494 		 "lambda templates are only available with "
10495 		 "-std=c++14 or -std=gnu++14");
10496       else if (cxx_dialect < cxx2a)
10497 	pedwarn (parser->lexer->next_token->location, OPT_Wpedantic,
10498 		 "lambda templates are only available with "
10499 		 "-std=c++2a or -std=gnu++2a");
10500 
10501       cp_lexer_consume_token (parser->lexer);
10502 
10503       template_param_list = cp_parser_template_parameter_list (parser);
10504 
10505       cp_parser_skip_to_end_of_template_parameter_list (parser);
10506 
10507       /* We just processed one more parameter list.  */
10508       ++parser->num_template_parameter_lists;
10509     }
10510 
10511   /* The parameter-declaration-clause is optional (unless
10512      template-parameter-list was given), but must begin with an
10513      opening parenthesis if present.  */
10514   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
10515     {
10516       matching_parens parens;
10517       parens.consume_open (parser);
10518 
10519       begin_scope (sk_function_parms, /*entity=*/NULL_TREE);
10520 
10521       /* Parse parameters.  */
10522       param_list = cp_parser_parameter_declaration_clause (parser);
10523 
10524       /* Default arguments shall not be specified in the
10525 	 parameter-declaration-clause of a lambda-declarator.  */
10526       if (cxx_dialect < cxx14)
10527 	for (tree t = param_list; t; t = TREE_CHAIN (t))
10528 	  if (TREE_PURPOSE (t) && DECL_P (TREE_VALUE (t)))
10529 	    pedwarn (DECL_SOURCE_LOCATION (TREE_VALUE (t)), OPT_Wpedantic,
10530 		     "default argument specified for lambda parameter");
10531 
10532       parens.require_close (parser);
10533 
10534       attributes = cp_parser_attributes_opt (parser);
10535 
10536       /* In the decl-specifier-seq of the lambda-declarator, each
10537 	 decl-specifier shall either be mutable or constexpr.  */
10538       int declares_class_or_enum;
10539       if (cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
10540 	cp_parser_decl_specifier_seq (parser,
10541 				      CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR,
10542 				      &lambda_specs, &declares_class_or_enum);
10543       if (lambda_specs.storage_class == sc_mutable)
10544 	{
10545 	  LAMBDA_EXPR_MUTABLE_P (lambda_expr) = 1;
10546 	  if (lambda_specs.conflicting_specifiers_p)
10547 	    error_at (lambda_specs.locations[ds_storage_class],
10548 		      "duplicate %<mutable%>");
10549 	}
10550 
10551       tx_qual = cp_parser_tx_qualifier_opt (parser);
10552 
10553       /* Parse optional exception specification.  */
10554       exception_spec = cp_parser_exception_specification_opt (parser);
10555 
10556       /* Parse optional trailing return type.  */
10557       if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
10558         {
10559           cp_lexer_consume_token (parser->lexer);
10560           return_type = cp_parser_trailing_type_id (parser);
10561         }
10562 
10563       /* The function parameters must be in scope all the way until after the
10564          trailing-return-type in case of decltype.  */
10565       pop_bindings_and_leave_scope ();
10566     }
10567   else if (template_param_list != NULL_TREE) // generate diagnostic
10568     cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10569 
10570   /* Create the function call operator.
10571 
10572      Messing with declarators like this is no uglier than building up the
10573      FUNCTION_DECL by hand, and this is less likely to get out of sync with
10574      other code.  */
10575   {
10576     cp_decl_specifier_seq return_type_specs;
10577     cp_declarator* declarator;
10578     tree fco;
10579     int quals;
10580     void *p;
10581 
10582     clear_decl_specs (&return_type_specs);
10583     if (return_type)
10584       return_type_specs.type = return_type;
10585     else
10586       /* Maybe we will deduce the return type later.  */
10587       return_type_specs.type = make_auto ();
10588 
10589     if (lambda_specs.locations[ds_constexpr])
10590       {
10591 	if (cxx_dialect >= cxx17)
10592 	  return_type_specs.locations[ds_constexpr]
10593 	    = lambda_specs.locations[ds_constexpr];
10594 	else
10595 	  error_at (lambda_specs.locations[ds_constexpr], "%<constexpr%> "
10596 		    "lambda only available with -std=c++17 or -std=gnu++17");
10597       }
10598 
10599     p = obstack_alloc (&declarator_obstack, 0);
10600 
10601     declarator = make_id_declarator (NULL_TREE, call_op_identifier, sfk_none);
10602 
10603     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
10604 	     ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
10605     declarator = make_call_declarator (declarator, param_list, quals,
10606 				       VIRT_SPEC_UNSPECIFIED,
10607                                        REF_QUAL_NONE,
10608 				       tx_qual,
10609 				       exception_spec,
10610                                        /*late_return_type=*/NULL_TREE,
10611                                        /*requires_clause*/NULL_TREE);
10612     declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
10613 
10614     fco = grokmethod (&return_type_specs,
10615 		      declarator,
10616 		      attributes);
10617     if (fco != error_mark_node)
10618       {
10619 	DECL_INITIALIZED_IN_CLASS_P (fco) = 1;
10620 	DECL_ARTIFICIAL (fco) = 1;
10621 	/* Give the object parameter a different name.  */
10622 	DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure");
10623 	if (return_type)
10624 	  TYPE_HAS_LATE_RETURN_TYPE (TREE_TYPE (fco)) = 1;
10625       }
10626     if (template_param_list)
10627       {
10628 	fco = finish_member_template_decl (fco);
10629 	finish_template_decl (template_param_list);
10630 	--parser->num_template_parameter_lists;
10631       }
10632     else if (parser->fully_implicit_function_template_p)
10633       fco = finish_fully_implicit_template (parser, fco);
10634 
10635     finish_member_declaration (fco);
10636 
10637     obstack_free (&declarator_obstack, p);
10638 
10639     return (fco != error_mark_node);
10640   }
10641 }
10642 
10643 /* Parse the body of a lambda expression, which is simply
10644 
10645    compound-statement
10646 
10647    but which requires special handling.
10648    LAMBDA_EXPR is the current representation of the lambda expression.  */
10649 
10650 static void
10651 cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
10652 {
10653   bool nested = (current_function_decl != NULL_TREE);
10654   bool local_variables_forbidden_p = parser->local_variables_forbidden_p;
10655   bool in_function_body = parser->in_function_body;
10656 
10657   if (nested)
10658     push_function_context ();
10659   else
10660     /* Still increment function_depth so that we don't GC in the
10661        middle of an expression.  */
10662     ++function_depth;
10663 
10664   vec<tree> omp_privatization_save;
10665   save_omp_privatization_clauses (omp_privatization_save);
10666   /* Clear this in case we're in the middle of a default argument.  */
10667   parser->local_variables_forbidden_p = false;
10668   parser->in_function_body = true;
10669 
10670   {
10671     local_specialization_stack s (lss_copy);
10672     tree fco = lambda_function (lambda_expr);
10673     tree body = start_lambda_function (fco, lambda_expr);
10674     matching_braces braces;
10675 
10676     if (braces.require_open (parser))
10677       {
10678 	tree compound_stmt = begin_compound_stmt (0);
10679 
10680 	/* Originally C++11 required us to peek for 'return expr'; and
10681 	   process it specially here to deduce the return type.  N3638
10682 	   removed the need for that.  */
10683 
10684 	while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
10685 	  cp_parser_label_declaration (parser);
10686 	cp_parser_statement_seq_opt (parser, NULL_TREE);
10687 	braces.require_close (parser);
10688 
10689 	finish_compound_stmt (compound_stmt);
10690       }
10691 
10692     finish_lambda_function (body);
10693   }
10694 
10695   restore_omp_privatization_clauses (omp_privatization_save);
10696   parser->local_variables_forbidden_p = local_variables_forbidden_p;
10697   parser->in_function_body = in_function_body;
10698   if (nested)
10699     pop_function_context();
10700   else
10701     --function_depth;
10702 }
10703 
10704 /* Statements [gram.stmt.stmt]  */
10705 
10706 /* Build and add a DEBUG_BEGIN_STMT statement with location LOC.  */
10707 
10708 static void
10709 add_debug_begin_stmt (location_t loc)
10710 {
10711   if (!MAY_HAVE_DEBUG_MARKER_STMTS)
10712     return;
10713   if (DECL_DECLARED_CONCEPT_P (current_function_decl))
10714     /* A concept is never expanded normally.  */
10715     return;
10716 
10717   tree stmt = build0 (DEBUG_BEGIN_STMT, void_type_node);
10718   SET_EXPR_LOCATION (stmt, loc);
10719   add_stmt (stmt);
10720 }
10721 
10722 /* Parse a statement.
10723 
10724    statement:
10725      labeled-statement
10726      expression-statement
10727      compound-statement
10728      selection-statement
10729      iteration-statement
10730      jump-statement
10731      declaration-statement
10732      try-block
10733 
10734   C++11:
10735 
10736   statement:
10737     labeled-statement
10738     attribute-specifier-seq (opt) expression-statement
10739     attribute-specifier-seq (opt) compound-statement
10740     attribute-specifier-seq (opt) selection-statement
10741     attribute-specifier-seq (opt) iteration-statement
10742     attribute-specifier-seq (opt) jump-statement
10743     declaration-statement
10744     attribute-specifier-seq (opt) try-block
10745 
10746   init-statement:
10747     expression-statement
10748     simple-declaration
10749 
10750   TM Extension:
10751 
10752    statement:
10753      atomic-statement
10754 
10755   IN_COMPOUND is true when the statement is nested inside a
10756   cp_parser_compound_statement; this matters for certain pragmas.
10757 
10758   If IF_P is not NULL, *IF_P is set to indicate whether the statement
10759   is a (possibly labeled) if statement which is not enclosed in braces
10760   and has an else clause.  This is used to implement -Wparentheses.
10761 
10762   CHAIN is a vector of if-else-if conditions.  */
10763 
10764 static void
10765 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
10766 		     bool in_compound, bool *if_p, vec<tree> *chain,
10767 		     location_t *loc_after_labels)
10768 {
10769   tree statement, std_attrs = NULL_TREE;
10770   cp_token *token;
10771   location_t statement_location, attrs_location;
10772 
10773  restart:
10774   if (if_p != NULL)
10775     *if_p = false;
10776   /* There is no statement yet.  */
10777   statement = NULL_TREE;
10778 
10779   saved_token_sentinel saved_tokens (parser->lexer);
10780   attrs_location = cp_lexer_peek_token (parser->lexer)->location;
10781   if (c_dialect_objc ())
10782     /* In obj-c++, seeing '[[' might be the either the beginning of
10783        c++11 attributes, or a nested objc-message-expression.  So
10784        let's parse the c++11 attributes tentatively.  */
10785     cp_parser_parse_tentatively (parser);
10786   std_attrs = cp_parser_std_attribute_spec_seq (parser);
10787   if (c_dialect_objc ())
10788     {
10789       if (!cp_parser_parse_definitely (parser))
10790 	std_attrs = NULL_TREE;
10791     }
10792 
10793   /* Peek at the next token.  */
10794   token = cp_lexer_peek_token (parser->lexer);
10795   /* Remember the location of the first token in the statement.  */
10796   statement_location = token->location;
10797   add_debug_begin_stmt (statement_location);
10798   /* If this is a keyword, then that will often determine what kind of
10799      statement we have.  */
10800   if (token->type == CPP_KEYWORD)
10801     {
10802       enum rid keyword = token->keyword;
10803 
10804       switch (keyword)
10805 	{
10806 	case RID_CASE:
10807 	case RID_DEFAULT:
10808 	  /* Looks like a labeled-statement with a case label.
10809 	     Parse the label, and then use tail recursion to parse
10810 	     the statement.  */
10811 	  cp_parser_label_for_labeled_statement (parser, std_attrs);
10812 	  in_compound = false;
10813 	  goto restart;
10814 
10815 	case RID_IF:
10816 	case RID_SWITCH:
10817 	  statement = cp_parser_selection_statement (parser, if_p, chain);
10818 	  break;
10819 
10820 	case RID_WHILE:
10821 	case RID_DO:
10822 	case RID_FOR:
10823 	  statement = cp_parser_iteration_statement (parser, if_p, false, 0);
10824 	  break;
10825 
10826 	case RID_BREAK:
10827 	case RID_CONTINUE:
10828 	case RID_RETURN:
10829 	case RID_GOTO:
10830 	  statement = cp_parser_jump_statement (parser);
10831 	  break;
10832 
10833 	  /* Objective-C++ exception-handling constructs.  */
10834 	case RID_AT_TRY:
10835 	case RID_AT_CATCH:
10836 	case RID_AT_FINALLY:
10837 	case RID_AT_SYNCHRONIZED:
10838 	case RID_AT_THROW:
10839 	  statement = cp_parser_objc_statement (parser);
10840 	  break;
10841 
10842 	case RID_TRY:
10843 	  statement = cp_parser_try_block (parser);
10844 	  break;
10845 
10846 	case RID_NAMESPACE:
10847 	  /* This must be a namespace alias definition.  */
10848 	  cp_parser_declaration_statement (parser);
10849 	  return;
10850 
10851 	case RID_TRANSACTION_ATOMIC:
10852 	case RID_TRANSACTION_RELAXED:
10853 	case RID_SYNCHRONIZED:
10854 	case RID_ATOMIC_NOEXCEPT:
10855 	case RID_ATOMIC_CANCEL:
10856 	  statement = cp_parser_transaction (parser, token);
10857 	  break;
10858 	case RID_TRANSACTION_CANCEL:
10859 	  statement = cp_parser_transaction_cancel (parser);
10860 	  break;
10861 
10862 	default:
10863 	  /* It might be a keyword like `int' that can start a
10864 	     declaration-statement.  */
10865 	  break;
10866 	}
10867     }
10868   else if (token->type == CPP_NAME)
10869     {
10870       /* If the next token is a `:', then we are looking at a
10871 	 labeled-statement.  */
10872       token = cp_lexer_peek_nth_token (parser->lexer, 2);
10873       if (token->type == CPP_COLON)
10874 	{
10875 	  /* Looks like a labeled-statement with an ordinary label.
10876 	     Parse the label, and then use tail recursion to parse
10877 	     the statement.  */
10878 
10879 	  cp_parser_label_for_labeled_statement (parser, std_attrs);
10880 	  in_compound = false;
10881 	  goto restart;
10882 	}
10883     }
10884   /* Anything that starts with a `{' must be a compound-statement.  */
10885   else if (token->type == CPP_OPEN_BRACE)
10886     statement = cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
10887   /* CPP_PRAGMA is a #pragma inside a function body, which constitutes
10888      a statement all its own.  */
10889   else if (token->type == CPP_PRAGMA)
10890     {
10891       /* Only certain OpenMP pragmas are attached to statements, and thus
10892 	 are considered statements themselves.  All others are not.  In
10893 	 the context of a compound, accept the pragma as a "statement" and
10894 	 return so that we can check for a close brace.  Otherwise we
10895 	 require a real statement and must go back and read one.  */
10896       if (in_compound)
10897 	cp_parser_pragma (parser, pragma_compound, if_p);
10898       else if (!cp_parser_pragma (parser, pragma_stmt, if_p))
10899 	goto restart;
10900       return;
10901     }
10902   else if (token->type == CPP_EOF)
10903     {
10904       cp_parser_error (parser, "expected statement");
10905       return;
10906     }
10907 
10908   /* Everything else must be a declaration-statement or an
10909      expression-statement.  Try for the declaration-statement
10910      first, unless we are looking at a `;', in which case we know that
10911      we have an expression-statement.  */
10912   if (!statement)
10913     {
10914       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
10915 	{
10916 	  if (std_attrs != NULL_TREE)
10917 	    {
10918 	      /*  Attributes should be parsed as part of the the
10919 		  declaration, so let's un-parse them.  */
10920 	      saved_tokens.rollback();
10921 	      std_attrs = NULL_TREE;
10922 	    }
10923 
10924 	  cp_parser_parse_tentatively (parser);
10925 	  /* Try to parse the declaration-statement.  */
10926 	  cp_parser_declaration_statement (parser);
10927 	  /* If that worked, we're done.  */
10928 	  if (cp_parser_parse_definitely (parser))
10929 	    return;
10930 	}
10931       /* All preceding labels have been parsed at this point.  */
10932       if (loc_after_labels != NULL)
10933 	*loc_after_labels = statement_location;
10934 
10935       /* Look for an expression-statement instead.  */
10936       statement = cp_parser_expression_statement (parser, in_statement_expr);
10937 
10938       /* Handle [[fallthrough]];.  */
10939       if (attribute_fallthrough_p (std_attrs))
10940 	{
10941 	  /* The next token after the fallthrough attribute is ';'.  */
10942 	  if (statement == NULL_TREE)
10943 	    {
10944 	      /* Turn [[fallthrough]]; into FALLTHROUGH ();.  */
10945 	      statement = build_call_expr_internal_loc (statement_location,
10946 							IFN_FALLTHROUGH,
10947 							void_type_node, 0);
10948 	      finish_expr_stmt (statement);
10949 	    }
10950 	  else
10951 	    warning_at (statement_location, OPT_Wattributes,
10952 			"%<fallthrough%> attribute not followed by %<;%>");
10953 	  std_attrs = NULL_TREE;
10954 	}
10955     }
10956 
10957   /* Set the line number for the statement.  */
10958   if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
10959     SET_EXPR_LOCATION (statement, statement_location);
10960 
10961   /* Allow "[[fallthrough]];", but warn otherwise.  */
10962   if (std_attrs != NULL_TREE)
10963     warning_at (attrs_location,
10964 		OPT_Wattributes,
10965 		"attributes at the beginning of statement are ignored");
10966 }
10967 
10968 /* Append ATTR to attribute list ATTRS.  */
10969 
10970 static tree
10971 attr_chainon (tree attrs, tree attr)
10972 {
10973   if (attrs == error_mark_node)
10974     return error_mark_node;
10975   if (attr == error_mark_node)
10976     return error_mark_node;
10977   return chainon (attrs, attr);
10978 }
10979 
10980 /* Parse the label for a labeled-statement, i.e.
10981 
10982    identifier :
10983    case constant-expression :
10984    default :
10985 
10986    GNU Extension:
10987    case constant-expression ... constant-expression : statement
10988 
10989    When a label is parsed without errors, the label is added to the
10990    parse tree by the finish_* functions, so this function doesn't
10991    have to return the label.  */
10992 
10993 static void
10994 cp_parser_label_for_labeled_statement (cp_parser* parser, tree attributes)
10995 {
10996   cp_token *token;
10997   tree label = NULL_TREE;
10998   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
10999 
11000   /* The next token should be an identifier.  */
11001   token = cp_lexer_peek_token (parser->lexer);
11002   if (token->type != CPP_NAME
11003       && token->type != CPP_KEYWORD)
11004     {
11005       cp_parser_error (parser, "expected labeled-statement");
11006       return;
11007     }
11008 
11009   /* Remember whether this case or a user-defined label is allowed to fall
11010      through to.  */
11011   bool fallthrough_p = token->flags & PREV_FALLTHROUGH;
11012 
11013   parser->colon_corrects_to_scope_p = false;
11014   switch (token->keyword)
11015     {
11016     case RID_CASE:
11017       {
11018 	tree expr, expr_hi;
11019 	cp_token *ellipsis;
11020 
11021 	/* Consume the `case' token.  */
11022 	cp_lexer_consume_token (parser->lexer);
11023 	/* Parse the constant-expression.  */
11024 	expr = cp_parser_constant_expression (parser);
11025 	if (check_for_bare_parameter_packs (expr))
11026 	  expr = error_mark_node;
11027 
11028 	ellipsis = cp_lexer_peek_token (parser->lexer);
11029 	if (ellipsis->type == CPP_ELLIPSIS)
11030 	  {
11031 	    /* Consume the `...' token.  */
11032 	    cp_lexer_consume_token (parser->lexer);
11033 	    expr_hi = cp_parser_constant_expression (parser);
11034 	    if (check_for_bare_parameter_packs (expr_hi))
11035 	      expr_hi = error_mark_node;
11036 
11037 	    /* We don't need to emit warnings here, as the common code
11038 	       will do this for us.  */
11039 	  }
11040 	else
11041 	  expr_hi = NULL_TREE;
11042 
11043 	if (parser->in_switch_statement_p)
11044 	  {
11045 	    tree l = finish_case_label (token->location, expr, expr_hi);
11046 	    if (l && TREE_CODE (l) == CASE_LABEL_EXPR)
11047 	      FALLTHROUGH_LABEL_P (CASE_LABEL (l)) = fallthrough_p;
11048 	  }
11049 	else
11050 	  error_at (token->location,
11051 		    "case label %qE not within a switch statement",
11052 		    expr);
11053       }
11054       break;
11055 
11056     case RID_DEFAULT:
11057       /* Consume the `default' token.  */
11058       cp_lexer_consume_token (parser->lexer);
11059 
11060       if (parser->in_switch_statement_p)
11061 	{
11062 	  tree l = finish_case_label (token->location, NULL_TREE, NULL_TREE);
11063 	  if (l && TREE_CODE (l) == CASE_LABEL_EXPR)
11064 	    FALLTHROUGH_LABEL_P (CASE_LABEL (l)) = fallthrough_p;
11065 	}
11066       else
11067 	error_at (token->location, "case label not within a switch statement");
11068       break;
11069 
11070     default:
11071       /* Anything else must be an ordinary label.  */
11072       label = finish_label_stmt (cp_parser_identifier (parser));
11073       if (label && TREE_CODE (label) == LABEL_DECL)
11074 	FALLTHROUGH_LABEL_P (label) = fallthrough_p;
11075       break;
11076     }
11077 
11078   /* Require the `:' token.  */
11079   cp_parser_require (parser, CPP_COLON, RT_COLON);
11080 
11081   /* An ordinary label may optionally be followed by attributes.
11082      However, this is only permitted if the attributes are then
11083      followed by a semicolon.  This is because, for backward
11084      compatibility, when parsing
11085        lab: __attribute__ ((unused)) int i;
11086      we want the attribute to attach to "i", not "lab".  */
11087   if (label != NULL_TREE
11088       && cp_next_tokens_can_be_gnu_attribute_p (parser))
11089     {
11090       tree attrs;
11091       cp_parser_parse_tentatively (parser);
11092       attrs = cp_parser_gnu_attributes_opt (parser);
11093       if (attrs == NULL_TREE
11094 	  || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
11095 	cp_parser_abort_tentative_parse (parser);
11096       else if (!cp_parser_parse_definitely (parser))
11097 	;
11098       else
11099 	attributes = attr_chainon (attributes, attrs);
11100     }
11101 
11102   if (attributes != NULL_TREE)
11103     cplus_decl_attributes (&label, attributes, 0);
11104 
11105   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
11106 }
11107 
11108 /* Parse an expression-statement.
11109 
11110    expression-statement:
11111      expression [opt] ;
11112 
11113    Returns the new EXPR_STMT -- or NULL_TREE if the expression
11114    statement consists of nothing more than an `;'. IN_STATEMENT_EXPR_P
11115    indicates whether this expression-statement is part of an
11116    expression statement.  */
11117 
11118 static tree
11119 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
11120 {
11121   tree statement = NULL_TREE;
11122   cp_token *token = cp_lexer_peek_token (parser->lexer);
11123   location_t loc = token->location;
11124 
11125   /* There might be attribute fallthrough.  */
11126   tree attr = cp_parser_gnu_attributes_opt (parser);
11127 
11128   /* If the next token is a ';', then there is no expression
11129      statement.  */
11130   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
11131     {
11132       statement = cp_parser_expression (parser);
11133       if (statement == error_mark_node
11134 	  && !cp_parser_uncommitted_to_tentative_parse_p (parser))
11135 	{
11136 	  cp_parser_skip_to_end_of_block_or_statement (parser);
11137 	  return error_mark_node;
11138 	}
11139     }
11140 
11141   /* Handle [[fallthrough]];.  */
11142   if (attribute_fallthrough_p (attr))
11143     {
11144       /* The next token after the fallthrough attribute is ';'.  */
11145       if (statement == NULL_TREE)
11146 	/* Turn [[fallthrough]]; into FALLTHROUGH ();.  */
11147 	statement = build_call_expr_internal_loc (loc, IFN_FALLTHROUGH,
11148 						  void_type_node, 0);
11149       else
11150 	warning_at (loc, OPT_Wattributes,
11151 		    "%<fallthrough%> attribute not followed by %<;%>");
11152       attr = NULL_TREE;
11153     }
11154 
11155   /* Allow "[[fallthrough]];", but warn otherwise.  */
11156   if (attr != NULL_TREE)
11157     warning_at (loc, OPT_Wattributes,
11158 		"attributes at the beginning of statement are ignored");
11159 
11160   /* Give a helpful message for "A<T>::type t;" and the like.  */
11161   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
11162       && !cp_parser_uncommitted_to_tentative_parse_p (parser))
11163     {
11164       if (TREE_CODE (statement) == SCOPE_REF)
11165 	error_at (token->location, "need %<typename%> before %qE because "
11166 		  "%qT is a dependent scope",
11167 		  statement, TREE_OPERAND (statement, 0));
11168       else if (is_overloaded_fn (statement)
11169 	       && DECL_CONSTRUCTOR_P (get_first_fn (statement)))
11170 	{
11171 	  /* A::A a; */
11172 	  tree fn = get_first_fn (statement);
11173 	  error_at (token->location,
11174 		    "%<%T::%D%> names the constructor, not the type",
11175 		    DECL_CONTEXT (fn), DECL_NAME (fn));
11176 	}
11177     }
11178 
11179   /* Consume the final `;'.  */
11180   cp_parser_consume_semicolon_at_end_of_statement (parser);
11181 
11182   if (in_statement_expr
11183       && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
11184     /* This is the final expression statement of a statement
11185        expression.  */
11186     statement = finish_stmt_expr_expr (statement, in_statement_expr);
11187   else if (statement)
11188     statement = finish_expr_stmt (statement);
11189 
11190   return statement;
11191 }
11192 
11193 /* Parse a compound-statement.
11194 
11195    compound-statement:
11196      { statement-seq [opt] }
11197 
11198    GNU extension:
11199 
11200    compound-statement:
11201      { label-declaration-seq [opt] statement-seq [opt] }
11202 
11203    label-declaration-seq:
11204      label-declaration
11205      label-declaration-seq label-declaration
11206 
11207    Returns a tree representing the statement.  */
11208 
11209 static tree
11210 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
11211 			      int bcs_flags, bool function_body)
11212 {
11213   tree compound_stmt;
11214   matching_braces braces;
11215 
11216   /* Consume the `{'.  */
11217   if (!braces.require_open (parser))
11218     return error_mark_node;
11219   if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
11220       && !function_body && cxx_dialect < cxx14)
11221     pedwarn (input_location, OPT_Wpedantic,
11222 	     "compound-statement in %<constexpr%> function");
11223   /* Begin the compound-statement.  */
11224   compound_stmt = begin_compound_stmt (bcs_flags);
11225   /* If the next keyword is `__label__' we have a label declaration.  */
11226   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
11227     cp_parser_label_declaration (parser);
11228   /* Parse an (optional) statement-seq.  */
11229   cp_parser_statement_seq_opt (parser, in_statement_expr);
11230   /* Finish the compound-statement.  */
11231   finish_compound_stmt (compound_stmt);
11232   /* Consume the `}'.  */
11233   braces.require_close (parser);
11234 
11235   return compound_stmt;
11236 }
11237 
11238 /* Parse an (optional) statement-seq.
11239 
11240    statement-seq:
11241      statement
11242      statement-seq [opt] statement  */
11243 
11244 static void
11245 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
11246 {
11247   /* Scan statements until there aren't any more.  */
11248   while (true)
11249     {
11250       cp_token *token = cp_lexer_peek_token (parser->lexer);
11251 
11252       /* If we are looking at a `}', then we have run out of
11253 	 statements; the same is true if we have reached the end
11254 	 of file, or have stumbled upon a stray '@end'.  */
11255       if (token->type == CPP_CLOSE_BRACE
11256 	  || token->type == CPP_EOF
11257 	  || token->type == CPP_PRAGMA_EOL
11258 	  || (token->type == CPP_KEYWORD && token->keyword == RID_AT_END))
11259 	break;
11260 
11261       /* If we are in a compound statement and find 'else' then
11262 	 something went wrong.  */
11263       else if (token->type == CPP_KEYWORD && token->keyword == RID_ELSE)
11264 	{
11265 	  if (parser->in_statement & IN_IF_STMT)
11266 	    break;
11267 	  else
11268 	    {
11269 	      token = cp_lexer_consume_token (parser->lexer);
11270 	      error_at (token->location, "%<else%> without a previous %<if%>");
11271 	    }
11272 	}
11273 
11274       /* Parse the statement.  */
11275       cp_parser_statement (parser, in_statement_expr, true, NULL);
11276     }
11277 }
11278 
11279 /* Return true if we're looking at (init; cond), false otherwise.  */
11280 
11281 static bool
11282 cp_parser_init_statement_p (cp_parser *parser)
11283 {
11284   /* Save tokens so that we can put them back.  */
11285   cp_lexer_save_tokens (parser->lexer);
11286 
11287   /* Look for ';' that is not nested in () or {}.  */
11288   int ret = cp_parser_skip_to_closing_parenthesis_1 (parser,
11289 						     /*recovering=*/false,
11290 						     CPP_SEMICOLON,
11291 						     /*consume_paren=*/false);
11292 
11293   /* Roll back the tokens we skipped.  */
11294   cp_lexer_rollback_tokens (parser->lexer);
11295 
11296   return ret == -1;
11297 }
11298 
11299 /* Parse a selection-statement.
11300 
11301    selection-statement:
11302      if ( init-statement [opt] condition ) statement
11303      if ( init-statement [opt] condition ) statement else statement
11304      switch ( init-statement [opt] condition ) statement
11305 
11306    Returns the new IF_STMT or SWITCH_STMT.
11307 
11308    If IF_P is not NULL, *IF_P is set to indicate whether the statement
11309    is a (possibly labeled) if statement which is not enclosed in
11310    braces and has an else clause.  This is used to implement
11311    -Wparentheses.
11312 
11313    CHAIN is a vector of if-else-if conditions.  This is used to implement
11314    -Wduplicated-cond.  */
11315 
11316 static tree
11317 cp_parser_selection_statement (cp_parser* parser, bool *if_p,
11318 			       vec<tree> *chain)
11319 {
11320   cp_token *token;
11321   enum rid keyword;
11322   token_indent_info guard_tinfo;
11323 
11324   if (if_p != NULL)
11325     *if_p = false;
11326 
11327   /* Peek at the next token.  */
11328   token = cp_parser_require (parser, CPP_KEYWORD, RT_SELECT);
11329   guard_tinfo = get_token_indent_info (token);
11330 
11331   /* See what kind of keyword it is.  */
11332   keyword = token->keyword;
11333   switch (keyword)
11334     {
11335     case RID_IF:
11336     case RID_SWITCH:
11337       {
11338 	tree statement;
11339 	tree condition;
11340 
11341 	bool cx = false;
11342 	if (keyword == RID_IF
11343 	    && cp_lexer_next_token_is_keyword (parser->lexer,
11344 					       RID_CONSTEXPR))
11345 	  {
11346 	    cx = true;
11347 	    cp_token *tok = cp_lexer_consume_token (parser->lexer);
11348 	    if (cxx_dialect < cxx17 && !in_system_header_at (tok->location))
11349 	      pedwarn (tok->location, 0, "%<if constexpr%> only available "
11350 		       "with -std=c++17 or -std=gnu++17");
11351 	  }
11352 
11353 	/* Look for the `('.  */
11354 	matching_parens parens;
11355 	if (!parens.require_open (parser))
11356 	  {
11357 	    cp_parser_skip_to_end_of_statement (parser);
11358 	    return error_mark_node;
11359 	  }
11360 
11361 	/* Begin the selection-statement.  */
11362 	if (keyword == RID_IF)
11363 	  {
11364 	    statement = begin_if_stmt ();
11365 	    IF_STMT_CONSTEXPR_P (statement) = cx;
11366 	  }
11367 	else
11368 	  statement = begin_switch_stmt ();
11369 
11370 	/* Parse the optional init-statement.  */
11371 	if (cp_parser_init_statement_p (parser))
11372 	  {
11373 	    tree decl;
11374 	    if (cxx_dialect < cxx17)
11375 	      pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
11376 		       "init-statement in selection statements only available "
11377 		       "with -std=c++17 or -std=gnu++17");
11378 	    cp_parser_init_statement (parser, &decl);
11379 	  }
11380 
11381 	/* Parse the condition.  */
11382 	condition = cp_parser_condition (parser);
11383 	/* Look for the `)'.  */
11384 	if (!parens.require_close (parser))
11385 	  cp_parser_skip_to_closing_parenthesis (parser, true, false,
11386 						 /*consume_paren=*/true);
11387 
11388 	if (keyword == RID_IF)
11389 	  {
11390 	    bool nested_if;
11391 	    unsigned char in_statement;
11392 
11393 	    /* Add the condition.  */
11394 	    condition = finish_if_stmt_cond (condition, statement);
11395 
11396 	    if (warn_duplicated_cond)
11397 	      warn_duplicated_cond_add_or_warn (token->location, condition,
11398 						&chain);
11399 
11400 	    /* Parse the then-clause.  */
11401 	    in_statement = parser->in_statement;
11402 	    parser->in_statement |= IN_IF_STMT;
11403 
11404 	    /* Outside a template, the non-selected branch of a constexpr
11405 	       if is a 'discarded statement', i.e. unevaluated.  */
11406 	    bool was_discarded = in_discarded_stmt;
11407 	    bool discard_then = (cx && !processing_template_decl
11408 				 && integer_zerop (condition));
11409 	    if (discard_then)
11410 	      {
11411 		in_discarded_stmt = true;
11412 		++c_inhibit_evaluation_warnings;
11413 	      }
11414 
11415 	    cp_parser_implicitly_scoped_statement (parser, &nested_if,
11416 						   guard_tinfo);
11417 
11418 	    parser->in_statement = in_statement;
11419 
11420 	    finish_then_clause (statement);
11421 
11422 	    if (discard_then)
11423 	      {
11424 		THEN_CLAUSE (statement) = NULL_TREE;
11425 		in_discarded_stmt = was_discarded;
11426 		--c_inhibit_evaluation_warnings;
11427 	      }
11428 
11429 	    /* If the next token is `else', parse the else-clause.  */
11430 	    if (cp_lexer_next_token_is_keyword (parser->lexer,
11431 						RID_ELSE))
11432 	      {
11433 		bool discard_else = (cx && !processing_template_decl
11434 				     && integer_nonzerop (condition));
11435 		if (discard_else)
11436 		  {
11437 		    in_discarded_stmt = true;
11438 		    ++c_inhibit_evaluation_warnings;
11439 		  }
11440 
11441 		guard_tinfo
11442 		  = get_token_indent_info (cp_lexer_peek_token (parser->lexer));
11443 		/* Consume the `else' keyword.  */
11444 		cp_lexer_consume_token (parser->lexer);
11445 		if (warn_duplicated_cond)
11446 		  {
11447 		    if (cp_lexer_next_token_is_keyword (parser->lexer,
11448 							RID_IF)
11449 			&& chain == NULL)
11450 		      {
11451 			/* We've got "if (COND) else if (COND2)".  Start
11452 			   the condition chain and add COND as the first
11453 			   element.  */
11454 			chain = new vec<tree> ();
11455 			if (!CONSTANT_CLASS_P (condition)
11456 			    && !TREE_SIDE_EFFECTS (condition))
11457 			{
11458 			  /* Wrap it in a NOP_EXPR so that we can set the
11459 			     location of the condition.  */
11460 			  tree e = build1 (NOP_EXPR, TREE_TYPE (condition),
11461 					   condition);
11462 			  SET_EXPR_LOCATION (e, token->location);
11463 			  chain->safe_push (e);
11464 			}
11465 		      }
11466 		    else if (!cp_lexer_next_token_is_keyword (parser->lexer,
11467 							      RID_IF))
11468 		      {
11469 			/* This is if-else without subsequent if.  Zap the
11470 			   condition chain; we would have already warned at
11471 			   this point.  */
11472 			delete chain;
11473 			chain = NULL;
11474 		      }
11475 		  }
11476 		begin_else_clause (statement);
11477 		/* Parse the else-clause.  */
11478 		cp_parser_implicitly_scoped_statement (parser, NULL,
11479 						       guard_tinfo, chain);
11480 
11481 		finish_else_clause (statement);
11482 
11483 		/* If we are currently parsing a then-clause, then
11484 		   IF_P will not be NULL.  We set it to true to
11485 		   indicate that this if statement has an else clause.
11486 		   This may trigger the Wparentheses warning below
11487 		   when we get back up to the parent if statement.  */
11488 		if (if_p != NULL)
11489 		  *if_p = true;
11490 
11491 		if (discard_else)
11492 		  {
11493 		    ELSE_CLAUSE (statement) = NULL_TREE;
11494 		    in_discarded_stmt = was_discarded;
11495 		    --c_inhibit_evaluation_warnings;
11496 		  }
11497 	      }
11498 	    else
11499 	      {
11500 		/* This if statement does not have an else clause.  If
11501 		   NESTED_IF is true, then the then-clause has an if
11502 		   statement which does have an else clause.  We warn
11503 		   about the potential ambiguity.  */
11504 		if (nested_if)
11505 		  warning_at (EXPR_LOCATION (statement), OPT_Wdangling_else,
11506 			      "suggest explicit braces to avoid ambiguous"
11507 			      " %<else%>");
11508 		if (warn_duplicated_cond)
11509 		  {
11510 		    /* We don't need the condition chain anymore.  */
11511 		    delete chain;
11512 		    chain = NULL;
11513 		  }
11514 	      }
11515 
11516 	    /* Now we're all done with the if-statement.  */
11517 	    finish_if_stmt (statement);
11518 	  }
11519 	else
11520 	  {
11521 	    bool in_switch_statement_p;
11522 	    unsigned char in_statement;
11523 
11524 	    /* Add the condition.  */
11525 	    finish_switch_cond (condition, statement);
11526 
11527 	    /* Parse the body of the switch-statement.  */
11528 	    in_switch_statement_p = parser->in_switch_statement_p;
11529 	    in_statement = parser->in_statement;
11530 	    parser->in_switch_statement_p = true;
11531 	    parser->in_statement |= IN_SWITCH_STMT;
11532 	    cp_parser_implicitly_scoped_statement (parser, if_p,
11533 						   guard_tinfo);
11534 	    parser->in_switch_statement_p = in_switch_statement_p;
11535 	    parser->in_statement = in_statement;
11536 
11537 	    /* Now we're all done with the switch-statement.  */
11538 	    finish_switch_stmt (statement);
11539 	  }
11540 
11541 	return statement;
11542       }
11543       break;
11544 
11545     default:
11546       cp_parser_error (parser, "expected selection-statement");
11547       return error_mark_node;
11548     }
11549 }
11550 
11551 /* Parse a condition.
11552 
11553    condition:
11554      expression
11555      type-specifier-seq declarator = initializer-clause
11556      type-specifier-seq declarator braced-init-list
11557 
11558    GNU Extension:
11559 
11560    condition:
11561      type-specifier-seq declarator asm-specification [opt]
11562        attributes [opt] = assignment-expression
11563 
11564    Returns the expression that should be tested.  */
11565 
11566 static tree
11567 cp_parser_condition (cp_parser* parser)
11568 {
11569   cp_decl_specifier_seq type_specifiers;
11570   const char *saved_message;
11571   int declares_class_or_enum;
11572 
11573   /* Try the declaration first.  */
11574   cp_parser_parse_tentatively (parser);
11575   /* New types are not allowed in the type-specifier-seq for a
11576      condition.  */
11577   saved_message = parser->type_definition_forbidden_message;
11578   parser->type_definition_forbidden_message
11579     = G_("types may not be defined in conditions");
11580   /* Parse the type-specifier-seq.  */
11581   cp_parser_decl_specifier_seq (parser,
11582 				CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR,
11583 				&type_specifiers,
11584 				&declares_class_or_enum);
11585   /* Restore the saved message.  */
11586   parser->type_definition_forbidden_message = saved_message;
11587   /* If all is well, we might be looking at a declaration.  */
11588   if (!cp_parser_error_occurred (parser))
11589     {
11590       tree decl;
11591       tree asm_specification;
11592       tree attributes;
11593       cp_declarator *declarator;
11594       tree initializer = NULL_TREE;
11595 
11596       /* Parse the declarator.  */
11597       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
11598 					 /*ctor_dtor_or_conv_p=*/NULL,
11599 					 /*parenthesized_p=*/NULL,
11600 					 /*member_p=*/false,
11601 					 /*friend_p=*/false);
11602       /* Parse the attributes.  */
11603       attributes = cp_parser_attributes_opt (parser);
11604       /* Parse the asm-specification.  */
11605       asm_specification = cp_parser_asm_specification_opt (parser);
11606       /* If the next token is not an `=' or '{', then we might still be
11607 	 looking at an expression.  For example:
11608 
11609 	   if (A(a).x)
11610 
11611 	 looks like a decl-specifier-seq and a declarator -- but then
11612 	 there is no `=', so this is an expression.  */
11613       if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
11614 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
11615 	cp_parser_simulate_error (parser);
11616 
11617       /* If we did see an `=' or '{', then we are looking at a declaration
11618 	 for sure.  */
11619       if (cp_parser_parse_definitely (parser))
11620 	{
11621 	  tree pushed_scope;
11622 	  bool non_constant_p;
11623 	  int flags = LOOKUP_ONLYCONVERTING;
11624 
11625 	  /* Create the declaration.  */
11626 	  decl = start_decl (declarator, &type_specifiers,
11627 			     /*initialized_p=*/true,
11628 			     attributes, /*prefix_attributes=*/NULL_TREE,
11629 			     &pushed_scope);
11630 
11631 	  /* Parse the initializer.  */
11632 	  if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
11633 	    {
11634 	      initializer = cp_parser_braced_list (parser, &non_constant_p);
11635 	      CONSTRUCTOR_IS_DIRECT_INIT (initializer) = 1;
11636 	      flags = 0;
11637 	    }
11638 	  else
11639 	    {
11640 	      /* Consume the `='.  */
11641 	      cp_parser_require (parser, CPP_EQ, RT_EQ);
11642 	      initializer = cp_parser_initializer_clause (parser, &non_constant_p);
11643 	    }
11644 	  if (BRACE_ENCLOSED_INITIALIZER_P (initializer))
11645 	    maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
11646 
11647 	  /* Process the initializer.  */
11648 	  cp_finish_decl (decl,
11649 			  initializer, !non_constant_p,
11650 			  asm_specification,
11651 			  flags);
11652 
11653 	  if (pushed_scope)
11654 	    pop_scope (pushed_scope);
11655 
11656 	  return convert_from_reference (decl);
11657 	}
11658     }
11659   /* If we didn't even get past the declarator successfully, we are
11660      definitely not looking at a declaration.  */
11661   else
11662     cp_parser_abort_tentative_parse (parser);
11663 
11664   /* Otherwise, we are looking at an expression.  */
11665   return cp_parser_expression (parser);
11666 }
11667 
11668 /* Parses a for-statement or range-for-statement until the closing ')',
11669    not included. */
11670 
11671 static tree
11672 cp_parser_for (cp_parser *parser, bool ivdep, unsigned short unroll)
11673 {
11674   tree init, scope, decl;
11675   bool is_range_for;
11676 
11677   /* Begin the for-statement.  */
11678   scope = begin_for_scope (&init);
11679 
11680   /* Parse the initialization.  */
11681   is_range_for = cp_parser_init_statement (parser, &decl);
11682 
11683   if (is_range_for)
11684     return cp_parser_range_for (parser, scope, init, decl, ivdep, unroll);
11685   else
11686     return cp_parser_c_for (parser, scope, init, ivdep, unroll);
11687 }
11688 
11689 static tree
11690 cp_parser_c_for (cp_parser *parser, tree scope, tree init, bool ivdep,
11691 		 unsigned short unroll)
11692 {
11693   /* Normal for loop */
11694   tree condition = NULL_TREE;
11695   tree expression = NULL_TREE;
11696   tree stmt;
11697 
11698   stmt = begin_for_stmt (scope, init);
11699   /* The init-statement has already been parsed in
11700      cp_parser_init_statement, so no work is needed here.  */
11701   finish_init_stmt (stmt);
11702 
11703   /* If there's a condition, process it.  */
11704   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
11705     condition = cp_parser_condition (parser);
11706   else if (ivdep)
11707     {
11708       cp_parser_error (parser, "missing loop condition in loop with "
11709 		       "%<GCC ivdep%> pragma");
11710       condition = error_mark_node;
11711     }
11712   else if (unroll)
11713     {
11714       cp_parser_error (parser, "missing loop condition in loop with "
11715 		       "%<GCC unroll%> pragma");
11716       condition = error_mark_node;
11717     }
11718   finish_for_cond (condition, stmt, ivdep, unroll);
11719   /* Look for the `;'.  */
11720   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
11721 
11722   /* If there's an expression, process it.  */
11723   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
11724     expression = cp_parser_expression (parser);
11725   finish_for_expr (expression, stmt);
11726 
11727   return stmt;
11728 }
11729 
11730 /* Tries to parse a range-based for-statement:
11731 
11732   range-based-for:
11733     decl-specifier-seq declarator : expression
11734 
11735   The decl-specifier-seq declarator and the `:' are already parsed by
11736   cp_parser_init_statement.  If processing_template_decl it returns a
11737   newly created RANGE_FOR_STMT; if not, it is converted to a
11738   regular FOR_STMT.  */
11739 
11740 static tree
11741 cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl,
11742 		     bool ivdep, unsigned short unroll)
11743 {
11744   tree stmt, range_expr;
11745   auto_vec <cxx_binding *, 16> bindings;
11746   auto_vec <tree, 16> names;
11747   tree decomp_first_name = NULL_TREE;
11748   unsigned int decomp_cnt = 0;
11749 
11750   /* Get the range declaration momentarily out of the way so that
11751      the range expression doesn't clash with it. */
11752   if (range_decl != error_mark_node)
11753     {
11754       if (DECL_HAS_VALUE_EXPR_P (range_decl))
11755 	{
11756 	  tree v = DECL_VALUE_EXPR (range_decl);
11757 	  /* For decomposition declaration get all of the corresponding
11758 	     declarations out of the way.  */
11759 	  if (TREE_CODE (v) == ARRAY_REF
11760 	      && VAR_P (TREE_OPERAND (v, 0))
11761 	      && DECL_DECOMPOSITION_P (TREE_OPERAND (v, 0)))
11762 	    {
11763 	      tree d = range_decl;
11764 	      range_decl = TREE_OPERAND (v, 0);
11765 	      decomp_cnt = tree_to_uhwi (TREE_OPERAND (v, 1)) + 1;
11766 	      decomp_first_name = d;
11767 	      for (unsigned int i = 0; i < decomp_cnt; i++, d = DECL_CHAIN (d))
11768 		{
11769 		  tree name = DECL_NAME (d);
11770 		  names.safe_push (name);
11771 		  bindings.safe_push (IDENTIFIER_BINDING (name));
11772 		  IDENTIFIER_BINDING (name)
11773 		    = IDENTIFIER_BINDING (name)->previous;
11774 		}
11775 	    }
11776 	}
11777       if (names.is_empty ())
11778 	{
11779 	  tree name = DECL_NAME (range_decl);
11780 	  names.safe_push (name);
11781 	  bindings.safe_push (IDENTIFIER_BINDING (name));
11782 	  IDENTIFIER_BINDING (name) = IDENTIFIER_BINDING (name)->previous;
11783 	}
11784     }
11785 
11786   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
11787     {
11788       bool expr_non_constant_p;
11789       range_expr = cp_parser_braced_list (parser, &expr_non_constant_p);
11790     }
11791   else
11792     range_expr = cp_parser_expression (parser);
11793 
11794   /* Put the range declaration(s) back into scope. */
11795   for (unsigned int i = 0; i < names.length (); i++)
11796     {
11797       cxx_binding *binding = bindings[i];
11798       binding->previous = IDENTIFIER_BINDING (names[i]);
11799       IDENTIFIER_BINDING (names[i]) = binding;
11800     }
11801 
11802   /* If in template, STMT is converted to a normal for-statement
11803      at instantiation. If not, it is done just ahead. */
11804   if (processing_template_decl)
11805     {
11806       if (check_for_bare_parameter_packs (range_expr))
11807 	range_expr = error_mark_node;
11808       stmt = begin_range_for_stmt (scope, init);
11809       if (ivdep)
11810 	RANGE_FOR_IVDEP (stmt) = 1;
11811       if (unroll)
11812 	RANGE_FOR_UNROLL (stmt) = build_int_cst (integer_type_node, unroll);
11813       finish_range_for_decl (stmt, range_decl, range_expr);
11814       if (!type_dependent_expression_p (range_expr)
11815 	  /* do_auto_deduction doesn't mess with template init-lists.  */
11816 	  && !BRACE_ENCLOSED_INITIALIZER_P (range_expr))
11817 	do_range_for_auto_deduction (range_decl, range_expr);
11818     }
11819   else
11820     {
11821       stmt = begin_for_stmt (scope, init);
11822       stmt = cp_convert_range_for (stmt, range_decl, range_expr,
11823 				   decomp_first_name, decomp_cnt, ivdep,
11824 				   unroll);
11825     }
11826   return stmt;
11827 }
11828 
11829 /* Subroutine of cp_convert_range_for: given the initializer expression,
11830    builds up the range temporary.  */
11831 
11832 static tree
11833 build_range_temp (tree range_expr)
11834 {
11835   tree range_type, range_temp;
11836 
11837   /* Find out the type deduced by the declaration
11838      `auto &&__range = range_expr'.  */
11839   range_type = cp_build_reference_type (make_auto (), true);
11840   range_type = do_auto_deduction (range_type, range_expr,
11841 				  type_uses_auto (range_type));
11842 
11843   /* Create the __range variable.  */
11844   range_temp = build_decl (input_location, VAR_DECL,
11845 			   get_identifier ("__for_range"), range_type);
11846   TREE_USED (range_temp) = 1;
11847   DECL_ARTIFICIAL (range_temp) = 1;
11848 
11849   return range_temp;
11850 }
11851 
11852 /* Used by cp_parser_range_for in template context: we aren't going to
11853    do a full conversion yet, but we still need to resolve auto in the
11854    type of the for-range-declaration if present.  This is basically
11855    a shortcut version of cp_convert_range_for.  */
11856 
11857 static void
11858 do_range_for_auto_deduction (tree decl, tree range_expr)
11859 {
11860   tree auto_node = type_uses_auto (TREE_TYPE (decl));
11861   if (auto_node)
11862     {
11863       tree begin_dummy, end_dummy, range_temp, iter_type, iter_decl;
11864       range_temp = convert_from_reference (build_range_temp (range_expr));
11865       iter_type = (cp_parser_perform_range_for_lookup
11866 		   (range_temp, &begin_dummy, &end_dummy));
11867       if (iter_type)
11868 	{
11869 	  iter_decl = build_decl (input_location, VAR_DECL, NULL_TREE,
11870 				  iter_type);
11871 	  iter_decl = build_x_indirect_ref (input_location, iter_decl,
11872 					    RO_UNARY_STAR,
11873 					    tf_warning_or_error);
11874 	  TREE_TYPE (decl) = do_auto_deduction (TREE_TYPE (decl),
11875 						iter_decl, auto_node);
11876 	}
11877     }
11878 }
11879 
11880 /* Converts a range-based for-statement into a normal
11881    for-statement, as per the definition.
11882 
11883       for (RANGE_DECL : RANGE_EXPR)
11884 	BLOCK
11885 
11886    should be equivalent to:
11887 
11888       {
11889 	auto &&__range = RANGE_EXPR;
11890 	for (auto __begin = BEGIN_EXPR, end = END_EXPR;
11891 	      __begin != __end;
11892 	      ++__begin)
11893 	  {
11894 	      RANGE_DECL = *__begin;
11895 	      BLOCK
11896 	  }
11897       }
11898 
11899    If RANGE_EXPR is an array:
11900 	BEGIN_EXPR = __range
11901 	END_EXPR = __range + ARRAY_SIZE(__range)
11902    Else if RANGE_EXPR has a member 'begin' or 'end':
11903 	BEGIN_EXPR = __range.begin()
11904 	END_EXPR = __range.end()
11905    Else:
11906 	BEGIN_EXPR = begin(__range)
11907 	END_EXPR = end(__range);
11908 
11909    If __range has a member 'begin' but not 'end', or vice versa, we must
11910    still use the second alternative (it will surely fail, however).
11911    When calling begin()/end() in the third alternative we must use
11912    argument dependent lookup, but always considering 'std' as an associated
11913    namespace.  */
11914 
11915 tree
11916 cp_convert_range_for (tree statement, tree range_decl, tree range_expr,
11917 		      tree decomp_first_name, unsigned int decomp_cnt,
11918 		      bool ivdep, unsigned short unroll)
11919 {
11920   tree begin, end;
11921   tree iter_type, begin_expr, end_expr;
11922   tree condition, expression;
11923 
11924   range_expr = mark_lvalue_use (range_expr);
11925 
11926   if (range_decl == error_mark_node || range_expr == error_mark_node)
11927     /* If an error happened previously do nothing or else a lot of
11928        unhelpful errors would be issued.  */
11929     begin_expr = end_expr = iter_type = error_mark_node;
11930   else
11931     {
11932       tree range_temp;
11933 
11934       if (VAR_P (range_expr)
11935 	  && array_of_runtime_bound_p (TREE_TYPE (range_expr)))
11936 	/* Can't bind a reference to an array of runtime bound.  */
11937 	range_temp = range_expr;
11938       else
11939 	{
11940 	  range_temp = build_range_temp (range_expr);
11941 	  pushdecl (range_temp);
11942 	  cp_finish_decl (range_temp, range_expr,
11943 			  /*is_constant_init*/false, NULL_TREE,
11944 			  LOOKUP_ONLYCONVERTING);
11945 	  range_temp = convert_from_reference (range_temp);
11946 	}
11947       iter_type = cp_parser_perform_range_for_lookup (range_temp,
11948 						      &begin_expr, &end_expr);
11949     }
11950 
11951   /* The new for initialization statement.  */
11952   begin = build_decl (input_location, VAR_DECL,
11953 		      get_identifier ("__for_begin"), iter_type);
11954   TREE_USED (begin) = 1;
11955   DECL_ARTIFICIAL (begin) = 1;
11956   pushdecl (begin);
11957   cp_finish_decl (begin, begin_expr,
11958 		  /*is_constant_init*/false, NULL_TREE,
11959 		  LOOKUP_ONLYCONVERTING);
11960 
11961   if (cxx_dialect >= cxx17)
11962     iter_type = cv_unqualified (TREE_TYPE (end_expr));
11963   end = build_decl (input_location, VAR_DECL,
11964 		    get_identifier ("__for_end"), iter_type);
11965   TREE_USED (end) = 1;
11966   DECL_ARTIFICIAL (end) = 1;
11967   pushdecl (end);
11968   cp_finish_decl (end, end_expr,
11969 		  /*is_constant_init*/false, NULL_TREE,
11970 		  LOOKUP_ONLYCONVERTING);
11971 
11972   finish_init_stmt (statement);
11973 
11974   /* The new for condition.  */
11975   condition = build_x_binary_op (input_location, NE_EXPR,
11976 				 begin, ERROR_MARK,
11977 				 end, ERROR_MARK,
11978 				 NULL, tf_warning_or_error);
11979   finish_for_cond (condition, statement, ivdep, unroll);
11980 
11981   /* The new increment expression.  */
11982   expression = finish_unary_op_expr (input_location,
11983 				     PREINCREMENT_EXPR, begin,
11984 				     tf_warning_or_error);
11985   finish_for_expr (expression, statement);
11986 
11987   if (VAR_P (range_decl) && DECL_DECOMPOSITION_P (range_decl))
11988     cp_maybe_mangle_decomp (range_decl, decomp_first_name, decomp_cnt);
11989 
11990   /* The declaration is initialized with *__begin inside the loop body.  */
11991   cp_finish_decl (range_decl,
11992 		  build_x_indirect_ref (input_location, begin, RO_UNARY_STAR,
11993 					tf_warning_or_error),
11994 		  /*is_constant_init*/false, NULL_TREE,
11995 		  LOOKUP_ONLYCONVERTING);
11996   if (VAR_P (range_decl) && DECL_DECOMPOSITION_P (range_decl))
11997     cp_finish_decomp (range_decl, decomp_first_name, decomp_cnt);
11998 
11999   return statement;
12000 }
12001 
12002 /* Solves BEGIN_EXPR and END_EXPR as described in cp_convert_range_for.
12003    We need to solve both at the same time because the method used
12004    depends on the existence of members begin or end.
12005    Returns the type deduced for the iterator expression.  */
12006 
12007 static tree
12008 cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end)
12009 {
12010   if (error_operand_p (range))
12011     {
12012       *begin = *end = error_mark_node;
12013       return error_mark_node;
12014     }
12015 
12016   if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (range))))
12017     {
12018       error ("range-based %<for%> expression of type %qT "
12019 	     "has incomplete type", TREE_TYPE (range));
12020       *begin = *end = error_mark_node;
12021       return error_mark_node;
12022     }
12023   if (TREE_CODE (TREE_TYPE (range)) == ARRAY_TYPE)
12024     {
12025       /* If RANGE is an array, we will use pointer arithmetic.  */
12026       *begin = decay_conversion (range, tf_warning_or_error);
12027       *end = build_binary_op (input_location, PLUS_EXPR,
12028 			      range,
12029 			      array_type_nelts_top (TREE_TYPE (range)),
12030 			      false);
12031       return TREE_TYPE (*begin);
12032     }
12033   else
12034     {
12035       /* If it is not an array, we must do a bit of magic.  */
12036       tree id_begin, id_end;
12037       tree member_begin, member_end;
12038 
12039       *begin = *end = error_mark_node;
12040 
12041       id_begin = get_identifier ("begin");
12042       id_end = get_identifier ("end");
12043       member_begin = lookup_member (TREE_TYPE (range), id_begin,
12044 				    /*protect=*/2, /*want_type=*/false,
12045 				    tf_warning_or_error);
12046       member_end = lookup_member (TREE_TYPE (range), id_end,
12047 				  /*protect=*/2, /*want_type=*/false,
12048 				  tf_warning_or_error);
12049 
12050       if (member_begin != NULL_TREE && member_end != NULL_TREE)
12051 	{
12052 	  /* Use the member functions.  */
12053 	  *begin = cp_parser_range_for_member_function (range, id_begin);
12054 	  *end = cp_parser_range_for_member_function (range, id_end);
12055 	}
12056       else
12057 	{
12058 	  /* Use global functions with ADL.  */
12059 	  vec<tree, va_gc> *vec;
12060 	  vec = make_tree_vector ();
12061 
12062 	  vec_safe_push (vec, range);
12063 
12064 	  member_begin = perform_koenig_lookup (id_begin, vec,
12065 						tf_warning_or_error);
12066 	  *begin = finish_call_expr (member_begin, &vec, false, true,
12067 				     tf_warning_or_error);
12068 	  member_end = perform_koenig_lookup (id_end, vec,
12069 					      tf_warning_or_error);
12070 	  *end = finish_call_expr (member_end, &vec, false, true,
12071 				   tf_warning_or_error);
12072 
12073 	  release_tree_vector (vec);
12074 	}
12075 
12076       /* Last common checks.  */
12077       if (*begin == error_mark_node || *end == error_mark_node)
12078 	{
12079 	  /* If one of the expressions is an error do no more checks.  */
12080 	  *begin = *end = error_mark_node;
12081 	  return error_mark_node;
12082 	}
12083       else if (type_dependent_expression_p (*begin)
12084 	       || type_dependent_expression_p (*end))
12085 	/* Can happen, when, eg, in a template context, Koenig lookup
12086 	   can't resolve begin/end (c++/58503).  */
12087 	return NULL_TREE;
12088       else
12089 	{
12090 	  tree iter_type = cv_unqualified (TREE_TYPE (*begin));
12091 	  /* The unqualified type of the __begin and __end temporaries should
12092 	     be the same, as required by the multiple auto declaration.  */
12093 	  if (!same_type_p (iter_type, cv_unqualified (TREE_TYPE (*end))))
12094 	    {
12095 	      if (cxx_dialect >= cxx17
12096 		  && (build_x_binary_op (input_location, NE_EXPR,
12097 					 *begin, ERROR_MARK,
12098 					 *end, ERROR_MARK,
12099 					 NULL, tf_none)
12100 		      != error_mark_node))
12101 		/* P0184R0 allows __begin and __end to have different types,
12102 		   but make sure they are comparable so we can give a better
12103 		   diagnostic.  */;
12104 	      else
12105 		error ("inconsistent begin/end types in range-based %<for%> "
12106 		       "statement: %qT and %qT",
12107 		       TREE_TYPE (*begin), TREE_TYPE (*end));
12108 	    }
12109 	  return iter_type;
12110 	}
12111     }
12112 }
12113 
12114 /* Helper function for cp_parser_perform_range_for_lookup.
12115    Builds a tree for RANGE.IDENTIFIER().  */
12116 
12117 static tree
12118 cp_parser_range_for_member_function (tree range, tree identifier)
12119 {
12120   tree member, res;
12121   vec<tree, va_gc> *vec;
12122 
12123   member = finish_class_member_access_expr (range, identifier,
12124 					    false, tf_warning_or_error);
12125   if (member == error_mark_node)
12126     return error_mark_node;
12127 
12128   vec = make_tree_vector ();
12129   res = finish_call_expr (member, &vec,
12130 			  /*disallow_virtual=*/false,
12131 			  /*koenig_p=*/false,
12132 			  tf_warning_or_error);
12133   release_tree_vector (vec);
12134   return res;
12135 }
12136 
12137 /* Parse an iteration-statement.
12138 
12139    iteration-statement:
12140      while ( condition ) statement
12141      do statement while ( expression ) ;
12142      for ( init-statement condition [opt] ; expression [opt] )
12143        statement
12144 
12145    Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT.  */
12146 
12147 static tree
12148 cp_parser_iteration_statement (cp_parser* parser, bool *if_p, bool ivdep,
12149 			       unsigned short unroll)
12150 {
12151   cp_token *token;
12152   enum rid keyword;
12153   tree statement;
12154   unsigned char in_statement;
12155   token_indent_info guard_tinfo;
12156 
12157   /* Peek at the next token.  */
12158   token = cp_parser_require (parser, CPP_KEYWORD, RT_ITERATION);
12159   if (!token)
12160     return error_mark_node;
12161 
12162   guard_tinfo = get_token_indent_info (token);
12163 
12164   /* Remember whether or not we are already within an iteration
12165      statement.  */
12166   in_statement = parser->in_statement;
12167 
12168   /* See what kind of keyword it is.  */
12169   keyword = token->keyword;
12170   switch (keyword)
12171     {
12172     case RID_WHILE:
12173       {
12174 	tree condition;
12175 
12176 	/* Begin the while-statement.  */
12177 	statement = begin_while_stmt ();
12178 	/* Look for the `('.  */
12179 	matching_parens parens;
12180 	parens.require_open (parser);
12181 	/* Parse the condition.  */
12182 	condition = cp_parser_condition (parser);
12183 	finish_while_stmt_cond (condition, statement, ivdep, unroll);
12184 	/* Look for the `)'.  */
12185 	parens.require_close (parser);
12186 	/* Parse the dependent statement.  */
12187 	parser->in_statement = IN_ITERATION_STMT;
12188 	bool prev = note_iteration_stmt_body_start ();
12189 	cp_parser_already_scoped_statement (parser, if_p, guard_tinfo);
12190 	note_iteration_stmt_body_end (prev);
12191 	parser->in_statement = in_statement;
12192 	/* We're done with the while-statement.  */
12193 	finish_while_stmt (statement);
12194       }
12195       break;
12196 
12197     case RID_DO:
12198       {
12199 	tree expression;
12200 
12201 	/* Begin the do-statement.  */
12202 	statement = begin_do_stmt ();
12203 	/* Parse the body of the do-statement.  */
12204 	parser->in_statement = IN_ITERATION_STMT;
12205 	bool prev = note_iteration_stmt_body_start ();
12206 	cp_parser_implicitly_scoped_statement (parser, NULL, guard_tinfo);
12207 	note_iteration_stmt_body_end (prev);
12208 	parser->in_statement = in_statement;
12209 	finish_do_body (statement);
12210 	/* Look for the `while' keyword.  */
12211 	cp_parser_require_keyword (parser, RID_WHILE, RT_WHILE);
12212 	/* Look for the `('.  */
12213 	matching_parens parens;
12214 	parens.require_open (parser);
12215 	/* Parse the expression.  */
12216 	expression = cp_parser_expression (parser);
12217 	/* We're done with the do-statement.  */
12218 	finish_do_stmt (expression, statement, ivdep, unroll);
12219 	/* Look for the `)'.  */
12220 	parens.require_close (parser);
12221 	/* Look for the `;'.  */
12222 	cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12223       }
12224       break;
12225 
12226     case RID_FOR:
12227       {
12228 	/* Look for the `('.  */
12229 	matching_parens parens;
12230 	parens.require_open (parser);
12231 
12232 	statement = cp_parser_for (parser, ivdep, unroll);
12233 
12234 	/* Look for the `)'.  */
12235 	parens.require_close (parser);
12236 
12237 	/* Parse the body of the for-statement.  */
12238 	parser->in_statement = IN_ITERATION_STMT;
12239 	bool prev = note_iteration_stmt_body_start ();
12240 	cp_parser_already_scoped_statement (parser, if_p, guard_tinfo);
12241 	note_iteration_stmt_body_end (prev);
12242 	parser->in_statement = in_statement;
12243 
12244 	/* We're done with the for-statement.  */
12245 	finish_for_stmt (statement);
12246       }
12247       break;
12248 
12249     default:
12250       cp_parser_error (parser, "expected iteration-statement");
12251       statement = error_mark_node;
12252       break;
12253     }
12254 
12255   return statement;
12256 }
12257 
12258 /* Parse a init-statement or the declarator of a range-based-for.
12259    Returns true if a range-based-for declaration is seen.
12260 
12261    init-statement:
12262      expression-statement
12263      simple-declaration  */
12264 
12265 static bool
12266 cp_parser_init_statement (cp_parser* parser, tree *decl)
12267 {
12268   /* If the next token is a `;', then we have an empty
12269      expression-statement.  Grammatically, this is also a
12270      simple-declaration, but an invalid one, because it does not
12271      declare anything.  Therefore, if we did not handle this case
12272      specially, we would issue an error message about an invalid
12273      declaration.  */
12274   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
12275     {
12276       bool is_range_for = false;
12277       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
12278 
12279       /* A colon is used in range-based for.  */
12280       parser->colon_corrects_to_scope_p = false;
12281 
12282       /* We're going to speculatively look for a declaration, falling back
12283 	 to an expression, if necessary.  */
12284       cp_parser_parse_tentatively (parser);
12285       /* Parse the declaration.  */
12286       cp_parser_simple_declaration (parser,
12287 				    /*function_definition_allowed_p=*/false,
12288 				    decl);
12289       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
12290       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
12291 	{
12292 	  /* It is a range-for, consume the ':' */
12293 	  cp_lexer_consume_token (parser->lexer);
12294 	  is_range_for = true;
12295 	  if (cxx_dialect < cxx11)
12296 	    {
12297 	      pedwarn (cp_lexer_peek_token (parser->lexer)->location, 0,
12298 		       "range-based %<for%> loops only available with "
12299 		       "-std=c++11 or -std=gnu++11");
12300 	      *decl = error_mark_node;
12301 	    }
12302 	}
12303       else
12304 	  /* The ';' is not consumed yet because we told
12305 	     cp_parser_simple_declaration not to.  */
12306 	  cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12307 
12308       if (cp_parser_parse_definitely (parser))
12309 	return is_range_for;
12310       /* If the tentative parse failed, then we shall need to look for an
12311 	 expression-statement.  */
12312     }
12313   /* If we are here, it is an expression-statement.  */
12314   cp_parser_expression_statement (parser, NULL_TREE);
12315   return false;
12316 }
12317 
12318 /* Parse a jump-statement.
12319 
12320    jump-statement:
12321      break ;
12322      continue ;
12323      return expression [opt] ;
12324      return braced-init-list ;
12325      goto identifier ;
12326 
12327    GNU extension:
12328 
12329    jump-statement:
12330      goto * expression ;
12331 
12332    Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR.  */
12333 
12334 static tree
12335 cp_parser_jump_statement (cp_parser* parser)
12336 {
12337   tree statement = error_mark_node;
12338   cp_token *token;
12339   enum rid keyword;
12340   unsigned char in_statement;
12341 
12342   /* Peek at the next token.  */
12343   token = cp_parser_require (parser, CPP_KEYWORD, RT_JUMP);
12344   if (!token)
12345     return error_mark_node;
12346 
12347   /* See what kind of keyword it is.  */
12348   keyword = token->keyword;
12349   switch (keyword)
12350     {
12351     case RID_BREAK:
12352       in_statement = parser->in_statement & ~IN_IF_STMT;
12353       switch (in_statement)
12354 	{
12355 	case 0:
12356 	  error_at (token->location, "break statement not within loop or switch");
12357 	  break;
12358 	default:
12359 	  gcc_assert ((in_statement & IN_SWITCH_STMT)
12360 		      || in_statement == IN_ITERATION_STMT);
12361 	  statement = finish_break_stmt ();
12362 	  if (in_statement == IN_ITERATION_STMT)
12363 	    break_maybe_infinite_loop ();
12364 	  break;
12365 	case IN_OMP_BLOCK:
12366 	  error_at (token->location, "invalid exit from OpenMP structured block");
12367 	  break;
12368 	case IN_OMP_FOR:
12369 	  error_at (token->location, "break statement used with OpenMP for loop");
12370 	  break;
12371 	}
12372       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12373       break;
12374 
12375     case RID_CONTINUE:
12376       switch (parser->in_statement & ~(IN_SWITCH_STMT | IN_IF_STMT))
12377 	{
12378 	case 0:
12379 	  error_at (token->location, "continue statement not within a loop");
12380 	  break;
12381 	  /* Fall through.  */
12382 	case IN_ITERATION_STMT:
12383 	case IN_OMP_FOR:
12384 	  statement = finish_continue_stmt ();
12385 	  break;
12386 	case IN_OMP_BLOCK:
12387 	  error_at (token->location, "invalid exit from OpenMP structured block");
12388 	  break;
12389 	default:
12390 	  gcc_unreachable ();
12391 	}
12392       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12393       break;
12394 
12395     case RID_RETURN:
12396       {
12397 	tree expr;
12398 	bool expr_non_constant_p;
12399 
12400 	if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
12401 	  {
12402 	    cp_lexer_set_source_position (parser->lexer);
12403 	    maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
12404 	    expr = cp_parser_braced_list (parser, &expr_non_constant_p);
12405 	  }
12406 	else if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
12407 	  expr = cp_parser_expression (parser);
12408 	else
12409 	  /* If the next token is a `;', then there is no
12410 	     expression.  */
12411 	  expr = NULL_TREE;
12412 	/* Build the return-statement.  */
12413 	if (current_function_auto_return_pattern && in_discarded_stmt)
12414 	  /* Don't deduce from a discarded return statement.  */;
12415 	else
12416 	  statement = finish_return_stmt (expr);
12417 	/* Look for the final `;'.  */
12418 	cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12419       }
12420       break;
12421 
12422     case RID_GOTO:
12423       if (parser->in_function_body
12424 	  && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
12425 	{
12426 	  error ("%<goto%> in %<constexpr%> function");
12427 	  cp_function_chain->invalid_constexpr = true;
12428 	}
12429 
12430       /* Create the goto-statement.  */
12431       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
12432 	{
12433 	  /* Issue a warning about this use of a GNU extension.  */
12434 	  pedwarn (token->location, OPT_Wpedantic, "ISO C++ forbids computed gotos");
12435 	  /* Consume the '*' token.  */
12436 	  cp_lexer_consume_token (parser->lexer);
12437 	  /* Parse the dependent expression.  */
12438 	  finish_goto_stmt (cp_parser_expression (parser));
12439 	}
12440       else
12441 	finish_goto_stmt (cp_parser_identifier (parser));
12442       /* Look for the final `;'.  */
12443       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
12444       break;
12445 
12446     default:
12447       cp_parser_error (parser, "expected jump-statement");
12448       break;
12449     }
12450 
12451   return statement;
12452 }
12453 
12454 /* Parse a declaration-statement.
12455 
12456    declaration-statement:
12457      block-declaration  */
12458 
12459 static void
12460 cp_parser_declaration_statement (cp_parser* parser)
12461 {
12462   void *p;
12463 
12464   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
12465   p = obstack_alloc (&declarator_obstack, 0);
12466 
12467  /* Parse the block-declaration.  */
12468   cp_parser_block_declaration (parser, /*statement_p=*/true);
12469 
12470   /* Free any declarators allocated.  */
12471   obstack_free (&declarator_obstack, p);
12472 }
12473 
12474 /* Some dependent statements (like `if (cond) statement'), are
12475    implicitly in their own scope.  In other words, if the statement is
12476    a single statement (as opposed to a compound-statement), it is
12477    none-the-less treated as if it were enclosed in braces.  Any
12478    declarations appearing in the dependent statement are out of scope
12479    after control passes that point.  This function parses a statement,
12480    but ensures that is in its own scope, even if it is not a
12481    compound-statement.
12482 
12483    If IF_P is not NULL, *IF_P is set to indicate whether the statement
12484    is a (possibly labeled) if statement which is not enclosed in
12485    braces and has an else clause.  This is used to implement
12486    -Wparentheses.
12487 
12488    CHAIN is a vector of if-else-if conditions.  This is used to implement
12489    -Wduplicated-cond.
12490 
12491    Returns the new statement.  */
12492 
12493 static tree
12494 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p,
12495 				       const token_indent_info &guard_tinfo,
12496 				       vec<tree> *chain)
12497 {
12498   tree statement;
12499   location_t body_loc = cp_lexer_peek_token (parser->lexer)->location;
12500   location_t body_loc_after_labels = UNKNOWN_LOCATION;
12501   token_indent_info body_tinfo
12502     = get_token_indent_info (cp_lexer_peek_token (parser->lexer));
12503 
12504   if (if_p != NULL)
12505     *if_p = false;
12506 
12507   /* Mark if () ; with a special NOP_EXPR.  */
12508   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
12509     {
12510       cp_lexer_consume_token (parser->lexer);
12511       statement = add_stmt (build_empty_stmt (body_loc));
12512 
12513       if (guard_tinfo.keyword == RID_IF
12514 	  && !cp_lexer_next_token_is_keyword (parser->lexer, RID_ELSE))
12515 	warning_at (body_loc, OPT_Wempty_body,
12516 		    "suggest braces around empty body in an %<if%> statement");
12517       else if (guard_tinfo.keyword == RID_ELSE)
12518 	warning_at (body_loc, OPT_Wempty_body,
12519 		    "suggest braces around empty body in an %<else%> statement");
12520     }
12521   /* if a compound is opened, we simply parse the statement directly.  */
12522   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
12523     statement = cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
12524   /* If the token is not a `{', then we must take special action.  */
12525   else
12526     {
12527       /* Create a compound-statement.  */
12528       statement = begin_compound_stmt (0);
12529       /* Parse the dependent-statement.  */
12530       cp_parser_statement (parser, NULL_TREE, false, if_p, chain,
12531 			   &body_loc_after_labels);
12532       /* Finish the dummy compound-statement.  */
12533       finish_compound_stmt (statement);
12534     }
12535 
12536   token_indent_info next_tinfo
12537     = get_token_indent_info (cp_lexer_peek_token (parser->lexer));
12538   warn_for_misleading_indentation (guard_tinfo, body_tinfo, next_tinfo);
12539 
12540   if (body_loc_after_labels != UNKNOWN_LOCATION
12541       && next_tinfo.type != CPP_SEMICOLON)
12542     warn_for_multistatement_macros (body_loc_after_labels, next_tinfo.location,
12543 				    guard_tinfo.location, guard_tinfo.keyword);
12544 
12545   /* Return the statement.  */
12546   return statement;
12547 }
12548 
12549 /* For some dependent statements (like `while (cond) statement'), we
12550    have already created a scope.  Therefore, even if the dependent
12551    statement is a compound-statement, we do not want to create another
12552    scope.  */
12553 
12554 static void
12555 cp_parser_already_scoped_statement (cp_parser* parser, bool *if_p,
12556 				    const token_indent_info &guard_tinfo)
12557 {
12558   /* If the token is a `{', then we must take special action.  */
12559   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
12560     {
12561       token_indent_info body_tinfo
12562 	= get_token_indent_info (cp_lexer_peek_token (parser->lexer));
12563       location_t loc_after_labels = UNKNOWN_LOCATION;
12564 
12565       cp_parser_statement (parser, NULL_TREE, false, if_p, NULL,
12566 			   &loc_after_labels);
12567       token_indent_info next_tinfo
12568 	= get_token_indent_info (cp_lexer_peek_token (parser->lexer));
12569       warn_for_misleading_indentation (guard_tinfo, body_tinfo, next_tinfo);
12570 
12571       if (loc_after_labels != UNKNOWN_LOCATION
12572 	  && next_tinfo.type != CPP_SEMICOLON)
12573 	warn_for_multistatement_macros (loc_after_labels, next_tinfo.location,
12574 					guard_tinfo.location,
12575 					guard_tinfo.keyword);
12576     }
12577   else
12578     {
12579       /* Avoid calling cp_parser_compound_statement, so that we
12580 	 don't create a new scope.  Do everything else by hand.  */
12581       matching_braces braces;
12582       braces.require_open (parser);
12583       /* If the next keyword is `__label__' we have a label declaration.  */
12584       while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
12585 	cp_parser_label_declaration (parser);
12586       /* Parse an (optional) statement-seq.  */
12587       cp_parser_statement_seq_opt (parser, NULL_TREE);
12588       braces.require_close (parser);
12589     }
12590 }
12591 
12592 /* Declarations [gram.dcl.dcl] */
12593 
12594 /* Parse an optional declaration-sequence.
12595 
12596    declaration-seq:
12597      declaration
12598      declaration-seq declaration  */
12599 
12600 static void
12601 cp_parser_declaration_seq_opt (cp_parser* parser)
12602 {
12603   while (true)
12604     {
12605       cp_token *token;
12606 
12607       token = cp_lexer_peek_token (parser->lexer);
12608 
12609       if (token->type == CPP_CLOSE_BRACE
12610 	  || token->type == CPP_EOF
12611 	  || token->type == CPP_PRAGMA_EOL)
12612 	break;
12613 
12614       if (token->type == CPP_SEMICOLON)
12615 	{
12616 	  /* A declaration consisting of a single semicolon is
12617 	     invalid.  Allow it unless we're being pedantic.  */
12618 	  cp_lexer_consume_token (parser->lexer);
12619 	  if (!in_system_header_at (input_location))
12620 	    pedwarn (input_location, OPT_Wpedantic, "extra %<;%>");
12621 	  continue;
12622 	}
12623 
12624       /* If we're entering or exiting a region that's implicitly
12625 	 extern "C", modify the lang context appropriately.  */
12626       if (!parser->implicit_extern_c && token->implicit_extern_c)
12627 	{
12628 	  push_lang_context (lang_name_c);
12629 	  parser->implicit_extern_c = true;
12630 	}
12631       else if (parser->implicit_extern_c && !token->implicit_extern_c)
12632 	{
12633 	  pop_lang_context ();
12634 	  parser->implicit_extern_c = false;
12635 	}
12636 
12637       if (token->type == CPP_PRAGMA)
12638 	{
12639 	  /* A top-level declaration can consist solely of a #pragma.
12640 	     A nested declaration cannot, so this is done here and not
12641 	     in cp_parser_declaration.  (A #pragma at block scope is
12642 	     handled in cp_parser_statement.)  */
12643 	  cp_parser_pragma (parser, pragma_external, NULL);
12644 	  continue;
12645 	}
12646 
12647       /* Parse the declaration itself.  */
12648       cp_parser_declaration (parser);
12649     }
12650 }
12651 
12652 /* Parse a declaration.
12653 
12654    declaration:
12655      block-declaration
12656      function-definition
12657      template-declaration
12658      explicit-instantiation
12659      explicit-specialization
12660      linkage-specification
12661      namespace-definition
12662 
12663    C++17:
12664      deduction-guide
12665 
12666    GNU extension:
12667 
12668    declaration:
12669       __extension__ declaration */
12670 
12671 static void
12672 cp_parser_declaration (cp_parser* parser)
12673 {
12674   cp_token token1;
12675   cp_token token2;
12676   int saved_pedantic;
12677   void *p;
12678   tree attributes = NULL_TREE;
12679 
12680   /* Check for the `__extension__' keyword.  */
12681   if (cp_parser_extension_opt (parser, &saved_pedantic))
12682     {
12683       /* Parse the qualified declaration.  */
12684       cp_parser_declaration (parser);
12685       /* Restore the PEDANTIC flag.  */
12686       pedantic = saved_pedantic;
12687 
12688       return;
12689     }
12690 
12691   /* Try to figure out what kind of declaration is present.  */
12692   token1 = *cp_lexer_peek_token (parser->lexer);
12693 
12694   if (token1.type != CPP_EOF)
12695     token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
12696   else
12697     {
12698       token2.type = CPP_EOF;
12699       token2.keyword = RID_MAX;
12700     }
12701 
12702   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
12703   p = obstack_alloc (&declarator_obstack, 0);
12704 
12705   /* If the next token is `extern' and the following token is a string
12706      literal, then we have a linkage specification.  */
12707   if (token1.keyword == RID_EXTERN
12708       && cp_parser_is_pure_string_literal (&token2))
12709     cp_parser_linkage_specification (parser);
12710   /* If the next token is `template', then we have either a template
12711      declaration, an explicit instantiation, or an explicit
12712      specialization.  */
12713   else if (token1.keyword == RID_TEMPLATE)
12714     {
12715       /* `template <>' indicates a template specialization.  */
12716       if (token2.type == CPP_LESS
12717 	  && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
12718 	cp_parser_explicit_specialization (parser);
12719       /* `template <' indicates a template declaration.  */
12720       else if (token2.type == CPP_LESS)
12721 	cp_parser_template_declaration (parser, /*member_p=*/false);
12722       /* Anything else must be an explicit instantiation.  */
12723       else
12724 	cp_parser_explicit_instantiation (parser);
12725     }
12726   /* If the next token is `export', then we have a template
12727      declaration.  */
12728   else if (token1.keyword == RID_EXPORT)
12729     cp_parser_template_declaration (parser, /*member_p=*/false);
12730   /* If the next token is `extern', 'static' or 'inline' and the one
12731      after that is `template', we have a GNU extended explicit
12732      instantiation directive.  */
12733   else if (cp_parser_allow_gnu_extensions_p (parser)
12734 	   && (token1.keyword == RID_EXTERN
12735 	       || token1.keyword == RID_STATIC
12736 	       || token1.keyword == RID_INLINE)
12737 	   && token2.keyword == RID_TEMPLATE)
12738     cp_parser_explicit_instantiation (parser);
12739   /* If the next token is `namespace', check for a named or unnamed
12740      namespace definition.  */
12741   else if (token1.keyword == RID_NAMESPACE
12742 	   && (/* A named namespace definition.  */
12743 	       (token2.type == CPP_NAME
12744 		&& (cp_lexer_peek_nth_token (parser->lexer, 3)->type
12745 		    != CPP_EQ))
12746                || (token2.type == CPP_OPEN_SQUARE
12747                    && cp_lexer_peek_nth_token (parser->lexer, 3)->type
12748                    == CPP_OPEN_SQUARE)
12749 	       /* An unnamed namespace definition.  */
12750 	       || token2.type == CPP_OPEN_BRACE
12751 	       || token2.keyword == RID_ATTRIBUTE))
12752     cp_parser_namespace_definition (parser);
12753   /* An inline (associated) namespace definition.  */
12754   else if (token1.keyword == RID_INLINE
12755 	   && token2.keyword == RID_NAMESPACE)
12756     cp_parser_namespace_definition (parser);
12757   /* Objective-C++ declaration/definition.  */
12758   else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
12759     cp_parser_objc_declaration (parser, NULL_TREE);
12760   else if (c_dialect_objc ()
12761 	   && token1.keyword == RID_ATTRIBUTE
12762 	   && cp_parser_objc_valid_prefix_attributes (parser, &attributes))
12763     cp_parser_objc_declaration (parser, attributes);
12764   /* At this point we may have a template declared by a concept
12765      introduction.  */
12766   else if (flag_concepts
12767 	   && cp_parser_template_declaration_after_export (parser,
12768 							   /*member_p=*/false))
12769     /* We did.  */;
12770   else
12771     /* Try to parse a block-declaration, or a function-definition.  */
12772     cp_parser_block_declaration (parser, /*statement_p=*/false);
12773 
12774   /* Free any declarators allocated.  */
12775   obstack_free (&declarator_obstack, p);
12776 }
12777 
12778 /* Parse a block-declaration.
12779 
12780    block-declaration:
12781      simple-declaration
12782      asm-definition
12783      namespace-alias-definition
12784      using-declaration
12785      using-directive
12786 
12787    GNU Extension:
12788 
12789    block-declaration:
12790      __extension__ block-declaration
12791 
12792    C++0x Extension:
12793 
12794    block-declaration:
12795      static_assert-declaration
12796 
12797    If STATEMENT_P is TRUE, then this block-declaration is occurring as
12798    part of a declaration-statement.  */
12799 
12800 static void
12801 cp_parser_block_declaration (cp_parser *parser,
12802 			     bool      statement_p)
12803 {
12804   cp_token *token1;
12805   int saved_pedantic;
12806 
12807   /* Check for the `__extension__' keyword.  */
12808   if (cp_parser_extension_opt (parser, &saved_pedantic))
12809     {
12810       /* Parse the qualified declaration.  */
12811       cp_parser_block_declaration (parser, statement_p);
12812       /* Restore the PEDANTIC flag.  */
12813       pedantic = saved_pedantic;
12814 
12815       return;
12816     }
12817 
12818   /* Peek at the next token to figure out which kind of declaration is
12819      present.  */
12820   token1 = cp_lexer_peek_token (parser->lexer);
12821 
12822   /* If the next keyword is `asm', we have an asm-definition.  */
12823   if (token1->keyword == RID_ASM)
12824     {
12825       if (statement_p)
12826 	cp_parser_commit_to_tentative_parse (parser);
12827       cp_parser_asm_definition (parser);
12828     }
12829   /* If the next keyword is `namespace', we have a
12830      namespace-alias-definition.  */
12831   else if (token1->keyword == RID_NAMESPACE)
12832     cp_parser_namespace_alias_definition (parser);
12833   /* If the next keyword is `using', we have a
12834      using-declaration, a using-directive, or an alias-declaration.  */
12835   else if (token1->keyword == RID_USING)
12836     {
12837       cp_token *token2;
12838 
12839       if (statement_p)
12840 	cp_parser_commit_to_tentative_parse (parser);
12841       /* If the token after `using' is `namespace', then we have a
12842 	 using-directive.  */
12843       token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
12844       if (token2->keyword == RID_NAMESPACE)
12845 	cp_parser_using_directive (parser);
12846       /* If the second token after 'using' is '=', then we have an
12847 	 alias-declaration.  */
12848       else if (cxx_dialect >= cxx11
12849 	       && token2->type == CPP_NAME
12850 	       && ((cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ)
12851 		   || (cp_nth_tokens_can_be_attribute_p (parser, 3))))
12852 	cp_parser_alias_declaration (parser);
12853       /* Otherwise, it's a using-declaration.  */
12854       else
12855 	cp_parser_using_declaration (parser,
12856 				     /*access_declaration_p=*/false);
12857     }
12858   /* If the next keyword is `__label__' we have a misplaced label
12859      declaration.  */
12860   else if (token1->keyword == RID_LABEL)
12861     {
12862       cp_lexer_consume_token (parser->lexer);
12863       error_at (token1->location, "%<__label__%> not at the beginning of a block");
12864       cp_parser_skip_to_end_of_statement (parser);
12865       /* If the next token is now a `;', consume it.  */
12866       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
12867 	cp_lexer_consume_token (parser->lexer);
12868     }
12869   /* If the next token is `static_assert' we have a static assertion.  */
12870   else if (token1->keyword == RID_STATIC_ASSERT)
12871     cp_parser_static_assert (parser, /*member_p=*/false);
12872   /* Anything else must be a simple-declaration.  */
12873   else
12874     cp_parser_simple_declaration (parser, !statement_p,
12875 				  /*maybe_range_for_decl*/NULL);
12876 }
12877 
12878 /* Parse a simple-declaration.
12879 
12880    simple-declaration:
12881      decl-specifier-seq [opt] init-declarator-list [opt] ;
12882      decl-specifier-seq ref-qualifier [opt] [ identifier-list ]
12883        brace-or-equal-initializer ;
12884 
12885    init-declarator-list:
12886      init-declarator
12887      init-declarator-list , init-declarator
12888 
12889    If FUNCTION_DEFINITION_ALLOWED_P is TRUE, then we also recognize a
12890    function-definition as a simple-declaration.
12891 
12892    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
12893    parsed declaration if it is an uninitialized single declarator not followed
12894    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
12895    if present, will not be consumed.  */
12896 
12897 static void
12898 cp_parser_simple_declaration (cp_parser* parser,
12899 			      bool function_definition_allowed_p,
12900 			      tree *maybe_range_for_decl)
12901 {
12902   cp_decl_specifier_seq decl_specifiers;
12903   int declares_class_or_enum;
12904   bool saw_declarator;
12905   location_t comma_loc = UNKNOWN_LOCATION;
12906   location_t init_loc = UNKNOWN_LOCATION;
12907 
12908   if (maybe_range_for_decl)
12909     *maybe_range_for_decl = NULL_TREE;
12910 
12911   /* Defer access checks until we know what is being declared; the
12912      checks for names appearing in the decl-specifier-seq should be
12913      done as if we were in the scope of the thing being declared.  */
12914   push_deferring_access_checks (dk_deferred);
12915 
12916   /* Parse the decl-specifier-seq.  We have to keep track of whether
12917      or not the decl-specifier-seq declares a named class or
12918      enumeration type, since that is the only case in which the
12919      init-declarator-list is allowed to be empty.
12920 
12921      [dcl.dcl]
12922 
12923      In a simple-declaration, the optional init-declarator-list can be
12924      omitted only when declaring a class or enumeration, that is when
12925      the decl-specifier-seq contains either a class-specifier, an
12926      elaborated-type-specifier, or an enum-specifier.  */
12927   cp_parser_decl_specifier_seq (parser,
12928 				CP_PARSER_FLAGS_OPTIONAL,
12929 				&decl_specifiers,
12930 				&declares_class_or_enum);
12931   /* We no longer need to defer access checks.  */
12932   stop_deferring_access_checks ();
12933 
12934   /* In a block scope, a valid declaration must always have a
12935      decl-specifier-seq.  By not trying to parse declarators, we can
12936      resolve the declaration/expression ambiguity more quickly.  */
12937   if (!function_definition_allowed_p
12938       && !decl_specifiers.any_specifiers_p)
12939     {
12940       cp_parser_error (parser, "expected declaration");
12941       goto done;
12942     }
12943 
12944   /* If the next two tokens are both identifiers, the code is
12945      erroneous. The usual cause of this situation is code like:
12946 
12947        T t;
12948 
12949      where "T" should name a type -- but does not.  */
12950   if (!decl_specifiers.any_type_specifiers_p
12951       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
12952     {
12953       /* If parsing tentatively, we should commit; we really are
12954 	 looking at a declaration.  */
12955       cp_parser_commit_to_tentative_parse (parser);
12956       /* Give up.  */
12957       goto done;
12958     }
12959 
12960   /* If we have seen at least one decl-specifier, and the next token
12961      is not a parenthesis, then we must be looking at a declaration.
12962      (After "int (" we might be looking at a functional cast.)  */
12963   if (decl_specifiers.any_specifiers_p
12964       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
12965       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
12966       && !cp_parser_error_occurred (parser))
12967     cp_parser_commit_to_tentative_parse (parser);
12968 
12969   /* Look for C++17 decomposition declaration.  */
12970   for (size_t n = 1; ; n++)
12971     if (cp_lexer_nth_token_is (parser->lexer, n, CPP_AND)
12972 	|| cp_lexer_nth_token_is (parser->lexer, n, CPP_AND_AND))
12973       continue;
12974     else if (cp_lexer_nth_token_is (parser->lexer, n, CPP_OPEN_SQUARE)
12975 	     && !cp_lexer_nth_token_is (parser->lexer, n + 1, CPP_OPEN_SQUARE)
12976 	     && decl_specifiers.any_specifiers_p)
12977       {
12978 	tree decl
12979 	  = cp_parser_decomposition_declaration (parser, &decl_specifiers,
12980 						 maybe_range_for_decl,
12981 						 &init_loc);
12982 
12983 	/* The next token should be either a `,' or a `;'.  */
12984 	cp_token *token = cp_lexer_peek_token (parser->lexer);
12985 	/* If it's a `;', we are done.  */
12986 	if (token->type == CPP_SEMICOLON)
12987 	  goto finish;
12988 	else if (maybe_range_for_decl)
12989 	  {
12990 	    if (*maybe_range_for_decl == NULL_TREE)
12991 	      *maybe_range_for_decl = error_mark_node;
12992 	    goto finish;
12993 	  }
12994 	/* Anything else is an error.  */
12995 	else
12996 	  {
12997 	    /* If we have already issued an error message we don't need
12998 	       to issue another one.  */
12999 	    if ((decl != error_mark_node
13000 		 && DECL_INITIAL (decl) != error_mark_node)
13001 		|| cp_parser_uncommitted_to_tentative_parse_p (parser))
13002 	      cp_parser_error (parser, "expected %<,%> or %<;%>");
13003 	    /* Skip tokens until we reach the end of the statement.  */
13004 	    cp_parser_skip_to_end_of_statement (parser);
13005 	    /* If the next token is now a `;', consume it.  */
13006 	    if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
13007 	      cp_lexer_consume_token (parser->lexer);
13008 	    goto done;
13009 	  }
13010       }
13011     else
13012       break;
13013 
13014   tree last_type;
13015   bool auto_specifier_p;
13016   /* NULL_TREE if both variable and function declaration are allowed,
13017      error_mark_node if function declaration are not allowed and
13018      a FUNCTION_DECL that should be diagnosed if it is followed by
13019      variable declarations.  */
13020   tree auto_function_declaration;
13021 
13022   last_type = NULL_TREE;
13023   auto_specifier_p
13024     = decl_specifiers.type && type_uses_auto (decl_specifiers.type);
13025   auto_function_declaration = NULL_TREE;
13026 
13027   /* Keep going until we hit the `;' at the end of the simple
13028      declaration.  */
13029   saw_declarator = false;
13030   while (cp_lexer_next_token_is_not (parser->lexer,
13031 				     CPP_SEMICOLON))
13032     {
13033       cp_token *token;
13034       bool function_definition_p;
13035       tree decl;
13036       tree auto_result = NULL_TREE;
13037 
13038       if (saw_declarator)
13039 	{
13040 	  /* If we are processing next declarator, comma is expected */
13041 	  token = cp_lexer_peek_token (parser->lexer);
13042 	  gcc_assert (token->type == CPP_COMMA);
13043 	  cp_lexer_consume_token (parser->lexer);
13044 	  if (maybe_range_for_decl)
13045 	    {
13046 	      *maybe_range_for_decl = error_mark_node;
13047 	      if (comma_loc == UNKNOWN_LOCATION)
13048 		comma_loc = token->location;
13049 	    }
13050 	}
13051       else
13052 	saw_declarator = true;
13053 
13054       /* Parse the init-declarator.  */
13055       decl = cp_parser_init_declarator (parser, &decl_specifiers,
13056 					/*checks=*/NULL,
13057 					function_definition_allowed_p,
13058 					/*member_p=*/false,
13059 					declares_class_or_enum,
13060 					&function_definition_p,
13061 					maybe_range_for_decl,
13062 					&init_loc,
13063 					&auto_result);
13064       /* If an error occurred while parsing tentatively, exit quickly.
13065 	 (That usually happens when in the body of a function; each
13066 	 statement is treated as a declaration-statement until proven
13067 	 otherwise.)  */
13068       if (cp_parser_error_occurred (parser))
13069 	goto done;
13070 
13071       if (auto_specifier_p && cxx_dialect >= cxx14)
13072 	{
13073 	  /* If the init-declarator-list contains more than one
13074 	     init-declarator, they shall all form declarations of
13075 	     variables.  */
13076 	  if (auto_function_declaration == NULL_TREE)
13077 	    auto_function_declaration
13078 	      = TREE_CODE (decl) == FUNCTION_DECL ? decl : error_mark_node;
13079 	  else if (TREE_CODE (decl) == FUNCTION_DECL
13080 		   || auto_function_declaration != error_mark_node)
13081 	    {
13082 	      error_at (decl_specifiers.locations[ds_type_spec],
13083 			"non-variable %qD in declaration with more than one "
13084 			"declarator with placeholder type",
13085 			TREE_CODE (decl) == FUNCTION_DECL
13086 			? decl : auto_function_declaration);
13087 	      auto_function_declaration = error_mark_node;
13088 	    }
13089 	}
13090 
13091       if (auto_result
13092 	  && (!processing_template_decl || !type_uses_auto (auto_result)))
13093 	{
13094 	  if (last_type
13095 	      && last_type != error_mark_node
13096 	      && !same_type_p (auto_result, last_type))
13097 	    {
13098 	      /* If the list of declarators contains more than one declarator,
13099 		 the type of each declared variable is determined as described
13100 		 above. If the type deduced for the template parameter U is not
13101 		 the same in each deduction, the program is ill-formed.  */
13102 	      error_at (decl_specifiers.locations[ds_type_spec],
13103 			"inconsistent deduction for %qT: %qT and then %qT",
13104 			decl_specifiers.type, last_type, auto_result);
13105 	      last_type = error_mark_node;
13106 	    }
13107 	  else
13108 	    last_type = auto_result;
13109 	}
13110 
13111       /* Handle function definitions specially.  */
13112       if (function_definition_p)
13113 	{
13114 	  /* If the next token is a `,', then we are probably
13115 	     processing something like:
13116 
13117 	       void f() {}, *p;
13118 
13119 	     which is erroneous.  */
13120 	  if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
13121 	    {
13122 	      cp_token *token = cp_lexer_peek_token (parser->lexer);
13123 	      error_at (token->location,
13124 			"mixing"
13125 			" declarations and function-definitions is forbidden");
13126 	    }
13127 	  /* Otherwise, we're done with the list of declarators.  */
13128 	  else
13129 	    {
13130 	      pop_deferring_access_checks ();
13131 	      return;
13132 	    }
13133 	}
13134       if (maybe_range_for_decl && *maybe_range_for_decl == NULL_TREE)
13135 	*maybe_range_for_decl = decl;
13136       /* The next token should be either a `,' or a `;'.  */
13137       token = cp_lexer_peek_token (parser->lexer);
13138       /* If it's a `,', there are more declarators to come.  */
13139       if (token->type == CPP_COMMA)
13140 	/* will be consumed next time around */;
13141       /* If it's a `;', we are done.  */
13142       else if (token->type == CPP_SEMICOLON)
13143 	break;
13144       else if (maybe_range_for_decl)
13145 	{
13146 	  if ((declares_class_or_enum & 2) && token->type == CPP_COLON)
13147 	    permerror (decl_specifiers.locations[ds_type_spec],
13148 		       "types may not be defined in a for-range-declaration");
13149 	  break;
13150 	}
13151       /* Anything else is an error.  */
13152       else
13153 	{
13154 	  /* If we have already issued an error message we don't need
13155 	     to issue another one.  */
13156 	  if ((decl != error_mark_node
13157 	       && DECL_INITIAL (decl) != error_mark_node)
13158 	      || cp_parser_uncommitted_to_tentative_parse_p (parser))
13159 	    cp_parser_error (parser, "expected %<,%> or %<;%>");
13160 	  /* Skip tokens until we reach the end of the statement.  */
13161 	  cp_parser_skip_to_end_of_statement (parser);
13162 	  /* If the next token is now a `;', consume it.  */
13163 	  if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
13164 	    cp_lexer_consume_token (parser->lexer);
13165 	  goto done;
13166 	}
13167       /* After the first time around, a function-definition is not
13168 	 allowed -- even if it was OK at first.  For example:
13169 
13170 	   int i, f() {}
13171 
13172 	 is not valid.  */
13173       function_definition_allowed_p = false;
13174     }
13175 
13176   /* Issue an error message if no declarators are present, and the
13177      decl-specifier-seq does not itself declare a class or
13178      enumeration: [dcl.dcl]/3.  */
13179   if (!saw_declarator)
13180     {
13181       if (cp_parser_declares_only_class_p (parser))
13182 	{
13183 	  if (!declares_class_or_enum
13184 	      && decl_specifiers.type
13185 	      && OVERLOAD_TYPE_P (decl_specifiers.type))
13186 	    /* Ensure an error is issued anyway when finish_decltype_type,
13187 	       called via cp_parser_decl_specifier_seq, returns a class or
13188 	       an enumeration (c++/51786).  */
13189 	    decl_specifiers.type = NULL_TREE;
13190 	  shadow_tag (&decl_specifiers);
13191 	}
13192       /* Perform any deferred access checks.  */
13193       perform_deferred_access_checks (tf_warning_or_error);
13194     }
13195 
13196   /* Consume the `;'.  */
13197  finish:
13198   if (!maybe_range_for_decl)
13199     cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
13200   else if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
13201     {
13202       if (init_loc != UNKNOWN_LOCATION)
13203 	error_at (init_loc, "initializer in range-based %<for%> loop");
13204       if (comma_loc != UNKNOWN_LOCATION)
13205 	error_at (comma_loc,
13206 		  "multiple declarations in range-based %<for%> loop");
13207     }
13208 
13209  done:
13210   pop_deferring_access_checks ();
13211 }
13212 
13213 /* Helper of cp_parser_simple_declaration, parse a decomposition declaration.
13214      decl-specifier-seq ref-qualifier [opt] [ identifier-list ]
13215        initializer ;  */
13216 
13217 static tree
13218 cp_parser_decomposition_declaration (cp_parser *parser,
13219 				     cp_decl_specifier_seq *decl_specifiers,
13220 				     tree *maybe_range_for_decl,
13221 				     location_t *init_loc)
13222 {
13223   cp_ref_qualifier ref_qual = cp_parser_ref_qualifier_opt (parser);
13224   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
13225   cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
13226 
13227   /* Parse the identifier-list.  */
13228   auto_vec<cp_expr, 10> v;
13229   if (!cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_SQUARE))
13230     while (true)
13231       {
13232 	cp_expr e = cp_parser_identifier (parser);
13233 	if (e.get_value () == error_mark_node)
13234 	  break;
13235 	v.safe_push (e);
13236 	if (!cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
13237 	  break;
13238 	cp_lexer_consume_token (parser->lexer);
13239       }
13240 
13241   location_t end_loc = cp_lexer_peek_token (parser->lexer)->location;
13242   if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
13243     {
13244       end_loc = UNKNOWN_LOCATION;
13245       cp_parser_skip_to_closing_parenthesis_1 (parser, true, CPP_CLOSE_SQUARE,
13246 					       false);
13247       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_SQUARE))
13248 	cp_lexer_consume_token (parser->lexer);
13249       else
13250 	{
13251 	  cp_parser_skip_to_end_of_statement (parser);
13252 	  return error_mark_node;
13253 	}
13254     }
13255 
13256   if (cxx_dialect < cxx17)
13257     pedwarn (loc, 0, "structured bindings only available with "
13258 		     "-std=c++17 or -std=gnu++17");
13259 
13260   tree pushed_scope;
13261   cp_declarator *declarator = make_declarator (cdk_decomp);
13262   loc = end_loc == UNKNOWN_LOCATION ? loc : make_location (loc, loc, end_loc);
13263   declarator->id_loc = loc;
13264   if (ref_qual != REF_QUAL_NONE)
13265     declarator = make_reference_declarator (TYPE_UNQUALIFIED, declarator,
13266 					    ref_qual == REF_QUAL_RVALUE,
13267 					    NULL_TREE);
13268   tree decl = start_decl (declarator, decl_specifiers, SD_INITIALIZED,
13269 			  NULL_TREE, decl_specifiers->attributes,
13270 			  &pushed_scope);
13271   tree orig_decl = decl;
13272 
13273   unsigned int i;
13274   cp_expr e;
13275   cp_decl_specifier_seq decl_specs;
13276   clear_decl_specs (&decl_specs);
13277   decl_specs.type = make_auto ();
13278   tree prev = decl;
13279   FOR_EACH_VEC_ELT (v, i, e)
13280     {
13281       if (i == 0)
13282 	declarator = make_id_declarator (NULL_TREE, e.get_value (), sfk_none);
13283       else
13284 	declarator->u.id.unqualified_name = e.get_value ();
13285       declarator->id_loc = e.get_location ();
13286       tree elt_pushed_scope;
13287       tree decl2 = start_decl (declarator, &decl_specs, SD_INITIALIZED,
13288 			       NULL_TREE, NULL_TREE, &elt_pushed_scope);
13289       if (decl2 == error_mark_node)
13290 	decl = error_mark_node;
13291       else if (decl != error_mark_node && DECL_CHAIN (decl2) != prev)
13292 	{
13293 	  /* Ensure we've diagnosed redeclaration if we aren't creating
13294 	     a new VAR_DECL.  */
13295 	  gcc_assert (errorcount);
13296 	  decl = error_mark_node;
13297 	}
13298       else
13299 	prev = decl2;
13300       if (elt_pushed_scope)
13301 	pop_scope (elt_pushed_scope);
13302     }
13303 
13304   if (v.is_empty ())
13305     {
13306       error_at (loc, "empty structured binding declaration");
13307       decl = error_mark_node;
13308     }
13309 
13310   if (maybe_range_for_decl == NULL
13311       || cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
13312     {
13313       bool non_constant_p = false, is_direct_init = false;
13314       *init_loc = cp_lexer_peek_token (parser->lexer)->location;
13315       tree initializer = cp_parser_initializer (parser, &is_direct_init,
13316 						&non_constant_p);
13317       if (initializer == NULL_TREE
13318 	  || (TREE_CODE (initializer) == TREE_LIST
13319 	      && TREE_CHAIN (initializer))
13320 	  || (is_direct_init
13321 	      && BRACE_ENCLOSED_INITIALIZER_P (initializer)
13322 	      && CONSTRUCTOR_NELTS (initializer) != 1))
13323 	{
13324 	  error_at (loc, "invalid initializer for structured binding "
13325 		    "declaration");
13326 	  initializer = error_mark_node;
13327 	}
13328 
13329       if (decl != error_mark_node)
13330 	{
13331 	  cp_maybe_mangle_decomp (decl, prev, v.length ());
13332 	  cp_finish_decl (decl, initializer, non_constant_p, NULL_TREE,
13333 			  is_direct_init ? LOOKUP_NORMAL : LOOKUP_IMPLICIT);
13334 	  cp_finish_decomp (decl, prev, v.length ());
13335 	}
13336     }
13337   else if (decl != error_mark_node)
13338     {
13339       *maybe_range_for_decl = prev;
13340       /* Ensure DECL_VALUE_EXPR is created for all the decls but
13341 	 the underlying DECL.  */
13342       cp_finish_decomp (decl, prev, v.length ());
13343     }
13344 
13345   if (pushed_scope)
13346     pop_scope (pushed_scope);
13347 
13348   if (decl == error_mark_node && DECL_P (orig_decl))
13349     {
13350       if (DECL_NAMESPACE_SCOPE_P (orig_decl))
13351 	SET_DECL_ASSEMBLER_NAME (orig_decl, get_identifier ("<decomp>"));
13352     }
13353 
13354   return decl;
13355 }
13356 
13357 /* Parse a decl-specifier-seq.
13358 
13359    decl-specifier-seq:
13360      decl-specifier-seq [opt] decl-specifier
13361      decl-specifier attribute-specifier-seq [opt] (C++11)
13362 
13363    decl-specifier:
13364      storage-class-specifier
13365      type-specifier
13366      function-specifier
13367      friend
13368      typedef
13369 
13370    GNU Extension:
13371 
13372    decl-specifier:
13373      attributes
13374 
13375    Concepts Extension:
13376 
13377    decl-specifier:
13378      concept
13379 
13380    Set *DECL_SPECS to a representation of the decl-specifier-seq.
13381 
13382    The parser flags FLAGS is used to control type-specifier parsing.
13383 
13384    *DECLARES_CLASS_OR_ENUM is set to the bitwise or of the following
13385    flags:
13386 
13387      1: one of the decl-specifiers is an elaborated-type-specifier
13388 	(i.e., a type declaration)
13389      2: one of the decl-specifiers is an enum-specifier or a
13390 	class-specifier (i.e., a type definition)
13391 
13392    */
13393 
13394 static void
13395 cp_parser_decl_specifier_seq (cp_parser* parser,
13396 			      cp_parser_flags flags,
13397 			      cp_decl_specifier_seq *decl_specs,
13398 			      int* declares_class_or_enum)
13399 {
13400   bool constructor_possible_p = !parser->in_declarator_p;
13401   bool found_decl_spec = false;
13402   cp_token *start_token = NULL;
13403   cp_decl_spec ds;
13404 
13405   /* Clear DECL_SPECS.  */
13406   clear_decl_specs (decl_specs);
13407 
13408   /* Assume no class or enumeration type is declared.  */
13409   *declares_class_or_enum = 0;
13410 
13411   /* Keep reading specifiers until there are no more to read.  */
13412   while (true)
13413     {
13414       bool constructor_p;
13415       cp_token *token;
13416       ds = ds_last;
13417 
13418       /* Peek at the next token.  */
13419       token = cp_lexer_peek_token (parser->lexer);
13420 
13421       /* Save the first token of the decl spec list for error
13422          reporting.  */
13423       if (!start_token)
13424 	start_token = token;
13425       /* Handle attributes.  */
13426       if (cp_next_tokens_can_be_attribute_p (parser))
13427 	{
13428 	  /* Parse the attributes.  */
13429 	  tree attrs = cp_parser_attributes_opt (parser);
13430 
13431 	  /* In a sequence of declaration specifiers, c++11 attributes
13432 	     appertain to the type that precede them. In that case
13433 	     [dcl.spec]/1 says:
13434 
13435 	         The attribute-specifier-seq affects the type only for
13436 		 the declaration it appears in, not other declarations
13437 		 involving the same type.
13438 
13439              But for now let's force the user to position the
13440              attribute either at the beginning of the declaration or
13441              after the declarator-id, which would clearly mean that it
13442              applies to the declarator.  */
13443 	  if (cxx11_attribute_p (attrs))
13444 	    {
13445 	      if (!found_decl_spec)
13446 		/* The c++11 attribute is at the beginning of the
13447 		   declaration.  It appertains to the entity being
13448 		   declared.  */;
13449 	      else
13450 		{
13451 		  if (decl_specs->type && CLASS_TYPE_P (decl_specs->type))
13452 		    {
13453 		      /*  This is an attribute following a
13454 			  class-specifier.  */
13455 		      if (decl_specs->type_definition_p)
13456 			warn_misplaced_attr_for_class_type (token->location,
13457 							    decl_specs->type);
13458 		      attrs = NULL_TREE;
13459 		    }
13460 		  else
13461 		    {
13462 		      decl_specs->std_attributes
13463 			= attr_chainon (decl_specs->std_attributes, attrs);
13464 		      if (decl_specs->locations[ds_std_attribute] == 0)
13465 			decl_specs->locations[ds_std_attribute] = token->location;
13466 		    }
13467 		  continue;
13468 		}
13469 	    }
13470 
13471 	  decl_specs->attributes
13472 	    = attr_chainon (decl_specs->attributes, attrs);
13473 	  if (decl_specs->locations[ds_attribute] == 0)
13474 	    decl_specs->locations[ds_attribute] = token->location;
13475 	  continue;
13476 	}
13477       /* Assume we will find a decl-specifier keyword.  */
13478       found_decl_spec = true;
13479       /* If the next token is an appropriate keyword, we can simply
13480 	 add it to the list.  */
13481       switch (token->keyword)
13482 	{
13483 	  /* decl-specifier:
13484 	       friend
13485                constexpr */
13486 	case RID_FRIEND:
13487 	  if (!at_class_scope_p ())
13488 	    {
13489 	      gcc_rich_location richloc (token->location);
13490 	      richloc.add_fixit_remove ();
13491 	      error_at (&richloc, "%<friend%> used outside of class");
13492 	      cp_lexer_purge_token (parser->lexer);
13493 	    }
13494 	  else
13495 	    {
13496 	      ds = ds_friend;
13497 	      /* Consume the token.  */
13498 	      cp_lexer_consume_token (parser->lexer);
13499 	    }
13500 	  break;
13501 
13502         case RID_CONSTEXPR:
13503 	  ds = ds_constexpr;
13504           cp_lexer_consume_token (parser->lexer);
13505           break;
13506 
13507         case RID_CONCEPT:
13508           ds = ds_concept;
13509           cp_lexer_consume_token (parser->lexer);
13510           break;
13511 
13512 	  /* function-specifier:
13513 	       inline
13514 	       virtual
13515 	       explicit  */
13516 	case RID_INLINE:
13517 	case RID_VIRTUAL:
13518 	case RID_EXPLICIT:
13519 	  cp_parser_function_specifier_opt (parser, decl_specs);
13520 	  break;
13521 
13522 	  /* decl-specifier:
13523 	       typedef  */
13524 	case RID_TYPEDEF:
13525 	  ds = ds_typedef;
13526 	  /* Consume the token.  */
13527 	  cp_lexer_consume_token (parser->lexer);
13528 	  /* A constructor declarator cannot appear in a typedef.  */
13529 	  constructor_possible_p = false;
13530 	  /* The "typedef" keyword can only occur in a declaration; we
13531 	     may as well commit at this point.  */
13532 	  cp_parser_commit_to_tentative_parse (parser);
13533 
13534           if (decl_specs->storage_class != sc_none)
13535             decl_specs->conflicting_specifiers_p = true;
13536 	  break;
13537 
13538 	  /* storage-class-specifier:
13539 	       auto
13540 	       register
13541 	       static
13542 	       extern
13543 	       mutable
13544 
13545 	     GNU Extension:
13546 	       thread  */
13547 	case RID_AUTO:
13548           if (cxx_dialect == cxx98)
13549             {
13550 	      /* Consume the token.  */
13551 	      cp_lexer_consume_token (parser->lexer);
13552 
13553 	      /* Complain about `auto' as a storage specifier, if
13554 		 we're complaining about C++0x compatibility.  */
13555 	      gcc_rich_location richloc (token->location);
13556 	      richloc.add_fixit_remove ();
13557 	      warning_at (&richloc, OPT_Wc__11_compat,
13558 			  "%<auto%> changes meaning in C++11; "
13559 			  "please remove it");
13560 
13561               /* Set the storage class anyway.  */
13562               cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
13563 					   token);
13564             }
13565           else
13566 	    /* C++0x auto type-specifier.  */
13567 	    found_decl_spec = false;
13568           break;
13569 
13570 	case RID_REGISTER:
13571 	case RID_STATIC:
13572 	case RID_EXTERN:
13573 	case RID_MUTABLE:
13574 	  /* Consume the token.  */
13575 	  cp_lexer_consume_token (parser->lexer);
13576           cp_parser_set_storage_class (parser, decl_specs, token->keyword,
13577 				       token);
13578 	  break;
13579 	case RID_THREAD:
13580 	  /* Consume the token.  */
13581 	  ds = ds_thread;
13582 	  cp_lexer_consume_token (parser->lexer);
13583 	  break;
13584 
13585 	default:
13586 	  /* We did not yet find a decl-specifier yet.  */
13587 	  found_decl_spec = false;
13588 	  break;
13589 	}
13590 
13591       if (found_decl_spec
13592 	  && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
13593 	  && token->keyword != RID_CONSTEXPR)
13594 	error ("decl-specifier invalid in condition");
13595 
13596       if (found_decl_spec
13597 	  && (flags & CP_PARSER_FLAGS_ONLY_MUTABLE_OR_CONSTEXPR)
13598 	  && token->keyword != RID_MUTABLE
13599 	  && token->keyword != RID_CONSTEXPR)
13600 	error_at (token->location, "%qD invalid in lambda",
13601 		  ridpointers[token->keyword]);
13602 
13603       if (ds != ds_last)
13604 	set_and_check_decl_spec_loc (decl_specs, ds, token);
13605 
13606       /* Constructors are a special case.  The `S' in `S()' is not a
13607 	 decl-specifier; it is the beginning of the declarator.  */
13608       constructor_p
13609 	= (!found_decl_spec
13610 	   && constructor_possible_p
13611 	   && (cp_parser_constructor_declarator_p
13612 	       (parser, decl_spec_seq_has_spec_p (decl_specs, ds_friend))));
13613 
13614       /* If we don't have a DECL_SPEC yet, then we must be looking at
13615 	 a type-specifier.  */
13616       if (!found_decl_spec && !constructor_p)
13617 	{
13618 	  int decl_spec_declares_class_or_enum;
13619 	  bool is_cv_qualifier;
13620 	  tree type_spec;
13621 
13622 	  type_spec
13623 	    = cp_parser_type_specifier (parser, flags,
13624 					decl_specs,
13625 					/*is_declaration=*/true,
13626 					&decl_spec_declares_class_or_enum,
13627 					&is_cv_qualifier);
13628 	  *declares_class_or_enum |= decl_spec_declares_class_or_enum;
13629 
13630 	  /* If this type-specifier referenced a user-defined type
13631 	     (a typedef, class-name, etc.), then we can't allow any
13632 	     more such type-specifiers henceforth.
13633 
13634 	     [dcl.spec]
13635 
13636 	     The longest sequence of decl-specifiers that could
13637 	     possibly be a type name is taken as the
13638 	     decl-specifier-seq of a declaration.  The sequence shall
13639 	     be self-consistent as described below.
13640 
13641 	     [dcl.type]
13642 
13643 	     As a general rule, at most one type-specifier is allowed
13644 	     in the complete decl-specifier-seq of a declaration.  The
13645 	     only exceptions are the following:
13646 
13647 	     -- const or volatile can be combined with any other
13648 		type-specifier.
13649 
13650 	     -- signed or unsigned can be combined with char, long,
13651 		short, or int.
13652 
13653 	     -- ..
13654 
13655 	     Example:
13656 
13657 	       typedef char* Pc;
13658 	       void g (const int Pc);
13659 
13660 	     Here, Pc is *not* part of the decl-specifier seq; it's
13661 	     the declarator.  Therefore, once we see a type-specifier
13662 	     (other than a cv-qualifier), we forbid any additional
13663 	     user-defined types.  We *do* still allow things like `int
13664 	     int' to be considered a decl-specifier-seq, and issue the
13665 	     error message later.  */
13666 	  if (type_spec && !is_cv_qualifier)
13667 	    flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
13668 	  /* A constructor declarator cannot follow a type-specifier.  */
13669 	  if (type_spec)
13670 	    {
13671 	      constructor_possible_p = false;
13672 	      found_decl_spec = true;
13673 	      if (!is_cv_qualifier)
13674 		decl_specs->any_type_specifiers_p = true;
13675 	    }
13676 	}
13677 
13678       /* If we still do not have a DECL_SPEC, then there are no more
13679 	 decl-specifiers.  */
13680       if (!found_decl_spec)
13681 	break;
13682 
13683       decl_specs->any_specifiers_p = true;
13684       /* After we see one decl-specifier, further decl-specifiers are
13685 	 always optional.  */
13686       flags |= CP_PARSER_FLAGS_OPTIONAL;
13687     }
13688 
13689   /* Don't allow a friend specifier with a class definition.  */
13690   if (decl_spec_seq_has_spec_p (decl_specs, ds_friend)
13691       && (*declares_class_or_enum & 2))
13692     error_at (decl_specs->locations[ds_friend],
13693 	      "class definition may not be declared a friend");
13694 }
13695 
13696 /* Parse an (optional) storage-class-specifier.
13697 
13698    storage-class-specifier:
13699      auto
13700      register
13701      static
13702      extern
13703      mutable
13704 
13705    GNU Extension:
13706 
13707    storage-class-specifier:
13708      thread
13709 
13710    Returns an IDENTIFIER_NODE corresponding to the keyword used.  */
13711 
13712 static tree
13713 cp_parser_storage_class_specifier_opt (cp_parser* parser)
13714 {
13715   switch (cp_lexer_peek_token (parser->lexer)->keyword)
13716     {
13717     case RID_AUTO:
13718       if (cxx_dialect != cxx98)
13719         return NULL_TREE;
13720       /* Fall through for C++98.  */
13721       gcc_fallthrough ();
13722 
13723     case RID_REGISTER:
13724     case RID_STATIC:
13725     case RID_EXTERN:
13726     case RID_MUTABLE:
13727     case RID_THREAD:
13728       /* Consume the token.  */
13729       return cp_lexer_consume_token (parser->lexer)->u.value;
13730 
13731     default:
13732       return NULL_TREE;
13733     }
13734 }
13735 
13736 /* Parse an (optional) function-specifier.
13737 
13738    function-specifier:
13739      inline
13740      virtual
13741      explicit
13742 
13743    Returns an IDENTIFIER_NODE corresponding to the keyword used.
13744    Updates DECL_SPECS, if it is non-NULL.  */
13745 
13746 static tree
13747 cp_parser_function_specifier_opt (cp_parser* parser,
13748 				  cp_decl_specifier_seq *decl_specs)
13749 {
13750   cp_token *token = cp_lexer_peek_token (parser->lexer);
13751   switch (token->keyword)
13752     {
13753     case RID_INLINE:
13754       set_and_check_decl_spec_loc (decl_specs, ds_inline, token);
13755       break;
13756 
13757     case RID_VIRTUAL:
13758       /* 14.5.2.3 [temp.mem]
13759 
13760 	 A member function template shall not be virtual.  */
13761       if (PROCESSING_REAL_TEMPLATE_DECL_P ()
13762 	  && current_class_type)
13763 	error_at (token->location, "templates may not be %<virtual%>");
13764       else
13765 	set_and_check_decl_spec_loc (decl_specs, ds_virtual, token);
13766       break;
13767 
13768     case RID_EXPLICIT:
13769       set_and_check_decl_spec_loc (decl_specs, ds_explicit, token);
13770       break;
13771 
13772     default:
13773       return NULL_TREE;
13774     }
13775 
13776   /* Consume the token.  */
13777   return cp_lexer_consume_token (parser->lexer)->u.value;
13778 }
13779 
13780 /* Parse a linkage-specification.
13781 
13782    linkage-specification:
13783      extern string-literal { declaration-seq [opt] }
13784      extern string-literal declaration  */
13785 
13786 static void
13787 cp_parser_linkage_specification (cp_parser* parser)
13788 {
13789   tree linkage;
13790 
13791   /* Look for the `extern' keyword.  */
13792   cp_token *extern_token
13793     = cp_parser_require_keyword (parser, RID_EXTERN, RT_EXTERN);
13794 
13795   /* Look for the string-literal.  */
13796   cp_token *string_token = cp_lexer_peek_token (parser->lexer);
13797   linkage = cp_parser_string_literal (parser, false, false);
13798 
13799   /* Transform the literal into an identifier.  If the literal is a
13800      wide-character string, or contains embedded NULs, then we can't
13801      handle it as the user wants.  */
13802   if (strlen (TREE_STRING_POINTER (linkage))
13803       != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
13804     {
13805       cp_parser_error (parser, "invalid linkage-specification");
13806       /* Assume C++ linkage.  */
13807       linkage = lang_name_cplusplus;
13808     }
13809   else
13810     linkage = get_identifier (TREE_STRING_POINTER (linkage));
13811 
13812   /* We're now using the new linkage.  */
13813   push_lang_context (linkage);
13814 
13815   /* Preserve the location of the the innermost linkage specification,
13816      tracking the locations of nested specifications via a local.  */
13817   location_t saved_location
13818     = parser->innermost_linkage_specification_location;
13819   /* Construct a location ranging from the start of the "extern" to
13820      the end of the string-literal, with the caret at the start, e.g.:
13821        extern "C" {
13822        ^~~~~~~~~~
13823   */
13824   parser->innermost_linkage_specification_location
13825     = make_location (extern_token->location,
13826 		     extern_token->location,
13827 		     get_finish (string_token->location));
13828 
13829   /* If the next token is a `{', then we're using the first
13830      production.  */
13831   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13832     {
13833       cp_ensure_no_omp_declare_simd (parser);
13834       cp_ensure_no_oacc_routine (parser);
13835 
13836       /* Consume the `{' token.  */
13837       matching_braces braces;
13838       braces.consume_open (parser)->location;
13839       /* Parse the declarations.  */
13840       cp_parser_declaration_seq_opt (parser);
13841       /* Look for the closing `}'.  */
13842       braces.require_close (parser);
13843     }
13844   /* Otherwise, there's just one declaration.  */
13845   else
13846     {
13847       bool saved_in_unbraced_linkage_specification_p;
13848 
13849       saved_in_unbraced_linkage_specification_p
13850 	= parser->in_unbraced_linkage_specification_p;
13851       parser->in_unbraced_linkage_specification_p = true;
13852       cp_parser_declaration (parser);
13853       parser->in_unbraced_linkage_specification_p
13854 	= saved_in_unbraced_linkage_specification_p;
13855     }
13856 
13857   /* We're done with the linkage-specification.  */
13858   pop_lang_context ();
13859 
13860   /* Restore location of parent linkage specification, if any.  */
13861   parser->innermost_linkage_specification_location = saved_location;
13862 }
13863 
13864 /* Parse a static_assert-declaration.
13865 
13866    static_assert-declaration:
13867      static_assert ( constant-expression , string-literal ) ;
13868      static_assert ( constant-expression ) ; (C++17)
13869 
13870    If MEMBER_P, this static_assert is a class member.  */
13871 
13872 static void
13873 cp_parser_static_assert(cp_parser *parser, bool member_p)
13874 {
13875   cp_expr condition;
13876   location_t token_loc;
13877   tree message;
13878   bool dummy;
13879 
13880   /* Peek at the `static_assert' token so we can keep track of exactly
13881      where the static assertion started.  */
13882   token_loc = cp_lexer_peek_token (parser->lexer)->location;
13883 
13884   /* Look for the `static_assert' keyword.  */
13885   if (!cp_parser_require_keyword (parser, RID_STATIC_ASSERT,
13886                                   RT_STATIC_ASSERT))
13887     return;
13888 
13889   /*  We know we are in a static assertion; commit to any tentative
13890       parse.  */
13891   if (cp_parser_parsing_tentatively (parser))
13892     cp_parser_commit_to_tentative_parse (parser);
13893 
13894   /* Parse the `(' starting the static assertion condition.  */
13895   matching_parens parens;
13896   parens.require_open (parser);
13897 
13898   /* Parse the constant-expression.  Allow a non-constant expression
13899      here in order to give better diagnostics in finish_static_assert.  */
13900   condition =
13901     cp_parser_constant_expression (parser,
13902                                    /*allow_non_constant_p=*/true,
13903                                    /*non_constant_p=*/&dummy);
13904 
13905   if (cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
13906     {
13907       if (cxx_dialect < cxx17)
13908 	pedwarn (input_location, OPT_Wpedantic,
13909 		 "static_assert without a message "
13910 		 "only available with -std=c++17 or -std=gnu++17");
13911       /* Eat the ')'  */
13912       cp_lexer_consume_token (parser->lexer);
13913       message = build_string (1, "");
13914       TREE_TYPE (message) = char_array_type_node;
13915       fix_string_type (message);
13916     }
13917   else
13918     {
13919       /* Parse the separating `,'.  */
13920       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
13921 
13922       /* Parse the string-literal message.  */
13923       message = cp_parser_string_literal (parser,
13924                                 	  /*translate=*/false,
13925                                 	  /*wide_ok=*/true);
13926 
13927       /* A `)' completes the static assertion.  */
13928       if (!parens.require_close (parser))
13929 	cp_parser_skip_to_closing_parenthesis (parser,
13930                                                /*recovering=*/true,
13931                                                /*or_comma=*/false,
13932 					       /*consume_paren=*/true);
13933     }
13934 
13935   /* A semicolon terminates the declaration.  */
13936   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
13937 
13938   /* Get the location for the static assertion.  Use that of the
13939      condition if available, otherwise, use that of the "static_assert"
13940      token.  */
13941   location_t assert_loc = condition.get_location ();
13942   if (assert_loc == UNKNOWN_LOCATION)
13943     assert_loc = token_loc;
13944 
13945   /* Complete the static assertion, which may mean either processing
13946      the static assert now or saving it for template instantiation.  */
13947   finish_static_assert (condition, message, assert_loc, member_p);
13948 }
13949 
13950 /* Parse the expression in decltype ( expression ).  */
13951 
13952 static tree
13953 cp_parser_decltype_expr (cp_parser *parser,
13954 			 bool &id_expression_or_member_access_p)
13955 {
13956   cp_token *id_expr_start_token;
13957   tree expr;
13958 
13959   /* Since we're going to preserve any side-effects from this parse, set up a
13960      firewall to protect our callers from cp_parser_commit_to_tentative_parse
13961      in the expression.  */
13962   tentative_firewall firewall (parser);
13963 
13964   /* First, try parsing an id-expression.  */
13965   id_expr_start_token = cp_lexer_peek_token (parser->lexer);
13966   cp_parser_parse_tentatively (parser);
13967   expr = cp_parser_id_expression (parser,
13968                                   /*template_keyword_p=*/false,
13969                                   /*check_dependency_p=*/true,
13970                                   /*template_p=*/NULL,
13971                                   /*declarator_p=*/false,
13972                                   /*optional_p=*/false);
13973 
13974   if (!cp_parser_error_occurred (parser) && expr != error_mark_node)
13975     {
13976       bool non_integral_constant_expression_p = false;
13977       tree id_expression = expr;
13978       cp_id_kind idk;
13979       const char *error_msg;
13980 
13981       if (identifier_p (expr))
13982 	/* Lookup the name we got back from the id-expression.  */
13983 	expr = cp_parser_lookup_name_simple (parser, expr,
13984 					     id_expr_start_token->location);
13985 
13986       if (expr && TREE_CODE (expr) == TEMPLATE_DECL)
13987 	/* A template without args is not a complete id-expression.  */
13988 	expr = error_mark_node;
13989 
13990       if (expr
13991           && expr != error_mark_node
13992           && TREE_CODE (expr) != TYPE_DECL
13993 	  && (TREE_CODE (expr) != BIT_NOT_EXPR
13994 	      || !TYPE_P (TREE_OPERAND (expr, 0)))
13995           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
13996         {
13997           /* Complete lookup of the id-expression.  */
13998           expr = (finish_id_expression
13999                   (id_expression, expr, parser->scope, &idk,
14000                    /*integral_constant_expression_p=*/false,
14001                    /*allow_non_integral_constant_expression_p=*/true,
14002                    &non_integral_constant_expression_p,
14003                    /*template_p=*/false,
14004                    /*done=*/true,
14005                    /*address_p=*/false,
14006                    /*template_arg_p=*/false,
14007                    &error_msg,
14008 		   id_expr_start_token->location));
14009 
14010           if (expr == error_mark_node)
14011             /* We found an id-expression, but it was something that we
14012                should not have found. This is an error, not something
14013                we can recover from, so note that we found an
14014                id-expression and we'll recover as gracefully as
14015                possible.  */
14016             id_expression_or_member_access_p = true;
14017         }
14018 
14019       if (expr
14020           && expr != error_mark_node
14021           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
14022         /* We have an id-expression.  */
14023         id_expression_or_member_access_p = true;
14024     }
14025 
14026   if (!id_expression_or_member_access_p)
14027     {
14028       /* Abort the id-expression parse.  */
14029       cp_parser_abort_tentative_parse (parser);
14030 
14031       /* Parsing tentatively, again.  */
14032       cp_parser_parse_tentatively (parser);
14033 
14034       /* Parse a class member access.  */
14035       expr = cp_parser_postfix_expression (parser, /*address_p=*/false,
14036                                            /*cast_p=*/false, /*decltype*/true,
14037                                            /*member_access_only_p=*/true, NULL);
14038 
14039       if (expr
14040           && expr != error_mark_node
14041           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
14042         /* We have an id-expression.  */
14043         id_expression_or_member_access_p = true;
14044     }
14045 
14046   if (id_expression_or_member_access_p)
14047     /* We have parsed the complete id-expression or member access.  */
14048     cp_parser_parse_definitely (parser);
14049   else
14050     {
14051       /* Abort our attempt to parse an id-expression or member access
14052          expression.  */
14053       cp_parser_abort_tentative_parse (parser);
14054 
14055       /* Commit to the tentative_firewall so we get syntax errors.  */
14056       cp_parser_commit_to_tentative_parse (parser);
14057 
14058       /* Parse a full expression.  */
14059       expr = cp_parser_expression (parser, /*pidk=*/NULL, /*cast_p=*/false,
14060 				   /*decltype_p=*/true);
14061     }
14062 
14063   return expr;
14064 }
14065 
14066 /* Parse a `decltype' type. Returns the type.
14067 
14068    simple-type-specifier:
14069      decltype ( expression )
14070    C++14 proposal:
14071      decltype ( auto )  */
14072 
14073 static tree
14074 cp_parser_decltype (cp_parser *parser)
14075 {
14076   bool id_expression_or_member_access_p = false;
14077   cp_token *start_token = cp_lexer_peek_token (parser->lexer);
14078 
14079   if (start_token->type == CPP_DECLTYPE)
14080     {
14081       /* Already parsed.  */
14082       cp_lexer_consume_token (parser->lexer);
14083       return saved_checks_value (start_token->u.tree_check_value);
14084     }
14085 
14086   /* Look for the `decltype' token.  */
14087   if (!cp_parser_require_keyword (parser, RID_DECLTYPE, RT_DECLTYPE))
14088     return error_mark_node;
14089 
14090   /* Parse the opening `('.  */
14091   matching_parens parens;
14092   if (!parens.require_open (parser))
14093     return error_mark_node;
14094 
14095   push_deferring_access_checks (dk_deferred);
14096 
14097   tree expr = NULL_TREE;
14098 
14099   if (cxx_dialect >= cxx14
14100       && cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
14101     /* decltype (auto) */
14102     cp_lexer_consume_token (parser->lexer);
14103   else
14104     {
14105       /* decltype (expression)  */
14106 
14107       /* Types cannot be defined in a `decltype' expression.  Save away the
14108 	 old message and set the new one.  */
14109       const char *saved_message = parser->type_definition_forbidden_message;
14110       parser->type_definition_forbidden_message
14111 	= G_("types may not be defined in %<decltype%> expressions");
14112 
14113       /* The restrictions on constant-expressions do not apply inside
14114 	 decltype expressions.  */
14115       bool saved_integral_constant_expression_p
14116 	= parser->integral_constant_expression_p;
14117       bool saved_non_integral_constant_expression_p
14118 	= parser->non_integral_constant_expression_p;
14119       parser->integral_constant_expression_p = false;
14120 
14121       /* Within a parenthesized expression, a `>' token is always
14122 	 the greater-than operator.  */
14123       bool saved_greater_than_is_operator_p
14124 	= parser->greater_than_is_operator_p;
14125       parser->greater_than_is_operator_p = true;
14126 
14127       /* Do not actually evaluate the expression.  */
14128       ++cp_unevaluated_operand;
14129 
14130       /* Do not warn about problems with the expression.  */
14131       ++c_inhibit_evaluation_warnings;
14132 
14133       expr = cp_parser_decltype_expr (parser, id_expression_or_member_access_p);
14134 
14135       /* Go back to evaluating expressions.  */
14136       --cp_unevaluated_operand;
14137       --c_inhibit_evaluation_warnings;
14138 
14139       /* The `>' token might be the end of a template-id or
14140 	 template-parameter-list now.  */
14141       parser->greater_than_is_operator_p
14142 	= saved_greater_than_is_operator_p;
14143 
14144       /* Restore the old message and the integral constant expression
14145 	 flags.  */
14146       parser->type_definition_forbidden_message = saved_message;
14147       parser->integral_constant_expression_p
14148 	= saved_integral_constant_expression_p;
14149       parser->non_integral_constant_expression_p
14150 	= saved_non_integral_constant_expression_p;
14151     }
14152 
14153   /* Parse to the closing `)'.  */
14154   if (!parens.require_close (parser))
14155     {
14156       cp_parser_skip_to_closing_parenthesis (parser, true, false,
14157 					     /*consume_paren=*/true);
14158       pop_deferring_access_checks ();
14159       return error_mark_node;
14160     }
14161 
14162   if (!expr)
14163     {
14164       /* Build auto.  */
14165       expr = make_decltype_auto ();
14166       AUTO_IS_DECLTYPE (expr) = true;
14167     }
14168   else
14169     expr = finish_decltype_type (expr, id_expression_or_member_access_p,
14170 				 tf_warning_or_error);
14171 
14172   /* Replace the decltype with a CPP_DECLTYPE so we don't need to parse
14173      it again.  */
14174   start_token->type = CPP_DECLTYPE;
14175   start_token->u.tree_check_value = ggc_cleared_alloc<struct tree_check> ();
14176   start_token->u.tree_check_value->value = expr;
14177   start_token->u.tree_check_value->checks = get_deferred_access_checks ();
14178   start_token->keyword = RID_MAX;
14179   cp_lexer_purge_tokens_after (parser->lexer, start_token);
14180 
14181   pop_to_parent_deferring_access_checks ();
14182 
14183   return expr;
14184 }
14185 
14186 /* Special member functions [gram.special] */
14187 
14188 /* Parse a conversion-function-id.
14189 
14190    conversion-function-id:
14191      operator conversion-type-id
14192 
14193    Returns an IDENTIFIER_NODE representing the operator.  */
14194 
14195 static tree
14196 cp_parser_conversion_function_id (cp_parser* parser)
14197 {
14198   tree type;
14199   tree saved_scope;
14200   tree saved_qualifying_scope;
14201   tree saved_object_scope;
14202   tree pushed_scope = NULL_TREE;
14203 
14204   /* Look for the `operator' token.  */
14205   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
14206     return error_mark_node;
14207   /* When we parse the conversion-type-id, the current scope will be
14208      reset.  However, we need that information in able to look up the
14209      conversion function later, so we save it here.  */
14210   saved_scope = parser->scope;
14211   saved_qualifying_scope = parser->qualifying_scope;
14212   saved_object_scope = parser->object_scope;
14213   /* We must enter the scope of the class so that the names of
14214      entities declared within the class are available in the
14215      conversion-type-id.  For example, consider:
14216 
14217        struct S {
14218 	 typedef int I;
14219 	 operator I();
14220        };
14221 
14222        S::operator I() { ... }
14223 
14224      In order to see that `I' is a type-name in the definition, we
14225      must be in the scope of `S'.  */
14226   if (saved_scope)
14227     pushed_scope = push_scope (saved_scope);
14228   /* Parse the conversion-type-id.  */
14229   type = cp_parser_conversion_type_id (parser);
14230   /* Leave the scope of the class, if any.  */
14231   if (pushed_scope)
14232     pop_scope (pushed_scope);
14233   /* Restore the saved scope.  */
14234   parser->scope = saved_scope;
14235   parser->qualifying_scope = saved_qualifying_scope;
14236   parser->object_scope = saved_object_scope;
14237   /* If the TYPE is invalid, indicate failure.  */
14238   if (type == error_mark_node)
14239     return error_mark_node;
14240   return make_conv_op_name (type);
14241 }
14242 
14243 /* Parse a conversion-type-id:
14244 
14245    conversion-type-id:
14246      type-specifier-seq conversion-declarator [opt]
14247 
14248    Returns the TYPE specified.  */
14249 
14250 static tree
14251 cp_parser_conversion_type_id (cp_parser* parser)
14252 {
14253   tree attributes;
14254   cp_decl_specifier_seq type_specifiers;
14255   cp_declarator *declarator;
14256   tree type_specified;
14257   const char *saved_message;
14258 
14259   /* Parse the attributes.  */
14260   attributes = cp_parser_attributes_opt (parser);
14261 
14262   saved_message = parser->type_definition_forbidden_message;
14263   parser->type_definition_forbidden_message
14264     = G_("types may not be defined in a conversion-type-id");
14265 
14266   /* Parse the type-specifiers.  */
14267   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
14268 				/*is_trailing_return=*/false,
14269 				&type_specifiers);
14270 
14271   parser->type_definition_forbidden_message = saved_message;
14272 
14273   /* If that didn't work, stop.  */
14274   if (type_specifiers.type == error_mark_node)
14275     return error_mark_node;
14276   /* Parse the conversion-declarator.  */
14277   declarator = cp_parser_conversion_declarator_opt (parser);
14278 
14279   type_specified =  grokdeclarator (declarator, &type_specifiers, TYPENAME,
14280 				    /*initialized=*/0, &attributes);
14281   if (attributes)
14282     cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
14283 
14284   /* Don't give this error when parsing tentatively.  This happens to
14285      work because we always parse this definitively once.  */
14286   if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
14287       && type_uses_auto (type_specified))
14288     {
14289       if (cxx_dialect < cxx14)
14290 	{
14291 	  error ("invalid use of %<auto%> in conversion operator");
14292 	  return error_mark_node;
14293 	}
14294       else if (template_parm_scope_p ())
14295 	warning (0, "use of %<auto%> in member template "
14296 		 "conversion operator can never be deduced");
14297     }
14298 
14299   return type_specified;
14300 }
14301 
14302 /* Parse an (optional) conversion-declarator.
14303 
14304    conversion-declarator:
14305      ptr-operator conversion-declarator [opt]
14306 
14307    */
14308 
14309 static cp_declarator *
14310 cp_parser_conversion_declarator_opt (cp_parser* parser)
14311 {
14312   enum tree_code code;
14313   tree class_type, std_attributes = NULL_TREE;
14314   cp_cv_quals cv_quals;
14315 
14316   /* We don't know if there's a ptr-operator next, or not.  */
14317   cp_parser_parse_tentatively (parser);
14318   /* Try the ptr-operator.  */
14319   code = cp_parser_ptr_operator (parser, &class_type, &cv_quals,
14320 				 &std_attributes);
14321   /* If it worked, look for more conversion-declarators.  */
14322   if (cp_parser_parse_definitely (parser))
14323     {
14324       cp_declarator *declarator;
14325 
14326       /* Parse another optional declarator.  */
14327       declarator = cp_parser_conversion_declarator_opt (parser);
14328 
14329       declarator = cp_parser_make_indirect_declarator
14330 	(code, class_type, cv_quals, declarator, std_attributes);
14331 
14332       return declarator;
14333    }
14334 
14335   return NULL;
14336 }
14337 
14338 /* Parse an (optional) ctor-initializer.
14339 
14340    ctor-initializer:
14341      : mem-initializer-list  */
14342 
14343 static void
14344 cp_parser_ctor_initializer_opt (cp_parser* parser)
14345 {
14346   /* If the next token is not a `:', then there is no
14347      ctor-initializer.  */
14348   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
14349     {
14350       /* Do default initialization of any bases and members.  */
14351       if (DECL_CONSTRUCTOR_P (current_function_decl))
14352 	finish_mem_initializers (NULL_TREE);
14353       return;
14354     }
14355 
14356   /* Consume the `:' token.  */
14357   cp_lexer_consume_token (parser->lexer);
14358   /* And the mem-initializer-list.  */
14359   cp_parser_mem_initializer_list (parser);
14360 }
14361 
14362 /* Parse a mem-initializer-list.
14363 
14364    mem-initializer-list:
14365      mem-initializer ... [opt]
14366      mem-initializer ... [opt] , mem-initializer-list  */
14367 
14368 static void
14369 cp_parser_mem_initializer_list (cp_parser* parser)
14370 {
14371   tree mem_initializer_list = NULL_TREE;
14372   tree target_ctor = error_mark_node;
14373   cp_token *token = cp_lexer_peek_token (parser->lexer);
14374 
14375   /* Let the semantic analysis code know that we are starting the
14376      mem-initializer-list.  */
14377   if (!DECL_CONSTRUCTOR_P (current_function_decl))
14378     error_at (token->location,
14379 	      "only constructors take member initializers");
14380 
14381   /* Loop through the list.  */
14382   while (true)
14383     {
14384       tree mem_initializer;
14385 
14386       token = cp_lexer_peek_token (parser->lexer);
14387       /* Parse the mem-initializer.  */
14388       mem_initializer = cp_parser_mem_initializer (parser);
14389       /* If the next token is a `...', we're expanding member initializers. */
14390       bool ellipsis = cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS);
14391       if (ellipsis
14392 	  || (mem_initializer != error_mark_node
14393 	      && check_for_bare_parameter_packs (TREE_PURPOSE
14394 						 (mem_initializer))))
14395         {
14396           /* Consume the `...'. */
14397 	  if (ellipsis)
14398 	    cp_lexer_consume_token (parser->lexer);
14399 
14400           /* The TREE_PURPOSE must be a _TYPE, because base-specifiers
14401              can be expanded but members cannot. */
14402           if (mem_initializer != error_mark_node
14403               && !TYPE_P (TREE_PURPOSE (mem_initializer)))
14404             {
14405               error_at (token->location,
14406 			"cannot expand initializer for member %qD",
14407 			TREE_PURPOSE (mem_initializer));
14408               mem_initializer = error_mark_node;
14409             }
14410 
14411           /* Construct the pack expansion type. */
14412           if (mem_initializer != error_mark_node)
14413             mem_initializer = make_pack_expansion (mem_initializer);
14414         }
14415       if (target_ctor != error_mark_node
14416 	  && mem_initializer != error_mark_node)
14417 	{
14418 	  error ("mem-initializer for %qD follows constructor delegation",
14419 		 TREE_PURPOSE (mem_initializer));
14420 	  mem_initializer = error_mark_node;
14421 	}
14422       /* Look for a target constructor. */
14423       if (mem_initializer != error_mark_node
14424 	  && CLASS_TYPE_P (TREE_PURPOSE (mem_initializer))
14425 	  && same_type_p (TREE_PURPOSE (mem_initializer), current_class_type))
14426 	{
14427 	  maybe_warn_cpp0x (CPP0X_DELEGATING_CTORS);
14428 	  if (mem_initializer_list)
14429 	    {
14430 	      error ("constructor delegation follows mem-initializer for %qD",
14431 		     TREE_PURPOSE (mem_initializer_list));
14432 	      mem_initializer = error_mark_node;
14433 	    }
14434 	  target_ctor = mem_initializer;
14435 	}
14436       /* Add it to the list, unless it was erroneous.  */
14437       if (mem_initializer != error_mark_node)
14438 	{
14439 	  TREE_CHAIN (mem_initializer) = mem_initializer_list;
14440 	  mem_initializer_list = mem_initializer;
14441 	}
14442       /* If the next token is not a `,', we're done.  */
14443       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
14444 	break;
14445       /* Consume the `,' token.  */
14446       cp_lexer_consume_token (parser->lexer);
14447     }
14448 
14449   /* Perform semantic analysis.  */
14450   if (DECL_CONSTRUCTOR_P (current_function_decl))
14451     finish_mem_initializers (mem_initializer_list);
14452 }
14453 
14454 /* Parse a mem-initializer.
14455 
14456    mem-initializer:
14457      mem-initializer-id ( expression-list [opt] )
14458      mem-initializer-id braced-init-list
14459 
14460    GNU extension:
14461 
14462    mem-initializer:
14463      ( expression-list [opt] )
14464 
14465    Returns a TREE_LIST.  The TREE_PURPOSE is the TYPE (for a base
14466    class) or FIELD_DECL (for a non-static data member) to initialize;
14467    the TREE_VALUE is the expression-list.  An empty initialization
14468    list is represented by void_list_node.  */
14469 
14470 static tree
14471 cp_parser_mem_initializer (cp_parser* parser)
14472 {
14473   tree mem_initializer_id;
14474   tree expression_list;
14475   tree member;
14476   cp_token *token = cp_lexer_peek_token (parser->lexer);
14477 
14478   /* Find out what is being initialized.  */
14479   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
14480     {
14481       permerror (token->location,
14482 		 "anachronistic old-style base class initializer");
14483       mem_initializer_id = NULL_TREE;
14484     }
14485   else
14486     {
14487       mem_initializer_id = cp_parser_mem_initializer_id (parser);
14488       if (mem_initializer_id == error_mark_node)
14489 	return mem_initializer_id;
14490     }
14491   member = expand_member_init (mem_initializer_id);
14492   if (member && !DECL_P (member))
14493     in_base_initializer = 1;
14494 
14495   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
14496     {
14497       bool expr_non_constant_p;
14498       cp_lexer_set_source_position (parser->lexer);
14499       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
14500       expression_list = cp_parser_braced_list (parser, &expr_non_constant_p);
14501       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
14502       expression_list = build_tree_list (NULL_TREE, expression_list);
14503     }
14504   else
14505     {
14506       vec<tree, va_gc> *vec;
14507       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
14508 						     /*cast_p=*/false,
14509 						     /*allow_expansion_p=*/true,
14510 						     /*non_constant_p=*/NULL);
14511       if (vec == NULL)
14512 	return error_mark_node;
14513       expression_list = build_tree_list_vec (vec);
14514       release_tree_vector (vec);
14515     }
14516 
14517   if (expression_list == error_mark_node)
14518     return error_mark_node;
14519   if (!expression_list)
14520     expression_list = void_type_node;
14521 
14522   in_base_initializer = 0;
14523 
14524   return member ? build_tree_list (member, expression_list) : error_mark_node;
14525 }
14526 
14527 /* Parse a mem-initializer-id.
14528 
14529    mem-initializer-id:
14530      :: [opt] nested-name-specifier [opt] class-name
14531      decltype-specifier (C++11)
14532      identifier
14533 
14534    Returns a TYPE indicating the class to be initialized for the first
14535    production (and the second in C++11).  Returns an IDENTIFIER_NODE
14536    indicating the data member to be initialized for the last production.  */
14537 
14538 static tree
14539 cp_parser_mem_initializer_id (cp_parser* parser)
14540 {
14541   bool global_scope_p;
14542   bool nested_name_specifier_p;
14543   bool template_p = false;
14544   tree id;
14545 
14546   cp_token *token = cp_lexer_peek_token (parser->lexer);
14547 
14548   /* `typename' is not allowed in this context ([temp.res]).  */
14549   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
14550     {
14551       error_at (token->location,
14552 		"keyword %<typename%> not allowed in this context (a qualified "
14553 		"member initializer is implicitly a type)");
14554       cp_lexer_consume_token (parser->lexer);
14555     }
14556   /* Look for the optional `::' operator.  */
14557   global_scope_p
14558     = (cp_parser_global_scope_opt (parser,
14559 				   /*current_scope_valid_p=*/false)
14560        != NULL_TREE);
14561   /* Look for the optional nested-name-specifier.  The simplest way to
14562      implement:
14563 
14564        [temp.res]
14565 
14566        The keyword `typename' is not permitted in a base-specifier or
14567        mem-initializer; in these contexts a qualified name that
14568        depends on a template-parameter is implicitly assumed to be a
14569        type name.
14570 
14571      is to assume that we have seen the `typename' keyword at this
14572      point.  */
14573   nested_name_specifier_p
14574     = (cp_parser_nested_name_specifier_opt (parser,
14575 					    /*typename_keyword_p=*/true,
14576 					    /*check_dependency_p=*/true,
14577 					    /*type_p=*/true,
14578 					    /*is_declaration=*/true)
14579        != NULL_TREE);
14580   if (nested_name_specifier_p)
14581     template_p = cp_parser_optional_template_keyword (parser);
14582   /* If there is a `::' operator or a nested-name-specifier, then we
14583      are definitely looking for a class-name.  */
14584   if (global_scope_p || nested_name_specifier_p)
14585     return cp_parser_class_name (parser,
14586 				 /*typename_keyword_p=*/true,
14587 				 /*template_keyword_p=*/template_p,
14588 				 typename_type,
14589 				 /*check_dependency_p=*/true,
14590 				 /*class_head_p=*/false,
14591 				 /*is_declaration=*/true);
14592   /* Otherwise, we could also be looking for an ordinary identifier.  */
14593   cp_parser_parse_tentatively (parser);
14594   if (cp_lexer_next_token_is_decltype (parser->lexer))
14595     /* Try a decltype-specifier.  */
14596     id = cp_parser_decltype (parser);
14597   else
14598     /* Otherwise, try a class-name.  */
14599     id = cp_parser_class_name (parser,
14600 			       /*typename_keyword_p=*/true,
14601 			       /*template_keyword_p=*/false,
14602 			       none_type,
14603 			       /*check_dependency_p=*/true,
14604 			       /*class_head_p=*/false,
14605 			       /*is_declaration=*/true);
14606   /* If we found one, we're done.  */
14607   if (cp_parser_parse_definitely (parser))
14608     return id;
14609   /* Otherwise, look for an ordinary identifier.  */
14610   return cp_parser_identifier (parser);
14611 }
14612 
14613 /* Overloading [gram.over] */
14614 
14615 /* Parse an operator-function-id.
14616 
14617    operator-function-id:
14618      operator operator
14619 
14620    Returns an IDENTIFIER_NODE for the operator which is a
14621    human-readable spelling of the identifier, e.g., `operator +'.  */
14622 
14623 static cp_expr
14624 cp_parser_operator_function_id (cp_parser* parser)
14625 {
14626   /* Look for the `operator' keyword.  */
14627   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
14628     return error_mark_node;
14629   /* And then the name of the operator itself.  */
14630   return cp_parser_operator (parser);
14631 }
14632 
14633 /* Return an identifier node for a user-defined literal operator.
14634    The suffix identifier is chained to the operator name identifier.  */
14635 
14636 tree
14637 cp_literal_operator_id (const char* name)
14638 {
14639   tree identifier;
14640   char *buffer = XNEWVEC (char, strlen (UDLIT_OP_ANSI_PREFIX)
14641 			      + strlen (name) + 10);
14642   sprintf (buffer, UDLIT_OP_ANSI_FORMAT, name);
14643   identifier = get_identifier (buffer);
14644 
14645   return identifier;
14646 }
14647 
14648 /* Parse an operator.
14649 
14650    operator:
14651      new delete new[] delete[] + - * / % ^ & | ~ ! = < >
14652      += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= &&
14653      || ++ -- , ->* -> () []
14654 
14655    GNU Extensions:
14656 
14657    operator:
14658      <? >? <?= >?=
14659 
14660    Returns an IDENTIFIER_NODE for the operator which is a
14661    human-readable spelling of the identifier, e.g., `operator +'.  */
14662 
14663 static cp_expr
14664 cp_parser_operator (cp_parser* parser)
14665 {
14666   tree id = NULL_TREE;
14667   cp_token *token;
14668   bool utf8 = false;
14669 
14670   /* Peek at the next token.  */
14671   token = cp_lexer_peek_token (parser->lexer);
14672 
14673   location_t start_loc = token->location;
14674 
14675   /* Figure out which operator we have.  */
14676   enum tree_code op = ERROR_MARK;
14677   bool assop = false;
14678   bool consumed = false;
14679   switch (token->type)
14680     {
14681     case CPP_KEYWORD:
14682       {
14683 	/* The keyword should be either `new' or `delete'.  */
14684 	if (token->keyword == RID_NEW)
14685 	  op = NEW_EXPR;
14686 	else if (token->keyword == RID_DELETE)
14687 	  op = DELETE_EXPR;
14688 	else
14689 	  break;
14690 
14691 	/* Consume the `new' or `delete' token.  */
14692 	location_t end_loc = cp_lexer_consume_token (parser->lexer)->location;
14693 
14694 	/* Peek at the next token.  */
14695 	token = cp_lexer_peek_token (parser->lexer);
14696 	/* If it's a `[' token then this is the array variant of the
14697 	   operator.  */
14698 	if (token->type == CPP_OPEN_SQUARE)
14699 	  {
14700 	    /* Consume the `[' token.  */
14701 	    cp_lexer_consume_token (parser->lexer);
14702 	    /* Look for the `]' token.  */
14703 	    if (cp_token *close_token
14704 		= cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
14705 	      end_loc = close_token->location;
14706 	    op = op == NEW_EXPR ? VEC_NEW_EXPR : VEC_DELETE_EXPR;
14707 	  }
14708 	start_loc = make_location (start_loc, start_loc, end_loc);
14709 	consumed = true;
14710 	break;
14711       }
14712 
14713     case CPP_PLUS:
14714       op = PLUS_EXPR;
14715       break;
14716 
14717     case CPP_MINUS:
14718       op = MINUS_EXPR;
14719       break;
14720 
14721     case CPP_MULT:
14722       op = MULT_EXPR;
14723       break;
14724 
14725     case CPP_DIV:
14726       op = TRUNC_DIV_EXPR;
14727       break;
14728 
14729     case CPP_MOD:
14730       op = TRUNC_MOD_EXPR;
14731       break;
14732 
14733     case CPP_XOR:
14734       op = BIT_XOR_EXPR;
14735       break;
14736 
14737     case CPP_AND:
14738       op = BIT_AND_EXPR;
14739       break;
14740 
14741     case CPP_OR:
14742       op = BIT_IOR_EXPR;
14743       break;
14744 
14745     case CPP_COMPL:
14746       op = BIT_NOT_EXPR;
14747       break;
14748 
14749     case CPP_NOT:
14750       op = TRUTH_NOT_EXPR;
14751       break;
14752 
14753     case CPP_EQ:
14754       assop = true;
14755       op = NOP_EXPR;
14756       break;
14757 
14758     case CPP_LESS:
14759       op = LT_EXPR;
14760       break;
14761 
14762     case CPP_GREATER:
14763       op = GT_EXPR;
14764       break;
14765 
14766     case CPP_PLUS_EQ:
14767       assop = true;
14768       op = PLUS_EXPR;
14769       break;
14770 
14771     case CPP_MINUS_EQ:
14772       assop = true;
14773       op = MINUS_EXPR;
14774       break;
14775 
14776     case CPP_MULT_EQ:
14777       assop = true;
14778       op = MULT_EXPR;
14779       break;
14780 
14781     case CPP_DIV_EQ:
14782       assop = true;
14783       op = TRUNC_DIV_EXPR;
14784       break;
14785 
14786     case CPP_MOD_EQ:
14787       assop = true;
14788       op = TRUNC_MOD_EXPR;
14789       break;
14790 
14791     case CPP_XOR_EQ:
14792       assop = true;
14793       op = BIT_XOR_EXPR;
14794       break;
14795 
14796     case CPP_AND_EQ:
14797       assop = true;
14798       op = BIT_AND_EXPR;
14799       break;
14800 
14801     case CPP_OR_EQ:
14802       assop = true;
14803       op = BIT_IOR_EXPR;
14804       break;
14805 
14806     case CPP_LSHIFT:
14807       op = LSHIFT_EXPR;
14808       break;
14809 
14810     case CPP_RSHIFT:
14811       op = RSHIFT_EXPR;
14812       break;
14813 
14814     case CPP_LSHIFT_EQ:
14815       assop = true;
14816       op = LSHIFT_EXPR;
14817       break;
14818 
14819     case CPP_RSHIFT_EQ:
14820       assop = true;
14821       op = RSHIFT_EXPR;
14822       break;
14823 
14824     case CPP_EQ_EQ:
14825       op = EQ_EXPR;
14826       break;
14827 
14828     case CPP_NOT_EQ:
14829       op = NE_EXPR;
14830       break;
14831 
14832     case CPP_LESS_EQ:
14833       op = LE_EXPR;
14834       break;
14835 
14836     case CPP_GREATER_EQ:
14837       op = GE_EXPR;
14838       break;
14839 
14840     case CPP_AND_AND:
14841       op = TRUTH_ANDIF_EXPR;
14842       break;
14843 
14844     case CPP_OR_OR:
14845       op = TRUTH_ORIF_EXPR;
14846       break;
14847 
14848     case CPP_PLUS_PLUS:
14849       op = POSTINCREMENT_EXPR;
14850       break;
14851 
14852     case CPP_MINUS_MINUS:
14853       op = PREDECREMENT_EXPR;
14854       break;
14855 
14856     case CPP_COMMA:
14857       op = COMPOUND_EXPR;
14858       break;
14859 
14860     case CPP_DEREF_STAR:
14861       op = MEMBER_REF;
14862       break;
14863 
14864     case CPP_DEREF:
14865       op = COMPONENT_REF;
14866       break;
14867 
14868     case CPP_OPEN_PAREN:
14869       {
14870         /* Consume the `('.  */
14871         matching_parens parens;
14872         parens.consume_open (parser);
14873         /* Look for the matching `)'.  */
14874         parens.require_close (parser);
14875 	op = CALL_EXPR;
14876 	consumed = true;
14877 	break;
14878       }
14879 
14880     case CPP_OPEN_SQUARE:
14881       /* Consume the `['.  */
14882       cp_lexer_consume_token (parser->lexer);
14883       /* Look for the matching `]'.  */
14884       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
14885       op = ARRAY_REF;
14886       consumed = true;
14887       break;
14888 
14889     case CPP_UTF8STRING:
14890     case CPP_UTF8STRING_USERDEF:
14891       utf8 = true;
14892       /* FALLTHRU */
14893     case CPP_STRING:
14894     case CPP_WSTRING:
14895     case CPP_STRING16:
14896     case CPP_STRING32:
14897     case CPP_STRING_USERDEF:
14898     case CPP_WSTRING_USERDEF:
14899     case CPP_STRING16_USERDEF:
14900     case CPP_STRING32_USERDEF:
14901       {
14902 	tree str, string_tree;
14903 	int sz, len;
14904 
14905 	if (cxx_dialect == cxx98)
14906 	  maybe_warn_cpp0x (CPP0X_USER_DEFINED_LITERALS);
14907 
14908 	/* Consume the string.  */
14909 	str = cp_parser_string_literal (parser, /*translate=*/true,
14910 				      /*wide_ok=*/true, /*lookup_udlit=*/false);
14911 	if (str == error_mark_node)
14912 	  return error_mark_node;
14913 	else if (TREE_CODE (str) == USERDEF_LITERAL)
14914 	  {
14915 	    string_tree = USERDEF_LITERAL_VALUE (str);
14916 	    id = USERDEF_LITERAL_SUFFIX_ID (str);
14917 	  }
14918 	else
14919 	  {
14920 	    string_tree = str;
14921 	    /* Look for the suffix identifier.  */
14922 	    token = cp_lexer_peek_token (parser->lexer);
14923 	    if (token->type == CPP_NAME)
14924 	      id = cp_parser_identifier (parser);
14925 	    else if (token->type == CPP_KEYWORD)
14926 	      {
14927 		error ("unexpected keyword;"
14928 		       " remove space between quotes and suffix identifier");
14929 		return error_mark_node;
14930 	      }
14931 	    else
14932 	      {
14933 		error ("expected suffix identifier");
14934 		return error_mark_node;
14935 	      }
14936 	  }
14937 	sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT
14938 			       (TREE_TYPE (TREE_TYPE (string_tree))));
14939 	len = TREE_STRING_LENGTH (string_tree) / sz - 1;
14940 	if (len != 0)
14941 	  {
14942 	    error ("expected empty string after %<operator%> keyword");
14943 	    return error_mark_node;
14944 	  }
14945 	if (utf8 || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string_tree)))
14946 	    != char_type_node)
14947 	  {
14948 	    error ("invalid encoding prefix in literal operator");
14949 	    return error_mark_node;
14950 	  }
14951 	if (id != error_mark_node)
14952 	  {
14953 	    const char *name = IDENTIFIER_POINTER (id);
14954 	    id = cp_literal_operator_id (name);
14955 	  }
14956 	return id;
14957       }
14958 
14959     default:
14960       /* Anything else is an error.  */
14961       break;
14962     }
14963 
14964   /* If we have selected an identifier, we need to consume the
14965      operator token.  */
14966   if (op != ERROR_MARK)
14967     {
14968       id = ovl_op_identifier (assop, op);
14969       if (!consumed)
14970 	cp_lexer_consume_token (parser->lexer);
14971     }
14972   /* Otherwise, no valid operator name was present.  */
14973   else
14974     {
14975       cp_parser_error (parser, "expected operator");
14976       id = error_mark_node;
14977     }
14978 
14979   return cp_expr (id, start_loc);
14980 }
14981 
14982 /* Parse a template-declaration.
14983 
14984    template-declaration:
14985      export [opt] template < template-parameter-list > declaration
14986 
14987    If MEMBER_P is TRUE, this template-declaration occurs within a
14988    class-specifier.
14989 
14990    The grammar rule given by the standard isn't correct.  What
14991    is really meant is:
14992 
14993    template-declaration:
14994      export [opt] template-parameter-list-seq
14995        decl-specifier-seq [opt] init-declarator [opt] ;
14996      export [opt] template-parameter-list-seq
14997        function-definition
14998 
14999    template-parameter-list-seq:
15000      template-parameter-list-seq [opt]
15001      template < template-parameter-list >
15002 
15003    Concept Extensions:
15004 
15005    template-parameter-list-seq:
15006      template < template-parameter-list > requires-clause [opt]
15007 
15008    requires-clause:
15009      requires logical-or-expression  */
15010 
15011 static void
15012 cp_parser_template_declaration (cp_parser* parser, bool member_p)
15013 {
15014   /* Check for `export'.  */
15015   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
15016     {
15017       /* Consume the `export' token.  */
15018       cp_lexer_consume_token (parser->lexer);
15019       /* Warn that we do not support `export'.  */
15020       warning (0, "keyword %<export%> not implemented, and will be ignored");
15021     }
15022 
15023   cp_parser_template_declaration_after_export (parser, member_p);
15024 }
15025 
15026 /* Parse a template-parameter-list.
15027 
15028    template-parameter-list:
15029      template-parameter
15030      template-parameter-list , template-parameter
15031 
15032    Returns a TREE_LIST.  Each node represents a template parameter.
15033    The nodes are connected via their TREE_CHAINs.  */
15034 
15035 static tree
15036 cp_parser_template_parameter_list (cp_parser* parser)
15037 {
15038   tree parameter_list = NULL_TREE;
15039 
15040   begin_template_parm_list ();
15041 
15042   /* The loop below parses the template parms.  We first need to know
15043      the total number of template parms to be able to compute proper
15044      canonical types of each dependent type. So after the loop, when
15045      we know the total number of template parms,
15046      end_template_parm_list computes the proper canonical types and
15047      fixes up the dependent types accordingly.  */
15048   while (true)
15049     {
15050       tree parameter;
15051       bool is_non_type;
15052       bool is_parameter_pack;
15053       location_t parm_loc;
15054 
15055       /* Parse the template-parameter.  */
15056       parm_loc = cp_lexer_peek_token (parser->lexer)->location;
15057       parameter = cp_parser_template_parameter (parser,
15058                                                 &is_non_type,
15059                                                 &is_parameter_pack);
15060       /* Add it to the list.  */
15061       if (parameter != error_mark_node)
15062 	parameter_list = process_template_parm (parameter_list,
15063 						parm_loc,
15064 						parameter,
15065 						is_non_type,
15066 						is_parameter_pack);
15067       else
15068        {
15069          tree err_parm = build_tree_list (parameter, parameter);
15070          parameter_list = chainon (parameter_list, err_parm);
15071        }
15072 
15073       /* If the next token is not a `,', we're done.  */
15074       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
15075 	break;
15076       /* Otherwise, consume the `,' token.  */
15077       cp_lexer_consume_token (parser->lexer);
15078     }
15079 
15080   return end_template_parm_list (parameter_list);
15081 }
15082 
15083 /* Parse a introduction-list.
15084 
15085    introduction-list:
15086      introduced-parameter
15087      introduction-list , introduced-parameter
15088 
15089    introduced-parameter:
15090      ...[opt] identifier
15091 
15092    Returns a TREE_VEC of WILDCARD_DECLs.  If the parameter is a pack
15093    then the introduced parm will have WILDCARD_PACK_P set.  In addition, the
15094    WILDCARD_DECL will also have DECL_NAME set and token location in
15095    DECL_SOURCE_LOCATION.  */
15096 
15097 static tree
15098 cp_parser_introduction_list (cp_parser *parser)
15099 {
15100   vec<tree, va_gc> *introduction_vec = make_tree_vector ();
15101 
15102   while (true)
15103     {
15104       bool is_pack = cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS);
15105       if (is_pack)
15106 	cp_lexer_consume_token (parser->lexer);
15107 
15108       /* Build placeholder. */
15109       tree parm = build_nt (WILDCARD_DECL);
15110       DECL_SOURCE_LOCATION (parm)
15111 	= cp_lexer_peek_token (parser->lexer)->location;
15112       DECL_NAME (parm) = cp_parser_identifier (parser);
15113       WILDCARD_PACK_P (parm) = is_pack;
15114       vec_safe_push (introduction_vec, parm);
15115 
15116       /* If the next token is not a `,', we're done.  */
15117       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
15118 	break;
15119       /* Otherwise, consume the `,' token.  */
15120       cp_lexer_consume_token (parser->lexer);
15121     }
15122 
15123   /* Convert the vec into a TREE_VEC.  */
15124   tree introduction_list = make_tree_vec (introduction_vec->length ());
15125   unsigned int n;
15126   tree parm;
15127   FOR_EACH_VEC_ELT (*introduction_vec, n, parm)
15128     TREE_VEC_ELT (introduction_list, n) = parm;
15129 
15130   release_tree_vector (introduction_vec);
15131   return introduction_list;
15132 }
15133 
15134 /* Given a declarator, get the declarator-id part, or NULL_TREE if this
15135    is an abstract declarator. */
15136 
15137 static inline cp_declarator*
15138 get_id_declarator (cp_declarator *declarator)
15139 {
15140   cp_declarator *d = declarator;
15141   while (d && d->kind != cdk_id)
15142     d = d->declarator;
15143   return d;
15144 }
15145 
15146 /* Get the unqualified-id from the DECLARATOR or NULL_TREE if this
15147    is an abstract declarator. */
15148 
15149 static inline tree
15150 get_unqualified_id (cp_declarator *declarator)
15151 {
15152   declarator = get_id_declarator (declarator);
15153   if (declarator)
15154     return declarator->u.id.unqualified_name;
15155   else
15156     return NULL_TREE;
15157 }
15158 
15159 /* Returns true if DECL represents a constrained-parameter.  */
15160 
15161 static inline bool
15162 is_constrained_parameter (tree decl)
15163 {
15164   return (decl
15165           && TREE_CODE (decl) == TYPE_DECL
15166           && CONSTRAINED_PARM_CONCEPT (decl)
15167           && DECL_P (CONSTRAINED_PARM_CONCEPT (decl)));
15168 }
15169 
15170 /* Returns true if PARM declares a constrained-parameter. */
15171 
15172 static inline bool
15173 is_constrained_parameter (cp_parameter_declarator *parm)
15174 {
15175   return is_constrained_parameter (parm->decl_specifiers.type);
15176 }
15177 
15178 /* Check that the type parameter is only a declarator-id, and that its
15179    type is not cv-qualified. */
15180 
15181 bool
15182 cp_parser_check_constrained_type_parm (cp_parser *parser,
15183 				       cp_parameter_declarator *parm)
15184 {
15185   if (!parm->declarator)
15186     return true;
15187 
15188   if (parm->declarator->kind != cdk_id)
15189     {
15190       cp_parser_error (parser, "invalid constrained type parameter");
15191       return false;
15192     }
15193 
15194   /* Don't allow cv-qualified type parameters.  */
15195   if (decl_spec_seq_has_spec_p (&parm->decl_specifiers, ds_const)
15196       || decl_spec_seq_has_spec_p (&parm->decl_specifiers, ds_volatile))
15197     {
15198       cp_parser_error (parser, "cv-qualified type parameter");
15199       return false;
15200     }
15201 
15202   return true;
15203 }
15204 
15205 /* Finish parsing/processing a template type parameter and checking
15206    various restrictions. */
15207 
15208 static inline tree
15209 cp_parser_constrained_type_template_parm (cp_parser *parser,
15210                                           tree id,
15211                                           cp_parameter_declarator* parmdecl)
15212 {
15213   if (cp_parser_check_constrained_type_parm (parser, parmdecl))
15214     return finish_template_type_parm (class_type_node, id);
15215   else
15216     return error_mark_node;
15217 }
15218 
15219 static tree
15220 finish_constrained_template_template_parm (tree proto, tree id)
15221 {
15222   /* FIXME: This should probably be copied, and we may need to adjust
15223      the template parameter depths.  */
15224   tree saved_parms = current_template_parms;
15225   begin_template_parm_list ();
15226   current_template_parms = DECL_TEMPLATE_PARMS (proto);
15227   end_template_parm_list ();
15228 
15229   tree parm = finish_template_template_parm (class_type_node, id);
15230   current_template_parms = saved_parms;
15231 
15232   return parm;
15233 }
15234 
15235 /* Finish parsing/processing a template template parameter by borrowing
15236    the template parameter list from the prototype parameter.  */
15237 
15238 static tree
15239 cp_parser_constrained_template_template_parm (cp_parser *parser,
15240                                               tree proto,
15241                                               tree id,
15242                                               cp_parameter_declarator *parmdecl)
15243 {
15244   if (!cp_parser_check_constrained_type_parm (parser, parmdecl))
15245     return error_mark_node;
15246   return finish_constrained_template_template_parm (proto, id);
15247 }
15248 
15249 /* Create a new non-type template parameter from the given PARM
15250    declarator.  */
15251 
15252 static tree
15253 constrained_non_type_template_parm (bool *is_non_type,
15254                                     cp_parameter_declarator *parm)
15255 {
15256   *is_non_type = true;
15257   cp_declarator *decl = parm->declarator;
15258   cp_decl_specifier_seq *specs = &parm->decl_specifiers;
15259   specs->type = TREE_TYPE (DECL_INITIAL (specs->type));
15260   return grokdeclarator (decl, specs, TPARM, 0, NULL);
15261 }
15262 
15263 /* Build a constrained template parameter based on the PARMDECL
15264    declarator. The type of PARMDECL is the constrained type, which
15265    refers to the prototype template parameter that ultimately
15266    specifies the type of the declared parameter. */
15267 
15268 static tree
15269 finish_constrained_parameter (cp_parser *parser,
15270                               cp_parameter_declarator *parmdecl,
15271                               bool *is_non_type,
15272                               bool *is_parameter_pack)
15273 {
15274   tree decl = parmdecl->decl_specifiers.type;
15275   tree id = get_unqualified_id (parmdecl->declarator);
15276   tree def = parmdecl->default_argument;
15277   tree proto = DECL_INITIAL (decl);
15278 
15279   /* A template parameter constrained by a variadic concept shall also
15280      be declared as a template parameter pack.  */
15281   bool is_variadic = template_parameter_pack_p (proto);
15282   if (is_variadic && !*is_parameter_pack)
15283     cp_parser_error (parser, "variadic constraint introduced without %<...%>");
15284 
15285   /* Build the parameter. Return an error if the declarator was invalid. */
15286   tree parm;
15287   if (TREE_CODE (proto) == TYPE_DECL)
15288     parm = cp_parser_constrained_type_template_parm (parser, id, parmdecl);
15289   else if (TREE_CODE (proto) == TEMPLATE_DECL)
15290     parm = cp_parser_constrained_template_template_parm (parser, proto, id,
15291 							 parmdecl);
15292   else
15293     parm = constrained_non_type_template_parm (is_non_type, parmdecl);
15294   if (parm == error_mark_node)
15295     return error_mark_node;
15296 
15297   /* Finish the parameter decl and create a node attaching the
15298      default argument and constraint.  */
15299   parm = build_tree_list (def, parm);
15300   TEMPLATE_PARM_CONSTRAINTS (parm) = decl;
15301 
15302   return parm;
15303 }
15304 
15305 /* Returns true if the parsed type actually represents the declaration
15306    of a type template-parameter.  */
15307 
15308 static inline bool
15309 declares_constrained_type_template_parameter (tree type)
15310 {
15311   return (is_constrained_parameter (type)
15312 	  && TREE_CODE (TREE_TYPE (type)) == TEMPLATE_TYPE_PARM);
15313 }
15314 
15315 
15316 /* Returns true if the parsed type actually represents the declaration of
15317    a template template-parameter.  */
15318 
15319 static bool
15320 declares_constrained_template_template_parameter (tree type)
15321 {
15322   return (is_constrained_parameter (type)
15323 	  && TREE_CODE (TREE_TYPE (type)) == TEMPLATE_TEMPLATE_PARM);
15324 }
15325 
15326 /* Parse a default argument for a type template-parameter.
15327    Note that diagnostics are handled in cp_parser_template_parameter.  */
15328 
15329 static tree
15330 cp_parser_default_type_template_argument (cp_parser *parser)
15331 {
15332   gcc_assert (cp_lexer_next_token_is (parser->lexer, CPP_EQ));
15333 
15334   /* Consume the `=' token.  */
15335   cp_lexer_consume_token (parser->lexer);
15336 
15337   cp_token *token = cp_lexer_peek_token (parser->lexer);
15338 
15339   /* Parse the default-argument.  */
15340   push_deferring_access_checks (dk_no_deferred);
15341   tree default_argument = cp_parser_type_id (parser);
15342   pop_deferring_access_checks ();
15343 
15344   if (flag_concepts && type_uses_auto (default_argument))
15345     {
15346       error_at (token->location,
15347 		"invalid use of %<auto%> in default template argument");
15348       return error_mark_node;
15349     }
15350 
15351   return default_argument;
15352 }
15353 
15354 /* Parse a default argument for a template template-parameter.  */
15355 
15356 static tree
15357 cp_parser_default_template_template_argument (cp_parser *parser)
15358 {
15359   gcc_assert (cp_lexer_next_token_is (parser->lexer, CPP_EQ));
15360 
15361   bool is_template;
15362 
15363   /* Consume the `='.  */
15364   cp_lexer_consume_token (parser->lexer);
15365   /* Parse the id-expression.  */
15366   push_deferring_access_checks (dk_no_deferred);
15367   /* save token before parsing the id-expression, for error
15368      reporting */
15369   const cp_token* token = cp_lexer_peek_token (parser->lexer);
15370   tree default_argument
15371     = cp_parser_id_expression (parser,
15372                                /*template_keyword_p=*/false,
15373                                /*check_dependency_p=*/true,
15374                                /*template_p=*/&is_template,
15375                                /*declarator_p=*/false,
15376                                /*optional_p=*/false);
15377   if (TREE_CODE (default_argument) == TYPE_DECL)
15378     /* If the id-expression was a template-id that refers to
15379        a template-class, we already have the declaration here,
15380        so no further lookup is needed.  */
15381     ;
15382   else
15383     /* Look up the name.  */
15384     default_argument
15385       = cp_parser_lookup_name (parser, default_argument,
15386                                none_type,
15387                                /*is_template=*/is_template,
15388                                /*is_namespace=*/false,
15389                                /*check_dependency=*/true,
15390                                /*ambiguous_decls=*/NULL,
15391                                token->location);
15392   /* See if the default argument is valid.  */
15393   default_argument = check_template_template_default_arg (default_argument);
15394   pop_deferring_access_checks ();
15395   return default_argument;
15396 }
15397 
15398 /* Parse a template-parameter.
15399 
15400    template-parameter:
15401      type-parameter
15402      parameter-declaration
15403 
15404    If all goes well, returns a TREE_LIST.  The TREE_VALUE represents
15405    the parameter.  The TREE_PURPOSE is the default value, if any.
15406    Returns ERROR_MARK_NODE on failure.  *IS_NON_TYPE is set to true
15407    iff this parameter is a non-type parameter.  *IS_PARAMETER_PACK is
15408    set to true iff this parameter is a parameter pack. */
15409 
15410 static tree
15411 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
15412                               bool *is_parameter_pack)
15413 {
15414   cp_token *token;
15415   cp_parameter_declarator *parameter_declarator;
15416   tree parm;
15417 
15418   /* Assume it is a type parameter or a template parameter.  */
15419   *is_non_type = false;
15420   /* Assume it not a parameter pack. */
15421   *is_parameter_pack = false;
15422   /* Peek at the next token.  */
15423   token = cp_lexer_peek_token (parser->lexer);
15424   /* If it is `template', we have a type-parameter.  */
15425   if (token->keyword == RID_TEMPLATE)
15426     return cp_parser_type_parameter (parser, is_parameter_pack);
15427   /* If it is `class' or `typename' we do not know yet whether it is a
15428      type parameter or a non-type parameter.  Consider:
15429 
15430        template <typename T, typename T::X X> ...
15431 
15432      or:
15433 
15434        template <class C, class D*> ...
15435 
15436      Here, the first parameter is a type parameter, and the second is
15437      a non-type parameter.  We can tell by looking at the token after
15438      the identifier -- if it is a `,', `=', or `>' then we have a type
15439      parameter.  */
15440   if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
15441     {
15442       /* Peek at the token after `class' or `typename'.  */
15443       token = cp_lexer_peek_nth_token (parser->lexer, 2);
15444       /* If it's an ellipsis, we have a template type parameter
15445          pack. */
15446       if (token->type == CPP_ELLIPSIS)
15447         return cp_parser_type_parameter (parser, is_parameter_pack);
15448       /* If it's an identifier, skip it.  */
15449       if (token->type == CPP_NAME)
15450 	token = cp_lexer_peek_nth_token (parser->lexer, 3);
15451       /* Now, see if the token looks like the end of a template
15452 	 parameter.  */
15453       if (token->type == CPP_COMMA
15454 	  || token->type == CPP_EQ
15455 	  || token->type == CPP_GREATER)
15456 	return cp_parser_type_parameter (parser, is_parameter_pack);
15457     }
15458 
15459   /* Otherwise, it is a non-type parameter or a constrained parameter.
15460 
15461      [temp.param]
15462 
15463      When parsing a default template-argument for a non-type
15464      template-parameter, the first non-nested `>' is taken as the end
15465      of the template parameter-list rather than a greater-than
15466      operator.  */
15467   parameter_declarator
15468      = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
15469 					/*parenthesized_p=*/NULL);
15470 
15471   if (!parameter_declarator)
15472     return error_mark_node;
15473 
15474   /* If the parameter declaration is marked as a parameter pack, set
15475    *IS_PARAMETER_PACK to notify the caller.  */
15476   if (parameter_declarator->template_parameter_pack_p)
15477     *is_parameter_pack = true;
15478 
15479   if (parameter_declarator->default_argument)
15480     {
15481       /* Can happen in some cases of erroneous input (c++/34892).  */
15482       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
15483 	/* Consume the `...' for better error recovery.  */
15484 	cp_lexer_consume_token (parser->lexer);
15485     }
15486 
15487   // The parameter may have been constrained.
15488   if (is_constrained_parameter (parameter_declarator))
15489     return finish_constrained_parameter (parser,
15490                                          parameter_declarator,
15491                                          is_non_type,
15492                                          is_parameter_pack);
15493 
15494   // Now we're sure that the parameter is a non-type parameter.
15495   *is_non_type = true;
15496 
15497   parm = grokdeclarator (parameter_declarator->declarator,
15498 			 &parameter_declarator->decl_specifiers,
15499 			 TPARM, /*initialized=*/0,
15500 			 /*attrlist=*/NULL);
15501   if (parm == error_mark_node)
15502     return error_mark_node;
15503 
15504   return build_tree_list (parameter_declarator->default_argument, parm);
15505 }
15506 
15507 /* Parse a type-parameter.
15508 
15509    type-parameter:
15510      class identifier [opt]
15511      class identifier [opt] = type-id
15512      typename identifier [opt]
15513      typename identifier [opt] = type-id
15514      template < template-parameter-list > class identifier [opt]
15515      template < template-parameter-list > class identifier [opt]
15516        = id-expression
15517 
15518    GNU Extension (variadic templates):
15519 
15520    type-parameter:
15521      class ... identifier [opt]
15522      typename ... identifier [opt]
15523 
15524    Returns a TREE_LIST.  The TREE_VALUE is itself a TREE_LIST.  The
15525    TREE_PURPOSE is the default-argument, if any.  The TREE_VALUE is
15526    the declaration of the parameter.
15527 
15528    Sets *IS_PARAMETER_PACK if this is a template parameter pack. */
15529 
15530 static tree
15531 cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
15532 {
15533   cp_token *token;
15534   tree parameter;
15535 
15536   /* Look for a keyword to tell us what kind of parameter this is.  */
15537   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_TYPENAME_TEMPLATE);
15538   if (!token)
15539     return error_mark_node;
15540 
15541   switch (token->keyword)
15542     {
15543     case RID_CLASS:
15544     case RID_TYPENAME:
15545       {
15546 	tree identifier;
15547 	tree default_argument;
15548 
15549         /* If the next token is an ellipsis, we have a template
15550            argument pack. */
15551         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
15552           {
15553             /* Consume the `...' token. */
15554             cp_lexer_consume_token (parser->lexer);
15555             maybe_warn_variadic_templates ();
15556 
15557             *is_parameter_pack = true;
15558           }
15559 
15560 	/* If the next token is an identifier, then it names the
15561 	   parameter.  */
15562 	if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
15563 	  identifier = cp_parser_identifier (parser);
15564 	else
15565 	  identifier = NULL_TREE;
15566 
15567 	/* Create the parameter.  */
15568 	parameter = finish_template_type_parm (class_type_node, identifier);
15569 
15570 	/* If the next token is an `=', we have a default argument.  */
15571 	if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
15572 	  {
15573 	    default_argument
15574 	      = cp_parser_default_type_template_argument (parser);
15575 
15576             /* Template parameter packs cannot have default
15577                arguments. */
15578             if (*is_parameter_pack)
15579               {
15580                 if (identifier)
15581                   error_at (token->location,
15582 			    "template parameter pack %qD cannot have a "
15583 			    "default argument", identifier);
15584                 else
15585                   error_at (token->location,
15586 			    "template parameter packs cannot have "
15587 			    "default arguments");
15588                 default_argument = NULL_TREE;
15589               }
15590 	    else if (check_for_bare_parameter_packs (default_argument))
15591 	      default_argument = error_mark_node;
15592 	  }
15593 	else
15594 	  default_argument = NULL_TREE;
15595 
15596 	/* Create the combined representation of the parameter and the
15597 	   default argument.  */
15598 	parameter = build_tree_list (default_argument, parameter);
15599       }
15600       break;
15601 
15602     case RID_TEMPLATE:
15603       {
15604 	tree identifier;
15605 	tree default_argument;
15606 
15607 	/* Look for the `<'.  */
15608 	cp_parser_require (parser, CPP_LESS, RT_LESS);
15609 	/* Parse the template-parameter-list.  */
15610 	cp_parser_template_parameter_list (parser);
15611 	/* Look for the `>'.  */
15612 	cp_parser_require (parser, CPP_GREATER, RT_GREATER);
15613 
15614         // If template requirements are present, parse them.
15615 	if (flag_concepts)
15616           {
15617 	    tree reqs = get_shorthand_constraints (current_template_parms);
15618 	    if (tree r = cp_parser_requires_clause_opt (parser))
15619               reqs = conjoin_constraints (reqs, normalize_expression (r));
15620 	    TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
15621           }
15622 
15623 	/* Look for the `class' or 'typename' keywords.  */
15624 	cp_parser_type_parameter_key (parser);
15625         /* If the next token is an ellipsis, we have a template
15626            argument pack. */
15627         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
15628           {
15629             /* Consume the `...' token. */
15630             cp_lexer_consume_token (parser->lexer);
15631             maybe_warn_variadic_templates ();
15632 
15633             *is_parameter_pack = true;
15634           }
15635 	/* If the next token is an `=', then there is a
15636 	   default-argument.  If the next token is a `>', we are at
15637 	   the end of the parameter-list.  If the next token is a `,',
15638 	   then we are at the end of this parameter.  */
15639 	if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
15640 	    && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
15641 	    && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
15642 	  {
15643 	    identifier = cp_parser_identifier (parser);
15644 	    /* Treat invalid names as if the parameter were nameless.  */
15645 	    if (identifier == error_mark_node)
15646 	      identifier = NULL_TREE;
15647 	  }
15648 	else
15649 	  identifier = NULL_TREE;
15650 
15651 	/* Create the template parameter.  */
15652 	parameter = finish_template_template_parm (class_type_node,
15653 						   identifier);
15654 
15655 	/* If the next token is an `=', then there is a
15656 	   default-argument.  */
15657 	if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
15658 	  {
15659 	    default_argument
15660 	      = cp_parser_default_template_template_argument (parser);
15661 
15662             /* Template parameter packs cannot have default
15663                arguments. */
15664             if (*is_parameter_pack)
15665               {
15666                 if (identifier)
15667                   error_at (token->location,
15668 			    "template parameter pack %qD cannot "
15669 			    "have a default argument",
15670 			    identifier);
15671                 else
15672                   error_at (token->location, "template parameter packs cannot "
15673 			    "have default arguments");
15674                 default_argument = NULL_TREE;
15675               }
15676 	  }
15677 	else
15678 	  default_argument = NULL_TREE;
15679 
15680 	/* Create the combined representation of the parameter and the
15681 	   default argument.  */
15682 	parameter = build_tree_list (default_argument, parameter);
15683       }
15684       break;
15685 
15686     default:
15687       gcc_unreachable ();
15688       break;
15689     }
15690 
15691   return parameter;
15692 }
15693 
15694 /* Parse a template-id.
15695 
15696    template-id:
15697      template-name < template-argument-list [opt] >
15698 
15699    If TEMPLATE_KEYWORD_P is TRUE, then we have just seen the
15700    `template' keyword.  In this case, a TEMPLATE_ID_EXPR will be
15701    returned.  Otherwise, if the template-name names a function, or set
15702    of functions, returns a TEMPLATE_ID_EXPR.  If the template-name
15703    names a class, returns a TYPE_DECL for the specialization.
15704 
15705    If CHECK_DEPENDENCY_P is FALSE, names are looked up in
15706    uninstantiated templates.  */
15707 
15708 static tree
15709 cp_parser_template_id (cp_parser *parser,
15710 		       bool template_keyword_p,
15711 		       bool check_dependency_p,
15712 		       enum tag_types tag_type,
15713 		       bool is_declaration)
15714 {
15715   tree templ;
15716   tree arguments;
15717   tree template_id;
15718   cp_token_position start_of_id = 0;
15719   cp_token *next_token = NULL, *next_token_2 = NULL;
15720   bool is_identifier;
15721 
15722   /* If the next token corresponds to a template-id, there is no need
15723      to reparse it.  */
15724   cp_token *token = cp_lexer_peek_token (parser->lexer);
15725   if (token->type == CPP_TEMPLATE_ID)
15726     {
15727       cp_lexer_consume_token (parser->lexer);
15728       return saved_checks_value (token->u.tree_check_value);
15729     }
15730 
15731   /* Avoid performing name lookup if there is no possibility of
15732      finding a template-id.  */
15733   if ((token->type != CPP_NAME && token->keyword != RID_OPERATOR)
15734       || (token->type == CPP_NAME
15735 	  && !cp_parser_nth_token_starts_template_argument_list_p
15736 	       (parser, 2)))
15737     {
15738       cp_parser_error (parser, "expected template-id");
15739       return error_mark_node;
15740     }
15741 
15742   /* Remember where the template-id starts.  */
15743   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
15744     start_of_id = cp_lexer_token_position (parser->lexer, false);
15745 
15746   push_deferring_access_checks (dk_deferred);
15747 
15748   /* Parse the template-name.  */
15749   is_identifier = false;
15750   templ = cp_parser_template_name (parser, template_keyword_p,
15751 				   check_dependency_p,
15752 				   is_declaration,
15753 				   tag_type,
15754 				   &is_identifier);
15755   if (templ == error_mark_node || is_identifier)
15756     {
15757       pop_deferring_access_checks ();
15758       return templ;
15759     }
15760 
15761   /* Since we're going to preserve any side-effects from this parse, set up a
15762      firewall to protect our callers from cp_parser_commit_to_tentative_parse
15763      in the template arguments.  */
15764   tentative_firewall firewall (parser);
15765 
15766   /* If we find the sequence `[:' after a template-name, it's probably
15767      a digraph-typo for `< ::'. Substitute the tokens and check if we can
15768      parse correctly the argument list.  */
15769   if (((next_token = cp_lexer_peek_token (parser->lexer))->type
15770        == CPP_OPEN_SQUARE)
15771       && next_token->flags & DIGRAPH
15772       && ((next_token_2 = cp_lexer_peek_nth_token (parser->lexer, 2))->type
15773 	  == CPP_COLON)
15774       && !(next_token_2->flags & PREV_WHITE))
15775     {
15776       cp_parser_parse_tentatively (parser);
15777       /* Change `:' into `::'.  */
15778       next_token_2->type = CPP_SCOPE;
15779       /* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
15780 	 CPP_LESS.  */
15781       cp_lexer_consume_token (parser->lexer);
15782 
15783       /* Parse the arguments.  */
15784       arguments = cp_parser_enclosed_template_argument_list (parser);
15785       if (!cp_parser_parse_definitely (parser))
15786 	{
15787 	  /* If we couldn't parse an argument list, then we revert our changes
15788 	     and return simply an error. Maybe this is not a template-id
15789 	     after all.  */
15790 	  next_token_2->type = CPP_COLON;
15791 	  cp_parser_error (parser, "expected %<<%>");
15792 	  pop_deferring_access_checks ();
15793 	  return error_mark_node;
15794 	}
15795       /* Otherwise, emit an error about the invalid digraph, but continue
15796 	 parsing because we got our argument list.  */
15797       if (permerror (next_token->location,
15798 		     "%<<::%> cannot begin a template-argument list"))
15799 	{
15800 	  static bool hint = false;
15801 	  inform (next_token->location,
15802 		  "%<<:%> is an alternate spelling for %<[%>."
15803 		  " Insert whitespace between %<<%> and %<::%>");
15804 	  if (!hint && !flag_permissive)
15805 	    {
15806 	      inform (next_token->location, "(if you use %<-fpermissive%> "
15807 		      "or %<-std=c++11%>, or %<-std=gnu++11%> G++ will "
15808 		      "accept your code)");
15809 	      hint = true;
15810 	    }
15811 	}
15812     }
15813   else
15814     {
15815       /* Look for the `<' that starts the template-argument-list.  */
15816       if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
15817 	{
15818 	  pop_deferring_access_checks ();
15819 	  return error_mark_node;
15820 	}
15821       /* Parse the arguments.  */
15822       arguments = cp_parser_enclosed_template_argument_list (parser);
15823     }
15824 
15825   /* Set the location to be of the form:
15826      template-name < template-argument-list [opt] >
15827      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15828      with caret == start at the start of the template-name,
15829      ranging until the closing '>'.  */
15830   location_t finish_loc
15831     = get_finish (cp_lexer_previous_token (parser->lexer)->location);
15832   location_t combined_loc
15833     = make_location (token->location, token->location, finish_loc);
15834 
15835   /* Check for concepts autos where they don't belong.  We could
15836      identify types in some cases of idnetifier TEMPL, looking ahead
15837      for a CPP_SCOPE, but that would buy us nothing: we accept auto in
15838      types.  We reject them in functions, but if what we have is an
15839      identifier, even with none_type we can't conclude it's NOT a
15840      type, we have to wait for template substitution.  */
15841   if (flag_concepts && check_auto_in_tmpl_args (templ, arguments))
15842     template_id = error_mark_node;
15843   /* Build a representation of the specialization.  */
15844   else if (identifier_p (templ))
15845     template_id = build_min_nt_loc (combined_loc,
15846 				    TEMPLATE_ID_EXPR,
15847 				    templ, arguments);
15848   else if (DECL_TYPE_TEMPLATE_P (templ)
15849 	   || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
15850     {
15851       bool entering_scope;
15852       /* In "template <typename T> ... A<T>::", A<T> is the abstract A
15853 	 template (rather than some instantiation thereof) only if
15854 	 is not nested within some other construct.  For example, in
15855 	 "template <typename T> void f(T) { A<T>::", A<T> is just an
15856 	 instantiation of A.  */
15857       entering_scope = (template_parm_scope_p ()
15858 			&& cp_lexer_next_token_is (parser->lexer,
15859 						   CPP_SCOPE));
15860       template_id
15861 	= finish_template_type (templ, arguments, entering_scope);
15862     }
15863   /* A template-like identifier may be a partial concept id. */
15864   else if (flag_concepts
15865            && (template_id = (cp_parser_maybe_partial_concept_id
15866 			      (parser, templ, arguments))))
15867     return template_id;
15868   else if (variable_template_p (templ))
15869     {
15870       template_id = lookup_template_variable (templ, arguments);
15871       if (TREE_CODE (template_id) == TEMPLATE_ID_EXPR)
15872 	SET_EXPR_LOCATION (template_id, combined_loc);
15873     }
15874   else
15875     {
15876       /* If it's not a class-template or a template-template, it should be
15877 	 a function-template.  */
15878       gcc_assert ((DECL_FUNCTION_TEMPLATE_P (templ)
15879 		   || TREE_CODE (templ) == OVERLOAD
15880 		   || BASELINK_P (templ)));
15881 
15882       template_id = lookup_template_function (templ, arguments);
15883       if (TREE_CODE (template_id) == TEMPLATE_ID_EXPR)
15884 	SET_EXPR_LOCATION (template_id, combined_loc);
15885     }
15886 
15887   /* If parsing tentatively, replace the sequence of tokens that makes
15888      up the template-id with a CPP_TEMPLATE_ID token.  That way,
15889      should we re-parse the token stream, we will not have to repeat
15890      the effort required to do the parse, nor will we issue duplicate
15891      error messages about problems during instantiation of the
15892      template.  */
15893   if (start_of_id
15894       /* Don't do this if we had a parse error in a declarator; re-parsing
15895 	 might succeed if a name changes meaning (60361).  */
15896       && !(cp_parser_error_occurred (parser)
15897 	   && cp_parser_parsing_tentatively (parser)
15898 	   && parser->in_declarator_p))
15899     {
15900       /* Reset the contents of the START_OF_ID token.  */
15901       token->type = CPP_TEMPLATE_ID;
15902       token->location = combined_loc;
15903 
15904       /* We must mark the lookup as kept, so we don't throw it away on
15905 	 the first parse.  */
15906       if (is_overloaded_fn (template_id))
15907 	lookup_keep (get_fns (template_id), true);
15908 
15909       /* Retrieve any deferred checks.  Do not pop this access checks yet
15910 	 so the memory will not be reclaimed during token replacing below.  */
15911       token->u.tree_check_value = ggc_cleared_alloc<struct tree_check> ();
15912       token->u.tree_check_value->value = template_id;
15913       token->u.tree_check_value->checks = get_deferred_access_checks ();
15914       token->keyword = RID_MAX;
15915 
15916       /* Purge all subsequent tokens.  */
15917       cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
15918 
15919       /* ??? Can we actually assume that, if template_id ==
15920 	 error_mark_node, we will have issued a diagnostic to the
15921 	 user, as opposed to simply marking the tentative parse as
15922 	 failed?  */
15923       if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
15924 	error_at (token->location, "parse error in template argument list");
15925     }
15926 
15927   pop_to_parent_deferring_access_checks ();
15928   return template_id;
15929 }
15930 
15931 /* Parse a template-name.
15932 
15933    template-name:
15934      identifier
15935 
15936    The standard should actually say:
15937 
15938    template-name:
15939      identifier
15940      operator-function-id
15941 
15942    A defect report has been filed about this issue.
15943 
15944    A conversion-function-id cannot be a template name because they cannot
15945    be part of a template-id. In fact, looking at this code:
15946 
15947    a.operator K<int>()
15948 
15949    the conversion-function-id is "operator K<int>", and K<int> is a type-id.
15950    It is impossible to call a templated conversion-function-id with an
15951    explicit argument list, since the only allowed template parameter is
15952    the type to which it is converting.
15953 
15954    If TEMPLATE_KEYWORD_P is true, then we have just seen the
15955    `template' keyword, in a construction like:
15956 
15957      T::template f<3>()
15958 
15959    In that case `f' is taken to be a template-name, even though there
15960    is no way of knowing for sure.
15961 
15962    Returns the TEMPLATE_DECL for the template, or an OVERLOAD if the
15963    name refers to a set of overloaded functions, at least one of which
15964    is a template, or an IDENTIFIER_NODE with the name of the template,
15965    if TEMPLATE_KEYWORD_P is true.  If CHECK_DEPENDENCY_P is FALSE,
15966    names are looked up inside uninstantiated templates.  */
15967 
15968 static tree
15969 cp_parser_template_name (cp_parser* parser,
15970 			 bool template_keyword_p,
15971 			 bool check_dependency_p,
15972 			 bool is_declaration,
15973 			 enum tag_types tag_type,
15974 			 bool *is_identifier)
15975 {
15976   tree identifier;
15977   tree decl;
15978   cp_token *token = cp_lexer_peek_token (parser->lexer);
15979 
15980   /* If the next token is `operator', then we have either an
15981      operator-function-id or a conversion-function-id.  */
15982   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_OPERATOR))
15983     {
15984       /* We don't know whether we're looking at an
15985 	 operator-function-id or a conversion-function-id.  */
15986       cp_parser_parse_tentatively (parser);
15987       /* Try an operator-function-id.  */
15988       identifier = cp_parser_operator_function_id (parser);
15989       /* If that didn't work, try a conversion-function-id.  */
15990       if (!cp_parser_parse_definitely (parser))
15991 	{
15992 	  cp_parser_error (parser, "expected template-name");
15993 	  return error_mark_node;
15994 	}
15995     }
15996   /* Look for the identifier.  */
15997   else
15998     identifier = cp_parser_identifier (parser);
15999 
16000   /* If we didn't find an identifier, we don't have a template-id.  */
16001   if (identifier == error_mark_node)
16002     return error_mark_node;
16003 
16004   /* If the name immediately followed the `template' keyword, then it
16005      is a template-name.  However, if the next token is not `<', then
16006      we do not treat it as a template-name, since it is not being used
16007      as part of a template-id.  This enables us to handle constructs
16008      like:
16009 
16010        template <typename T> struct S { S(); };
16011        template <typename T> S<T>::S();
16012 
16013      correctly.  We would treat `S' as a template -- if it were `S<T>'
16014      -- but we do not if there is no `<'.  */
16015 
16016   if (processing_template_decl
16017       && cp_parser_nth_token_starts_template_argument_list_p (parser, 1))
16018     {
16019       /* In a declaration, in a dependent context, we pretend that the
16020 	 "template" keyword was present in order to improve error
16021 	 recovery.  For example, given:
16022 
16023 	   template <typename T> void f(T::X<int>);
16024 
16025 	 we want to treat "X<int>" as a template-id.  */
16026       if (is_declaration
16027 	  && !template_keyword_p
16028 	  && parser->scope && TYPE_P (parser->scope)
16029 	  && check_dependency_p
16030 	  && dependent_scope_p (parser->scope)
16031 	  /* Do not do this for dtors (or ctors), since they never
16032 	     need the template keyword before their name.  */
16033 	  && !constructor_name_p (identifier, parser->scope))
16034 	{
16035 	  cp_token_position start = 0;
16036 
16037 	  /* Explain what went wrong.  */
16038 	  error_at (token->location, "non-template %qD used as template",
16039 		    identifier);
16040 	  inform (token->location, "use %<%T::template %D%> to indicate that it is a template",
16041 		  parser->scope, identifier);
16042 	  /* If parsing tentatively, find the location of the "<" token.  */
16043 	  if (cp_parser_simulate_error (parser))
16044 	    start = cp_lexer_token_position (parser->lexer, true);
16045 	  /* Parse the template arguments so that we can issue error
16046 	     messages about them.  */
16047 	  cp_lexer_consume_token (parser->lexer);
16048 	  cp_parser_enclosed_template_argument_list (parser);
16049 	  /* Skip tokens until we find a good place from which to
16050 	     continue parsing.  */
16051 	  cp_parser_skip_to_closing_parenthesis (parser,
16052 						 /*recovering=*/true,
16053 						 /*or_comma=*/true,
16054 						 /*consume_paren=*/false);
16055 	  /* If parsing tentatively, permanently remove the
16056 	     template argument list.  That will prevent duplicate
16057 	     error messages from being issued about the missing
16058 	     "template" keyword.  */
16059 	  if (start)
16060 	    cp_lexer_purge_tokens_after (parser->lexer, start);
16061 	  if (is_identifier)
16062 	    *is_identifier = true;
16063 	  parser->context->object_type = NULL_TREE;
16064 	  return identifier;
16065 	}
16066 
16067       /* If the "template" keyword is present, then there is generally
16068 	 no point in doing name-lookup, so we just return IDENTIFIER.
16069 	 But, if the qualifying scope is non-dependent then we can
16070 	 (and must) do name-lookup normally.  */
16071       if (template_keyword_p)
16072 	{
16073 	  tree scope = (parser->scope ? parser->scope
16074 			: parser->context->object_type);
16075 	  if (scope && TYPE_P (scope)
16076 	      && (!CLASS_TYPE_P (scope)
16077 		  || (check_dependency_p && dependent_type_p (scope))))
16078 	    {
16079 	      /* We're optimizing away the call to cp_parser_lookup_name, but
16080 		 we still need to do this.  */
16081 	      parser->context->object_type = NULL_TREE;
16082 	      return identifier;
16083 	    }
16084 	}
16085     }
16086 
16087   /* Look up the name.  */
16088   decl = cp_parser_lookup_name (parser, identifier,
16089 				tag_type,
16090 				/*is_template=*/true,
16091 				/*is_namespace=*/false,
16092 				check_dependency_p,
16093 				/*ambiguous_decls=*/NULL,
16094 				token->location);
16095 
16096   decl = strip_using_decl (decl);
16097 
16098   /* If DECL is a template, then the name was a template-name.  */
16099   if (TREE_CODE (decl) == TEMPLATE_DECL)
16100     {
16101       if (TREE_DEPRECATED (decl)
16102 	  && deprecated_state != DEPRECATED_SUPPRESS)
16103 	warn_deprecated_use (decl, NULL_TREE);
16104     }
16105   else
16106     {
16107       /* The standard does not explicitly indicate whether a name that
16108 	 names a set of overloaded declarations, some of which are
16109 	 templates, is a template-name.  However, such a name should
16110 	 be a template-name; otherwise, there is no way to form a
16111 	 template-id for the overloaded templates.  */
16112       bool found = false;
16113 
16114       for (lkp_iterator iter (MAYBE_BASELINK_FUNCTIONS (decl));
16115 	   !found && iter; ++iter)
16116 	if (TREE_CODE (*iter) == TEMPLATE_DECL)
16117 	  found = true;
16118 
16119       if (!found)
16120 	{
16121 	  /* The name does not name a template.  */
16122 	  cp_parser_error (parser, "expected template-name");
16123 	  return error_mark_node;
16124 	}
16125     }
16126 
16127   /* If DECL is dependent, and refers to a function, then just return
16128      its name; we will look it up again during template instantiation.  */
16129   if (DECL_FUNCTION_TEMPLATE_P (decl) || !DECL_P (decl))
16130     {
16131       tree scope = ovl_scope (decl);
16132       if (TYPE_P (scope) && dependent_type_p (scope))
16133 	return identifier;
16134     }
16135 
16136   return decl;
16137 }
16138 
16139 /* Parse a template-argument-list.
16140 
16141    template-argument-list:
16142      template-argument ... [opt]
16143      template-argument-list , template-argument ... [opt]
16144 
16145    Returns a TREE_VEC containing the arguments.  */
16146 
16147 static tree
16148 cp_parser_template_argument_list (cp_parser* parser)
16149 {
16150   tree fixed_args[10];
16151   unsigned n_args = 0;
16152   unsigned alloced = 10;
16153   tree *arg_ary = fixed_args;
16154   tree vec;
16155   bool saved_in_template_argument_list_p;
16156   bool saved_ice_p;
16157   bool saved_non_ice_p;
16158 
16159   saved_in_template_argument_list_p = parser->in_template_argument_list_p;
16160   parser->in_template_argument_list_p = true;
16161   /* Even if the template-id appears in an integral
16162      constant-expression, the contents of the argument list do
16163      not.  */
16164   saved_ice_p = parser->integral_constant_expression_p;
16165   parser->integral_constant_expression_p = false;
16166   saved_non_ice_p = parser->non_integral_constant_expression_p;
16167   parser->non_integral_constant_expression_p = false;
16168 
16169   /* Parse the arguments.  */
16170   do
16171     {
16172       tree argument;
16173 
16174       if (n_args)
16175 	/* Consume the comma.  */
16176 	cp_lexer_consume_token (parser->lexer);
16177 
16178       /* Parse the template-argument.  */
16179       argument = cp_parser_template_argument (parser);
16180 
16181       /* If the next token is an ellipsis, we're expanding a template
16182          argument pack. */
16183       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16184         {
16185 	  if (argument == error_mark_node)
16186 	    {
16187 	      cp_token *token = cp_lexer_peek_token (parser->lexer);
16188 	      error_at (token->location,
16189 			"expected parameter pack before %<...%>");
16190 	    }
16191           /* Consume the `...' token. */
16192           cp_lexer_consume_token (parser->lexer);
16193 
16194           /* Make the argument into a TYPE_PACK_EXPANSION or
16195              EXPR_PACK_EXPANSION. */
16196           argument = make_pack_expansion (argument);
16197         }
16198 
16199       if (n_args == alloced)
16200 	{
16201 	  alloced *= 2;
16202 
16203 	  if (arg_ary == fixed_args)
16204 	    {
16205 	      arg_ary = XNEWVEC (tree, alloced);
16206 	      memcpy (arg_ary, fixed_args, sizeof (tree) * n_args);
16207 	    }
16208 	  else
16209 	    arg_ary = XRESIZEVEC (tree, arg_ary, alloced);
16210 	}
16211       arg_ary[n_args++] = argument;
16212     }
16213   while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
16214 
16215   vec = make_tree_vec (n_args);
16216 
16217   while (n_args--)
16218     TREE_VEC_ELT (vec, n_args) = arg_ary[n_args];
16219 
16220   if (arg_ary != fixed_args)
16221     free (arg_ary);
16222   parser->non_integral_constant_expression_p = saved_non_ice_p;
16223   parser->integral_constant_expression_p = saved_ice_p;
16224   parser->in_template_argument_list_p = saved_in_template_argument_list_p;
16225   if (CHECKING_P)
16226     SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec));
16227   return vec;
16228 }
16229 
16230 /* Parse a template-argument.
16231 
16232    template-argument:
16233      assignment-expression
16234      type-id
16235      id-expression
16236 
16237    The representation is that of an assignment-expression, type-id, or
16238    id-expression -- except that the qualified id-expression is
16239    evaluated, so that the value returned is either a DECL or an
16240    OVERLOAD.
16241 
16242    Although the standard says "assignment-expression", it forbids
16243    throw-expressions or assignments in the template argument.
16244    Therefore, we use "conditional-expression" instead.  */
16245 
16246 static tree
16247 cp_parser_template_argument (cp_parser* parser)
16248 {
16249   tree argument;
16250   bool template_p;
16251   bool address_p;
16252   bool maybe_type_id = false;
16253   cp_token *token = NULL, *argument_start_token = NULL;
16254   location_t loc = 0;
16255   cp_id_kind idk;
16256 
16257   /* There's really no way to know what we're looking at, so we just
16258      try each alternative in order.
16259 
16260        [temp.arg]
16261 
16262        In a template-argument, an ambiguity between a type-id and an
16263        expression is resolved to a type-id, regardless of the form of
16264        the corresponding template-parameter.
16265 
16266      Therefore, we try a type-id first.  */
16267   cp_parser_parse_tentatively (parser);
16268   argument = cp_parser_template_type_arg (parser);
16269   /* If there was no error parsing the type-id but the next token is a
16270      '>>', our behavior depends on which dialect of C++ we're
16271      parsing. In C++98, we probably found a typo for '> >'. But there
16272      are type-id which are also valid expressions. For instance:
16273 
16274      struct X { int operator >> (int); };
16275      template <int V> struct Foo {};
16276      Foo<X () >> 5> r;
16277 
16278      Here 'X()' is a valid type-id of a function type, but the user just
16279      wanted to write the expression "X() >> 5". Thus, we remember that we
16280      found a valid type-id, but we still try to parse the argument as an
16281      expression to see what happens.
16282 
16283      In C++0x, the '>>' will be considered two separate '>'
16284      tokens.  */
16285   if (!cp_parser_error_occurred (parser)
16286       && cxx_dialect == cxx98
16287       && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
16288     {
16289       maybe_type_id = true;
16290       cp_parser_abort_tentative_parse (parser);
16291     }
16292   else
16293     {
16294       /* If the next token isn't a `,' or a `>', then this argument wasn't
16295       really finished. This means that the argument is not a valid
16296       type-id.  */
16297       if (!cp_parser_next_token_ends_template_argument_p (parser))
16298 	cp_parser_error (parser, "expected template-argument");
16299       /* If that worked, we're done.  */
16300       if (cp_parser_parse_definitely (parser))
16301 	return argument;
16302     }
16303   /* We're still not sure what the argument will be.  */
16304   cp_parser_parse_tentatively (parser);
16305   /* Try a template.  */
16306   argument_start_token = cp_lexer_peek_token (parser->lexer);
16307   argument = cp_parser_id_expression (parser,
16308 				      /*template_keyword_p=*/false,
16309 				      /*check_dependency_p=*/true,
16310 				      &template_p,
16311 				      /*declarator_p=*/false,
16312 				      /*optional_p=*/false);
16313   /* If the next token isn't a `,' or a `>', then this argument wasn't
16314      really finished.  */
16315   if (!cp_parser_next_token_ends_template_argument_p (parser))
16316     cp_parser_error (parser, "expected template-argument");
16317   if (!cp_parser_error_occurred (parser))
16318     {
16319       /* Figure out what is being referred to.  If the id-expression
16320 	 was for a class template specialization, then we will have a
16321 	 TYPE_DECL at this point.  There is no need to do name lookup
16322 	 at this point in that case.  */
16323       if (TREE_CODE (argument) != TYPE_DECL)
16324 	argument = cp_parser_lookup_name (parser, argument,
16325 					  none_type,
16326 					  /*is_template=*/template_p,
16327 					  /*is_namespace=*/false,
16328 					  /*check_dependency=*/true,
16329 					  /*ambiguous_decls=*/NULL,
16330 					  argument_start_token->location);
16331       /* Handle a constrained-type-specifier for a non-type template
16332 	 parameter.  */
16333       if (tree decl = cp_parser_maybe_concept_name (parser, argument))
16334 	argument = decl;
16335       else if (TREE_CODE (argument) != TEMPLATE_DECL
16336 	       && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
16337 	cp_parser_error (parser, "expected template-name");
16338     }
16339   if (cp_parser_parse_definitely (parser))
16340     {
16341       if (TREE_DEPRECATED (argument))
16342 	warn_deprecated_use (argument, NULL_TREE);
16343       return argument;
16344     }
16345   /* It must be a non-type argument.  In C++17 any constant-expression is
16346      allowed.  */
16347   if (cxx_dialect > cxx14)
16348     goto general_expr;
16349 
16350   /* Otherwise, the permitted cases are given in [temp.arg.nontype]:
16351 
16352      -- an integral constant-expression of integral or enumeration
16353 	type; or
16354 
16355      -- the name of a non-type template-parameter; or
16356 
16357      -- the name of an object or function with external linkage...
16358 
16359      -- the address of an object or function with external linkage...
16360 
16361      -- a pointer to member...  */
16362   /* Look for a non-type template parameter.  */
16363   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
16364     {
16365       cp_parser_parse_tentatively (parser);
16366       argument = cp_parser_primary_expression (parser,
16367 					       /*address_p=*/false,
16368 					       /*cast_p=*/false,
16369 					       /*template_arg_p=*/true,
16370 					       &idk);
16371       if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX
16372 	  || !cp_parser_next_token_ends_template_argument_p (parser))
16373 	cp_parser_simulate_error (parser);
16374       if (cp_parser_parse_definitely (parser))
16375 	return argument;
16376     }
16377 
16378   /* If the next token is "&", the argument must be the address of an
16379      object or function with external linkage.  */
16380   address_p = cp_lexer_next_token_is (parser->lexer, CPP_AND);
16381   if (address_p)
16382     {
16383       loc = cp_lexer_peek_token (parser->lexer)->location;
16384       cp_lexer_consume_token (parser->lexer);
16385     }
16386   /* See if we might have an id-expression.  */
16387   token = cp_lexer_peek_token (parser->lexer);
16388   if (token->type == CPP_NAME
16389       || token->keyword == RID_OPERATOR
16390       || token->type == CPP_SCOPE
16391       || token->type == CPP_TEMPLATE_ID
16392       || token->type == CPP_NESTED_NAME_SPECIFIER)
16393     {
16394       cp_parser_parse_tentatively (parser);
16395       argument = cp_parser_primary_expression (parser,
16396 					       address_p,
16397 					       /*cast_p=*/false,
16398 					       /*template_arg_p=*/true,
16399 					       &idk);
16400       if (cp_parser_error_occurred (parser)
16401 	  || !cp_parser_next_token_ends_template_argument_p (parser))
16402 	cp_parser_abort_tentative_parse (parser);
16403       else
16404 	{
16405 	  tree probe;
16406 
16407 	  if (INDIRECT_REF_P (argument))
16408 	    {
16409 	      /* Strip the dereference temporarily.  */
16410 	      gcc_assert (REFERENCE_REF_P (argument));
16411 	      argument = TREE_OPERAND (argument, 0);
16412 	    }
16413 
16414 	  /* If we're in a template, we represent a qualified-id referring
16415 	     to a static data member as a SCOPE_REF even if the scope isn't
16416 	     dependent so that we can check access control later.  */
16417 	  probe = argument;
16418 	  if (TREE_CODE (probe) == SCOPE_REF)
16419 	    probe = TREE_OPERAND (probe, 1);
16420 	  if (VAR_P (probe))
16421 	    {
16422 	      /* A variable without external linkage might still be a
16423 		 valid constant-expression, so no error is issued here
16424 		 if the external-linkage check fails.  */
16425 	      if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe))
16426 		cp_parser_simulate_error (parser);
16427 	    }
16428 	  else if (is_overloaded_fn (argument))
16429 	    /* All overloaded functions are allowed; if the external
16430 	       linkage test does not pass, an error will be issued
16431 	       later.  */
16432 	    ;
16433 	  else if (address_p
16434 		   && (TREE_CODE (argument) == OFFSET_REF
16435 		       || TREE_CODE (argument) == SCOPE_REF))
16436 	    /* A pointer-to-member.  */
16437 	    ;
16438 	  else if (TREE_CODE (argument) == TEMPLATE_PARM_INDEX)
16439 	    ;
16440 	  else
16441 	    cp_parser_simulate_error (parser);
16442 
16443 	  if (cp_parser_parse_definitely (parser))
16444 	    {
16445 	      if (address_p)
16446 		argument = build_x_unary_op (loc, ADDR_EXPR, argument,
16447 					     tf_warning_or_error);
16448 	      else
16449 		argument = convert_from_reference (argument);
16450 	      return argument;
16451 	    }
16452 	}
16453     }
16454   /* If the argument started with "&", there are no other valid
16455      alternatives at this point.  */
16456   if (address_p)
16457     {
16458       cp_parser_error (parser, "invalid non-type template argument");
16459       return error_mark_node;
16460     }
16461 
16462  general_expr:
16463   /* If the argument wasn't successfully parsed as a type-id followed
16464      by '>>', the argument can only be a constant expression now.
16465      Otherwise, we try parsing the constant-expression tentatively,
16466      because the argument could really be a type-id.  */
16467   if (maybe_type_id)
16468     cp_parser_parse_tentatively (parser);
16469 
16470   if (cxx_dialect <= cxx14)
16471     argument = cp_parser_constant_expression (parser);
16472   else
16473     {
16474       /* With C++17 generalized non-type template arguments we need to handle
16475 	 lvalue constant expressions, too.  */
16476       argument = cp_parser_assignment_expression (parser);
16477       require_potential_constant_expression (argument);
16478     }
16479 
16480   if (!maybe_type_id)
16481     return argument;
16482   if (!cp_parser_next_token_ends_template_argument_p (parser))
16483     cp_parser_error (parser, "expected template-argument");
16484   if (cp_parser_parse_definitely (parser))
16485     return argument;
16486   /* We did our best to parse the argument as a non type-id, but that
16487      was the only alternative that matched (albeit with a '>' after
16488      it). We can assume it's just a typo from the user, and a
16489      diagnostic will then be issued.  */
16490   return cp_parser_template_type_arg (parser);
16491 }
16492 
16493 /* Parse an explicit-instantiation.
16494 
16495    explicit-instantiation:
16496      template declaration
16497 
16498    Although the standard says `declaration', what it really means is:
16499 
16500    explicit-instantiation:
16501      template decl-specifier-seq [opt] declarator [opt] ;
16502 
16503    Things like `template int S<int>::i = 5, int S<double>::j;' are not
16504    supposed to be allowed.  A defect report has been filed about this
16505    issue.
16506 
16507    GNU Extension:
16508 
16509    explicit-instantiation:
16510      storage-class-specifier template
16511        decl-specifier-seq [opt] declarator [opt] ;
16512      function-specifier template
16513        decl-specifier-seq [opt] declarator [opt] ;  */
16514 
16515 static void
16516 cp_parser_explicit_instantiation (cp_parser* parser)
16517 {
16518   int declares_class_or_enum;
16519   cp_decl_specifier_seq decl_specifiers;
16520   tree extension_specifier = NULL_TREE;
16521 
16522   timevar_push (TV_TEMPLATE_INST);
16523 
16524   /* Look for an (optional) storage-class-specifier or
16525      function-specifier.  */
16526   if (cp_parser_allow_gnu_extensions_p (parser))
16527     {
16528       extension_specifier
16529 	= cp_parser_storage_class_specifier_opt (parser);
16530       if (!extension_specifier)
16531 	extension_specifier
16532 	  = cp_parser_function_specifier_opt (parser,
16533 					      /*decl_specs=*/NULL);
16534     }
16535 
16536   /* Look for the `template' keyword.  */
16537   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
16538   /* Let the front end know that we are processing an explicit
16539      instantiation.  */
16540   begin_explicit_instantiation ();
16541   /* [temp.explicit] says that we are supposed to ignore access
16542      control while processing explicit instantiation directives.  */
16543   push_deferring_access_checks (dk_no_check);
16544   /* Parse a decl-specifier-seq.  */
16545   cp_parser_decl_specifier_seq (parser,
16546 				CP_PARSER_FLAGS_OPTIONAL,
16547 				&decl_specifiers,
16548 				&declares_class_or_enum);
16549   /* If there was exactly one decl-specifier, and it declared a class,
16550      and there's no declarator, then we have an explicit type
16551      instantiation.  */
16552   if (declares_class_or_enum && cp_parser_declares_only_class_p (parser))
16553     {
16554       tree type;
16555 
16556       type = check_tag_decl (&decl_specifiers,
16557 			     /*explicit_type_instantiation_p=*/true);
16558       /* Turn access control back on for names used during
16559 	 template instantiation.  */
16560       pop_deferring_access_checks ();
16561       if (type)
16562 	do_type_instantiation (type, extension_specifier,
16563 			       /*complain=*/tf_error);
16564     }
16565   else
16566     {
16567       cp_declarator *declarator;
16568       tree decl;
16569 
16570       /* Parse the declarator.  */
16571       declarator
16572 	= cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
16573 				/*ctor_dtor_or_conv_p=*/NULL,
16574 				/*parenthesized_p=*/NULL,
16575 				/*member_p=*/false,
16576 				/*friend_p=*/false);
16577       if (declares_class_or_enum & 2)
16578 	cp_parser_check_for_definition_in_return_type (declarator,
16579 						       decl_specifiers.type,
16580 						       decl_specifiers.locations[ds_type_spec]);
16581       if (declarator != cp_error_declarator)
16582 	{
16583 	  if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_inline))
16584 	    permerror (decl_specifiers.locations[ds_inline],
16585 		       "explicit instantiation shall not use"
16586 		       " %<inline%> specifier");
16587 	  if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_constexpr))
16588 	    permerror (decl_specifiers.locations[ds_constexpr],
16589 		       "explicit instantiation shall not use"
16590 		       " %<constexpr%> specifier");
16591 
16592 	  decl = grokdeclarator (declarator, &decl_specifiers,
16593 				 NORMAL, 0, &decl_specifiers.attributes);
16594 	  /* Turn access control back on for names used during
16595 	     template instantiation.  */
16596 	  pop_deferring_access_checks ();
16597 	  /* Do the explicit instantiation.  */
16598 	  do_decl_instantiation (decl, extension_specifier);
16599 	}
16600       else
16601 	{
16602 	  pop_deferring_access_checks ();
16603 	  /* Skip the body of the explicit instantiation.  */
16604 	  cp_parser_skip_to_end_of_statement (parser);
16605 	}
16606     }
16607   /* We're done with the instantiation.  */
16608   end_explicit_instantiation ();
16609 
16610   cp_parser_consume_semicolon_at_end_of_statement (parser);
16611 
16612   timevar_pop (TV_TEMPLATE_INST);
16613 }
16614 
16615 /* Parse an explicit-specialization.
16616 
16617    explicit-specialization:
16618      template < > declaration
16619 
16620    Although the standard says `declaration', what it really means is:
16621 
16622    explicit-specialization:
16623      template <> decl-specifier [opt] init-declarator [opt] ;
16624      template <> function-definition
16625      template <> explicit-specialization
16626      template <> template-declaration  */
16627 
16628 static void
16629 cp_parser_explicit_specialization (cp_parser* parser)
16630 {
16631   bool need_lang_pop;
16632   cp_token *token = cp_lexer_peek_token (parser->lexer);
16633 
16634   /* Look for the `template' keyword.  */
16635   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
16636   /* Look for the `<'.  */
16637   cp_parser_require (parser, CPP_LESS, RT_LESS);
16638   /* Look for the `>'.  */
16639   cp_parser_require (parser, CPP_GREATER, RT_GREATER);
16640   /* We have processed another parameter list.  */
16641   ++parser->num_template_parameter_lists;
16642   /* [temp]
16643 
16644      A template ... explicit specialization ... shall not have C
16645      linkage.  */
16646   if (current_lang_name == lang_name_c)
16647     {
16648       error_at (token->location, "template specialization with C linkage");
16649       maybe_show_extern_c_location ();
16650       /* Give it C++ linkage to avoid confusing other parts of the
16651 	 front end.  */
16652       push_lang_context (lang_name_cplusplus);
16653       need_lang_pop = true;
16654     }
16655   else
16656     need_lang_pop = false;
16657   /* Let the front end know that we are beginning a specialization.  */
16658   if (!begin_specialization ())
16659     {
16660       end_specialization ();
16661       return;
16662     }
16663 
16664   /* If the next keyword is `template', we need to figure out whether
16665      or not we're looking a template-declaration.  */
16666   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
16667     {
16668       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
16669 	  && cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_GREATER)
16670 	cp_parser_template_declaration_after_export (parser,
16671 						     /*member_p=*/false);
16672       else
16673 	cp_parser_explicit_specialization (parser);
16674     }
16675   else
16676     /* Parse the dependent declaration.  */
16677     cp_parser_single_declaration (parser,
16678 				  /*checks=*/NULL,
16679 				  /*member_p=*/false,
16680 				  /*explicit_specialization_p=*/true,
16681 				  /*friend_p=*/NULL);
16682   /* We're done with the specialization.  */
16683   end_specialization ();
16684   /* For the erroneous case of a template with C linkage, we pushed an
16685      implicit C++ linkage scope; exit that scope now.  */
16686   if (need_lang_pop)
16687     pop_lang_context ();
16688   /* We're done with this parameter list.  */
16689   --parser->num_template_parameter_lists;
16690 }
16691 
16692 /* Parse a type-specifier.
16693 
16694    type-specifier:
16695      simple-type-specifier
16696      class-specifier
16697      enum-specifier
16698      elaborated-type-specifier
16699      cv-qualifier
16700 
16701    GNU Extension:
16702 
16703    type-specifier:
16704      __complex__
16705 
16706    Returns a representation of the type-specifier.  For a
16707    class-specifier, enum-specifier, or elaborated-type-specifier, a
16708    TREE_TYPE is returned; otherwise, a TYPE_DECL is returned.
16709 
16710    The parser flags FLAGS is used to control type-specifier parsing.
16711 
16712    If IS_DECLARATION is TRUE, then this type-specifier is appearing
16713    in a decl-specifier-seq.
16714 
16715    If DECLARES_CLASS_OR_ENUM is non-NULL, and the type-specifier is a
16716    class-specifier, enum-specifier, or elaborated-type-specifier, then
16717    *DECLARES_CLASS_OR_ENUM is set to a nonzero value.  The value is 1
16718    if a type is declared; 2 if it is defined.  Otherwise, it is set to
16719    zero.
16720 
16721    If IS_CV_QUALIFIER is non-NULL, and the type-specifier is a
16722    cv-qualifier, then IS_CV_QUALIFIER is set to TRUE.  Otherwise, it
16723    is set to FALSE.  */
16724 
16725 static tree
16726 cp_parser_type_specifier (cp_parser* parser,
16727 			  cp_parser_flags flags,
16728 			  cp_decl_specifier_seq *decl_specs,
16729 			  bool is_declaration,
16730 			  int* declares_class_or_enum,
16731 			  bool* is_cv_qualifier)
16732 {
16733   tree type_spec = NULL_TREE;
16734   cp_token *token;
16735   enum rid keyword;
16736   cp_decl_spec ds = ds_last;
16737 
16738   /* Assume this type-specifier does not declare a new type.  */
16739   if (declares_class_or_enum)
16740     *declares_class_or_enum = 0;
16741   /* And that it does not specify a cv-qualifier.  */
16742   if (is_cv_qualifier)
16743     *is_cv_qualifier = false;
16744   /* Peek at the next token.  */
16745   token = cp_lexer_peek_token (parser->lexer);
16746 
16747   /* If we're looking at a keyword, we can use that to guide the
16748      production we choose.  */
16749   keyword = token->keyword;
16750   switch (keyword)
16751     {
16752     case RID_ENUM:
16753       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
16754 	goto elaborated_type_specifier;
16755 
16756       /* Look for the enum-specifier.  */
16757       type_spec = cp_parser_enum_specifier (parser);
16758       /* If that worked, we're done.  */
16759       if (type_spec)
16760 	{
16761 	  if (declares_class_or_enum)
16762 	    *declares_class_or_enum = 2;
16763 	  if (decl_specs)
16764 	    cp_parser_set_decl_spec_type (decl_specs,
16765 					  type_spec,
16766 					  token,
16767 					  /*type_definition_p=*/true);
16768 	  return type_spec;
16769 	}
16770       else
16771 	goto elaborated_type_specifier;
16772 
16773       /* Any of these indicate either a class-specifier, or an
16774 	 elaborated-type-specifier.  */
16775     case RID_CLASS:
16776     case RID_STRUCT:
16777     case RID_UNION:
16778       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
16779 	goto elaborated_type_specifier;
16780 
16781       /* Parse tentatively so that we can back up if we don't find a
16782 	 class-specifier.  */
16783       cp_parser_parse_tentatively (parser);
16784       /* Look for the class-specifier.  */
16785       type_spec = cp_parser_class_specifier (parser);
16786       invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, type_spec);
16787       /* If that worked, we're done.  */
16788       if (cp_parser_parse_definitely (parser))
16789 	{
16790 	  if (declares_class_or_enum)
16791 	    *declares_class_or_enum = 2;
16792 	  if (decl_specs)
16793 	    cp_parser_set_decl_spec_type (decl_specs,
16794 					  type_spec,
16795 					  token,
16796 					  /*type_definition_p=*/true);
16797 	  return type_spec;
16798 	}
16799 
16800       /* Fall through.  */
16801     elaborated_type_specifier:
16802       /* We're declaring (not defining) a class or enum.  */
16803       if (declares_class_or_enum)
16804 	*declares_class_or_enum = 1;
16805 
16806       /* Fall through.  */
16807     case RID_TYPENAME:
16808       /* Look for an elaborated-type-specifier.  */
16809       type_spec
16810 	= (cp_parser_elaborated_type_specifier
16811 	   (parser,
16812 	    decl_spec_seq_has_spec_p (decl_specs, ds_friend),
16813 	    is_declaration));
16814       if (decl_specs)
16815 	cp_parser_set_decl_spec_type (decl_specs,
16816 				      type_spec,
16817 				      token,
16818 				      /*type_definition_p=*/false);
16819       return type_spec;
16820 
16821     case RID_CONST:
16822       ds = ds_const;
16823       if (is_cv_qualifier)
16824 	*is_cv_qualifier = true;
16825       break;
16826 
16827     case RID_VOLATILE:
16828       ds = ds_volatile;
16829       if (is_cv_qualifier)
16830 	*is_cv_qualifier = true;
16831       break;
16832 
16833     case RID_RESTRICT:
16834       ds = ds_restrict;
16835       if (is_cv_qualifier)
16836 	*is_cv_qualifier = true;
16837       break;
16838 
16839     case RID_COMPLEX:
16840       /* The `__complex__' keyword is a GNU extension.  */
16841       ds = ds_complex;
16842       break;
16843 
16844     default:
16845       break;
16846     }
16847 
16848   /* Handle simple keywords.  */
16849   if (ds != ds_last)
16850     {
16851       if (decl_specs)
16852 	{
16853 	  set_and_check_decl_spec_loc (decl_specs, ds, token);
16854 	  decl_specs->any_specifiers_p = true;
16855 	}
16856       return cp_lexer_consume_token (parser->lexer)->u.value;
16857     }
16858 
16859   /* If we do not already have a type-specifier, assume we are looking
16860      at a simple-type-specifier.  */
16861   type_spec = cp_parser_simple_type_specifier (parser,
16862 					       decl_specs,
16863 					       flags);
16864 
16865   /* If we didn't find a type-specifier, and a type-specifier was not
16866      optional in this context, issue an error message.  */
16867   if (!type_spec && !(flags & CP_PARSER_FLAGS_OPTIONAL))
16868     {
16869       cp_parser_error (parser, "expected type specifier");
16870       return error_mark_node;
16871     }
16872 
16873   return type_spec;
16874 }
16875 
16876 /* Parse a simple-type-specifier.
16877 
16878    simple-type-specifier:
16879      :: [opt] nested-name-specifier [opt] type-name
16880      :: [opt] nested-name-specifier template template-id
16881      char
16882      wchar_t
16883      bool
16884      short
16885      int
16886      long
16887      signed
16888      unsigned
16889      float
16890      double
16891      void
16892 
16893    C++11 Extension:
16894 
16895    simple-type-specifier:
16896      auto
16897      decltype ( expression )
16898      char16_t
16899      char32_t
16900      __underlying_type ( type-id )
16901 
16902    C++17 extension:
16903 
16904      nested-name-specifier(opt) template-name
16905 
16906    GNU Extension:
16907 
16908    simple-type-specifier:
16909      __int128
16910      __typeof__ unary-expression
16911      __typeof__ ( type-id )
16912      __typeof__ ( type-id ) { initializer-list , [opt] }
16913 
16914    Concepts Extension:
16915 
16916    simple-type-specifier:
16917      constrained-type-specifier
16918 
16919    Returns the indicated TYPE_DECL.  If DECL_SPECS is not NULL, it is
16920    appropriately updated.  */
16921 
16922 static tree
16923 cp_parser_simple_type_specifier (cp_parser* parser,
16924 				 cp_decl_specifier_seq *decl_specs,
16925 				 cp_parser_flags flags)
16926 {
16927   tree type = NULL_TREE;
16928   cp_token *token;
16929   int idx;
16930 
16931   /* Peek at the next token.  */
16932   token = cp_lexer_peek_token (parser->lexer);
16933 
16934   /* If we're looking at a keyword, things are easy.  */
16935   switch (token->keyword)
16936     {
16937     case RID_CHAR:
16938       if (decl_specs)
16939 	decl_specs->explicit_char_p = true;
16940       type = char_type_node;
16941       break;
16942     case RID_CHAR16:
16943       type = char16_type_node;
16944       break;
16945     case RID_CHAR32:
16946       type = char32_type_node;
16947       break;
16948     case RID_WCHAR:
16949       type = wchar_type_node;
16950       break;
16951     case RID_BOOL:
16952       type = boolean_type_node;
16953       break;
16954     case RID_SHORT:
16955       set_and_check_decl_spec_loc (decl_specs, ds_short, token);
16956       type = short_integer_type_node;
16957       break;
16958     case RID_INT:
16959       if (decl_specs)
16960 	decl_specs->explicit_int_p = true;
16961       type = integer_type_node;
16962       break;
16963     case RID_INT_N_0:
16964     case RID_INT_N_1:
16965     case RID_INT_N_2:
16966     case RID_INT_N_3:
16967       idx = token->keyword - RID_INT_N_0;
16968       if (! int_n_enabled_p [idx])
16969 	break;
16970       if (decl_specs)
16971 	{
16972 	  decl_specs->explicit_intN_p = true;
16973 	  decl_specs->int_n_idx = idx;
16974 	}
16975       type = int_n_trees [idx].signed_type;
16976       break;
16977     case RID_LONG:
16978       if (decl_specs)
16979 	set_and_check_decl_spec_loc (decl_specs, ds_long, token);
16980       type = long_integer_type_node;
16981       break;
16982     case RID_SIGNED:
16983       set_and_check_decl_spec_loc (decl_specs, ds_signed, token);
16984       type = integer_type_node;
16985       break;
16986     case RID_UNSIGNED:
16987       set_and_check_decl_spec_loc (decl_specs, ds_unsigned, token);
16988       type = unsigned_type_node;
16989       break;
16990     case RID_FLOAT:
16991       type = float_type_node;
16992       break;
16993     case RID_DOUBLE:
16994       type = double_type_node;
16995       break;
16996     case RID_VOID:
16997       type = void_type_node;
16998       break;
16999 
17000     case RID_AUTO:
17001       maybe_warn_cpp0x (CPP0X_AUTO);
17002       if (parser->auto_is_implicit_function_template_parm_p)
17003 	{
17004 	  /* The 'auto' might be the placeholder return type for a function decl
17005 	     with trailing return type.  */
17006 	  bool have_trailing_return_fn_decl = false;
17007 
17008 	  cp_parser_parse_tentatively (parser);
17009 	  cp_lexer_consume_token (parser->lexer);
17010 	  while (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
17011 		 && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA)
17012 		 && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
17013 		 && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
17014 	    {
17015 	      if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
17016 		{
17017 		  cp_lexer_consume_token (parser->lexer);
17018 		  cp_parser_skip_to_closing_parenthesis (parser,
17019 							 /*recovering*/false,
17020 							 /*or_comma*/false,
17021 							 /*consume_paren*/true);
17022 		  continue;
17023 		}
17024 
17025 	      if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
17026 		{
17027 		  have_trailing_return_fn_decl = true;
17028 		  break;
17029 		}
17030 
17031 	      cp_lexer_consume_token (parser->lexer);
17032 	    }
17033 	  cp_parser_abort_tentative_parse (parser);
17034 
17035 	  if (have_trailing_return_fn_decl)
17036 	    {
17037 	      type = make_auto ();
17038 	      break;
17039 	    }
17040 
17041 	  if (cxx_dialect >= cxx14)
17042 	    {
17043 	      type = synthesize_implicit_template_parm (parser, NULL_TREE);
17044 	      type = TREE_TYPE (type);
17045 	    }
17046 	  else
17047 	    type = error_mark_node;
17048 
17049 	  if (current_class_type && LAMBDA_TYPE_P (current_class_type))
17050 	    {
17051 	      if (cxx_dialect < cxx14)
17052 		error_at (token->location,
17053 			 "use of %<auto%> in lambda parameter declaration "
17054 			 "only available with "
17055 			 "-std=c++14 or -std=gnu++14");
17056 	    }
17057 	  else if (cxx_dialect < cxx14)
17058 	    error_at (token->location,
17059 		     "use of %<auto%> in parameter declaration "
17060 		     "only available with "
17061 		     "-std=c++14 or -std=gnu++14");
17062 	  else if (!flag_concepts)
17063 	    pedwarn (token->location, 0,
17064 		     "use of %<auto%> in parameter declaration "
17065 		     "only available with -fconcepts");
17066 	}
17067       else
17068 	type = make_auto ();
17069       break;
17070 
17071     case RID_DECLTYPE:
17072       /* Since DR 743, decltype can either be a simple-type-specifier by
17073 	 itself or begin a nested-name-specifier.  Parsing it will replace
17074 	 it with a CPP_DECLTYPE, so just rewind and let the CPP_DECLTYPE
17075 	 handling below decide what to do.  */
17076       cp_parser_decltype (parser);
17077       cp_lexer_set_token_position (parser->lexer, token);
17078       break;
17079 
17080     case RID_TYPEOF:
17081       /* Consume the `typeof' token.  */
17082       cp_lexer_consume_token (parser->lexer);
17083       /* Parse the operand to `typeof'.  */
17084       type = cp_parser_sizeof_operand (parser, RID_TYPEOF);
17085       /* If it is not already a TYPE, take its type.  */
17086       if (!TYPE_P (type))
17087 	type = finish_typeof (type);
17088 
17089       if (decl_specs)
17090 	cp_parser_set_decl_spec_type (decl_specs, type,
17091 				      token,
17092 				      /*type_definition_p=*/false);
17093 
17094       return type;
17095 
17096     case RID_UNDERLYING_TYPE:
17097       type = cp_parser_trait_expr (parser, RID_UNDERLYING_TYPE);
17098       if (decl_specs)
17099 	cp_parser_set_decl_spec_type (decl_specs, type,
17100 				      token,
17101 				      /*type_definition_p=*/false);
17102 
17103       return type;
17104 
17105     case RID_BASES:
17106     case RID_DIRECT_BASES:
17107       type = cp_parser_trait_expr (parser, token->keyword);
17108       if (decl_specs)
17109        cp_parser_set_decl_spec_type (decl_specs, type,
17110                                      token,
17111                                      /*type_definition_p=*/false);
17112       return type;
17113     default:
17114       break;
17115     }
17116 
17117   /* If token is an already-parsed decltype not followed by ::,
17118      it's a simple-type-specifier.  */
17119   if (token->type == CPP_DECLTYPE
17120       && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
17121     {
17122       type = saved_checks_value (token->u.tree_check_value);
17123       if (decl_specs)
17124 	{
17125 	  cp_parser_set_decl_spec_type (decl_specs, type,
17126 					token,
17127 					/*type_definition_p=*/false);
17128 	  /* Remember that we are handling a decltype in order to
17129 	     implement the resolution of DR 1510 when the argument
17130 	     isn't instantiation dependent.  */
17131 	  decl_specs->decltype_p = true;
17132 	}
17133       cp_lexer_consume_token (parser->lexer);
17134       return type;
17135     }
17136 
17137   /* If the type-specifier was for a built-in type, we're done.  */
17138   if (type)
17139     {
17140       /* Record the type.  */
17141       if (decl_specs
17142 	  && (token->keyword != RID_SIGNED
17143 	      && token->keyword != RID_UNSIGNED
17144 	      && token->keyword != RID_SHORT
17145 	      && token->keyword != RID_LONG))
17146 	cp_parser_set_decl_spec_type (decl_specs,
17147 				      type,
17148 				      token,
17149 				      /*type_definition_p=*/false);
17150       if (decl_specs)
17151 	decl_specs->any_specifiers_p = true;
17152 
17153       /* Consume the token.  */
17154       cp_lexer_consume_token (parser->lexer);
17155 
17156       if (type == error_mark_node)
17157 	return error_mark_node;
17158 
17159       /* There is no valid C++ program where a non-template type is
17160 	 followed by a "<".  That usually indicates that the user thought
17161 	 that the type was a template.  */
17162       cp_parser_check_for_invalid_template_id (parser, type, none_type,
17163 					       token->location);
17164 
17165       return TYPE_NAME (type);
17166     }
17167 
17168   /* The type-specifier must be a user-defined type.  */
17169   if (!(flags & CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES))
17170     {
17171       bool qualified_p;
17172       bool global_p;
17173 
17174       /* Don't gobble tokens or issue error messages if this is an
17175 	 optional type-specifier.  */
17176       if ((flags & CP_PARSER_FLAGS_OPTIONAL) || cxx_dialect >= cxx17)
17177 	cp_parser_parse_tentatively (parser);
17178 
17179       token = cp_lexer_peek_token (parser->lexer);
17180 
17181       /* Look for the optional `::' operator.  */
17182       global_p
17183 	= (cp_parser_global_scope_opt (parser,
17184 				       /*current_scope_valid_p=*/false)
17185 	   != NULL_TREE);
17186       /* Look for the nested-name specifier.  */
17187       qualified_p
17188 	= (cp_parser_nested_name_specifier_opt (parser,
17189 						/*typename_keyword_p=*/false,
17190 						/*check_dependency_p=*/true,
17191 						/*type_p=*/false,
17192 						/*is_declaration=*/false)
17193 	   != NULL_TREE);
17194       /* If we have seen a nested-name-specifier, and the next token
17195 	 is `template', then we are using the template-id production.  */
17196       if (parser->scope
17197 	  && cp_parser_optional_template_keyword (parser))
17198 	{
17199 	  /* Look for the template-id.  */
17200 	  type = cp_parser_template_id (parser,
17201 					/*template_keyword_p=*/true,
17202 					/*check_dependency_p=*/true,
17203 					none_type,
17204 					/*is_declaration=*/false);
17205 	  /* If the template-id did not name a type, we are out of
17206 	     luck.  */
17207 	  if (TREE_CODE (type) != TYPE_DECL)
17208 	    {
17209 	      cp_parser_error (parser, "expected template-id for type");
17210 	      type = NULL_TREE;
17211 	    }
17212 	}
17213       /* Otherwise, look for a type-name.  */
17214       else
17215 	type = cp_parser_type_name (parser);
17216       /* Keep track of all name-lookups performed in class scopes.  */
17217       if (type
17218 	  && !global_p
17219 	  && !qualified_p
17220 	  && TREE_CODE (type) == TYPE_DECL
17221 	  && identifier_p (DECL_NAME (type)))
17222 	maybe_note_name_used_in_class (DECL_NAME (type), type);
17223       /* If it didn't work out, we don't have a TYPE.  */
17224       if (((flags & CP_PARSER_FLAGS_OPTIONAL) || cxx_dialect >= cxx17)
17225 	  && !cp_parser_parse_definitely (parser))
17226 	type = NULL_TREE;
17227       if (!type && cxx_dialect >= cxx17)
17228 	{
17229 	  if (flags & CP_PARSER_FLAGS_OPTIONAL)
17230 	    cp_parser_parse_tentatively (parser);
17231 
17232 	  cp_parser_global_scope_opt (parser,
17233 				      /*current_scope_valid_p=*/false);
17234 	  cp_parser_nested_name_specifier_opt (parser,
17235 					       /*typename_keyword_p=*/false,
17236 					       /*check_dependency_p=*/true,
17237 					       /*type_p=*/false,
17238 					       /*is_declaration=*/false);
17239 	  tree name = cp_parser_identifier (parser);
17240 	  if (name && TREE_CODE (name) == IDENTIFIER_NODE
17241 	      && parser->scope != error_mark_node)
17242 	    {
17243 	      tree tmpl = cp_parser_lookup_name (parser, name,
17244 						 none_type,
17245 						 /*is_template=*/false,
17246 						 /*is_namespace=*/false,
17247 						 /*check_dependency=*/true,
17248 						 /*ambiguous_decls=*/NULL,
17249 						 token->location);
17250 	      if (tmpl && tmpl != error_mark_node
17251 		  && (DECL_CLASS_TEMPLATE_P (tmpl)
17252 		      || DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl)))
17253 		type = make_template_placeholder (tmpl);
17254 	      else
17255 		{
17256 		  type = error_mark_node;
17257 		  if (!cp_parser_simulate_error (parser))
17258 		    cp_parser_name_lookup_error (parser, name, tmpl,
17259 						 NLE_TYPE, token->location);
17260 		}
17261 	    }
17262 	  else
17263 	    type = error_mark_node;
17264 
17265 	  if ((flags & CP_PARSER_FLAGS_OPTIONAL)
17266 	      && !cp_parser_parse_definitely (parser))
17267 	    type = NULL_TREE;
17268 	}
17269       if (type && decl_specs)
17270 	cp_parser_set_decl_spec_type (decl_specs, type,
17271 				      token,
17272 				      /*type_definition_p=*/false);
17273     }
17274 
17275   /* If we didn't get a type-name, issue an error message.  */
17276   if (!type && !(flags & CP_PARSER_FLAGS_OPTIONAL))
17277     {
17278       cp_parser_error (parser, "expected type-name");
17279       return error_mark_node;
17280     }
17281 
17282   if (type && type != error_mark_node)
17283     {
17284       /* See if TYPE is an Objective-C type, and if so, parse and
17285 	 accept any protocol references following it.  Do this before
17286 	 the cp_parser_check_for_invalid_template_id() call, because
17287 	 Objective-C types can be followed by '<...>' which would
17288 	 enclose protocol names rather than template arguments, and so
17289 	 everything is fine.  */
17290       if (c_dialect_objc () && !parser->scope
17291 	  && (objc_is_id (type) || objc_is_class_name (type)))
17292 	{
17293 	  tree protos = cp_parser_objc_protocol_refs_opt (parser);
17294 	  tree qual_type = objc_get_protocol_qualified_type (type, protos);
17295 
17296 	  /* Clobber the "unqualified" type previously entered into
17297 	     DECL_SPECS with the new, improved protocol-qualified version.  */
17298 	  if (decl_specs)
17299 	    decl_specs->type = qual_type;
17300 
17301 	  return qual_type;
17302 	}
17303 
17304       /* There is no valid C++ program where a non-template type is
17305 	 followed by a "<".  That usually indicates that the user
17306 	 thought that the type was a template.  */
17307       cp_parser_check_for_invalid_template_id (parser, type,
17308 					       none_type,
17309 					       token->location);
17310     }
17311 
17312   return type;
17313 }
17314 
17315 /* Parse a type-name.
17316 
17317    type-name:
17318      class-name
17319      enum-name
17320      typedef-name
17321      simple-template-id [in c++0x]
17322 
17323    enum-name:
17324      identifier
17325 
17326    typedef-name:
17327      identifier
17328 
17329   Concepts:
17330 
17331    type-name:
17332      concept-name
17333      partial-concept-id
17334 
17335    concept-name:
17336      identifier
17337 
17338    Returns a TYPE_DECL for the type.  */
17339 
17340 static tree
17341 cp_parser_type_name (cp_parser* parser)
17342 {
17343   return cp_parser_type_name (parser, /*typename_keyword_p=*/false);
17344 }
17345 
17346 /* See above. */
17347 static tree
17348 cp_parser_type_name (cp_parser* parser, bool typename_keyword_p)
17349 {
17350   tree type_decl;
17351 
17352   /* We can't know yet whether it is a class-name or not.  */
17353   cp_parser_parse_tentatively (parser);
17354   /* Try a class-name.  */
17355   type_decl = cp_parser_class_name (parser,
17356 				    typename_keyword_p,
17357 				    /*template_keyword_p=*/false,
17358 				    none_type,
17359 				    /*check_dependency_p=*/true,
17360 				    /*class_head_p=*/false,
17361 				    /*is_declaration=*/false);
17362   /* If it's not a class-name, keep looking.  */
17363   if (!cp_parser_parse_definitely (parser))
17364     {
17365       if (cxx_dialect < cxx11)
17366 	/* It must be a typedef-name or an enum-name.  */
17367 	return cp_parser_nonclass_name (parser);
17368 
17369       cp_parser_parse_tentatively (parser);
17370       /* It is either a simple-template-id representing an
17371 	 instantiation of an alias template...  */
17372       type_decl = cp_parser_template_id (parser,
17373 					 /*template_keyword_p=*/false,
17374 					 /*check_dependency_p=*/true,
17375 					 none_type,
17376 					 /*is_declaration=*/false);
17377       /* Note that this must be an instantiation of an alias template
17378 	 because [temp.names]/6 says:
17379 
17380 	     A template-id that names an alias template specialization
17381 	     is a type-name.
17382 
17383 	 Whereas [temp.names]/7 says:
17384 
17385 	     A simple-template-id that names a class template
17386 	     specialization is a class-name.
17387 
17388          With concepts, this could also be a partial-concept-id that
17389          declares a non-type template parameter. */
17390       if (type_decl != NULL_TREE
17391 	  && TREE_CODE (type_decl) == TYPE_DECL
17392 	  && TYPE_DECL_ALIAS_P (type_decl))
17393 	gcc_assert (DECL_TEMPLATE_INSTANTIATION (type_decl));
17394       else if (is_constrained_parameter (type_decl))
17395         /* Don't do anything. */ ;
17396       else
17397 	cp_parser_simulate_error (parser);
17398 
17399       if (!cp_parser_parse_definitely (parser))
17400 	/* ... Or a typedef-name or an enum-name.  */
17401 	return cp_parser_nonclass_name (parser);
17402     }
17403 
17404   return type_decl;
17405 }
17406 
17407 /*  Check if DECL and ARGS can form a constrained-type-specifier.
17408     If ARGS is non-null, we try to form a concept check of the
17409     form DECL<?, ARGS> where ? is a wildcard that matches any
17410     kind of template argument. If ARGS is NULL, then we try to
17411     form a concept check of the form DECL<?>. */
17412 
17413 static tree
17414 cp_parser_maybe_constrained_type_specifier (cp_parser *parser,
17415 					    tree decl, tree args)
17416 {
17417   gcc_assert (args ? TREE_CODE (args) == TREE_VEC : true);
17418 
17419   /* If we a constrained-type-specifier cannot be deduced. */
17420   if (parser->prevent_constrained_type_specifiers)
17421     return NULL_TREE;
17422 
17423   /* A constrained type specifier can only be found in an
17424      overload set or as a reference to a template declaration.
17425 
17426      FIXME: This might be masking a bug.  It's possible that
17427      that the deduction below is causing template specializations
17428      to be formed with the wildcard as an argument.  */
17429   if (TREE_CODE (decl) != OVERLOAD && TREE_CODE (decl) != TEMPLATE_DECL)
17430     return NULL_TREE;
17431 
17432   /* Try to build a call expression that evaluates the
17433      concept. This can fail if the overload set refers
17434      only to non-templates. */
17435   tree placeholder = build_nt (WILDCARD_DECL);
17436   tree check = build_concept_check (decl, placeholder, args);
17437   if (check == error_mark_node)
17438     return NULL_TREE;
17439 
17440   /* Deduce the checked constraint and the prototype parameter.
17441 
17442      FIXME: In certain cases, failure to deduce should be a
17443      diagnosable error.  */
17444   tree conc;
17445   tree proto;
17446   if (!deduce_constrained_parameter (check, conc, proto))
17447     return NULL_TREE;
17448 
17449   /* In template parameter scope, this results in a constrained
17450      parameter. Return a descriptor of that parm. */
17451   if (processing_template_parmlist)
17452     return build_constrained_parameter (conc, proto, args);
17453 
17454   /* In a parameter-declaration-clause, constrained-type
17455      specifiers result in invented template parameters.  */
17456   if (parser->auto_is_implicit_function_template_parm_p)
17457     {
17458       tree x = build_constrained_parameter (conc, proto, args);
17459       return synthesize_implicit_template_parm (parser, x);
17460     }
17461   else
17462     {
17463      /* Otherwise, we're in a context where the constrained
17464         type name is deduced and the constraint applies
17465         after deduction. */
17466       return make_constrained_auto (conc, args);
17467     }
17468 
17469   return NULL_TREE;
17470 }
17471 
17472 /* If DECL refers to a concept, return a TYPE_DECL representing
17473    the result of using the constrained type specifier in the
17474    current context.  DECL refers to a concept if
17475 
17476   - it is an overload set containing a function concept taking a single
17477     type argument, or
17478 
17479   - it is a variable concept taking a single type argument.  */
17480 
17481 static tree
17482 cp_parser_maybe_concept_name (cp_parser* parser, tree decl)
17483 {
17484   if (flag_concepts
17485       && (TREE_CODE (decl) == OVERLOAD
17486 	  || BASELINK_P (decl)
17487 	  || variable_concept_p (decl)))
17488     return cp_parser_maybe_constrained_type_specifier (parser, decl, NULL_TREE);
17489   else
17490     return NULL_TREE;
17491 }
17492 
17493 /* Check if DECL and ARGS form a partial-concept-id.  If so,
17494    assign ID to the resulting constrained placeholder.
17495 
17496    Returns true if the partial-concept-id designates a placeholder
17497    and false otherwise. Note that *id is set to NULL_TREE in
17498    this case. */
17499 
17500 static tree
17501 cp_parser_maybe_partial_concept_id (cp_parser *parser, tree decl, tree args)
17502 {
17503   return cp_parser_maybe_constrained_type_specifier (parser, decl, args);
17504 }
17505 
17506 /* Parse a non-class type-name, that is, either an enum-name, a typedef-name,
17507    or a concept-name.
17508 
17509    enum-name:
17510      identifier
17511 
17512    typedef-name:
17513      identifier
17514 
17515    concept-name:
17516      identifier
17517 
17518    Returns a TYPE_DECL for the type.  */
17519 
17520 static tree
17521 cp_parser_nonclass_name (cp_parser* parser)
17522 {
17523   tree type_decl;
17524   tree identifier;
17525 
17526   cp_token *token = cp_lexer_peek_token (parser->lexer);
17527   identifier = cp_parser_identifier (parser);
17528   if (identifier == error_mark_node)
17529     return error_mark_node;
17530 
17531   /* Look up the type-name.  */
17532   type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
17533 
17534   type_decl = strip_using_decl (type_decl);
17535 
17536   /* If we found an overload set, then it may refer to a concept-name. */
17537   if (tree decl = cp_parser_maybe_concept_name (parser, type_decl))
17538     type_decl = decl;
17539 
17540   if (TREE_CODE (type_decl) != TYPE_DECL
17541       && (objc_is_id (identifier) || objc_is_class_name (identifier)))
17542     {
17543       /* See if this is an Objective-C type.  */
17544       tree protos = cp_parser_objc_protocol_refs_opt (parser);
17545       tree type = objc_get_protocol_qualified_type (identifier, protos);
17546       if (type)
17547 	type_decl = TYPE_NAME (type);
17548     }
17549 
17550   /* Issue an error if we did not find a type-name.  */
17551   if (TREE_CODE (type_decl) != TYPE_DECL
17552       /* In Objective-C, we have the complication that class names are
17553 	 normally type names and start declarations (eg, the
17554 	 "NSObject" in "NSObject *object;"), but can be used in an
17555 	 Objective-C 2.0 dot-syntax (as in "NSObject.version") which
17556 	 is an expression.  So, a classname followed by a dot is not a
17557 	 valid type-name.  */
17558       || (objc_is_class_name (TREE_TYPE (type_decl))
17559 	  && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT))
17560     {
17561       if (!cp_parser_simulate_error (parser))
17562 	cp_parser_name_lookup_error (parser, identifier, type_decl,
17563 				     NLE_TYPE, token->location);
17564       return error_mark_node;
17565     }
17566   /* Remember that the name was used in the definition of the
17567      current class so that we can check later to see if the
17568      meaning would have been different after the class was
17569      entirely defined.  */
17570   else if (type_decl != error_mark_node
17571 	   && !parser->scope)
17572     maybe_note_name_used_in_class (identifier, type_decl);
17573 
17574   return type_decl;
17575 }
17576 
17577 /* Parse an elaborated-type-specifier.  Note that the grammar given
17578    here incorporates the resolution to DR68.
17579 
17580    elaborated-type-specifier:
17581      class-key :: [opt] nested-name-specifier [opt] identifier
17582      class-key :: [opt] nested-name-specifier [opt] template [opt] template-id
17583      enum-key :: [opt] nested-name-specifier [opt] identifier
17584      typename :: [opt] nested-name-specifier identifier
17585      typename :: [opt] nested-name-specifier template [opt]
17586        template-id
17587 
17588    GNU extension:
17589 
17590    elaborated-type-specifier:
17591      class-key attributes :: [opt] nested-name-specifier [opt] identifier
17592      class-key attributes :: [opt] nested-name-specifier [opt]
17593 	       template [opt] template-id
17594      enum attributes :: [opt] nested-name-specifier [opt] identifier
17595 
17596    If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
17597    declared `friend'.  If IS_DECLARATION is TRUE, then this
17598    elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
17599    something is being declared.
17600 
17601    Returns the TYPE specified.  */
17602 
17603 static tree
17604 cp_parser_elaborated_type_specifier (cp_parser* parser,
17605 				     bool is_friend,
17606 				     bool is_declaration)
17607 {
17608   enum tag_types tag_type;
17609   tree identifier;
17610   tree type = NULL_TREE;
17611   tree attributes = NULL_TREE;
17612   tree globalscope;
17613   cp_token *token = NULL;
17614 
17615   /* See if we're looking at the `enum' keyword.  */
17616   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
17617     {
17618       /* Consume the `enum' token.  */
17619       cp_lexer_consume_token (parser->lexer);
17620       /* Remember that it's an enumeration type.  */
17621       tag_type = enum_type;
17622       /* Issue a warning if the `struct' or `class' key (for C++0x scoped
17623 	 enums) is used here.  */
17624       cp_token *token = cp_lexer_peek_token (parser->lexer);
17625       if (cp_parser_is_keyword (token, RID_CLASS)
17626 	  || cp_parser_is_keyword (token, RID_STRUCT))
17627 	{
17628 	  gcc_rich_location richloc (token->location);
17629 	  richloc.add_range (input_location, false);
17630 	  richloc.add_fixit_remove ();
17631 	  pedwarn (&richloc, 0, "elaborated-type-specifier for "
17632 		   "a scoped enum must not use the %qD keyword",
17633 		   token->u.value);
17634 	  /* Consume the `struct' or `class' and parse it anyway.  */
17635 	  cp_lexer_consume_token (parser->lexer);
17636 	}
17637       /* Parse the attributes.  */
17638       attributes = cp_parser_attributes_opt (parser);
17639     }
17640   /* Or, it might be `typename'.  */
17641   else if (cp_lexer_next_token_is_keyword (parser->lexer,
17642 					   RID_TYPENAME))
17643     {
17644       /* Consume the `typename' token.  */
17645       cp_lexer_consume_token (parser->lexer);
17646       /* Remember that it's a `typename' type.  */
17647       tag_type = typename_type;
17648     }
17649   /* Otherwise it must be a class-key.  */
17650   else
17651     {
17652       tag_type = cp_parser_class_key (parser);
17653       if (tag_type == none_type)
17654 	return error_mark_node;
17655       /* Parse the attributes.  */
17656       attributes = cp_parser_attributes_opt (parser);
17657     }
17658 
17659   /* Look for the `::' operator.  */
17660   globalscope =  cp_parser_global_scope_opt (parser,
17661 					     /*current_scope_valid_p=*/false);
17662   /* Look for the nested-name-specifier.  */
17663   tree nested_name_specifier;
17664   if (tag_type == typename_type && !globalscope)
17665     {
17666       nested_name_specifier
17667 	= cp_parser_nested_name_specifier (parser,
17668 					   /*typename_keyword_p=*/true,
17669 					   /*check_dependency_p=*/true,
17670 					   /*type_p=*/true,
17671 					   is_declaration);
17672       if (!nested_name_specifier)
17673 	return error_mark_node;
17674     }
17675   else
17676     /* Even though `typename' is not present, the proposed resolution
17677        to Core Issue 180 says that in `class A<T>::B', `B' should be
17678        considered a type-name, even if `A<T>' is dependent.  */
17679     nested_name_specifier
17680       = cp_parser_nested_name_specifier_opt (parser,
17681 					     /*typename_keyword_p=*/true,
17682 					     /*check_dependency_p=*/true,
17683 					     /*type_p=*/true,
17684 					     is_declaration);
17685  /* For everything but enumeration types, consider a template-id.
17686     For an enumeration type, consider only a plain identifier.  */
17687   if (tag_type != enum_type)
17688     {
17689       bool template_p = false;
17690       tree decl;
17691 
17692       /* Allow the `template' keyword.  */
17693       template_p = cp_parser_optional_template_keyword (parser);
17694       /* If we didn't see `template', we don't know if there's a
17695 	 template-id or not.  */
17696       if (!template_p)
17697 	cp_parser_parse_tentatively (parser);
17698       /* Parse the template-id.  */
17699       token = cp_lexer_peek_token (parser->lexer);
17700       decl = cp_parser_template_id (parser, template_p,
17701 				    /*check_dependency_p=*/true,
17702 				    tag_type,
17703 				    is_declaration);
17704       /* If we didn't find a template-id, look for an ordinary
17705 	 identifier.  */
17706       if (!template_p && !cp_parser_parse_definitely (parser))
17707 	;
17708       /* We can get here when cp_parser_template_id, called by
17709 	 cp_parser_class_name with tag_type == none_type, succeeds
17710 	 and caches a BASELINK.  Then, when called again here,
17711 	 instead of failing and returning an error_mark_node
17712 	 returns it (see template/typename17.C in C++11).
17713 	 ??? Could we diagnose this earlier?  */
17714       else if (tag_type == typename_type && BASELINK_P (decl))
17715 	{
17716 	  cp_parser_diagnose_invalid_type_name (parser, decl, token->location);
17717 	  type = error_mark_node;
17718 	}
17719       /* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
17720 	 in effect, then we must assume that, upon instantiation, the
17721 	 template will correspond to a class.  */
17722       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
17723 	       && tag_type == typename_type)
17724 	type = make_typename_type (parser->scope, decl,
17725 				   typename_type,
17726 				   /*complain=*/tf_error);
17727       /* If the `typename' keyword is in effect and DECL is not a type
17728 	 decl, then type is non existent.   */
17729       else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL)
17730         ;
17731       else if (TREE_CODE (decl) == TYPE_DECL)
17732 	{
17733 	  type = check_elaborated_type_specifier (tag_type, decl,
17734 						  /*allow_template_p=*/true);
17735 
17736 	  /* If the next token is a semicolon, this must be a specialization,
17737 	     instantiation, or friend declaration.  Check the scope while we
17738 	     still know whether or not we had a nested-name-specifier.  */
17739 	  if (type != error_mark_node
17740 	      && !nested_name_specifier && !is_friend
17741 	      && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
17742 	    check_unqualified_spec_or_inst (type, token->location);
17743 	}
17744       else if (decl == error_mark_node)
17745 	type = error_mark_node;
17746     }
17747 
17748   if (!type)
17749     {
17750       token = cp_lexer_peek_token (parser->lexer);
17751       identifier = cp_parser_identifier (parser);
17752 
17753       if (identifier == error_mark_node)
17754 	{
17755 	  parser->scope = NULL_TREE;
17756 	  return error_mark_node;
17757 	}
17758 
17759       /* For a `typename', we needn't call xref_tag.  */
17760       if (tag_type == typename_type
17761 	  && TREE_CODE (parser->scope) != NAMESPACE_DECL)
17762 	return cp_parser_make_typename_type (parser, identifier,
17763 					     token->location);
17764 
17765       /* Template parameter lists apply only if we are not within a
17766 	 function parameter list.  */
17767       bool template_parm_lists_apply
17768 	  = parser->num_template_parameter_lists;
17769       if (template_parm_lists_apply)
17770 	for (cp_binding_level *s = current_binding_level;
17771 	     s && s->kind != sk_template_parms;
17772 	     s = s->level_chain)
17773 	  if (s->kind == sk_function_parms)
17774 	    template_parm_lists_apply = false;
17775 
17776       /* Look up a qualified name in the usual way.  */
17777       if (parser->scope)
17778 	{
17779 	  tree decl;
17780 	  tree ambiguous_decls;
17781 
17782 	  decl = cp_parser_lookup_name (parser, identifier,
17783 					tag_type,
17784 					/*is_template=*/false,
17785 					/*is_namespace=*/false,
17786 					/*check_dependency=*/true,
17787 					&ambiguous_decls,
17788 					token->location);
17789 
17790 	  /* If the lookup was ambiguous, an error will already have been
17791 	     issued.  */
17792 	  if (ambiguous_decls)
17793 	    return error_mark_node;
17794 
17795 	  /* If we are parsing friend declaration, DECL may be a
17796 	     TEMPLATE_DECL tree node here.  However, we need to check
17797 	     whether this TEMPLATE_DECL results in valid code.  Consider
17798 	     the following example:
17799 
17800 	       namespace N {
17801 		 template <class T> class C {};
17802 	       }
17803 	       class X {
17804 		 template <class T> friend class N::C; // #1, valid code
17805 	       };
17806 	       template <class T> class Y {
17807 		 friend class N::C;		       // #2, invalid code
17808 	       };
17809 
17810 	     For both case #1 and #2, we arrive at a TEMPLATE_DECL after
17811 	     name lookup of `N::C'.  We see that friend declaration must
17812 	     be template for the code to be valid.  Note that
17813 	     processing_template_decl does not work here since it is
17814 	     always 1 for the above two cases.  */
17815 
17816 	  decl = (cp_parser_maybe_treat_template_as_class
17817 		  (decl, /*tag_name_p=*/is_friend
17818 			 && template_parm_lists_apply));
17819 
17820 	  if (TREE_CODE (decl) != TYPE_DECL)
17821 	    {
17822 	      cp_parser_diagnose_invalid_type_name (parser,
17823 						    identifier,
17824 						    token->location);
17825 	      return error_mark_node;
17826 	    }
17827 
17828 	  if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
17829             {
17830               bool allow_template = (template_parm_lists_apply
17831 		                     || DECL_SELF_REFERENCE_P (decl));
17832               type = check_elaborated_type_specifier (tag_type, decl,
17833                                                       allow_template);
17834 
17835               if (type == error_mark_node)
17836                 return error_mark_node;
17837             }
17838 
17839           /* Forward declarations of nested types, such as
17840 
17841                class C1::C2;
17842                class C1::C2::C3;
17843 
17844              are invalid unless all components preceding the final '::'
17845              are complete.  If all enclosing types are complete, these
17846              declarations become merely pointless.
17847 
17848              Invalid forward declarations of nested types are errors
17849              caught elsewhere in parsing.  Those that are pointless arrive
17850              here.  */
17851 
17852           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
17853               && !is_friend && !processing_explicit_instantiation)
17854             warning (0, "declaration %qD does not declare anything", decl);
17855 
17856 	  type = TREE_TYPE (decl);
17857 	}
17858       else
17859 	{
17860 	  /* An elaborated-type-specifier sometimes introduces a new type and
17861 	     sometimes names an existing type.  Normally, the rule is that it
17862 	     introduces a new type only if there is not an existing type of
17863 	     the same name already in scope.  For example, given:
17864 
17865 	       struct S {};
17866 	       void f() { struct S s; }
17867 
17868 	     the `struct S' in the body of `f' is the same `struct S' as in
17869 	     the global scope; the existing definition is used.  However, if
17870 	     there were no global declaration, this would introduce a new
17871 	     local class named `S'.
17872 
17873 	     An exception to this rule applies to the following code:
17874 
17875 	       namespace N { struct S; }
17876 
17877 	     Here, the elaborated-type-specifier names a new type
17878 	     unconditionally; even if there is already an `S' in the
17879 	     containing scope this declaration names a new type.
17880 	     This exception only applies if the elaborated-type-specifier
17881 	     forms the complete declaration:
17882 
17883 	       [class.name]
17884 
17885 	       A declaration consisting solely of `class-key identifier ;' is
17886 	       either a redeclaration of the name in the current scope or a
17887 	       forward declaration of the identifier as a class name.  It
17888 	       introduces the name into the current scope.
17889 
17890 	     We are in this situation precisely when the next token is a `;'.
17891 
17892 	     An exception to the exception is that a `friend' declaration does
17893 	     *not* name a new type; i.e., given:
17894 
17895 	       struct S { friend struct T; };
17896 
17897 	     `T' is not a new type in the scope of `S'.
17898 
17899 	     Also, `new struct S' or `sizeof (struct S)' never results in the
17900 	     definition of a new type; a new type can only be declared in a
17901 	     declaration context.  */
17902 
17903 	  tag_scope ts;
17904 	  bool template_p;
17905 
17906 	  if (is_friend)
17907 	    /* Friends have special name lookup rules.  */
17908 	    ts = ts_within_enclosing_non_class;
17909 	  else if (is_declaration
17910 		   && cp_lexer_next_token_is (parser->lexer,
17911 					      CPP_SEMICOLON))
17912 	    /* This is a `class-key identifier ;' */
17913 	    ts = ts_current;
17914 	  else
17915 	    ts = ts_global;
17916 
17917 	  template_p =
17918 	    (template_parm_lists_apply
17919 	     && (cp_parser_next_token_starts_class_definition_p (parser)
17920 		 || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
17921 	  /* An unqualified name was used to reference this type, so
17922 	     there were no qualifying templates.  */
17923 	  if (template_parm_lists_apply
17924 	      && !cp_parser_check_template_parameters (parser,
17925 						       /*num_templates=*/0,
17926 						       /*template_id*/false,
17927 						       token->location,
17928 						       /*declarator=*/NULL))
17929 	    return error_mark_node;
17930 	  type = xref_tag (tag_type, identifier, ts, template_p);
17931 	}
17932     }
17933 
17934   if (type == error_mark_node)
17935     return error_mark_node;
17936 
17937   /* Allow attributes on forward declarations of classes.  */
17938   if (attributes)
17939     {
17940       if (TREE_CODE (type) == TYPENAME_TYPE)
17941 	warning (OPT_Wattributes,
17942 		 "attributes ignored on uninstantiated type");
17943       else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
17944 	       && ! processing_explicit_instantiation)
17945 	warning (OPT_Wattributes,
17946 		 "attributes ignored on template instantiation");
17947       else if (is_declaration && cp_parser_declares_only_class_p (parser))
17948 	cplus_decl_attributes (&type, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
17949       else
17950 	warning (OPT_Wattributes,
17951 		 "attributes ignored on elaborated-type-specifier that is not a forward declaration");
17952     }
17953 
17954   if (tag_type != enum_type)
17955     {
17956       /* Indicate whether this class was declared as a `class' or as a
17957 	 `struct'.  */
17958       if (CLASS_TYPE_P (type))
17959 	CLASSTYPE_DECLARED_CLASS (type) = (tag_type == class_type);
17960       cp_parser_check_class_key (tag_type, type);
17961     }
17962 
17963   /* A "<" cannot follow an elaborated type specifier.  If that
17964      happens, the user was probably trying to form a template-id.  */
17965   cp_parser_check_for_invalid_template_id (parser, type, tag_type,
17966 					   token->location);
17967 
17968   return type;
17969 }
17970 
17971 /* Parse an enum-specifier.
17972 
17973    enum-specifier:
17974      enum-head { enumerator-list [opt] }
17975      enum-head { enumerator-list , } [C++0x]
17976 
17977    enum-head:
17978      enum-key identifier [opt] enum-base [opt]
17979      enum-key nested-name-specifier identifier enum-base [opt]
17980 
17981    enum-key:
17982      enum
17983      enum class   [C++0x]
17984      enum struct  [C++0x]
17985 
17986    enum-base:   [C++0x]
17987      : type-specifier-seq
17988 
17989    opaque-enum-specifier:
17990      enum-key identifier enum-base [opt] ;
17991 
17992    GNU Extensions:
17993      enum-key attributes[opt] identifier [opt] enum-base [opt]
17994        { enumerator-list [opt] }attributes[opt]
17995      enum-key attributes[opt] identifier [opt] enum-base [opt]
17996        { enumerator-list, }attributes[opt] [C++0x]
17997 
17998    Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
17999    if the token stream isn't an enum-specifier after all.  */
18000 
18001 static tree
18002 cp_parser_enum_specifier (cp_parser* parser)
18003 {
18004   tree identifier;
18005   tree type = NULL_TREE;
18006   tree prev_scope;
18007   tree nested_name_specifier = NULL_TREE;
18008   tree attributes;
18009   bool scoped_enum_p = false;
18010   bool has_underlying_type = false;
18011   bool nested_being_defined = false;
18012   bool new_value_list = false;
18013   bool is_new_type = false;
18014   bool is_unnamed = false;
18015   tree underlying_type = NULL_TREE;
18016   cp_token *type_start_token = NULL;
18017   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
18018 
18019   parser->colon_corrects_to_scope_p = false;
18020 
18021   /* Parse tentatively so that we can back up if we don't find a
18022      enum-specifier.  */
18023   cp_parser_parse_tentatively (parser);
18024 
18025   /* Caller guarantees that the current token is 'enum', an identifier
18026      possibly follows, and the token after that is an opening brace.
18027      If we don't have an identifier, fabricate an anonymous name for
18028      the enumeration being defined.  */
18029   cp_lexer_consume_token (parser->lexer);
18030 
18031   /* Parse the "class" or "struct", which indicates a scoped
18032      enumeration type in C++0x.  */
18033   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
18034       || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
18035     {
18036       if (cxx_dialect < cxx11)
18037         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
18038 
18039       /* Consume the `struct' or `class' token.  */
18040       cp_lexer_consume_token (parser->lexer);
18041 
18042       scoped_enum_p = true;
18043     }
18044 
18045   attributes = cp_parser_attributes_opt (parser);
18046 
18047   /* Clear the qualification.  */
18048   parser->scope = NULL_TREE;
18049   parser->qualifying_scope = NULL_TREE;
18050   parser->object_scope = NULL_TREE;
18051 
18052   /* Figure out in what scope the declaration is being placed.  */
18053   prev_scope = current_scope ();
18054 
18055   type_start_token = cp_lexer_peek_token (parser->lexer);
18056 
18057   push_deferring_access_checks (dk_no_check);
18058   nested_name_specifier
18059       = cp_parser_nested_name_specifier_opt (parser,
18060 					     /*typename_keyword_p=*/true,
18061 					     /*check_dependency_p=*/false,
18062 					     /*type_p=*/false,
18063 					     /*is_declaration=*/false);
18064 
18065   if (nested_name_specifier)
18066     {
18067       tree name;
18068 
18069       identifier = cp_parser_identifier (parser);
18070       name =  cp_parser_lookup_name (parser, identifier,
18071 				     enum_type,
18072 				     /*is_template=*/false,
18073 				     /*is_namespace=*/false,
18074 				     /*check_dependency=*/true,
18075 				     /*ambiguous_decls=*/NULL,
18076 				     input_location);
18077       if (name && name != error_mark_node)
18078 	{
18079 	  type = TREE_TYPE (name);
18080 	  if (TREE_CODE (type) == TYPENAME_TYPE)
18081 	    {
18082 	      /* Are template enums allowed in ISO? */
18083 	      if (template_parm_scope_p ())
18084 		pedwarn (type_start_token->location, OPT_Wpedantic,
18085 			 "%qD is an enumeration template", name);
18086 	      /* ignore a typename reference, for it will be solved by name
18087 	         in start_enum.  */
18088 	      type = NULL_TREE;
18089 	    }
18090 	}
18091       else if (nested_name_specifier == error_mark_node)
18092 	/* We already issued an error.  */;
18093       else
18094 	{
18095 	  error_at (type_start_token->location,
18096 		    "%qD does not name an enumeration in %qT",
18097 		    identifier, nested_name_specifier);
18098 	  nested_name_specifier = error_mark_node;
18099 	}
18100     }
18101   else
18102     {
18103       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
18104 	identifier = cp_parser_identifier (parser);
18105       else
18106 	{
18107 	  identifier = make_anon_name ();
18108 	  is_unnamed = true;
18109 	  if (scoped_enum_p)
18110 	    error_at (type_start_token->location,
18111 		      "unnamed scoped enum is not allowed");
18112 	}
18113     }
18114   pop_deferring_access_checks ();
18115 
18116   /* Check for the `:' that denotes a specified underlying type in C++0x.
18117      Note that a ':' could also indicate a bitfield width, however.  */
18118   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
18119     {
18120       cp_decl_specifier_seq type_specifiers;
18121 
18122       /* Consume the `:'.  */
18123       cp_lexer_consume_token (parser->lexer);
18124 
18125       /* Parse the type-specifier-seq.  */
18126       cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
18127 				    /*is_trailing_return=*/false,
18128                                     &type_specifiers);
18129 
18130       /* At this point this is surely not elaborated type specifier.  */
18131       if (!cp_parser_parse_definitely (parser))
18132 	return NULL_TREE;
18133 
18134       if (cxx_dialect < cxx11)
18135         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
18136 
18137       has_underlying_type = true;
18138 
18139       /* If that didn't work, stop.  */
18140       if (type_specifiers.type != error_mark_node)
18141         {
18142           underlying_type = grokdeclarator (NULL, &type_specifiers, TYPENAME,
18143                                             /*initialized=*/0, NULL);
18144           if (underlying_type == error_mark_node
18145 	      || check_for_bare_parameter_packs (underlying_type))
18146             underlying_type = NULL_TREE;
18147         }
18148     }
18149 
18150   /* Look for the `{' but don't consume it yet.  */
18151   if (!cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18152     {
18153       if (cxx_dialect < cxx11 || (!scoped_enum_p && !underlying_type))
18154 	{
18155 	  cp_parser_error (parser, "expected %<{%>");
18156 	  if (has_underlying_type)
18157 	    {
18158 	      type = NULL_TREE;
18159 	      goto out;
18160 	    }
18161 	}
18162       /* An opaque-enum-specifier must have a ';' here.  */
18163       if ((scoped_enum_p || underlying_type)
18164 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
18165 	{
18166 	  cp_parser_error (parser, "expected %<;%> or %<{%>");
18167 	  if (has_underlying_type)
18168 	    {
18169 	      type = NULL_TREE;
18170 	      goto out;
18171 	    }
18172 	}
18173     }
18174 
18175   if (!has_underlying_type && !cp_parser_parse_definitely (parser))
18176     return NULL_TREE;
18177 
18178   if (nested_name_specifier)
18179     {
18180       if (CLASS_TYPE_P (nested_name_specifier))
18181 	{
18182 	  nested_being_defined = TYPE_BEING_DEFINED (nested_name_specifier);
18183 	  TYPE_BEING_DEFINED (nested_name_specifier) = 1;
18184 	  push_scope (nested_name_specifier);
18185 	}
18186       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
18187 	{
18188 	  push_nested_namespace (nested_name_specifier);
18189 	}
18190     }
18191 
18192   /* Issue an error message if type-definitions are forbidden here.  */
18193   if (!cp_parser_check_type_definition (parser))
18194     type = error_mark_node;
18195   else
18196     /* Create the new type.  We do this before consuming the opening
18197        brace so the enum will be recorded as being on the line of its
18198        tag (or the 'enum' keyword, if there is no tag).  */
18199     type = start_enum (identifier, type, underlying_type,
18200 		       attributes, scoped_enum_p, &is_new_type);
18201 
18202   /* If the next token is not '{' it is an opaque-enum-specifier or an
18203      elaborated-type-specifier.  */
18204   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18205     {
18206       timevar_push (TV_PARSE_ENUM);
18207       if (nested_name_specifier
18208 	  && nested_name_specifier != error_mark_node)
18209 	{
18210 	  /* The following catches invalid code such as:
18211 	     enum class S<int>::E { A, B, C }; */
18212 	  if (!processing_specialization
18213 	      && CLASS_TYPE_P (nested_name_specifier)
18214 	      && CLASSTYPE_USE_TEMPLATE (nested_name_specifier))
18215 	    error_at (type_start_token->location, "cannot add an enumerator "
18216 		      "list to a template instantiation");
18217 
18218 	  if (TREE_CODE (nested_name_specifier) == TYPENAME_TYPE)
18219 	    {
18220 	      error_at (type_start_token->location,
18221 			"%<%T::%E%> has not been declared",
18222 			TYPE_CONTEXT (nested_name_specifier),
18223 			nested_name_specifier);
18224 	      type = error_mark_node;
18225 	    }
18226 	  else if (TREE_CODE (nested_name_specifier) != NAMESPACE_DECL
18227 		   && !CLASS_TYPE_P (nested_name_specifier))
18228 	    {
18229 	      error_at (type_start_token->location, "nested name specifier "
18230 			"%qT for enum declaration does not name a class "
18231 			"or namespace", nested_name_specifier);
18232 	      type = error_mark_node;
18233 	    }
18234 	  /* If that scope does not contain the scope in which the
18235 	     class was originally declared, the program is invalid.  */
18236 	  else if (prev_scope && !is_ancestor (prev_scope,
18237 					       nested_name_specifier))
18238 	    {
18239 	      if (at_namespace_scope_p ())
18240 		error_at (type_start_token->location,
18241 			  "declaration of %qD in namespace %qD which does not "
18242 			  "enclose %qD",
18243 			  type, prev_scope, nested_name_specifier);
18244 	      else
18245 		error_at (type_start_token->location,
18246 			  "declaration of %qD in %qD which does not "
18247 			  "enclose %qD",
18248 			  type, prev_scope, nested_name_specifier);
18249 	      type = error_mark_node;
18250 	    }
18251 	  /* If that scope is the scope where the declaration is being placed
18252 	     the program is invalid.  */
18253 	  else if (CLASS_TYPE_P (nested_name_specifier)
18254 		   && CLASS_TYPE_P (prev_scope)
18255 		   && same_type_p (nested_name_specifier, prev_scope))
18256 	    {
18257 	      permerror (type_start_token->location,
18258 			 "extra qualification not allowed");
18259 	      nested_name_specifier = NULL_TREE;
18260 	    }
18261 	}
18262 
18263       if (scoped_enum_p)
18264 	begin_scope (sk_scoped_enum, type);
18265 
18266       /* Consume the opening brace.  */
18267       matching_braces braces;
18268       braces.consume_open (parser);
18269 
18270       if (type == error_mark_node)
18271 	; /* Nothing to add */
18272       else if (OPAQUE_ENUM_P (type)
18273 	       || (cxx_dialect > cxx98 && processing_specialization))
18274 	{
18275 	  new_value_list = true;
18276 	  SET_OPAQUE_ENUM_P (type, false);
18277 	  DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
18278 	}
18279       else
18280 	{
18281 	  error_at (type_start_token->location,
18282 		    "multiple definition of %q#T", type);
18283 	  inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
18284 		  "previous definition here");
18285 	  type = error_mark_node;
18286 	}
18287 
18288       if (type == error_mark_node)
18289 	cp_parser_skip_to_end_of_block_or_statement (parser);
18290       /* If the next token is not '}', then there are some enumerators.  */
18291       else if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
18292 	{
18293 	  if (is_unnamed && !scoped_enum_p)
18294 	    pedwarn (type_start_token->location, OPT_Wpedantic,
18295 		     "ISO C++ forbids empty unnamed enum");
18296 	}
18297       else
18298 	cp_parser_enumerator_list (parser, type);
18299 
18300       /* Consume the final '}'.  */
18301       braces.require_close (parser);
18302 
18303       if (scoped_enum_p)
18304 	finish_scope ();
18305       timevar_pop (TV_PARSE_ENUM);
18306     }
18307   else
18308     {
18309       /* If a ';' follows, then it is an opaque-enum-specifier
18310 	and additional restrictions apply.  */
18311       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
18312 	{
18313 	  if (is_unnamed)
18314 	    error_at (type_start_token->location,
18315 		      "opaque-enum-specifier without name");
18316 	  else if (nested_name_specifier)
18317 	    error_at (type_start_token->location,
18318 		      "opaque-enum-specifier must use a simple identifier");
18319 	}
18320     }
18321 
18322   /* Look for trailing attributes to apply to this enumeration, and
18323      apply them if appropriate.  */
18324   if (cp_parser_allow_gnu_extensions_p (parser))
18325     {
18326       tree trailing_attr = cp_parser_gnu_attributes_opt (parser);
18327       cplus_decl_attributes (&type,
18328 			     trailing_attr,
18329 			     (int) ATTR_FLAG_TYPE_IN_PLACE);
18330     }
18331 
18332   /* Finish up the enumeration.  */
18333   if (type != error_mark_node)
18334     {
18335       if (new_value_list)
18336 	finish_enum_value_list (type);
18337       if (is_new_type)
18338 	finish_enum (type);
18339     }
18340 
18341   if (nested_name_specifier)
18342     {
18343       if (CLASS_TYPE_P (nested_name_specifier))
18344 	{
18345 	  TYPE_BEING_DEFINED (nested_name_specifier) = nested_being_defined;
18346 	  pop_scope (nested_name_specifier);
18347 	}
18348       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
18349 	{
18350 	  pop_nested_namespace (nested_name_specifier);
18351 	}
18352     }
18353  out:
18354   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
18355   return type;
18356 }
18357 
18358 /* Parse an enumerator-list.  The enumerators all have the indicated
18359    TYPE.
18360 
18361    enumerator-list:
18362      enumerator-definition
18363      enumerator-list , enumerator-definition  */
18364 
18365 static void
18366 cp_parser_enumerator_list (cp_parser* parser, tree type)
18367 {
18368   while (true)
18369     {
18370       /* Parse an enumerator-definition.  */
18371       cp_parser_enumerator_definition (parser, type);
18372 
18373       /* If the next token is not a ',', we've reached the end of
18374 	 the list.  */
18375       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18376 	break;
18377       /* Otherwise, consume the `,' and keep going.  */
18378       cp_lexer_consume_token (parser->lexer);
18379       /* If the next token is a `}', there is a trailing comma.  */
18380       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
18381 	{
18382 	  if (cxx_dialect < cxx11 && !in_system_header_at (input_location))
18383 	    pedwarn (input_location, OPT_Wpedantic,
18384                      "comma at end of enumerator list");
18385 	  break;
18386 	}
18387     }
18388 }
18389 
18390 /* Parse an enumerator-definition.  The enumerator has the indicated
18391    TYPE.
18392 
18393    enumerator-definition:
18394      enumerator
18395      enumerator = constant-expression
18396 
18397    enumerator:
18398      identifier
18399 
18400    GNU Extensions:
18401 
18402    enumerator-definition:
18403      enumerator attributes [opt]
18404      enumerator attributes [opt] = constant-expression  */
18405 
18406 static void
18407 cp_parser_enumerator_definition (cp_parser* parser, tree type)
18408 {
18409   tree identifier;
18410   tree value;
18411   location_t loc;
18412 
18413   /* Save the input location because we are interested in the location
18414      of the identifier and not the location of the explicit value.  */
18415   loc = cp_lexer_peek_token (parser->lexer)->location;
18416 
18417   /* Look for the identifier.  */
18418   identifier = cp_parser_identifier (parser);
18419   if (identifier == error_mark_node)
18420     return;
18421 
18422   /* Parse any specified attributes.  */
18423   tree attrs = cp_parser_attributes_opt (parser);
18424 
18425   /* If the next token is an '=', then there is an explicit value.  */
18426   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
18427     {
18428       /* Consume the `=' token.  */
18429       cp_lexer_consume_token (parser->lexer);
18430       /* Parse the value.  */
18431       value = cp_parser_constant_expression (parser);
18432     }
18433   else
18434     value = NULL_TREE;
18435 
18436   /* If we are processing a template, make sure the initializer of the
18437      enumerator doesn't contain any bare template parameter pack.  */
18438   if (check_for_bare_parameter_packs (value))
18439     value = error_mark_node;
18440 
18441   /* Create the enumerator.  */
18442   build_enumerator (identifier, value, type, attrs, loc);
18443 }
18444 
18445 /* Parse a namespace-name.
18446 
18447    namespace-name:
18448      original-namespace-name
18449      namespace-alias
18450 
18451    Returns the NAMESPACE_DECL for the namespace.  */
18452 
18453 static tree
18454 cp_parser_namespace_name (cp_parser* parser)
18455 {
18456   tree identifier;
18457   tree namespace_decl;
18458 
18459   cp_token *token = cp_lexer_peek_token (parser->lexer);
18460 
18461   /* Get the name of the namespace.  */
18462   identifier = cp_parser_identifier (parser);
18463   if (identifier == error_mark_node)
18464     return error_mark_node;
18465 
18466   /* Look up the identifier in the currently active scope.  Look only
18467      for namespaces, due to:
18468 
18469        [basic.lookup.udir]
18470 
18471        When looking up a namespace-name in a using-directive or alias
18472        definition, only namespace names are considered.
18473 
18474      And:
18475 
18476        [basic.lookup.qual]
18477 
18478        During the lookup of a name preceding the :: scope resolution
18479        operator, object, function, and enumerator names are ignored.
18480 
18481      (Note that cp_parser_qualifying_entity only calls this
18482      function if the token after the name is the scope resolution
18483      operator.)  */
18484   namespace_decl = cp_parser_lookup_name (parser, identifier,
18485 					  none_type,
18486 					  /*is_template=*/false,
18487 					  /*is_namespace=*/true,
18488 					  /*check_dependency=*/true,
18489 					  /*ambiguous_decls=*/NULL,
18490 					  token->location);
18491   /* If it's not a namespace, issue an error.  */
18492   if (namespace_decl == error_mark_node
18493       || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
18494     {
18495       if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
18496 	{
18497 	  error_at (token->location, "%qD is not a namespace-name", identifier);
18498 	  if (namespace_decl == error_mark_node
18499 	      && parser->scope && TREE_CODE (parser->scope) == NAMESPACE_DECL)
18500 	    suggest_alternative_in_explicit_scope (token->location, identifier,
18501 						   parser->scope);
18502 	}
18503       cp_parser_error (parser, "expected namespace-name");
18504       namespace_decl = error_mark_node;
18505     }
18506 
18507   return namespace_decl;
18508 }
18509 
18510 /* Parse a namespace-definition.
18511 
18512    namespace-definition:
18513      named-namespace-definition
18514      unnamed-namespace-definition
18515 
18516    named-namespace-definition:
18517      original-namespace-definition
18518      extension-namespace-definition
18519 
18520    original-namespace-definition:
18521      namespace identifier { namespace-body }
18522 
18523    extension-namespace-definition:
18524      namespace original-namespace-name { namespace-body }
18525 
18526    unnamed-namespace-definition:
18527      namespace { namespace-body } */
18528 
18529 static void
18530 cp_parser_namespace_definition (cp_parser* parser)
18531 {
18532   tree identifier;
18533   int nested_definition_count = 0;
18534 
18535   cp_ensure_no_omp_declare_simd (parser);
18536   cp_ensure_no_oacc_routine (parser);
18537 
18538   bool is_inline = cp_lexer_next_token_is_keyword (parser->lexer, RID_INLINE);
18539 
18540   if (is_inline)
18541     {
18542       maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES);
18543       cp_lexer_consume_token (parser->lexer);
18544     }
18545 
18546   /* Look for the `namespace' keyword.  */
18547   cp_token* token
18548     = cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
18549 
18550   /* Parse any specified attributes before the identifier.  */
18551   tree attribs = cp_parser_attributes_opt (parser);
18552 
18553   for (;;)
18554     {
18555       identifier = NULL_TREE;
18556 
18557       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
18558 	{
18559 	  identifier = cp_parser_identifier (parser);
18560 
18561 	  /* Parse any attributes specified after the identifier.  */
18562 	  attribs = attr_chainon (attribs, cp_parser_attributes_opt (parser));
18563 	}
18564 
18565       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
18566 	break;
18567 
18568       if (!nested_definition_count && cxx_dialect < cxx17)
18569         pedwarn (input_location, OPT_Wpedantic,
18570                  "nested namespace definitions only available with "
18571                  "-std=c++17 or -std=gnu++17");
18572 
18573       /* Nested namespace names can create new namespaces (unlike
18574 	 other qualified-ids).  */
18575       if (int count = identifier ? push_namespace (identifier) : 0)
18576 	nested_definition_count += count;
18577       else
18578 	cp_parser_error (parser, "nested namespace name required");
18579       cp_lexer_consume_token (parser->lexer);
18580     }
18581 
18582   if (nested_definition_count && !identifier)
18583     cp_parser_error (parser, "namespace name required");
18584 
18585   if (nested_definition_count && attribs)
18586     error_at (token->location,
18587 	      "a nested namespace definition cannot have attributes");
18588   if (nested_definition_count && is_inline)
18589     error_at (token->location,
18590 	      "a nested namespace definition cannot be inline");
18591 
18592   /* Start the namespace.  */
18593   nested_definition_count += push_namespace (identifier, is_inline);
18594 
18595   bool has_visibility = handle_namespace_attrs (current_namespace, attribs);
18596 
18597   warning  (OPT_Wnamespaces, "namespace %qD entered", current_namespace);
18598 
18599   /* Look for the `{' to validate starting the namespace.  */
18600   matching_braces braces;
18601   if (braces.require_open (parser))
18602     {
18603       /* Parse the body of the namespace.  */
18604       cp_parser_namespace_body (parser);
18605 
18606       /* Look for the final `}'.  */
18607       braces.require_close (parser);
18608     }
18609 
18610   if (has_visibility)
18611     pop_visibility (1);
18612 
18613   /* Pop the nested namespace definitions.  */
18614   while (nested_definition_count--)
18615     pop_namespace ();
18616 }
18617 
18618 /* Parse a namespace-body.
18619 
18620    namespace-body:
18621      declaration-seq [opt]  */
18622 
18623 static void
18624 cp_parser_namespace_body (cp_parser* parser)
18625 {
18626   cp_parser_declaration_seq_opt (parser);
18627 }
18628 
18629 /* Parse a namespace-alias-definition.
18630 
18631    namespace-alias-definition:
18632      namespace identifier = qualified-namespace-specifier ;  */
18633 
18634 static void
18635 cp_parser_namespace_alias_definition (cp_parser* parser)
18636 {
18637   tree identifier;
18638   tree namespace_specifier;
18639 
18640   cp_token *token = cp_lexer_peek_token (parser->lexer);
18641 
18642   /* Look for the `namespace' keyword.  */
18643   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
18644   /* Look for the identifier.  */
18645   identifier = cp_parser_identifier (parser);
18646   if (identifier == error_mark_node)
18647     return;
18648   /* Look for the `=' token.  */
18649   if (!cp_parser_uncommitted_to_tentative_parse_p (parser)
18650       && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18651     {
18652       error_at (token->location, "%<namespace%> definition is not allowed here");
18653       /* Skip the definition.  */
18654       cp_lexer_consume_token (parser->lexer);
18655       if (cp_parser_skip_to_closing_brace (parser))
18656 	cp_lexer_consume_token (parser->lexer);
18657       return;
18658     }
18659   cp_parser_require (parser, CPP_EQ, RT_EQ);
18660   /* Look for the qualified-namespace-specifier.  */
18661   namespace_specifier
18662     = cp_parser_qualified_namespace_specifier (parser);
18663   /* Look for the `;' token.  */
18664   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18665 
18666   /* Register the alias in the symbol table.  */
18667   do_namespace_alias (identifier, namespace_specifier);
18668 }
18669 
18670 /* Parse a qualified-namespace-specifier.
18671 
18672    qualified-namespace-specifier:
18673      :: [opt] nested-name-specifier [opt] namespace-name
18674 
18675    Returns a NAMESPACE_DECL corresponding to the specified
18676    namespace.  */
18677 
18678 static tree
18679 cp_parser_qualified_namespace_specifier (cp_parser* parser)
18680 {
18681   /* Look for the optional `::'.  */
18682   cp_parser_global_scope_opt (parser,
18683 			      /*current_scope_valid_p=*/false);
18684 
18685   /* Look for the optional nested-name-specifier.  */
18686   cp_parser_nested_name_specifier_opt (parser,
18687 				       /*typename_keyword_p=*/false,
18688 				       /*check_dependency_p=*/true,
18689 				       /*type_p=*/false,
18690 				       /*is_declaration=*/true);
18691 
18692   return cp_parser_namespace_name (parser);
18693 }
18694 
18695 /* Parse a using-declaration, or, if ACCESS_DECLARATION_P is true, an
18696    access declaration.
18697 
18698    using-declaration:
18699      using typename [opt] :: [opt] nested-name-specifier unqualified-id ;
18700      using :: unqualified-id ;
18701 
18702    access-declaration:
18703      qualified-id ;
18704 
18705    */
18706 
18707 static bool
18708 cp_parser_using_declaration (cp_parser* parser,
18709 			     bool access_declaration_p)
18710 {
18711   cp_token *token;
18712   bool typename_p = false;
18713   bool global_scope_p;
18714   tree decl;
18715   tree identifier;
18716   tree qscope;
18717   int oldcount = errorcount;
18718   cp_token *diag_token = NULL;
18719 
18720   if (access_declaration_p)
18721     {
18722       diag_token = cp_lexer_peek_token (parser->lexer);
18723       cp_parser_parse_tentatively (parser);
18724     }
18725   else
18726     {
18727       /* Look for the `using' keyword.  */
18728       cp_parser_require_keyword (parser, RID_USING, RT_USING);
18729 
18730  again:
18731       /* Peek at the next token.  */
18732       token = cp_lexer_peek_token (parser->lexer);
18733       /* See if it's `typename'.  */
18734       if (token->keyword == RID_TYPENAME)
18735 	{
18736 	  /* Remember that we've seen it.  */
18737 	  typename_p = true;
18738 	  /* Consume the `typename' token.  */
18739 	  cp_lexer_consume_token (parser->lexer);
18740 	}
18741     }
18742 
18743   /* Look for the optional global scope qualification.  */
18744   global_scope_p
18745     = (cp_parser_global_scope_opt (parser,
18746 				   /*current_scope_valid_p=*/false)
18747        != NULL_TREE);
18748 
18749   /* If we saw `typename', or didn't see `::', then there must be a
18750      nested-name-specifier present.  */
18751   if (typename_p || !global_scope_p)
18752     {
18753       qscope = cp_parser_nested_name_specifier (parser, typename_p,
18754 						/*check_dependency_p=*/true,
18755 						/*type_p=*/false,
18756 						/*is_declaration=*/true);
18757       if (!qscope && !cp_parser_uncommitted_to_tentative_parse_p (parser))
18758 	{
18759 	  cp_parser_skip_to_end_of_block_or_statement (parser);
18760 	  return false;
18761 	}
18762     }
18763   /* Otherwise, we could be in either of the two productions.  In that
18764      case, treat the nested-name-specifier as optional.  */
18765   else
18766     qscope = cp_parser_nested_name_specifier_opt (parser,
18767 						  /*typename_keyword_p=*/false,
18768 						  /*check_dependency_p=*/true,
18769 						  /*type_p=*/false,
18770 						  /*is_declaration=*/true);
18771   if (!qscope)
18772     qscope = global_namespace;
18773   else if (UNSCOPED_ENUM_P (qscope))
18774     qscope = CP_TYPE_CONTEXT (qscope);
18775 
18776   if (access_declaration_p && cp_parser_error_occurred (parser))
18777     /* Something has already gone wrong; there's no need to parse
18778        further.  Since an error has occurred, the return value of
18779        cp_parser_parse_definitely will be false, as required.  */
18780     return cp_parser_parse_definitely (parser);
18781 
18782   token = cp_lexer_peek_token (parser->lexer);
18783   /* Parse the unqualified-id.  */
18784   identifier = cp_parser_unqualified_id (parser,
18785 					 /*template_keyword_p=*/false,
18786 					 /*check_dependency_p=*/true,
18787 					 /*declarator_p=*/true,
18788 					 /*optional_p=*/false);
18789 
18790   if (access_declaration_p)
18791     {
18792       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
18793 	cp_parser_simulate_error (parser);
18794       if (!cp_parser_parse_definitely (parser))
18795 	return false;
18796     }
18797   else if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18798     {
18799       cp_token *ell = cp_lexer_consume_token (parser->lexer);
18800       if (cxx_dialect < cxx17
18801 	  && !in_system_header_at (ell->location))
18802 	pedwarn (ell->location, 0,
18803 		 "pack expansion in using-declaration only available "
18804 		 "with -std=c++17 or -std=gnu++17");
18805       qscope = make_pack_expansion (qscope);
18806     }
18807 
18808   /* The function we call to handle a using-declaration is different
18809      depending on what scope we are in.  */
18810   if (qscope == error_mark_node || identifier == error_mark_node)
18811     ;
18812   else if (!identifier_p (identifier)
18813 	   && TREE_CODE (identifier) != BIT_NOT_EXPR)
18814     /* [namespace.udecl]
18815 
18816        A using declaration shall not name a template-id.  */
18817     error_at (token->location,
18818 	      "a template-id may not appear in a using-declaration");
18819   else
18820     {
18821       if (at_class_scope_p ())
18822 	{
18823 	  /* Create the USING_DECL.  */
18824 	  decl = do_class_using_decl (qscope, identifier);
18825 
18826 	  if (decl && typename_p)
18827 	    USING_DECL_TYPENAME_P (decl) = 1;
18828 
18829 	  if (check_for_bare_parameter_packs (decl))
18830 	    {
18831 	      cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18832 	      return false;
18833 	    }
18834 	  else
18835 	    /* Add it to the list of members in this class.  */
18836 	    finish_member_declaration (decl);
18837 	}
18838       else
18839 	{
18840 	  decl = cp_parser_lookup_name_simple (parser,
18841 					       identifier,
18842 					       token->location);
18843 	  if (decl == error_mark_node)
18844 	    cp_parser_name_lookup_error (parser, identifier,
18845 					 decl, NLE_NULL,
18846 					 token->location);
18847 	  else if (check_for_bare_parameter_packs (decl))
18848 	    {
18849 	      cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18850 	      return false;
18851 	    }
18852 	  else if (!at_namespace_scope_p ())
18853 	    finish_local_using_decl (decl, qscope, identifier);
18854 	  else
18855 	    finish_namespace_using_decl (decl, qscope, identifier);
18856 	}
18857     }
18858 
18859   if (!access_declaration_p
18860       && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18861     {
18862       cp_token *comma = cp_lexer_consume_token (parser->lexer);
18863       if (cxx_dialect < cxx17)
18864 	pedwarn (comma->location, 0,
18865 		 "comma-separated list in using-declaration only available "
18866 		 "with -std=c++17 or -std=gnu++17");
18867       goto again;
18868     }
18869 
18870   /* Look for the final `;'.  */
18871   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18872 
18873   if (access_declaration_p && errorcount == oldcount)
18874     warning_at (diag_token->location, OPT_Wdeprecated,
18875 		"access declarations are deprecated "
18876 		"in favour of using-declarations; "
18877 		"suggestion: add the %<using%> keyword");
18878 
18879   return true;
18880 }
18881 
18882 /* Parse an alias-declaration.
18883 
18884    alias-declaration:
18885      using identifier attribute-specifier-seq [opt] = type-id  */
18886 
18887 static tree
18888 cp_parser_alias_declaration (cp_parser* parser)
18889 {
18890   tree id, type, decl, pushed_scope = NULL_TREE, attributes;
18891   location_t id_location;
18892   cp_declarator *declarator;
18893   cp_decl_specifier_seq decl_specs;
18894   bool member_p;
18895   const char *saved_message = NULL;
18896 
18897   /* Look for the `using' keyword.  */
18898   cp_token *using_token
18899     = cp_parser_require_keyword (parser, RID_USING, RT_USING);
18900   if (using_token == NULL)
18901     return error_mark_node;
18902 
18903   id_location = cp_lexer_peek_token (parser->lexer)->location;
18904   id = cp_parser_identifier (parser);
18905   if (id == error_mark_node)
18906     return error_mark_node;
18907 
18908   cp_token *attrs_token = cp_lexer_peek_token (parser->lexer);
18909   attributes = cp_parser_attributes_opt (parser);
18910   if (attributes == error_mark_node)
18911     return error_mark_node;
18912 
18913   cp_parser_require (parser, CPP_EQ, RT_EQ);
18914 
18915   if (cp_parser_error_occurred (parser))
18916     return error_mark_node;
18917 
18918   cp_parser_commit_to_tentative_parse (parser);
18919 
18920   /* Now we are going to parse the type-id of the declaration.  */
18921 
18922   /*
18923     [dcl.type]/3 says:
18924 
18925 	"A type-specifier-seq shall not define a class or enumeration
18926 	 unless it appears in the type-id of an alias-declaration (7.1.3) that
18927 	 is not the declaration of a template-declaration."
18928 
18929     In other words, if we currently are in an alias template, the
18930     type-id should not define a type.
18931 
18932     So let's set parser->type_definition_forbidden_message in that
18933     case; cp_parser_check_type_definition (called by
18934     cp_parser_class_specifier) will then emit an error if a type is
18935     defined in the type-id.  */
18936   if (parser->num_template_parameter_lists)
18937     {
18938       saved_message = parser->type_definition_forbidden_message;
18939       parser->type_definition_forbidden_message =
18940 	G_("types may not be defined in alias template declarations");
18941     }
18942 
18943   type = cp_parser_type_id (parser);
18944 
18945   /* Restore the error message if need be.  */
18946   if (parser->num_template_parameter_lists)
18947     parser->type_definition_forbidden_message = saved_message;
18948 
18949   if (type == error_mark_node
18950       || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
18951     {
18952       cp_parser_skip_to_end_of_block_or_statement (parser);
18953       return error_mark_node;
18954     }
18955 
18956   /* A typedef-name can also be introduced by an alias-declaration. The
18957      identifier following the using keyword becomes a typedef-name. It has
18958      the same semantics as if it were introduced by the typedef
18959      specifier. In particular, it does not define a new type and it shall
18960      not appear in the type-id.  */
18961 
18962   clear_decl_specs (&decl_specs);
18963   decl_specs.type = type;
18964   if (attributes != NULL_TREE)
18965     {
18966       decl_specs.attributes = attributes;
18967       set_and_check_decl_spec_loc (&decl_specs,
18968 				   ds_attribute,
18969 				   attrs_token);
18970     }
18971   set_and_check_decl_spec_loc (&decl_specs,
18972 			       ds_typedef,
18973 			       using_token);
18974   set_and_check_decl_spec_loc (&decl_specs,
18975 			       ds_alias,
18976 			       using_token);
18977 
18978   if (parser->num_template_parameter_lists
18979       && !cp_parser_check_template_parameters (parser,
18980 					       /*num_templates=*/0,
18981 					       /*template_id*/false,
18982 					       id_location,
18983 					       /*declarator=*/NULL))
18984     return error_mark_node;
18985 
18986   declarator = make_id_declarator (NULL_TREE, id, sfk_none);
18987   declarator->id_loc = id_location;
18988 
18989   member_p = at_class_scope_p ();
18990   if (member_p)
18991     decl = grokfield (declarator, &decl_specs, NULL_TREE, false,
18992 		      NULL_TREE, attributes);
18993   else
18994     decl = start_decl (declarator, &decl_specs, 0,
18995 		       attributes, NULL_TREE, &pushed_scope);
18996   if (decl == error_mark_node)
18997     return decl;
18998 
18999   // Attach constraints to the alias declaration.
19000   if (flag_concepts && current_template_parms)
19001     {
19002       tree reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
19003       tree constr = build_constraints (reqs, NULL_TREE);
19004       set_constraints (decl, constr);
19005     }
19006 
19007   cp_finish_decl (decl, NULL_TREE, 0, NULL_TREE, 0);
19008 
19009   if (pushed_scope)
19010     pop_scope (pushed_scope);
19011 
19012   /* If decl is a template, return its TEMPLATE_DECL so that it gets
19013      added into the symbol table; otherwise, return the TYPE_DECL.  */
19014   if (DECL_LANG_SPECIFIC (decl)
19015       && DECL_TEMPLATE_INFO (decl)
19016       && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (decl)))
19017     {
19018       decl = DECL_TI_TEMPLATE (decl);
19019       if (member_p)
19020 	check_member_template (decl);
19021     }
19022 
19023   return decl;
19024 }
19025 
19026 /* Parse a using-directive.
19027 
19028    using-directive:
19029      using namespace :: [opt] nested-name-specifier [opt]
19030        namespace-name ;  */
19031 
19032 static void
19033 cp_parser_using_directive (cp_parser* parser)
19034 {
19035   tree namespace_decl;
19036   tree attribs;
19037 
19038   /* Look for the `using' keyword.  */
19039   cp_parser_require_keyword (parser, RID_USING, RT_USING);
19040   /* And the `namespace' keyword.  */
19041   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
19042   /* Look for the optional `::' operator.  */
19043   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
19044   /* And the optional nested-name-specifier.  */
19045   cp_parser_nested_name_specifier_opt (parser,
19046 				       /*typename_keyword_p=*/false,
19047 				       /*check_dependency_p=*/true,
19048 				       /*type_p=*/false,
19049 				       /*is_declaration=*/true);
19050   /* Get the namespace being used.  */
19051   namespace_decl = cp_parser_namespace_name (parser);
19052   /* And any specified attributes.  */
19053   attribs = cp_parser_attributes_opt (parser);
19054 
19055   /* Update the symbol table.  */
19056   if (namespace_bindings_p ())
19057     finish_namespace_using_directive (namespace_decl, attribs);
19058   else
19059     finish_local_using_directive (namespace_decl, attribs);
19060 
19061   /* Look for the final `;'.  */
19062   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19063 }
19064 
19065 /* Parse an asm-definition.
19066 
19067    asm-definition:
19068      asm ( string-literal ) ;
19069 
19070    GNU Extension:
19071 
19072    asm-definition:
19073      asm volatile [opt] ( string-literal ) ;
19074      asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
19075      asm volatile [opt] ( string-literal : asm-operand-list [opt]
19076 			  : asm-operand-list [opt] ) ;
19077      asm volatile [opt] ( string-literal : asm-operand-list [opt]
19078 			  : asm-operand-list [opt]
19079 			  : asm-clobber-list [opt] ) ;
19080      asm volatile [opt] goto ( string-literal : : asm-operand-list [opt]
19081 			       : asm-clobber-list [opt]
19082 			       : asm-goto-list ) ;  */
19083 
19084 static void
19085 cp_parser_asm_definition (cp_parser* parser)
19086 {
19087   tree string;
19088   tree outputs = NULL_TREE;
19089   tree inputs = NULL_TREE;
19090   tree clobbers = NULL_TREE;
19091   tree labels = NULL_TREE;
19092   tree asm_stmt;
19093   bool volatile_p = false;
19094   bool extended_p = false;
19095   bool invalid_inputs_p = false;
19096   bool invalid_outputs_p = false;
19097   bool goto_p = false;
19098   required_token missing = RT_NONE;
19099 
19100   /* Look for the `asm' keyword.  */
19101   cp_parser_require_keyword (parser, RID_ASM, RT_ASM);
19102 
19103   if (parser->in_function_body
19104       && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
19105     {
19106       error ("%<asm%> in %<constexpr%> function");
19107       cp_function_chain->invalid_constexpr = true;
19108     }
19109 
19110   /* See if the next token is `volatile'.  */
19111   if (cp_parser_allow_gnu_extensions_p (parser)
19112       && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE))
19113     {
19114       /* Remember that we saw the `volatile' keyword.  */
19115       volatile_p = true;
19116       /* Consume the token.  */
19117       cp_lexer_consume_token (parser->lexer);
19118     }
19119   if (cp_parser_allow_gnu_extensions_p (parser)
19120       && parser->in_function_body
19121       && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO))
19122     {
19123       /* Remember that we saw the `goto' keyword.  */
19124       goto_p = true;
19125       /* Consume the token.  */
19126       cp_lexer_consume_token (parser->lexer);
19127     }
19128   /* Look for the opening `('.  */
19129   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
19130     return;
19131   /* Look for the string.  */
19132   string = cp_parser_string_literal (parser, false, false);
19133   if (string == error_mark_node)
19134     {
19135       cp_parser_skip_to_closing_parenthesis (parser, true, false,
19136 					     /*consume_paren=*/true);
19137       return;
19138     }
19139 
19140   /* If we're allowing GNU extensions, check for the extended assembly
19141      syntax.  Unfortunately, the `:' tokens need not be separated by
19142      a space in C, and so, for compatibility, we tolerate that here
19143      too.  Doing that means that we have to treat the `::' operator as
19144      two `:' tokens.  */
19145   if (cp_parser_allow_gnu_extensions_p (parser)
19146       && parser->in_function_body
19147       && (cp_lexer_next_token_is (parser->lexer, CPP_COLON)
19148 	  || cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)))
19149     {
19150       bool inputs_p = false;
19151       bool clobbers_p = false;
19152       bool labels_p = false;
19153 
19154       /* The extended syntax was used.  */
19155       extended_p = true;
19156 
19157       /* Look for outputs.  */
19158       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
19159 	{
19160 	  /* Consume the `:'.  */
19161 	  cp_lexer_consume_token (parser->lexer);
19162 	  /* Parse the output-operands.  */
19163 	  if (cp_lexer_next_token_is_not (parser->lexer,
19164 					  CPP_COLON)
19165 	      && cp_lexer_next_token_is_not (parser->lexer,
19166 					     CPP_SCOPE)
19167 	      && cp_lexer_next_token_is_not (parser->lexer,
19168 					     CPP_CLOSE_PAREN)
19169 	      && !goto_p)
19170             {
19171               outputs = cp_parser_asm_operand_list (parser);
19172               if (outputs == error_mark_node)
19173                 invalid_outputs_p = true;
19174             }
19175 	}
19176       /* If the next token is `::', there are no outputs, and the
19177 	 next token is the beginning of the inputs.  */
19178       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
19179 	/* The inputs are coming next.  */
19180 	inputs_p = true;
19181 
19182       /* Look for inputs.  */
19183       if (inputs_p
19184 	  || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
19185 	{
19186 	  /* Consume the `:' or `::'.  */
19187 	  cp_lexer_consume_token (parser->lexer);
19188 	  /* Parse the output-operands.  */
19189 	  if (cp_lexer_next_token_is_not (parser->lexer,
19190 					  CPP_COLON)
19191 	      && cp_lexer_next_token_is_not (parser->lexer,
19192 					     CPP_SCOPE)
19193 	      && cp_lexer_next_token_is_not (parser->lexer,
19194 					     CPP_CLOSE_PAREN))
19195             {
19196               inputs = cp_parser_asm_operand_list (parser);
19197               if (inputs == error_mark_node)
19198                 invalid_inputs_p = true;
19199             }
19200 	}
19201       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
19202 	/* The clobbers are coming next.  */
19203 	clobbers_p = true;
19204 
19205       /* Look for clobbers.  */
19206       if (clobbers_p
19207 	  || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
19208 	{
19209 	  clobbers_p = true;
19210 	  /* Consume the `:' or `::'.  */
19211 	  cp_lexer_consume_token (parser->lexer);
19212 	  /* Parse the clobbers.  */
19213 	  if (cp_lexer_next_token_is_not (parser->lexer,
19214 					  CPP_COLON)
19215 	      && cp_lexer_next_token_is_not (parser->lexer,
19216 					     CPP_CLOSE_PAREN))
19217 	    clobbers = cp_parser_asm_clobber_list (parser);
19218 	}
19219       else if (goto_p
19220 	       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
19221 	/* The labels are coming next.  */
19222 	labels_p = true;
19223 
19224       /* Look for labels.  */
19225       if (labels_p
19226 	  || (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_COLON)))
19227 	{
19228 	  labels_p = true;
19229 	  /* Consume the `:' or `::'.  */
19230 	  cp_lexer_consume_token (parser->lexer);
19231 	  /* Parse the labels.  */
19232 	  labels = cp_parser_asm_label_list (parser);
19233 	}
19234 
19235       if (goto_p && !labels_p)
19236 	missing = clobbers_p ? RT_COLON : RT_COLON_SCOPE;
19237     }
19238   else if (goto_p)
19239     missing = RT_COLON_SCOPE;
19240 
19241   /* Look for the closing `)'.  */
19242   if (!cp_parser_require (parser, missing ? CPP_COLON : CPP_CLOSE_PAREN,
19243 			  missing ? missing : RT_CLOSE_PAREN))
19244     cp_parser_skip_to_closing_parenthesis (parser, true, false,
19245 					   /*consume_paren=*/true);
19246   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19247 
19248   if (!invalid_inputs_p && !invalid_outputs_p)
19249     {
19250       /* Create the ASM_EXPR.  */
19251       if (parser->in_function_body)
19252 	{
19253 	  asm_stmt = finish_asm_stmt (volatile_p, string, outputs,
19254 				      inputs, clobbers, labels);
19255 	  /* If the extended syntax was not used, mark the ASM_EXPR.  */
19256 	  if (!extended_p)
19257 	    {
19258 	      tree temp = asm_stmt;
19259 	      if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
19260 		temp = TREE_OPERAND (temp, 0);
19261 
19262 	      ASM_INPUT_P (temp) = 1;
19263 	    }
19264 	}
19265       else
19266 	symtab->finalize_toplevel_asm (string);
19267     }
19268 }
19269 
19270 /* Given the type TYPE of a declaration with declarator DECLARATOR, return the
19271    type that comes from the decl-specifier-seq.  */
19272 
19273 static tree
19274 strip_declarator_types (tree type, cp_declarator *declarator)
19275 {
19276   for (cp_declarator *d = declarator; d;)
19277     switch (d->kind)
19278       {
19279       case cdk_id:
19280       case cdk_decomp:
19281       case cdk_error:
19282 	d = NULL;
19283 	break;
19284 
19285       default:
19286 	if (TYPE_PTRMEMFUNC_P (type))
19287 	  type = TYPE_PTRMEMFUNC_FN_TYPE (type);
19288 	type = TREE_TYPE (type);
19289 	d = d->declarator;
19290 	break;
19291       }
19292 
19293   return type;
19294 }
19295 
19296 /* Declarators [gram.dcl.decl] */
19297 
19298 /* Parse an init-declarator.
19299 
19300    init-declarator:
19301      declarator initializer [opt]
19302 
19303    GNU Extension:
19304 
19305    init-declarator:
19306      declarator asm-specification [opt] attributes [opt] initializer [opt]
19307 
19308    function-definition:
19309      decl-specifier-seq [opt] declarator ctor-initializer [opt]
19310        function-body
19311      decl-specifier-seq [opt] declarator function-try-block
19312 
19313    GNU Extension:
19314 
19315    function-definition:
19316      __extension__ function-definition
19317 
19318    TM Extension:
19319 
19320    function-definition:
19321      decl-specifier-seq [opt] declarator function-transaction-block
19322 
19323    The DECL_SPECIFIERS apply to this declarator.  Returns a
19324    representation of the entity declared.  If MEMBER_P is TRUE, then
19325    this declarator appears in a class scope.  The new DECL created by
19326    this declarator is returned.
19327 
19328    The CHECKS are access checks that should be performed once we know
19329    what entity is being declared (and, therefore, what classes have
19330    befriended it).
19331 
19332    If FUNCTION_DEFINITION_ALLOWED_P then we handle the declarator and
19333    for a function-definition here as well.  If the declarator is a
19334    declarator for a function-definition, *FUNCTION_DEFINITION_P will
19335    be TRUE upon return.  By that point, the function-definition will
19336    have been completely parsed.
19337 
19338    FUNCTION_DEFINITION_P may be NULL if FUNCTION_DEFINITION_ALLOWED_P
19339    is FALSE.
19340 
19341    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
19342    parsed declaration if it is an uninitialized single declarator not followed
19343    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
19344    if present, will not be consumed.  If returned, this declarator will be
19345    created with SD_INITIALIZED but will not call cp_finish_decl.
19346 
19347    If INIT_LOC is not NULL, and *INIT_LOC is equal to UNKNOWN_LOCATION,
19348    and there is an initializer, the pointed location_t is set to the
19349    location of the '=' or `(', or '{' in C++11 token introducing the
19350    initializer.  */
19351 
19352 static tree
19353 cp_parser_init_declarator (cp_parser* parser,
19354 			   cp_decl_specifier_seq *decl_specifiers,
19355 			   vec<deferred_access_check, va_gc> *checks,
19356 			   bool function_definition_allowed_p,
19357 			   bool member_p,
19358 			   int declares_class_or_enum,
19359 			   bool* function_definition_p,
19360 			   tree* maybe_range_for_decl,
19361 			   location_t* init_loc,
19362 			   tree* auto_result)
19363 {
19364   cp_token *token = NULL, *asm_spec_start_token = NULL,
19365            *attributes_start_token = NULL;
19366   cp_declarator *declarator;
19367   tree prefix_attributes;
19368   tree attributes = NULL;
19369   tree asm_specification;
19370   tree initializer;
19371   tree decl = NULL_TREE;
19372   tree scope;
19373   int is_initialized;
19374   /* Only valid if IS_INITIALIZED is true.  In that case, CPP_EQ if
19375      initialized with "= ..", CPP_OPEN_PAREN if initialized with
19376      "(...)".  */
19377   enum cpp_ttype initialization_kind;
19378   bool is_direct_init = false;
19379   bool is_non_constant_init;
19380   int ctor_dtor_or_conv_p;
19381   bool friend_p = cp_parser_friend_p (decl_specifiers);
19382   tree pushed_scope = NULL_TREE;
19383   bool range_for_decl_p = false;
19384   bool saved_default_arg_ok_p = parser->default_arg_ok_p;
19385   location_t tmp_init_loc = UNKNOWN_LOCATION;
19386 
19387   /* Gather the attributes that were provided with the
19388      decl-specifiers.  */
19389   prefix_attributes = decl_specifiers->attributes;
19390 
19391   /* Assume that this is not the declarator for a function
19392      definition.  */
19393   if (function_definition_p)
19394     *function_definition_p = false;
19395 
19396   /* Default arguments are only permitted for function parameters.  */
19397   if (decl_spec_seq_has_spec_p (decl_specifiers, ds_typedef))
19398     parser->default_arg_ok_p = false;
19399 
19400   /* Defer access checks while parsing the declarator; we cannot know
19401      what names are accessible until we know what is being
19402      declared.  */
19403   resume_deferring_access_checks ();
19404 
19405   token = cp_lexer_peek_token (parser->lexer);
19406 
19407   /* Parse the declarator.  */
19408   declarator
19409     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
19410 			    &ctor_dtor_or_conv_p,
19411 			    /*parenthesized_p=*/NULL,
19412 			    member_p, friend_p);
19413   /* Gather up the deferred checks.  */
19414   stop_deferring_access_checks ();
19415 
19416   parser->default_arg_ok_p = saved_default_arg_ok_p;
19417 
19418   /* If the DECLARATOR was erroneous, there's no need to go
19419      further.  */
19420   if (declarator == cp_error_declarator)
19421     return error_mark_node;
19422 
19423   /* Check that the number of template-parameter-lists is OK.  */
19424   if (!cp_parser_check_declarator_template_parameters (parser, declarator,
19425 						       token->location))
19426     return error_mark_node;
19427 
19428   if (declares_class_or_enum & 2)
19429     cp_parser_check_for_definition_in_return_type (declarator,
19430 						   decl_specifiers->type,
19431 						   decl_specifiers->locations[ds_type_spec]);
19432 
19433   /* Figure out what scope the entity declared by the DECLARATOR is
19434      located in.  `grokdeclarator' sometimes changes the scope, so
19435      we compute it now.  */
19436   scope = get_scope_of_declarator (declarator);
19437 
19438   /* Perform any lookups in the declared type which were thought to be
19439      dependent, but are not in the scope of the declarator.  */
19440   decl_specifiers->type
19441     = maybe_update_decl_type (decl_specifiers->type, scope);
19442 
19443   /* If we're allowing GNU extensions, look for an
19444      asm-specification.  */
19445   if (cp_parser_allow_gnu_extensions_p (parser))
19446     {
19447       /* Look for an asm-specification.  */
19448       asm_spec_start_token = cp_lexer_peek_token (parser->lexer);
19449       asm_specification = cp_parser_asm_specification_opt (parser);
19450     }
19451   else
19452     asm_specification = NULL_TREE;
19453 
19454   /* Look for attributes.  */
19455   attributes_start_token = cp_lexer_peek_token (parser->lexer);
19456   attributes = cp_parser_attributes_opt (parser);
19457 
19458   /* Peek at the next token.  */
19459   token = cp_lexer_peek_token (parser->lexer);
19460 
19461   bool bogus_implicit_tmpl = false;
19462 
19463   if (function_declarator_p (declarator))
19464     {
19465       /* Handle C++17 deduction guides.  */
19466       if (!decl_specifiers->type
19467 	  && ctor_dtor_or_conv_p <= 0
19468 	  && cxx_dialect >= cxx17)
19469 	{
19470 	  cp_declarator *id = get_id_declarator (declarator);
19471 	  tree name = id->u.id.unqualified_name;
19472 	  parser->scope = id->u.id.qualifying_scope;
19473 	  tree tmpl = cp_parser_lookup_name_simple (parser, name, id->id_loc);
19474 	  if (tmpl
19475 	      && (DECL_CLASS_TEMPLATE_P (tmpl)
19476 		  || DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl)))
19477 	    {
19478 	      id->u.id.unqualified_name = dguide_name (tmpl);
19479 	      id->u.id.sfk = sfk_deduction_guide;
19480 	      ctor_dtor_or_conv_p = 1;
19481 	    }
19482 	}
19483 
19484       /* Check to see if the token indicates the start of a
19485 	 function-definition.  */
19486       if (cp_parser_token_starts_function_definition_p (token))
19487 	{
19488 	  if (!function_definition_allowed_p)
19489 	    {
19490 	      /* If a function-definition should not appear here, issue an
19491 		 error message.  */
19492 	      cp_parser_error (parser,
19493 			       "a function-definition is not allowed here");
19494 	      return error_mark_node;
19495 	    }
19496 
19497 	  location_t func_brace_location
19498 	    = cp_lexer_peek_token (parser->lexer)->location;
19499 
19500 	  /* Neither attributes nor an asm-specification are allowed
19501 	     on a function-definition.  */
19502 	  if (asm_specification)
19503 	    error_at (asm_spec_start_token->location,
19504 		      "an asm-specification is not allowed "
19505 		      "on a function-definition");
19506 	  if (attributes)
19507 	    error_at (attributes_start_token->location,
19508 		      "attributes are not allowed "
19509 		      "on a function-definition");
19510 	  /* This is a function-definition.  */
19511 	  *function_definition_p = true;
19512 
19513 	  /* Parse the function definition.  */
19514 	  if (member_p)
19515 	    decl = cp_parser_save_member_function_body (parser,
19516 							decl_specifiers,
19517 							declarator,
19518 							prefix_attributes);
19519 	  else
19520 	    decl =
19521 	      (cp_parser_function_definition_from_specifiers_and_declarator
19522 	       (parser, decl_specifiers, prefix_attributes, declarator));
19523 
19524 	  if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
19525 	    {
19526 	      /* This is where the prologue starts...  */
19527 	      DECL_STRUCT_FUNCTION (decl)->function_start_locus
19528 		= func_brace_location;
19529 	    }
19530 
19531 	  return decl;
19532 	}
19533     }
19534   else if (parser->fully_implicit_function_template_p)
19535     {
19536       /* A non-template declaration involving a function parameter list
19537 	 containing an implicit template parameter will be made into a
19538 	 template.  If the resulting declaration is not going to be an
19539 	 actual function then finish the template scope here to prevent it.
19540 	 An error message will be issued once we have a decl to talk about.
19541 
19542          FIXME probably we should do type deduction rather than create an
19543          implicit template, but the standard currently doesn't allow it. */
19544       bogus_implicit_tmpl = true;
19545       finish_fully_implicit_template (parser, NULL_TREE);
19546     }
19547 
19548   /* [dcl.dcl]
19549 
19550      Only in function declarations for constructors, destructors, type
19551      conversions, and deduction guides can the decl-specifier-seq be omitted.
19552 
19553      We explicitly postpone this check past the point where we handle
19554      function-definitions because we tolerate function-definitions
19555      that are missing their return types in some modes.  */
19556   if (!decl_specifiers->any_specifiers_p && ctor_dtor_or_conv_p <= 0)
19557     {
19558       cp_parser_error (parser,
19559 		       "expected constructor, destructor, or type conversion");
19560       return error_mark_node;
19561     }
19562 
19563   /* An `=' or an `(', or an '{' in C++0x, indicates an initializer.  */
19564   if (token->type == CPP_EQ
19565       || token->type == CPP_OPEN_PAREN
19566       || token->type == CPP_OPEN_BRACE)
19567     {
19568       is_initialized = SD_INITIALIZED;
19569       initialization_kind = token->type;
19570       if (maybe_range_for_decl)
19571 	*maybe_range_for_decl = error_mark_node;
19572       tmp_init_loc = token->location;
19573       if (init_loc && *init_loc == UNKNOWN_LOCATION)
19574 	*init_loc = tmp_init_loc;
19575 
19576       if (token->type == CPP_EQ
19577 	  && function_declarator_p (declarator))
19578 	{
19579 	  cp_token *t2 = cp_lexer_peek_nth_token (parser->lexer, 2);
19580 	  if (t2->keyword == RID_DEFAULT)
19581 	    is_initialized = SD_DEFAULTED;
19582 	  else if (t2->keyword == RID_DELETE)
19583 	    is_initialized = SD_DELETED;
19584 	}
19585     }
19586   else
19587     {
19588       /* If the init-declarator isn't initialized and isn't followed by a
19589 	 `,' or `;', it's not a valid init-declarator.  */
19590       if (token->type != CPP_COMMA
19591 	  && token->type != CPP_SEMICOLON)
19592 	{
19593 	  if (maybe_range_for_decl && *maybe_range_for_decl != error_mark_node)
19594 	    range_for_decl_p = true;
19595 	  else
19596 	    {
19597 	      if (!maybe_range_for_decl)
19598 		cp_parser_error (parser, "expected initializer");
19599 	      return error_mark_node;
19600 	    }
19601 	}
19602       is_initialized = SD_UNINITIALIZED;
19603       initialization_kind = CPP_EOF;
19604     }
19605 
19606   /* Because start_decl has side-effects, we should only call it if we
19607      know we're going ahead.  By this point, we know that we cannot
19608      possibly be looking at any other construct.  */
19609   cp_parser_commit_to_tentative_parse (parser);
19610 
19611   /* Enter the newly declared entry in the symbol table.  If we're
19612      processing a declaration in a class-specifier, we wait until
19613      after processing the initializer.  */
19614   if (!member_p)
19615     {
19616       if (parser->in_unbraced_linkage_specification_p)
19617 	decl_specifiers->storage_class = sc_extern;
19618       decl = start_decl (declarator, decl_specifiers,
19619 			 range_for_decl_p? SD_INITIALIZED : is_initialized,
19620 			 attributes, prefix_attributes, &pushed_scope);
19621       cp_finalize_omp_declare_simd (parser, decl);
19622       cp_finalize_oacc_routine (parser, decl, false);
19623       /* Adjust location of decl if declarator->id_loc is more appropriate:
19624 	 set, and decl wasn't merged with another decl, in which case its
19625 	 location would be different from input_location, and more accurate.  */
19626       if (DECL_P (decl)
19627 	  && declarator->id_loc != UNKNOWN_LOCATION
19628 	  && DECL_SOURCE_LOCATION (decl) == input_location)
19629 	DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
19630     }
19631   else if (scope)
19632     /* Enter the SCOPE.  That way unqualified names appearing in the
19633        initializer will be looked up in SCOPE.  */
19634     pushed_scope = push_scope (scope);
19635 
19636   /* Perform deferred access control checks, now that we know in which
19637      SCOPE the declared entity resides.  */
19638   if (!member_p && decl)
19639     {
19640       tree saved_current_function_decl = NULL_TREE;
19641 
19642       /* If the entity being declared is a function, pretend that we
19643 	 are in its scope.  If it is a `friend', it may have access to
19644 	 things that would not otherwise be accessible.  */
19645       if (TREE_CODE (decl) == FUNCTION_DECL)
19646 	{
19647 	  saved_current_function_decl = current_function_decl;
19648 	  current_function_decl = decl;
19649 	}
19650 
19651       /* Perform access checks for template parameters.  */
19652       cp_parser_perform_template_parameter_access_checks (checks);
19653 
19654       /* Perform the access control checks for the declarator and the
19655 	 decl-specifiers.  */
19656       perform_deferred_access_checks (tf_warning_or_error);
19657 
19658       /* Restore the saved value.  */
19659       if (TREE_CODE (decl) == FUNCTION_DECL)
19660 	current_function_decl = saved_current_function_decl;
19661     }
19662 
19663   /* Parse the initializer.  */
19664   initializer = NULL_TREE;
19665   is_direct_init = false;
19666   is_non_constant_init = true;
19667   if (is_initialized)
19668     {
19669       if (function_declarator_p (declarator))
19670 	{
19671 	   if (initialization_kind == CPP_EQ)
19672 	     initializer = cp_parser_pure_specifier (parser);
19673 	   else
19674 	     {
19675 	       /* If the declaration was erroneous, we don't really
19676 		  know what the user intended, so just silently
19677 		  consume the initializer.  */
19678 	       if (decl != error_mark_node)
19679 		 error_at (tmp_init_loc, "initializer provided for function");
19680 	       cp_parser_skip_to_closing_parenthesis (parser,
19681 						      /*recovering=*/true,
19682 						      /*or_comma=*/false,
19683 						      /*consume_paren=*/true);
19684 	     }
19685 	}
19686       else
19687 	{
19688 	  /* We want to record the extra mangling scope for in-class
19689 	     initializers of class members and initializers of static data
19690 	     member templates.  The former involves deferring
19691 	     parsing of the initializer until end of class as with default
19692 	     arguments.  So right here we only handle the latter.  */
19693 	  if (!member_p && processing_template_decl && decl != error_mark_node)
19694 	    start_lambda_scope (decl);
19695 	  initializer = cp_parser_initializer (parser,
19696 					       &is_direct_init,
19697 					       &is_non_constant_init);
19698 	  if (!member_p && processing_template_decl && decl != error_mark_node)
19699 	    finish_lambda_scope ();
19700 	  if (initializer == error_mark_node)
19701 	    cp_parser_skip_to_end_of_statement (parser);
19702 	}
19703     }
19704 
19705   /* The old parser allows attributes to appear after a parenthesized
19706      initializer.  Mark Mitchell proposed removing this functionality
19707      on the GCC mailing lists on 2002-08-13.  This parser accepts the
19708      attributes -- but ignores them.  Made a permerror in GCC 8.  */
19709   if (cp_parser_allow_gnu_extensions_p (parser)
19710       && initialization_kind == CPP_OPEN_PAREN
19711       && cp_parser_attributes_opt (parser)
19712       && permerror (input_location,
19713 		    "attributes after parenthesized initializer ignored"))
19714     {
19715       static bool hint;
19716       if (flag_permissive && !hint)
19717 	{
19718 	  hint = true;
19719 	  inform (input_location,
19720 		  "this flexibility is deprecated and will be removed");
19721 	}
19722     }
19723 
19724   /* And now complain about a non-function implicit template.  */
19725   if (bogus_implicit_tmpl && decl != error_mark_node)
19726     error_at (DECL_SOURCE_LOCATION (decl),
19727 	      "non-function %qD declared as implicit template", decl);
19728 
19729   /* For an in-class declaration, use `grokfield' to create the
19730      declaration.  */
19731   if (member_p)
19732     {
19733       if (pushed_scope)
19734 	{
19735 	  pop_scope (pushed_scope);
19736 	  pushed_scope = NULL_TREE;
19737 	}
19738       decl = grokfield (declarator, decl_specifiers,
19739 			initializer, !is_non_constant_init,
19740 			/*asmspec=*/NULL_TREE,
19741 			attr_chainon (attributes, prefix_attributes));
19742       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
19743 	cp_parser_save_default_args (parser, decl);
19744       cp_finalize_omp_declare_simd (parser, decl);
19745       cp_finalize_oacc_routine (parser, decl, false);
19746     }
19747 
19748   /* Finish processing the declaration.  But, skip member
19749      declarations.  */
19750   if (!member_p && decl && decl != error_mark_node && !range_for_decl_p)
19751     {
19752       cp_finish_decl (decl,
19753 		      initializer, !is_non_constant_init,
19754 		      asm_specification,
19755 		      /* If the initializer is in parentheses, then this is
19756 			 a direct-initialization, which means that an
19757 			 `explicit' constructor is OK.  Otherwise, an
19758 			 `explicit' constructor cannot be used.  */
19759 		      ((is_direct_init || !is_initialized)
19760 		       ? LOOKUP_NORMAL : LOOKUP_IMPLICIT));
19761     }
19762   else if ((cxx_dialect != cxx98) && friend_p
19763 	   && decl && TREE_CODE (decl) == FUNCTION_DECL)
19764     /* Core issue #226 (C++0x only): A default template-argument
19765        shall not be specified in a friend class template
19766        declaration. */
19767     check_default_tmpl_args (decl, current_template_parms, /*is_primary=*/true,
19768                              /*is_partial=*/false, /*is_friend_decl=*/1);
19769 
19770   if (!friend_p && pushed_scope)
19771     pop_scope (pushed_scope);
19772 
19773   if (function_declarator_p (declarator)
19774       && parser->fully_implicit_function_template_p)
19775     {
19776       if (member_p)
19777 	decl = finish_fully_implicit_template (parser, decl);
19778       else
19779 	finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
19780     }
19781 
19782   if (auto_result && is_initialized && decl_specifiers->type
19783       && type_uses_auto (decl_specifiers->type))
19784     *auto_result = strip_declarator_types (TREE_TYPE (decl), declarator);
19785 
19786   return decl;
19787 }
19788 
19789 /* Parse a declarator.
19790 
19791    declarator:
19792      direct-declarator
19793      ptr-operator declarator
19794 
19795    abstract-declarator:
19796      ptr-operator abstract-declarator [opt]
19797      direct-abstract-declarator
19798 
19799    GNU Extensions:
19800 
19801    declarator:
19802      attributes [opt] direct-declarator
19803      attributes [opt] ptr-operator declarator
19804 
19805    abstract-declarator:
19806      attributes [opt] ptr-operator abstract-declarator [opt]
19807      attributes [opt] direct-abstract-declarator
19808 
19809    If CTOR_DTOR_OR_CONV_P is not NULL, *CTOR_DTOR_OR_CONV_P is used to
19810    detect constructors, destructors, deduction guides, or conversion operators.
19811    It is set to -1 if the declarator is a name, and +1 if it is a
19812    function. Otherwise it is set to zero. Usually you just want to
19813    test for >0, but internally the negative value is used.
19814 
19815    (The reason for CTOR_DTOR_OR_CONV_P is that a declaration must have
19816    a decl-specifier-seq unless it declares a constructor, destructor,
19817    or conversion.  It might seem that we could check this condition in
19818    semantic analysis, rather than parsing, but that makes it difficult
19819    to handle something like `f()'.  We want to notice that there are
19820    no decl-specifiers, and therefore realize that this is an
19821    expression, not a declaration.)
19822 
19823    If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
19824    the declarator is a direct-declarator of the form "(...)".
19825 
19826    MEMBER_P is true iff this declarator is a member-declarator.
19827 
19828    FRIEND_P is true iff this declarator is a friend.  */
19829 
19830 static cp_declarator *
19831 cp_parser_declarator (cp_parser* parser,
19832 		      cp_parser_declarator_kind dcl_kind,
19833 		      int* ctor_dtor_or_conv_p,
19834 		      bool* parenthesized_p,
19835 		      bool member_p, bool friend_p)
19836 {
19837   cp_declarator *declarator;
19838   enum tree_code code;
19839   cp_cv_quals cv_quals;
19840   tree class_type;
19841   tree gnu_attributes = NULL_TREE, std_attributes = NULL_TREE;
19842 
19843   /* Assume this is not a constructor, destructor, or type-conversion
19844      operator.  */
19845   if (ctor_dtor_or_conv_p)
19846     *ctor_dtor_or_conv_p = 0;
19847 
19848   if (cp_parser_allow_gnu_extensions_p (parser))
19849     gnu_attributes = cp_parser_gnu_attributes_opt (parser);
19850 
19851   /* Check for the ptr-operator production.  */
19852   cp_parser_parse_tentatively (parser);
19853   /* Parse the ptr-operator.  */
19854   code = cp_parser_ptr_operator (parser,
19855 				 &class_type,
19856 				 &cv_quals,
19857 				 &std_attributes);
19858 
19859   /* If that worked, then we have a ptr-operator.  */
19860   if (cp_parser_parse_definitely (parser))
19861     {
19862       /* If a ptr-operator was found, then this declarator was not
19863 	 parenthesized.  */
19864       if (parenthesized_p)
19865 	*parenthesized_p = true;
19866       /* The dependent declarator is optional if we are parsing an
19867 	 abstract-declarator.  */
19868       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED)
19869 	cp_parser_parse_tentatively (parser);
19870 
19871       /* Parse the dependent declarator.  */
19872       declarator = cp_parser_declarator (parser, dcl_kind,
19873 					 /*ctor_dtor_or_conv_p=*/NULL,
19874 					 /*parenthesized_p=*/NULL,
19875 					 /*member_p=*/false,
19876 					 friend_p);
19877 
19878       /* If we are parsing an abstract-declarator, we must handle the
19879 	 case where the dependent declarator is absent.  */
19880       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED
19881 	  && !cp_parser_parse_definitely (parser))
19882 	declarator = NULL;
19883 
19884       declarator = cp_parser_make_indirect_declarator
19885 	(code, class_type, cv_quals, declarator, std_attributes);
19886     }
19887   /* Everything else is a direct-declarator.  */
19888   else
19889     {
19890       if (parenthesized_p)
19891 	*parenthesized_p = cp_lexer_next_token_is (parser->lexer,
19892 						   CPP_OPEN_PAREN);
19893       declarator = cp_parser_direct_declarator (parser, dcl_kind,
19894 						ctor_dtor_or_conv_p,
19895 						member_p, friend_p);
19896     }
19897 
19898   if (gnu_attributes && declarator && declarator != cp_error_declarator)
19899     declarator->attributes = gnu_attributes;
19900   return declarator;
19901 }
19902 
19903 /* Parse a direct-declarator or direct-abstract-declarator.
19904 
19905    direct-declarator:
19906      declarator-id
19907      direct-declarator ( parameter-declaration-clause )
19908        cv-qualifier-seq [opt]
19909        ref-qualifier [opt]
19910        exception-specification [opt]
19911      direct-declarator [ constant-expression [opt] ]
19912      ( declarator )
19913 
19914    direct-abstract-declarator:
19915      direct-abstract-declarator [opt]
19916        ( parameter-declaration-clause )
19917        cv-qualifier-seq [opt]
19918        ref-qualifier [opt]
19919        exception-specification [opt]
19920      direct-abstract-declarator [opt] [ constant-expression [opt] ]
19921      ( abstract-declarator )
19922 
19923    Returns a representation of the declarator.  DCL_KIND is
19924    CP_PARSER_DECLARATOR_ABSTRACT, if we are parsing a
19925    direct-abstract-declarator.  It is CP_PARSER_DECLARATOR_NAMED, if
19926    we are parsing a direct-declarator.  It is
19927    CP_PARSER_DECLARATOR_EITHER, if we can accept either - in the case
19928    of ambiguity we prefer an abstract declarator, as per
19929    [dcl.ambig.res].  CTOR_DTOR_OR_CONV_P, MEMBER_P, and FRIEND_P are
19930    as for cp_parser_declarator.  */
19931 
19932 static cp_declarator *
19933 cp_parser_direct_declarator (cp_parser* parser,
19934 			     cp_parser_declarator_kind dcl_kind,
19935 			     int* ctor_dtor_or_conv_p,
19936 			     bool member_p, bool friend_p)
19937 {
19938   cp_token *token;
19939   cp_declarator *declarator = NULL;
19940   tree scope = NULL_TREE;
19941   bool saved_default_arg_ok_p = parser->default_arg_ok_p;
19942   bool saved_in_declarator_p = parser->in_declarator_p;
19943   bool first = true;
19944   tree pushed_scope = NULL_TREE;
19945   cp_token *open_paren = NULL, *close_paren = NULL;
19946 
19947   while (true)
19948     {
19949       /* Peek at the next token.  */
19950       token = cp_lexer_peek_token (parser->lexer);
19951       if (token->type == CPP_OPEN_PAREN)
19952 	{
19953 	  /* This is either a parameter-declaration-clause, or a
19954 	     parenthesized declarator. When we know we are parsing a
19955 	     named declarator, it must be a parenthesized declarator
19956 	     if FIRST is true. For instance, `(int)' is a
19957 	     parameter-declaration-clause, with an omitted
19958 	     direct-abstract-declarator. But `((*))', is a
19959 	     parenthesized abstract declarator. Finally, when T is a
19960 	     template parameter `(T)' is a
19961 	     parameter-declaration-clause, and not a parenthesized
19962 	     named declarator.
19963 
19964 	     We first try and parse a parameter-declaration-clause,
19965 	     and then try a nested declarator (if FIRST is true).
19966 
19967 	     It is not an error for it not to be a
19968 	     parameter-declaration-clause, even when FIRST is
19969 	     false. Consider,
19970 
19971 	       int i (int);
19972 	       int i (3);
19973 
19974 	     The first is the declaration of a function while the
19975 	     second is the definition of a variable, including its
19976 	     initializer.
19977 
19978 	     Having seen only the parenthesis, we cannot know which of
19979 	     these two alternatives should be selected.  Even more
19980 	     complex are examples like:
19981 
19982 	       int i (int (a));
19983 	       int i (int (3));
19984 
19985 	     The former is a function-declaration; the latter is a
19986 	     variable initialization.
19987 
19988 	     Thus again, we try a parameter-declaration-clause, and if
19989 	     that fails, we back out and return.  */
19990 
19991 	  if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
19992 	    {
19993 	      tree params;
19994 	      bool is_declarator = false;
19995 
19996 	      open_paren = NULL;
19997 
19998 	      /* In a member-declarator, the only valid interpretation
19999 		 of a parenthesis is the start of a
20000 		 parameter-declaration-clause.  (It is invalid to
20001 		 initialize a static data member with a parenthesized
20002 		 initializer; only the "=" form of initialization is
20003 		 permitted.)  */
20004 	      if (!member_p)
20005 		cp_parser_parse_tentatively (parser);
20006 
20007 	      /* Consume the `('.  */
20008 	      matching_parens parens;
20009 	      parens.consume_open (parser);
20010 	      if (first)
20011 		{
20012 		  /* If this is going to be an abstract declarator, we're
20013 		     in a declarator and we can't have default args.  */
20014 		  parser->default_arg_ok_p = false;
20015 		  parser->in_declarator_p = true;
20016 		}
20017 
20018 	      begin_scope (sk_function_parms, NULL_TREE);
20019 
20020 	      /* Parse the parameter-declaration-clause.  */
20021 	      params = cp_parser_parameter_declaration_clause (parser);
20022 
20023 	      /* Consume the `)'.  */
20024 	      parens.require_close (parser);
20025 
20026 	      /* If all went well, parse the cv-qualifier-seq,
20027 		 ref-qualifier and the exception-specification.  */
20028 	      if (member_p || cp_parser_parse_definitely (parser))
20029 		{
20030 		  cp_cv_quals cv_quals;
20031 		  cp_virt_specifiers virt_specifiers;
20032 		  cp_ref_qualifier ref_qual;
20033 		  tree exception_specification;
20034 		  tree late_return;
20035 		  tree attrs;
20036 		  bool memfn = (member_p || (pushed_scope
20037 					     && CLASS_TYPE_P (pushed_scope)));
20038 
20039 		  is_declarator = true;
20040 
20041 		  if (ctor_dtor_or_conv_p)
20042 		    *ctor_dtor_or_conv_p = *ctor_dtor_or_conv_p < 0;
20043 		  first = false;
20044 
20045 		  /* Parse the cv-qualifier-seq.  */
20046 		  cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
20047 		  /* Parse the ref-qualifier. */
20048 		  ref_qual = cp_parser_ref_qualifier_opt (parser);
20049 		  /* Parse the tx-qualifier.  */
20050 		  tree tx_qual = cp_parser_tx_qualifier_opt (parser);
20051 		  /* And the exception-specification.  */
20052 		  exception_specification
20053 		    = cp_parser_exception_specification_opt (parser);
20054 
20055 		  attrs = cp_parser_std_attribute_spec_seq (parser);
20056 
20057 		  /* In here, we handle cases where attribute is used after
20058 		     the function declaration.  For example:
20059 		     void func (int x) __attribute__((vector(..)));  */
20060 		  tree gnu_attrs = NULL_TREE;
20061 		  tree requires_clause = NULL_TREE;
20062 		  late_return = (cp_parser_late_return_type_opt
20063 				 (parser, declarator, requires_clause,
20064 				  memfn ? cv_quals : -1));
20065 
20066 		  /* Parse the virt-specifier-seq.  */
20067 		  virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
20068 
20069 		  /* Create the function-declarator.  */
20070 		  declarator = make_call_declarator (declarator,
20071 						     params,
20072 						     cv_quals,
20073 						     virt_specifiers,
20074 						     ref_qual,
20075 						     tx_qual,
20076 						     exception_specification,
20077 						     late_return,
20078 						     requires_clause);
20079 		  declarator->std_attributes = attrs;
20080 		  declarator->attributes = gnu_attrs;
20081 		  /* Any subsequent parameter lists are to do with
20082 		     return type, so are not those of the declared
20083 		     function.  */
20084 		  parser->default_arg_ok_p = false;
20085 		}
20086 
20087 	      /* Remove the function parms from scope.  */
20088 	      pop_bindings_and_leave_scope ();
20089 
20090 	      if (is_declarator)
20091 		/* Repeat the main loop.  */
20092 		continue;
20093 	    }
20094 
20095 	  /* If this is the first, we can try a parenthesized
20096 	     declarator.  */
20097 	  if (first)
20098 	    {
20099 	      bool saved_in_type_id_in_expr_p;
20100 
20101 	      parser->default_arg_ok_p = saved_default_arg_ok_p;
20102 	      parser->in_declarator_p = saved_in_declarator_p;
20103 
20104 	      open_paren = token;
20105 	      /* Consume the `('.  */
20106 	      matching_parens parens;
20107 	      parens.consume_open (parser);
20108 	      /* Parse the nested declarator.  */
20109 	      saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
20110 	      parser->in_type_id_in_expr_p = true;
20111 	      declarator
20112 		= cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
20113 					/*parenthesized_p=*/NULL,
20114 					member_p, friend_p);
20115 	      parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
20116 	      first = false;
20117 	      /* Expect a `)'.  */
20118 	      close_paren = cp_lexer_peek_token (parser->lexer);
20119 	      if (!parens.require_close (parser))
20120 		declarator = cp_error_declarator;
20121 	      if (declarator == cp_error_declarator)
20122 		break;
20123 
20124 	      goto handle_declarator;
20125 	    }
20126 	  /* Otherwise, we must be done.  */
20127 	  else
20128 	    break;
20129 	}
20130       else if ((!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
20131 	       && token->type == CPP_OPEN_SQUARE
20132 	       && !cp_next_tokens_can_be_attribute_p (parser))
20133 	{
20134 	  /* Parse an array-declarator.  */
20135 	  tree bounds, attrs;
20136 
20137 	  if (ctor_dtor_or_conv_p)
20138 	    *ctor_dtor_or_conv_p = 0;
20139 
20140 	  open_paren = NULL;
20141 	  first = false;
20142 	  parser->default_arg_ok_p = false;
20143 	  parser->in_declarator_p = true;
20144 	  /* Consume the `['.  */
20145 	  cp_lexer_consume_token (parser->lexer);
20146 	  /* Peek at the next token.  */
20147 	  token = cp_lexer_peek_token (parser->lexer);
20148 	  /* If the next token is `]', then there is no
20149 	     constant-expression.  */
20150 	  if (token->type != CPP_CLOSE_SQUARE)
20151 	    {
20152 	      bool non_constant_p;
20153 	      bounds
20154 		= cp_parser_constant_expression (parser,
20155 						 /*allow_non_constant=*/true,
20156 						 &non_constant_p);
20157 	      if (!non_constant_p)
20158 		/* OK */;
20159 	      else if (error_operand_p (bounds))
20160 		/* Already gave an error.  */;
20161 	      else if (!parser->in_function_body
20162 		       || current_binding_level->kind == sk_function_parms)
20163 		{
20164 		  /* Normally, the array bound must be an integral constant
20165 		     expression.  However, as an extension, we allow VLAs
20166 		     in function scopes as long as they aren't part of a
20167 		     parameter declaration.  */
20168 		  cp_parser_error (parser,
20169 				   "array bound is not an integer constant");
20170 		  bounds = error_mark_node;
20171 		}
20172 	      else if (processing_template_decl
20173 		       && !type_dependent_expression_p (bounds))
20174 		{
20175 		  /* Remember this wasn't a constant-expression.  */
20176 		  bounds = build_nop (TREE_TYPE (bounds), bounds);
20177 		  TREE_SIDE_EFFECTS (bounds) = 1;
20178 		}
20179 	    }
20180 	  else
20181 	    bounds = NULL_TREE;
20182 	  /* Look for the closing `]'.  */
20183 	  if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
20184 	    {
20185 	      declarator = cp_error_declarator;
20186 	      break;
20187 	    }
20188 
20189 	  attrs = cp_parser_std_attribute_spec_seq (parser);
20190 	  declarator = make_array_declarator (declarator, bounds);
20191 	  declarator->std_attributes = attrs;
20192 	}
20193       else if (first && dcl_kind != CP_PARSER_DECLARATOR_ABSTRACT)
20194 	{
20195 	  {
20196 	    tree qualifying_scope;
20197 	    tree unqualified_name;
20198 	    tree attrs;
20199 	    special_function_kind sfk;
20200 	    bool abstract_ok;
20201 	    bool pack_expansion_p = false;
20202 	    cp_token *declarator_id_start_token;
20203 
20204 	    /* Parse a declarator-id */
20205 	    abstract_ok = (dcl_kind == CP_PARSER_DECLARATOR_EITHER);
20206 	    if (abstract_ok)
20207 	      {
20208 		cp_parser_parse_tentatively (parser);
20209 
20210 		/* If we see an ellipsis, we should be looking at a
20211 		   parameter pack. */
20212 		if (token->type == CPP_ELLIPSIS)
20213 		  {
20214 		    /* Consume the `...' */
20215 		    cp_lexer_consume_token (parser->lexer);
20216 
20217 		    pack_expansion_p = true;
20218 		  }
20219 	      }
20220 
20221 	    declarator_id_start_token = cp_lexer_peek_token (parser->lexer);
20222 	    unqualified_name
20223 	      = cp_parser_declarator_id (parser, /*optional_p=*/abstract_ok);
20224 	    qualifying_scope = parser->scope;
20225 	    if (abstract_ok)
20226 	      {
20227 		bool okay = false;
20228 
20229 		if (!unqualified_name && pack_expansion_p)
20230 		  {
20231 		    /* Check whether an error occurred. */
20232 		    okay = !cp_parser_error_occurred (parser);
20233 
20234 		    /* We already consumed the ellipsis to mark a
20235 		       parameter pack, but we have no way to report it,
20236 		       so abort the tentative parse. We will be exiting
20237 		       immediately anyway. */
20238 		    cp_parser_abort_tentative_parse (parser);
20239 		  }
20240 		else
20241 		  okay = cp_parser_parse_definitely (parser);
20242 
20243 		if (!okay)
20244 		  unqualified_name = error_mark_node;
20245 		else if (unqualified_name
20246 			 && (qualifying_scope
20247 			     || (!identifier_p (unqualified_name))))
20248 		  {
20249 		    cp_parser_error (parser, "expected unqualified-id");
20250 		    unqualified_name = error_mark_node;
20251 		  }
20252 	      }
20253 
20254 	    if (!unqualified_name)
20255 	      return NULL;
20256 	    if (unqualified_name == error_mark_node)
20257 	      {
20258 		declarator = cp_error_declarator;
20259 		pack_expansion_p = false;
20260 		declarator->parameter_pack_p = false;
20261 		break;
20262 	      }
20263 
20264 	    attrs = cp_parser_std_attribute_spec_seq (parser);
20265 
20266 	    if (qualifying_scope && at_namespace_scope_p ()
20267 		&& TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
20268 	      {
20269 		/* In the declaration of a member of a template class
20270 		   outside of the class itself, the SCOPE will sometimes
20271 		   be a TYPENAME_TYPE.  For example, given:
20272 
20273 		   template <typename T>
20274 		   int S<T>::R::i = 3;
20275 
20276 		   the SCOPE will be a TYPENAME_TYPE for `S<T>::R'.  In
20277 		   this context, we must resolve S<T>::R to an ordinary
20278 		   type, rather than a typename type.
20279 
20280 		   The reason we normally avoid resolving TYPENAME_TYPEs
20281 		   is that a specialization of `S' might render
20282 		   `S<T>::R' not a type.  However, if `S' is
20283 		   specialized, then this `i' will not be used, so there
20284 		   is no harm in resolving the types here.  */
20285 		tree type;
20286 
20287 		/* Resolve the TYPENAME_TYPE.  */
20288 		type = resolve_typename_type (qualifying_scope,
20289 					      /*only_current_p=*/false);
20290 		/* If that failed, the declarator is invalid.  */
20291 		if (TREE_CODE (type) == TYPENAME_TYPE)
20292 		  {
20293 		    if (typedef_variant_p (type))
20294 		      error_at (declarator_id_start_token->location,
20295 				"cannot define member of dependent typedef "
20296 				"%qT", type);
20297 		    else
20298 		      error_at (declarator_id_start_token->location,
20299 				"%<%T::%E%> is not a type",
20300 				TYPE_CONTEXT (qualifying_scope),
20301 				TYPE_IDENTIFIER (qualifying_scope));
20302 		  }
20303 		qualifying_scope = type;
20304 	      }
20305 
20306 	    sfk = sfk_none;
20307 
20308 	    if (unqualified_name)
20309 	      {
20310 		tree class_type;
20311 
20312 		if (qualifying_scope
20313 		    && CLASS_TYPE_P (qualifying_scope))
20314 		  class_type = qualifying_scope;
20315 		else
20316 		  class_type = current_class_type;
20317 
20318 		if (TREE_CODE (unqualified_name) == TYPE_DECL)
20319 		  {
20320 		    tree name_type = TREE_TYPE (unqualified_name);
20321 
20322 		    if (!class_type || !same_type_p (name_type, class_type))
20323 		      {
20324 			/* We do not attempt to print the declarator
20325 			   here because we do not have enough
20326 			   information about its original syntactic
20327 			   form.  */
20328 			cp_parser_error (parser, "invalid declarator");
20329 			declarator = cp_error_declarator;
20330 			break;
20331 		      }
20332 		    else if (qualifying_scope
20333 			     && CLASSTYPE_USE_TEMPLATE (name_type))
20334 		      {
20335 			error_at (declarator_id_start_token->location,
20336 				  "invalid use of constructor as a template");
20337 			inform (declarator_id_start_token->location,
20338 				"use %<%T::%D%> instead of %<%T::%D%> to "
20339 				"name the constructor in a qualified name",
20340 				class_type,
20341 				DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
20342 				class_type, name_type);
20343 			declarator = cp_error_declarator;
20344 			break;
20345 		      }
20346 		    unqualified_name = constructor_name (class_type);
20347 		  }
20348 
20349 		if (class_type)
20350 		  {
20351 		    if (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
20352 		      sfk = sfk_destructor;
20353 		    else if (identifier_p (unqualified_name)
20354 			     && IDENTIFIER_CONV_OP_P (unqualified_name))
20355 		      sfk = sfk_conversion;
20356 		    else if (/* There's no way to declare a constructor
20357 				for an unnamed type, even if the type
20358 				got a name for linkage purposes.  */
20359 			     !TYPE_WAS_UNNAMED (class_type)
20360 			     /* Handle correctly (c++/19200):
20361 
20362 				struct S {
20363 				  struct T{};
20364 				  friend void S(T);
20365 				};
20366 
20367 				and also:
20368 
20369 				namespace N {
20370 				  void S();
20371 				}
20372 
20373 				struct S {
20374 				  friend void N::S();
20375 				};  */
20376 			     && (!friend_p || class_type == qualifying_scope)
20377 			     && constructor_name_p (unqualified_name,
20378 						    class_type))
20379 		      sfk = sfk_constructor;
20380 		    else if (is_overloaded_fn (unqualified_name)
20381 			     && DECL_CONSTRUCTOR_P (get_first_fn
20382 						    (unqualified_name)))
20383 		      sfk = sfk_constructor;
20384 
20385 		    if (ctor_dtor_or_conv_p && sfk != sfk_none)
20386 		      *ctor_dtor_or_conv_p = -1;
20387 		  }
20388 	      }
20389 	    declarator = make_id_declarator (qualifying_scope,
20390 					     unqualified_name,
20391 					     sfk);
20392 	    declarator->std_attributes = attrs;
20393 	    declarator->id_loc = token->location;
20394 	    declarator->parameter_pack_p = pack_expansion_p;
20395 
20396 	    if (pack_expansion_p)
20397 	      maybe_warn_variadic_templates ();
20398 	  }
20399 
20400 	handle_declarator:;
20401 	  scope = get_scope_of_declarator (declarator);
20402 	  if (scope)
20403 	    {
20404 	      /* Any names that appear after the declarator-id for a
20405 		 member are looked up in the containing scope.  */
20406 	      if (at_function_scope_p ())
20407 		{
20408 		  /* But declarations with qualified-ids can't appear in a
20409 		     function.  */
20410 		  cp_parser_error (parser, "qualified-id in declaration");
20411 		  declarator = cp_error_declarator;
20412 		  break;
20413 		}
20414 	      pushed_scope = push_scope (scope);
20415 	    }
20416 	  parser->in_declarator_p = true;
20417 	  if ((ctor_dtor_or_conv_p && *ctor_dtor_or_conv_p)
20418 	      || (declarator && declarator->kind == cdk_id))
20419 	    /* Default args are only allowed on function
20420 	       declarations.  */
20421 	    parser->default_arg_ok_p = saved_default_arg_ok_p;
20422 	  else
20423 	    parser->default_arg_ok_p = false;
20424 
20425 	  first = false;
20426 	}
20427       /* We're done.  */
20428       else
20429 	break;
20430     }
20431 
20432   /* For an abstract declarator, we might wind up with nothing at this
20433      point.  That's an error; the declarator is not optional.  */
20434   if (!declarator)
20435     cp_parser_error (parser, "expected declarator");
20436   else if (open_paren)
20437     {
20438       /* Record overly parenthesized declarator so we can give a
20439 	 diagnostic about confusing decl/expr disambiguation.  */
20440       if (declarator->kind == cdk_array)
20441 	{
20442 	  /* If the open and close parens are on different lines, this
20443 	     is probably a formatting thing, so ignore.  */
20444 	  expanded_location open = expand_location (open_paren->location);
20445 	  expanded_location close = expand_location (close_paren->location);
20446 	  if (open.line != close.line || open.file != close.file)
20447 	    open_paren = NULL;
20448 	}
20449       if (open_paren)
20450 	declarator->parenthesized = open_paren->location;
20451     }
20452 
20453   /* If we entered a scope, we must exit it now.  */
20454   if (pushed_scope)
20455     pop_scope (pushed_scope);
20456 
20457   parser->default_arg_ok_p = saved_default_arg_ok_p;
20458   parser->in_declarator_p = saved_in_declarator_p;
20459 
20460   return declarator;
20461 }
20462 
20463 /* Parse a ptr-operator.
20464 
20465    ptr-operator:
20466      * attribute-specifier-seq [opt] cv-qualifier-seq [opt] (C++11)
20467      * cv-qualifier-seq [opt]
20468      &
20469      :: [opt] nested-name-specifier * cv-qualifier-seq [opt]
20470      nested-name-specifier * attribute-specifier-seq [opt] cv-qualifier-seq [opt] (C++11)
20471 
20472    GNU Extension:
20473 
20474    ptr-operator:
20475      & cv-qualifier-seq [opt]
20476 
20477    Returns INDIRECT_REF if a pointer, or pointer-to-member, was used.
20478    Returns ADDR_EXPR if a reference was used, or NON_LVALUE_EXPR for
20479    an rvalue reference. In the case of a pointer-to-member, *TYPE is
20480    filled in with the TYPE containing the member.  *CV_QUALS is
20481    filled in with the cv-qualifier-seq, or TYPE_UNQUALIFIED, if there
20482    are no cv-qualifiers.  Returns ERROR_MARK if an error occurred.
20483    Note that the tree codes returned by this function have nothing
20484    to do with the types of trees that will be eventually be created
20485    to represent the pointer or reference type being parsed. They are
20486    just constants with suggestive names. */
20487 static enum tree_code
20488 cp_parser_ptr_operator (cp_parser* parser,
20489 			tree* type,
20490 			cp_cv_quals *cv_quals,
20491 			tree *attributes)
20492 {
20493   enum tree_code code = ERROR_MARK;
20494   cp_token *token;
20495   tree attrs = NULL_TREE;
20496 
20497   /* Assume that it's not a pointer-to-member.  */
20498   *type = NULL_TREE;
20499   /* And that there are no cv-qualifiers.  */
20500   *cv_quals = TYPE_UNQUALIFIED;
20501 
20502   /* Peek at the next token.  */
20503   token = cp_lexer_peek_token (parser->lexer);
20504 
20505   /* If it's a `*', `&' or `&&' we have a pointer or reference.  */
20506   if (token->type == CPP_MULT)
20507     code = INDIRECT_REF;
20508   else if (token->type == CPP_AND)
20509     code = ADDR_EXPR;
20510   else if ((cxx_dialect != cxx98) &&
20511 	   token->type == CPP_AND_AND) /* C++0x only */
20512     code = NON_LVALUE_EXPR;
20513 
20514   if (code != ERROR_MARK)
20515     {
20516       /* Consume the `*', `&' or `&&'.  */
20517       cp_lexer_consume_token (parser->lexer);
20518 
20519       /* A `*' can be followed by a cv-qualifier-seq, and so can a
20520 	 `&', if we are allowing GNU extensions.  (The only qualifier
20521 	 that can legally appear after `&' is `restrict', but that is
20522 	 enforced during semantic analysis.  */
20523       if (code == INDIRECT_REF
20524 	  || cp_parser_allow_gnu_extensions_p (parser))
20525 	*cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
20526 
20527       attrs = cp_parser_std_attribute_spec_seq (parser);
20528       if (attributes != NULL)
20529 	*attributes = attrs;
20530     }
20531   else
20532     {
20533       /* Try the pointer-to-member case.  */
20534       cp_parser_parse_tentatively (parser);
20535       /* Look for the optional `::' operator.  */
20536       cp_parser_global_scope_opt (parser,
20537 				  /*current_scope_valid_p=*/false);
20538       /* Look for the nested-name specifier.  */
20539       token = cp_lexer_peek_token (parser->lexer);
20540       cp_parser_nested_name_specifier (parser,
20541 				       /*typename_keyword_p=*/false,
20542 				       /*check_dependency_p=*/true,
20543 				       /*type_p=*/false,
20544 				       /*is_declaration=*/false);
20545       /* If we found it, and the next token is a `*', then we are
20546 	 indeed looking at a pointer-to-member operator.  */
20547       if (!cp_parser_error_occurred (parser)
20548 	  && cp_parser_require (parser, CPP_MULT, RT_MULT))
20549 	{
20550 	  /* Indicate that the `*' operator was used.  */
20551 	  code = INDIRECT_REF;
20552 
20553 	  if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
20554 	    error_at (token->location, "%qD is a namespace", parser->scope);
20555 	  else if (TREE_CODE (parser->scope) == ENUMERAL_TYPE)
20556 	    error_at (token->location, "cannot form pointer to member of "
20557 		      "non-class %q#T", parser->scope);
20558 	  else
20559 	    {
20560 	      /* The type of which the member is a member is given by the
20561 		 current SCOPE.  */
20562 	      *type = parser->scope;
20563 	      /* The next name will not be qualified.  */
20564 	      parser->scope = NULL_TREE;
20565 	      parser->qualifying_scope = NULL_TREE;
20566 	      parser->object_scope = NULL_TREE;
20567 	      /* Look for optional c++11 attributes.  */
20568 	      attrs = cp_parser_std_attribute_spec_seq (parser);
20569 	      if (attributes != NULL)
20570 		*attributes = attrs;
20571 	      /* Look for the optional cv-qualifier-seq.  */
20572 	      *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
20573 	    }
20574 	}
20575       /* If that didn't work we don't have a ptr-operator.  */
20576       if (!cp_parser_parse_definitely (parser))
20577 	cp_parser_error (parser, "expected ptr-operator");
20578     }
20579 
20580   return code;
20581 }
20582 
20583 /* Parse an (optional) cv-qualifier-seq.
20584 
20585    cv-qualifier-seq:
20586      cv-qualifier cv-qualifier-seq [opt]
20587 
20588    cv-qualifier:
20589      const
20590      volatile
20591 
20592    GNU Extension:
20593 
20594    cv-qualifier:
20595      __restrict__
20596 
20597    Returns a bitmask representing the cv-qualifiers.  */
20598 
20599 static cp_cv_quals
20600 cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
20601 {
20602   cp_cv_quals cv_quals = TYPE_UNQUALIFIED;
20603 
20604   while (true)
20605     {
20606       cp_token *token;
20607       cp_cv_quals cv_qualifier;
20608 
20609       /* Peek at the next token.  */
20610       token = cp_lexer_peek_token (parser->lexer);
20611       /* See if it's a cv-qualifier.  */
20612       switch (token->keyword)
20613 	{
20614 	case RID_CONST:
20615 	  cv_qualifier = TYPE_QUAL_CONST;
20616 	  break;
20617 
20618 	case RID_VOLATILE:
20619 	  cv_qualifier = TYPE_QUAL_VOLATILE;
20620 	  break;
20621 
20622 	case RID_RESTRICT:
20623 	  cv_qualifier = TYPE_QUAL_RESTRICT;
20624 	  break;
20625 
20626 	default:
20627 	  cv_qualifier = TYPE_UNQUALIFIED;
20628 	  break;
20629 	}
20630 
20631       if (!cv_qualifier)
20632 	break;
20633 
20634       if (cv_quals & cv_qualifier)
20635 	{
20636 	  gcc_rich_location richloc (token->location);
20637 	  richloc.add_fixit_remove ();
20638 	  error_at (&richloc, "duplicate cv-qualifier");
20639 	  cp_lexer_purge_token (parser->lexer);
20640 	}
20641       else
20642 	{
20643 	  cp_lexer_consume_token (parser->lexer);
20644 	  cv_quals |= cv_qualifier;
20645 	}
20646     }
20647 
20648   return cv_quals;
20649 }
20650 
20651 /* Parse an (optional) ref-qualifier
20652 
20653    ref-qualifier:
20654      &
20655      &&
20656 
20657    Returns cp_ref_qualifier representing ref-qualifier. */
20658 
20659 static cp_ref_qualifier
20660 cp_parser_ref_qualifier_opt (cp_parser* parser)
20661 {
20662   cp_ref_qualifier ref_qual = REF_QUAL_NONE;
20663 
20664   /* Don't try to parse bitwise '&' as a ref-qualifier (c++/57532).  */
20665   if (cxx_dialect < cxx11 && cp_parser_parsing_tentatively (parser))
20666     return ref_qual;
20667 
20668   while (true)
20669     {
20670       cp_ref_qualifier curr_ref_qual = REF_QUAL_NONE;
20671       cp_token *token = cp_lexer_peek_token (parser->lexer);
20672 
20673       switch (token->type)
20674 	{
20675 	case CPP_AND:
20676 	  curr_ref_qual = REF_QUAL_LVALUE;
20677 	  break;
20678 
20679 	case CPP_AND_AND:
20680 	  curr_ref_qual = REF_QUAL_RVALUE;
20681 	  break;
20682 
20683 	default:
20684 	  curr_ref_qual = REF_QUAL_NONE;
20685 	  break;
20686 	}
20687 
20688       if (!curr_ref_qual)
20689 	break;
20690       else if (ref_qual)
20691 	{
20692 	  error_at (token->location, "multiple ref-qualifiers");
20693 	  cp_lexer_purge_token (parser->lexer);
20694 	}
20695       else
20696 	{
20697 	  ref_qual = curr_ref_qual;
20698 	  cp_lexer_consume_token (parser->lexer);
20699 	}
20700     }
20701 
20702   return ref_qual;
20703 }
20704 
20705 /* Parse an optional tx-qualifier.
20706 
20707    tx-qualifier:
20708      transaction_safe
20709      transaction_safe_dynamic  */
20710 
20711 static tree
20712 cp_parser_tx_qualifier_opt (cp_parser *parser)
20713 {
20714   cp_token *token = cp_lexer_peek_token (parser->lexer);
20715   if (token->type == CPP_NAME)
20716     {
20717       tree name = token->u.value;
20718       const char *p = IDENTIFIER_POINTER (name);
20719       const int len = strlen ("transaction_safe");
20720       if (!strncmp (p, "transaction_safe", len))
20721 	{
20722 	  p += len;
20723 	  if (*p == '\0'
20724 	      || !strcmp (p, "_dynamic"))
20725 	    {
20726 	      cp_lexer_consume_token (parser->lexer);
20727 	      if (!flag_tm)
20728 		{
20729 		  error ("%qE requires %<-fgnu-tm%>", name);
20730 		  return NULL_TREE;
20731 		}
20732 	      else
20733 		return name;
20734 	    }
20735 	}
20736     }
20737   return NULL_TREE;
20738 }
20739 
20740 /* Parse an (optional) virt-specifier-seq.
20741 
20742    virt-specifier-seq:
20743      virt-specifier virt-specifier-seq [opt]
20744 
20745    virt-specifier:
20746      override
20747      final
20748 
20749    Returns a bitmask representing the virt-specifiers.  */
20750 
20751 static cp_virt_specifiers
20752 cp_parser_virt_specifier_seq_opt (cp_parser* parser)
20753 {
20754   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
20755 
20756   while (true)
20757     {
20758       cp_token *token;
20759       cp_virt_specifiers virt_specifier;
20760 
20761       /* Peek at the next token.  */
20762       token = cp_lexer_peek_token (parser->lexer);
20763       /* See if it's a virt-specifier-qualifier.  */
20764       if (token->type != CPP_NAME)
20765         break;
20766       if (id_equal (token->u.value, "override"))
20767         {
20768           maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
20769           virt_specifier = VIRT_SPEC_OVERRIDE;
20770         }
20771       else if (id_equal (token->u.value, "final"))
20772         {
20773           maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
20774           virt_specifier = VIRT_SPEC_FINAL;
20775         }
20776       else if (id_equal (token->u.value, "__final"))
20777         {
20778           virt_specifier = VIRT_SPEC_FINAL;
20779         }
20780       else
20781 	break;
20782 
20783       if (virt_specifiers & virt_specifier)
20784 	{
20785 	  gcc_rich_location richloc (token->location);
20786 	  richloc.add_fixit_remove ();
20787 	  error_at (&richloc, "duplicate virt-specifier");
20788 	  cp_lexer_purge_token (parser->lexer);
20789 	}
20790       else
20791 	{
20792 	  cp_lexer_consume_token (parser->lexer);
20793 	  virt_specifiers |= virt_specifier;
20794 	}
20795     }
20796   return virt_specifiers;
20797 }
20798 
20799 /* Used by handling of trailing-return-types and NSDMI, in which 'this'
20800    is in scope even though it isn't real.  */
20801 
20802 void
20803 inject_this_parameter (tree ctype, cp_cv_quals quals)
20804 {
20805   tree this_parm;
20806 
20807   if (current_class_ptr)
20808     {
20809       /* We don't clear this between NSDMIs.  Is it already what we want?  */
20810       tree type = TREE_TYPE (TREE_TYPE (current_class_ptr));
20811       if (DECL_P (current_class_ptr)
20812 	  && DECL_CONTEXT (current_class_ptr) == NULL_TREE
20813 	  && same_type_ignoring_top_level_qualifiers_p (ctype, type)
20814 	  && cp_type_quals (type) == quals)
20815 	return;
20816     }
20817 
20818   this_parm = build_this_parm (NULL_TREE, ctype, quals);
20819   /* Clear this first to avoid shortcut in cp_build_indirect_ref.  */
20820   current_class_ptr = NULL_TREE;
20821   current_class_ref
20822     = cp_build_fold_indirect_ref (this_parm);
20823   current_class_ptr = this_parm;
20824 }
20825 
20826 /* Return true iff our current scope is a non-static data member
20827    initializer.  */
20828 
20829 bool
20830 parsing_nsdmi (void)
20831 {
20832   /* We recognize NSDMI context by the context-less 'this' pointer set up
20833      by the function above.  */
20834   if (current_class_ptr
20835       && TREE_CODE (current_class_ptr) == PARM_DECL
20836       && DECL_CONTEXT (current_class_ptr) == NULL_TREE)
20837     return true;
20838   return false;
20839 }
20840 
20841 /* Parse a late-specified return type, if any.  This is not a separate
20842    non-terminal, but part of a function declarator, which looks like
20843 
20844    -> trailing-type-specifier-seq abstract-declarator(opt)
20845 
20846    Returns the type indicated by the type-id.
20847 
20848    In addition to this, parse any queued up #pragma omp declare simd
20849    clauses, and #pragma acc routine clauses.
20850 
20851    QUALS is either a bitmask of cv_qualifiers or -1 for a non-member
20852    function.  */
20853 
20854 static tree
20855 cp_parser_late_return_type_opt (cp_parser* parser, cp_declarator *declarator,
20856 				tree& requires_clause, cp_cv_quals quals)
20857 {
20858   cp_token *token;
20859   tree type = NULL_TREE;
20860   bool declare_simd_p = (parser->omp_declare_simd
20861 			 && declarator
20862 			 && declarator->kind == cdk_id);
20863 
20864   bool oacc_routine_p = (parser->oacc_routine
20865 			 && declarator
20866 			 && declarator->kind == cdk_id);
20867 
20868   /* Peek at the next token.  */
20869   token = cp_lexer_peek_token (parser->lexer);
20870   /* A late-specified return type is indicated by an initial '->'. */
20871   if (token->type != CPP_DEREF
20872       && token->keyword != RID_REQUIRES
20873       && !(token->type == CPP_NAME
20874 	   && token->u.value == ridpointers[RID_REQUIRES])
20875       && !(declare_simd_p || oacc_routine_p))
20876     return NULL_TREE;
20877 
20878   tree save_ccp = current_class_ptr;
20879   tree save_ccr = current_class_ref;
20880   if (quals >= 0)
20881     {
20882       /* DR 1207: 'this' is in scope in the trailing return type.  */
20883       inject_this_parameter (current_class_type, quals);
20884     }
20885 
20886   if (token->type == CPP_DEREF)
20887     {
20888       /* Consume the ->.  */
20889       cp_lexer_consume_token (parser->lexer);
20890 
20891       type = cp_parser_trailing_type_id (parser);
20892     }
20893 
20894   /* Function declarations may be followed by a trailing
20895      requires-clause.  */
20896   requires_clause = cp_parser_requires_clause_opt (parser);
20897 
20898   if (declare_simd_p)
20899     declarator->attributes
20900       = cp_parser_late_parsing_omp_declare_simd (parser,
20901 						 declarator->attributes);
20902   if (oacc_routine_p)
20903     declarator->attributes
20904       = cp_parser_late_parsing_oacc_routine (parser,
20905 					     declarator->attributes);
20906 
20907   if (quals >= 0)
20908     {
20909       current_class_ptr = save_ccp;
20910       current_class_ref = save_ccr;
20911     }
20912 
20913   return type;
20914 }
20915 
20916 /* Parse a declarator-id.
20917 
20918    declarator-id:
20919      id-expression
20920      :: [opt] nested-name-specifier [opt] type-name
20921 
20922    In the `id-expression' case, the value returned is as for
20923    cp_parser_id_expression if the id-expression was an unqualified-id.
20924    If the id-expression was a qualified-id, then a SCOPE_REF is
20925    returned.  The first operand is the scope (either a NAMESPACE_DECL
20926    or TREE_TYPE), but the second is still just a representation of an
20927    unqualified-id.  */
20928 
20929 static tree
20930 cp_parser_declarator_id (cp_parser* parser, bool optional_p)
20931 {
20932   tree id;
20933   /* The expression must be an id-expression.  Assume that qualified
20934      names are the names of types so that:
20935 
20936        template <class T>
20937        int S<T>::R::i = 3;
20938 
20939      will work; we must treat `S<T>::R' as the name of a type.
20940      Similarly, assume that qualified names are templates, where
20941      required, so that:
20942 
20943        template <class T>
20944        int S<T>::R<T>::i = 3;
20945 
20946      will work, too.  */
20947   id = cp_parser_id_expression (parser,
20948 				/*template_keyword_p=*/false,
20949 				/*check_dependency_p=*/false,
20950 				/*template_p=*/NULL,
20951 				/*declarator_p=*/true,
20952 				optional_p);
20953   if (id && BASELINK_P (id))
20954     id = BASELINK_FUNCTIONS (id);
20955   return id;
20956 }
20957 
20958 /* Parse a type-id.
20959 
20960    type-id:
20961      type-specifier-seq abstract-declarator [opt]
20962 
20963    Returns the TYPE specified.  */
20964 
20965 static tree
20966 cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg,
20967 		     bool is_trailing_return)
20968 {
20969   cp_decl_specifier_seq type_specifier_seq;
20970   cp_declarator *abstract_declarator;
20971 
20972   /* Parse the type-specifier-seq.  */
20973   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
20974 				is_trailing_return,
20975 				&type_specifier_seq);
20976   if (is_template_arg && type_specifier_seq.type
20977       && TREE_CODE (type_specifier_seq.type) == TEMPLATE_TYPE_PARM
20978       && CLASS_PLACEHOLDER_TEMPLATE (type_specifier_seq.type))
20979     /* A bare template name as a template argument is a template template
20980        argument, not a placeholder, so fail parsing it as a type argument.  */
20981     {
20982       gcc_assert (cp_parser_uncommitted_to_tentative_parse_p (parser));
20983       cp_parser_simulate_error (parser);
20984       return error_mark_node;
20985     }
20986   if (type_specifier_seq.type == error_mark_node)
20987     return error_mark_node;
20988 
20989   /* There might or might not be an abstract declarator.  */
20990   cp_parser_parse_tentatively (parser);
20991   /* Look for the declarator.  */
20992   abstract_declarator
20993     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_ABSTRACT, NULL,
20994 			    /*parenthesized_p=*/NULL,
20995 			    /*member_p=*/false,
20996 			    /*friend_p=*/false);
20997   /* Check to see if there really was a declarator.  */
20998   if (!cp_parser_parse_definitely (parser))
20999     abstract_declarator = NULL;
21000 
21001   if (type_specifier_seq.type
21002       /* The concepts TS allows 'auto' as a type-id.  */
21003       && (!flag_concepts || parser->in_type_id_in_expr_p)
21004       /* None of the valid uses of 'auto' in C++14 involve the type-id
21005 	 nonterminal, but it is valid in a trailing-return-type.  */
21006       && !(cxx_dialect >= cxx14 && is_trailing_return))
21007     if (tree auto_node = type_uses_auto (type_specifier_seq.type))
21008       {
21009 	/* A type-id with type 'auto' is only ok if the abstract declarator
21010 	   is a function declarator with a late-specified return type.
21011 
21012 	   A type-id with 'auto' is also valid in a trailing-return-type
21013 	   in a compound-requirement. */
21014 	if (abstract_declarator
21015 	    && abstract_declarator->kind == cdk_function
21016 	    && abstract_declarator->u.function.late_return_type)
21017 	  /* OK */;
21018 	else if (parser->in_result_type_constraint_p)
21019 	  /* OK */;
21020 	else
21021 	  {
21022 	    location_t loc = type_specifier_seq.locations[ds_type_spec];
21023 	    if (tree tmpl = CLASS_PLACEHOLDER_TEMPLATE (auto_node))
21024 	      {
21025 		error_at (loc, "missing template arguments after %qT",
21026 			  auto_node);
21027 		inform (DECL_SOURCE_LOCATION (tmpl), "%qD declared here",
21028 			tmpl);
21029 	      }
21030 	    else
21031 	      error_at (loc, "invalid use of %qT", auto_node);
21032 	    return error_mark_node;
21033 	  }
21034       }
21035 
21036   return groktypename (&type_specifier_seq, abstract_declarator,
21037 		       is_template_arg);
21038 }
21039 
21040 static tree
21041 cp_parser_type_id (cp_parser *parser)
21042 {
21043   return cp_parser_type_id_1 (parser, false, false);
21044 }
21045 
21046 static tree
21047 cp_parser_template_type_arg (cp_parser *parser)
21048 {
21049   tree r;
21050   const char *saved_message = parser->type_definition_forbidden_message;
21051   parser->type_definition_forbidden_message
21052     = G_("types may not be defined in template arguments");
21053   r = cp_parser_type_id_1 (parser, true, false);
21054   parser->type_definition_forbidden_message = saved_message;
21055   if (cxx_dialect >= cxx14 && !flag_concepts && type_uses_auto (r))
21056     {
21057       error ("invalid use of %<auto%> in template argument");
21058       r = error_mark_node;
21059     }
21060   return r;
21061 }
21062 
21063 static tree
21064 cp_parser_trailing_type_id (cp_parser *parser)
21065 {
21066   return cp_parser_type_id_1 (parser, false, true);
21067 }
21068 
21069 /* Parse a type-specifier-seq.
21070 
21071    type-specifier-seq:
21072      type-specifier type-specifier-seq [opt]
21073 
21074    GNU extension:
21075 
21076    type-specifier-seq:
21077      attributes type-specifier-seq [opt]
21078 
21079    If IS_DECLARATION is true, we are at the start of a "condition" or
21080    exception-declaration, so we might be followed by a declarator-id.
21081 
21082    If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
21083    i.e. we've just seen "->".
21084 
21085    Sets *TYPE_SPECIFIER_SEQ to represent the sequence.  */
21086 
21087 static void
21088 cp_parser_type_specifier_seq (cp_parser* parser,
21089 			      bool is_declaration,
21090 			      bool is_trailing_return,
21091 			      cp_decl_specifier_seq *type_specifier_seq)
21092 {
21093   bool seen_type_specifier = false;
21094   cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
21095   cp_token *start_token = NULL;
21096 
21097   /* Clear the TYPE_SPECIFIER_SEQ.  */
21098   clear_decl_specs (type_specifier_seq);
21099 
21100   /* In the context of a trailing return type, enum E { } is an
21101      elaborated-type-specifier followed by a function-body, not an
21102      enum-specifier.  */
21103   if (is_trailing_return)
21104     flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
21105 
21106   /* Parse the type-specifiers and attributes.  */
21107   while (true)
21108     {
21109       tree type_specifier;
21110       bool is_cv_qualifier;
21111 
21112       /* Check for attributes first.  */
21113       if (cp_next_tokens_can_be_attribute_p (parser))
21114 	{
21115 	  type_specifier_seq->attributes
21116 	    = attr_chainon (type_specifier_seq->attributes,
21117 			    cp_parser_attributes_opt (parser));
21118 	  continue;
21119 	}
21120 
21121       /* record the token of the beginning of the type specifier seq,
21122          for error reporting purposes*/
21123      if (!start_token)
21124        start_token = cp_lexer_peek_token (parser->lexer);
21125 
21126       /* Look for the type-specifier.  */
21127       type_specifier = cp_parser_type_specifier (parser,
21128 						 flags,
21129 						 type_specifier_seq,
21130 						 /*is_declaration=*/false,
21131 						 NULL,
21132 						 &is_cv_qualifier);
21133       if (!type_specifier)
21134 	{
21135 	  /* If the first type-specifier could not be found, this is not a
21136 	     type-specifier-seq at all.  */
21137 	  if (!seen_type_specifier)
21138 	    {
21139 	      /* Set in_declarator_p to avoid skipping to the semicolon.  */
21140 	      int in_decl = parser->in_declarator_p;
21141 	      parser->in_declarator_p = true;
21142 
21143 	      if (cp_parser_uncommitted_to_tentative_parse_p (parser)
21144 		  || !cp_parser_parse_and_diagnose_invalid_type_name (parser))
21145 		cp_parser_error (parser, "expected type-specifier");
21146 
21147 	      parser->in_declarator_p = in_decl;
21148 
21149 	      type_specifier_seq->type = error_mark_node;
21150 	      return;
21151 	    }
21152 	  /* If subsequent type-specifiers could not be found, the
21153 	     type-specifier-seq is complete.  */
21154 	  break;
21155 	}
21156 
21157       seen_type_specifier = true;
21158       /* The standard says that a condition can be:
21159 
21160 	    type-specifier-seq declarator = assignment-expression
21161 
21162 	 However, given:
21163 
21164 	   struct S {};
21165 	   if (int S = ...)
21166 
21167 	 we should treat the "S" as a declarator, not as a
21168 	 type-specifier.  The standard doesn't say that explicitly for
21169 	 type-specifier-seq, but it does say that for
21170 	 decl-specifier-seq in an ordinary declaration.  Perhaps it
21171 	 would be clearer just to allow a decl-specifier-seq here, and
21172 	 then add a semantic restriction that if any decl-specifiers
21173 	 that are not type-specifiers appear, the program is invalid.  */
21174       if (is_declaration && !is_cv_qualifier)
21175 	flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
21176     }
21177 }
21178 
21179 /* Return whether the function currently being declared has an associated
21180    template parameter list.  */
21181 
21182 static bool
21183 function_being_declared_is_template_p (cp_parser* parser)
21184 {
21185   if (!current_template_parms || processing_template_parmlist)
21186     return false;
21187 
21188   if (parser->implicit_template_scope)
21189     return true;
21190 
21191   if (at_class_scope_p ()
21192       && TYPE_BEING_DEFINED (current_class_type))
21193     return parser->num_template_parameter_lists != 0;
21194 
21195   return ((int) parser->num_template_parameter_lists > template_class_depth
21196 	  (current_class_type));
21197 }
21198 
21199 /* Parse a parameter-declaration-clause.
21200 
21201    parameter-declaration-clause:
21202      parameter-declaration-list [opt] ... [opt]
21203      parameter-declaration-list , ...
21204 
21205    Returns a representation for the parameter declarations.  A return
21206    value of NULL indicates a parameter-declaration-clause consisting
21207    only of an ellipsis.  */
21208 
21209 static tree
21210 cp_parser_parameter_declaration_clause (cp_parser* parser)
21211 {
21212   tree parameters;
21213   cp_token *token;
21214   bool ellipsis_p;
21215   bool is_error;
21216 
21217   temp_override<bool> cleanup
21218     (parser->auto_is_implicit_function_template_parm_p);
21219 
21220   if (!processing_specialization
21221       && !processing_template_parmlist
21222       && !processing_explicit_instantiation
21223       /* default_arg_ok_p tracks whether this is a parameter-clause for an
21224          actual function or a random abstract declarator.  */
21225       && parser->default_arg_ok_p)
21226     if (!current_function_decl
21227 	|| (current_class_type && LAMBDA_TYPE_P (current_class_type)))
21228       parser->auto_is_implicit_function_template_parm_p = true;
21229 
21230   /* Peek at the next token.  */
21231   token = cp_lexer_peek_token (parser->lexer);
21232   /* Check for trivial parameter-declaration-clauses.  */
21233   if (token->type == CPP_ELLIPSIS)
21234     {
21235       /* Consume the `...' token.  */
21236       cp_lexer_consume_token (parser->lexer);
21237       return NULL_TREE;
21238     }
21239   else if (token->type == CPP_CLOSE_PAREN)
21240     /* There are no parameters.  */
21241     {
21242 #ifndef NO_IMPLICIT_EXTERN_C
21243       if (in_system_header_at (input_location)
21244 	  && current_class_type == NULL
21245 	  && current_lang_name == lang_name_c)
21246 	return NULL_TREE;
21247       else
21248 #endif
21249 	return void_list_node;
21250     }
21251   /* Check for `(void)', too, which is a special case.  */
21252   else if (token->keyword == RID_VOID
21253 	   && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
21254 	       == CPP_CLOSE_PAREN))
21255     {
21256       /* Consume the `void' token.  */
21257       cp_lexer_consume_token (parser->lexer);
21258       /* There are no parameters.  */
21259       return void_list_node;
21260     }
21261 
21262   /* Parse the parameter-declaration-list.  */
21263   parameters = cp_parser_parameter_declaration_list (parser, &is_error);
21264   /* If a parse error occurred while parsing the
21265      parameter-declaration-list, then the entire
21266      parameter-declaration-clause is erroneous.  */
21267   if (is_error)
21268     return NULL;
21269 
21270   /* Peek at the next token.  */
21271   token = cp_lexer_peek_token (parser->lexer);
21272   /* If it's a `,', the clause should terminate with an ellipsis.  */
21273   if (token->type == CPP_COMMA)
21274     {
21275       /* Consume the `,'.  */
21276       cp_lexer_consume_token (parser->lexer);
21277       /* Expect an ellipsis.  */
21278       ellipsis_p
21279 	= (cp_parser_require (parser, CPP_ELLIPSIS, RT_ELLIPSIS) != NULL);
21280     }
21281   /* It might also be `...' if the optional trailing `,' was
21282      omitted.  */
21283   else if (token->type == CPP_ELLIPSIS)
21284     {
21285       /* Consume the `...' token.  */
21286       cp_lexer_consume_token (parser->lexer);
21287       /* And remember that we saw it.  */
21288       ellipsis_p = true;
21289     }
21290   else
21291     ellipsis_p = false;
21292 
21293   /* Finish the parameter list.  */
21294   if (!ellipsis_p)
21295     parameters = chainon (parameters, void_list_node);
21296 
21297   return parameters;
21298 }
21299 
21300 /* Parse a parameter-declaration-list.
21301 
21302    parameter-declaration-list:
21303      parameter-declaration
21304      parameter-declaration-list , parameter-declaration
21305 
21306    Returns a representation of the parameter-declaration-list, as for
21307    cp_parser_parameter_declaration_clause.  However, the
21308    `void_list_node' is never appended to the list.  Upon return,
21309    *IS_ERROR will be true iff an error occurred.  */
21310 
21311 static tree
21312 cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
21313 {
21314   tree parameters = NULL_TREE;
21315   tree *tail = &parameters;
21316   bool saved_in_unbraced_linkage_specification_p;
21317   int index = 0;
21318 
21319   /* Assume all will go well.  */
21320   *is_error = false;
21321   /* The special considerations that apply to a function within an
21322      unbraced linkage specifications do not apply to the parameters
21323      to the function.  */
21324   saved_in_unbraced_linkage_specification_p
21325     = parser->in_unbraced_linkage_specification_p;
21326   parser->in_unbraced_linkage_specification_p = false;
21327 
21328   /* Look for more parameters.  */
21329   while (true)
21330     {
21331       cp_parameter_declarator *parameter;
21332       tree decl = error_mark_node;
21333       bool parenthesized_p = false;
21334 
21335       /* Parse the parameter.  */
21336       parameter
21337 	= cp_parser_parameter_declaration (parser,
21338 					   /*template_parm_p=*/false,
21339 					   &parenthesized_p);
21340 
21341       /* We don't know yet if the enclosing context is deprecated, so wait
21342 	 and warn in grokparms if appropriate.  */
21343       deprecated_state = DEPRECATED_SUPPRESS;
21344 
21345       if (parameter)
21346 	{
21347 	  decl = grokdeclarator (parameter->declarator,
21348 				 &parameter->decl_specifiers,
21349 				 PARM,
21350 				 parameter->default_argument != NULL_TREE,
21351 				 &parameter->decl_specifiers.attributes);
21352 	  if (decl != error_mark_node && parameter->loc != UNKNOWN_LOCATION)
21353 	    DECL_SOURCE_LOCATION (decl) = parameter->loc;
21354 	}
21355 
21356       deprecated_state = DEPRECATED_NORMAL;
21357 
21358       /* If a parse error occurred parsing the parameter declaration,
21359 	 then the entire parameter-declaration-list is erroneous.  */
21360       if (decl == error_mark_node)
21361 	{
21362 	  *is_error = true;
21363 	  parameters = error_mark_node;
21364 	  break;
21365 	}
21366 
21367       if (parameter->decl_specifiers.attributes)
21368 	cplus_decl_attributes (&decl,
21369 			       parameter->decl_specifiers.attributes,
21370 			       0);
21371       if (DECL_NAME (decl))
21372 	decl = pushdecl (decl);
21373 
21374       if (decl != error_mark_node)
21375 	{
21376 	  retrofit_lang_decl (decl);
21377 	  DECL_PARM_INDEX (decl) = ++index;
21378 	  DECL_PARM_LEVEL (decl) = function_parm_depth ();
21379 	}
21380 
21381       /* Add the new parameter to the list.  */
21382       *tail = build_tree_list (parameter->default_argument, decl);
21383       tail = &TREE_CHAIN (*tail);
21384 
21385       /* Peek at the next token.  */
21386       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
21387 	  || cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
21388 	  /* These are for Objective-C++ */
21389 	  || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
21390 	  || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
21391 	/* The parameter-declaration-list is complete.  */
21392 	break;
21393       else if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
21394 	{
21395 	  cp_token *token;
21396 
21397 	  /* Peek at the next token.  */
21398 	  token = cp_lexer_peek_nth_token (parser->lexer, 2);
21399 	  /* If it's an ellipsis, then the list is complete.  */
21400 	  if (token->type == CPP_ELLIPSIS)
21401 	    break;
21402 	  /* Otherwise, there must be more parameters.  Consume the
21403 	     `,'.  */
21404 	  cp_lexer_consume_token (parser->lexer);
21405 	  /* When parsing something like:
21406 
21407 		int i(float f, double d)
21408 
21409 	     we can tell after seeing the declaration for "f" that we
21410 	     are not looking at an initialization of a variable "i",
21411 	     but rather at the declaration of a function "i".
21412 
21413 	     Due to the fact that the parsing of template arguments
21414 	     (as specified to a template-id) requires backtracking we
21415 	     cannot use this technique when inside a template argument
21416 	     list.  */
21417 	  if (!parser->in_template_argument_list_p
21418 	      && !parser->in_type_id_in_expr_p
21419 	      && cp_parser_uncommitted_to_tentative_parse_p (parser)
21420 	      /* However, a parameter-declaration of the form
21421 		 "float(f)" (which is a valid declaration of a
21422 		 parameter "f") can also be interpreted as an
21423 		 expression (the conversion of "f" to "float").  */
21424 	      && !parenthesized_p)
21425 	    cp_parser_commit_to_tentative_parse (parser);
21426 	}
21427       else
21428 	{
21429 	  cp_parser_error (parser, "expected %<,%> or %<...%>");
21430 	  if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
21431 	    cp_parser_skip_to_closing_parenthesis (parser,
21432 						   /*recovering=*/true,
21433 						   /*or_comma=*/false,
21434 						   /*consume_paren=*/false);
21435 	  break;
21436 	}
21437     }
21438 
21439   parser->in_unbraced_linkage_specification_p
21440     = saved_in_unbraced_linkage_specification_p;
21441 
21442   /* Reset implicit_template_scope if we are about to leave the function
21443      parameter list that introduced it.  Note that for out-of-line member
21444      definitions, there will be one or more class scopes before we get to
21445      the template parameter scope.  */
21446 
21447   if (cp_binding_level *its = parser->implicit_template_scope)
21448     if (cp_binding_level *maybe_its = current_binding_level->level_chain)
21449       {
21450 	while (maybe_its->kind == sk_class)
21451 	  maybe_its = maybe_its->level_chain;
21452 	if (maybe_its == its)
21453 	  {
21454 	    parser->implicit_template_parms = 0;
21455 	    parser->implicit_template_scope = 0;
21456 	  }
21457       }
21458 
21459   return parameters;
21460 }
21461 
21462 /* Parse a parameter declaration.
21463 
21464    parameter-declaration:
21465      decl-specifier-seq ... [opt] declarator
21466      decl-specifier-seq declarator = assignment-expression
21467      decl-specifier-seq ... [opt] abstract-declarator [opt]
21468      decl-specifier-seq abstract-declarator [opt] = assignment-expression
21469 
21470    If TEMPLATE_PARM_P is TRUE, then this parameter-declaration
21471    declares a template parameter.  (In that case, a non-nested `>'
21472    token encountered during the parsing of the assignment-expression
21473    is not interpreted as a greater-than operator.)
21474 
21475    Returns a representation of the parameter, or NULL if an error
21476    occurs.  If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to
21477    true iff the declarator is of the form "(p)".  */
21478 
21479 static cp_parameter_declarator *
21480 cp_parser_parameter_declaration (cp_parser *parser,
21481 				 bool template_parm_p,
21482 				 bool *parenthesized_p)
21483 {
21484   int declares_class_or_enum;
21485   cp_decl_specifier_seq decl_specifiers;
21486   cp_declarator *declarator;
21487   tree default_argument;
21488   cp_token *token = NULL, *declarator_token_start = NULL;
21489   const char *saved_message;
21490   bool template_parameter_pack_p = false;
21491 
21492   /* In a template parameter, `>' is not an operator.
21493 
21494      [temp.param]
21495 
21496      When parsing a default template-argument for a non-type
21497      template-parameter, the first non-nested `>' is taken as the end
21498      of the template parameter-list rather than a greater-than
21499      operator.  */
21500 
21501   /* Type definitions may not appear in parameter types.  */
21502   saved_message = parser->type_definition_forbidden_message;
21503   parser->type_definition_forbidden_message
21504     = G_("types may not be defined in parameter types");
21505 
21506   int template_parm_idx = (function_being_declared_is_template_p (parser) ?
21507 			   TREE_VEC_LENGTH (INNERMOST_TEMPLATE_PARMS
21508 					    (current_template_parms)) : 0);
21509 
21510   /* Parse the declaration-specifiers.  */
21511   cp_token *decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
21512   cp_parser_decl_specifier_seq (parser,
21513 				CP_PARSER_FLAGS_NONE,
21514 				&decl_specifiers,
21515 				&declares_class_or_enum);
21516 
21517   /* Complain about missing 'typename' or other invalid type names.  */
21518   if (!decl_specifiers.any_type_specifiers_p
21519       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
21520     decl_specifiers.type = error_mark_node;
21521 
21522   /* If an error occurred, there's no reason to attempt to parse the
21523      rest of the declaration.  */
21524   if (cp_parser_error_occurred (parser))
21525     {
21526       parser->type_definition_forbidden_message = saved_message;
21527       return NULL;
21528     }
21529 
21530   /* Peek at the next token.  */
21531   token = cp_lexer_peek_token (parser->lexer);
21532 
21533   /* If the next token is a `)', `,', `=', `>', or `...', then there
21534      is no declarator. However, when variadic templates are enabled,
21535      there may be a declarator following `...'.  */
21536   if (token->type == CPP_CLOSE_PAREN
21537       || token->type == CPP_COMMA
21538       || token->type == CPP_EQ
21539       || token->type == CPP_GREATER)
21540     {
21541       declarator = NULL;
21542       if (parenthesized_p)
21543 	*parenthesized_p = false;
21544     }
21545   /* Otherwise, there should be a declarator.  */
21546   else
21547     {
21548       bool saved_default_arg_ok_p = parser->default_arg_ok_p;
21549       parser->default_arg_ok_p = false;
21550 
21551       /* After seeing a decl-specifier-seq, if the next token is not a
21552 	 "(", there is no possibility that the code is a valid
21553 	 expression.  Therefore, if parsing tentatively, we commit at
21554 	 this point.  */
21555       if (!parser->in_template_argument_list_p
21556 	  /* In an expression context, having seen:
21557 
21558 	       (int((char ...
21559 
21560 	     we cannot be sure whether we are looking at a
21561 	     function-type (taking a "char" as a parameter) or a cast
21562 	     of some object of type "char" to "int".  */
21563 	  && !parser->in_type_id_in_expr_p
21564 	  && cp_parser_uncommitted_to_tentative_parse_p (parser)
21565 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
21566 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
21567 	cp_parser_commit_to_tentative_parse (parser);
21568       /* Parse the declarator.  */
21569       declarator_token_start = token;
21570       declarator = cp_parser_declarator (parser,
21571 					 CP_PARSER_DECLARATOR_EITHER,
21572 					 /*ctor_dtor_or_conv_p=*/NULL,
21573 					 parenthesized_p,
21574 					 /*member_p=*/false,
21575 					 /*friend_p=*/false);
21576       parser->default_arg_ok_p = saved_default_arg_ok_p;
21577       /* After the declarator, allow more attributes.  */
21578       decl_specifiers.attributes
21579 	= attr_chainon (decl_specifiers.attributes,
21580 			cp_parser_attributes_opt (parser));
21581 
21582       /* If the declarator is a template parameter pack, remember that and
21583 	 clear the flag in the declarator itself so we don't get errors
21584 	 from grokdeclarator.  */
21585       if (template_parm_p && declarator && declarator->parameter_pack_p)
21586 	{
21587 	  declarator->parameter_pack_p = false;
21588 	  template_parameter_pack_p = true;
21589 	}
21590     }
21591 
21592   /* If the next token is an ellipsis, and we have not seen a declarator
21593      name, and if either the type of the declarator contains parameter
21594      packs but it is not a TYPE_PACK_EXPANSION or is null (this happens
21595      for, eg, abbreviated integral type names), then we actually have a
21596      parameter pack expansion expression. Otherwise, leave the ellipsis
21597      for a C-style variadic function. */
21598   token = cp_lexer_peek_token (parser->lexer);
21599 
21600   /* If a function parameter pack was specified and an implicit template
21601      parameter was introduced during cp_parser_parameter_declaration,
21602      change any implicit parameters introduced into packs.  */
21603   if (parser->implicit_template_parms
21604       && (token->type == CPP_ELLIPSIS
21605 	  || (declarator && declarator->parameter_pack_p)))
21606     {
21607       int latest_template_parm_idx = TREE_VEC_LENGTH
21608 	(INNERMOST_TEMPLATE_PARMS (current_template_parms));
21609 
21610       if (latest_template_parm_idx != template_parm_idx)
21611 	decl_specifiers.type = convert_generic_types_to_packs
21612 	  (decl_specifiers.type,
21613 	   template_parm_idx, latest_template_parm_idx);
21614     }
21615 
21616   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
21617     {
21618       tree type = decl_specifiers.type;
21619 
21620       if (type && DECL_P (type))
21621         type = TREE_TYPE (type);
21622 
21623       if (((type
21624 	    && TREE_CODE (type) != TYPE_PACK_EXPANSION
21625 	    && (template_parm_p || uses_parameter_packs (type)))
21626 	   || (!type && template_parm_p))
21627 	  && declarator_can_be_parameter_pack (declarator))
21628 	{
21629 	  /* Consume the `...'. */
21630 	  cp_lexer_consume_token (parser->lexer);
21631 	  maybe_warn_variadic_templates ();
21632 
21633 	  /* Build a pack expansion type */
21634 	  if (template_parm_p)
21635 	    template_parameter_pack_p = true;
21636 	  else if (declarator)
21637 	    declarator->parameter_pack_p = true;
21638 	  else
21639 	    decl_specifiers.type = make_pack_expansion (type);
21640 	}
21641     }
21642 
21643   /* The restriction on defining new types applies only to the type
21644      of the parameter, not to the default argument.  */
21645   parser->type_definition_forbidden_message = saved_message;
21646 
21647   /* If the next token is `=', then process a default argument.  */
21648   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
21649     {
21650       tree type = decl_specifiers.type;
21651       token = cp_lexer_peek_token (parser->lexer);
21652       /* If we are defining a class, then the tokens that make up the
21653 	 default argument must be saved and processed later.  */
21654       if (!template_parm_p && at_class_scope_p ()
21655 	  && TYPE_BEING_DEFINED (current_class_type)
21656 	  && !LAMBDA_TYPE_P (current_class_type))
21657 	default_argument = cp_parser_cache_defarg (parser, /*nsdmi=*/false);
21658 
21659       // A constrained-type-specifier may declare a type template-parameter.
21660       else if (declares_constrained_type_template_parameter (type))
21661         default_argument
21662           = cp_parser_default_type_template_argument (parser);
21663 
21664       // A constrained-type-specifier may declare a template-template-parameter.
21665       else if (declares_constrained_template_template_parameter (type))
21666         default_argument
21667           = cp_parser_default_template_template_argument (parser);
21668 
21669       /* Outside of a class definition, we can just parse the
21670 	 assignment-expression.  */
21671       else
21672 	default_argument
21673 	  = cp_parser_default_argument (parser, template_parm_p);
21674 
21675       if (!parser->default_arg_ok_p)
21676 	{
21677 	  permerror (token->location,
21678 		     "default arguments are only "
21679 		     "permitted for function parameters");
21680 	}
21681       else if ((declarator && declarator->parameter_pack_p)
21682 	       || template_parameter_pack_p
21683 	       || (decl_specifiers.type
21684 		   && PACK_EXPANSION_P (decl_specifiers.type)))
21685 	{
21686 	  /* Find the name of the parameter pack.  */
21687 	  cp_declarator *id_declarator = declarator;
21688 	  while (id_declarator && id_declarator->kind != cdk_id)
21689 	    id_declarator = id_declarator->declarator;
21690 
21691 	  if (id_declarator && id_declarator->kind == cdk_id)
21692 	    error_at (declarator_token_start->location,
21693 		      template_parm_p
21694 		      ? G_("template parameter pack %qD "
21695 			   "cannot have a default argument")
21696 		      : G_("parameter pack %qD cannot have "
21697 			   "a default argument"),
21698 		      id_declarator->u.id.unqualified_name);
21699 	  else
21700 	    error_at (declarator_token_start->location,
21701 		      template_parm_p
21702 		      ? G_("template parameter pack cannot have "
21703 			   "a default argument")
21704 		      : G_("parameter pack cannot have a "
21705 			   "default argument"));
21706 
21707 	  default_argument = NULL_TREE;
21708 	}
21709     }
21710   else
21711     default_argument = NULL_TREE;
21712 
21713   /* Generate a location for the parameter, ranging from the start of the
21714      initial token to the end of the final token (using input_location for
21715      the latter, set up by cp_lexer_set_source_position_from_token when
21716      consuming tokens).
21717 
21718      If we have a identifier, then use it for the caret location, e.g.
21719 
21720        extern int callee (int one, int (*two)(int, int), float three);
21721                                    ~~~~~~^~~~~~~~~~~~~~
21722 
21723      otherwise, reuse the start location for the caret location e.g.:
21724 
21725        extern int callee (int one, int (*)(int, int), float three);
21726                                    ^~~~~~~~~~~~~~~~~
21727 
21728   */
21729   location_t caret_loc = (declarator && declarator->id_loc != UNKNOWN_LOCATION
21730 			  ? declarator->id_loc
21731 			  : decl_spec_token_start->location);
21732   location_t param_loc = make_location (caret_loc,
21733 					decl_spec_token_start->location,
21734 					input_location);
21735 
21736   return make_parameter_declarator (&decl_specifiers,
21737 				    declarator,
21738 				    default_argument,
21739 				    param_loc,
21740 				    template_parameter_pack_p);
21741 }
21742 
21743 /* Parse a default argument and return it.
21744 
21745    TEMPLATE_PARM_P is true if this is a default argument for a
21746    non-type template parameter.  */
21747 static tree
21748 cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
21749 {
21750   tree default_argument = NULL_TREE;
21751   bool saved_greater_than_is_operator_p;
21752   bool saved_local_variables_forbidden_p;
21753   bool non_constant_p, is_direct_init;
21754 
21755   /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
21756      set correctly.  */
21757   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
21758   parser->greater_than_is_operator_p = !template_parm_p;
21759   /* Local variable names (and the `this' keyword) may not
21760      appear in a default argument.  */
21761   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
21762   parser->local_variables_forbidden_p = true;
21763   /* Parse the assignment-expression.  */
21764   if (template_parm_p)
21765     push_deferring_access_checks (dk_no_deferred);
21766   tree saved_class_ptr = NULL_TREE;
21767   tree saved_class_ref = NULL_TREE;
21768   /* The "this" pointer is not valid in a default argument.  */
21769   if (cfun)
21770     {
21771       saved_class_ptr = current_class_ptr;
21772       cp_function_chain->x_current_class_ptr = NULL_TREE;
21773       saved_class_ref = current_class_ref;
21774       cp_function_chain->x_current_class_ref = NULL_TREE;
21775     }
21776   default_argument
21777     = cp_parser_initializer (parser, &is_direct_init, &non_constant_p);
21778   /* Restore the "this" pointer.  */
21779   if (cfun)
21780     {
21781       cp_function_chain->x_current_class_ptr = saved_class_ptr;
21782       cp_function_chain->x_current_class_ref = saved_class_ref;
21783     }
21784   if (BRACE_ENCLOSED_INITIALIZER_P (default_argument))
21785     maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
21786   if (template_parm_p)
21787     pop_deferring_access_checks ();
21788   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
21789   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
21790 
21791   return default_argument;
21792 }
21793 
21794 /* Parse a function-body.
21795 
21796    function-body:
21797      compound_statement  */
21798 
21799 static void
21800 cp_parser_function_body (cp_parser *parser, bool in_function_try_block)
21801 {
21802   cp_parser_compound_statement (parser, NULL, (in_function_try_block
21803 					       ? BCS_TRY_BLOCK : BCS_NORMAL),
21804 				true);
21805 }
21806 
21807 /* Parse a ctor-initializer-opt followed by a function-body.  Return
21808    true if a ctor-initializer was present.  When IN_FUNCTION_TRY_BLOCK
21809    is true we are parsing a function-try-block.  */
21810 
21811 static void
21812 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser,
21813 						  bool in_function_try_block)
21814 {
21815   tree body, list;
21816   const bool check_body_p =
21817      DECL_CONSTRUCTOR_P (current_function_decl)
21818      && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
21819   tree last = NULL;
21820 
21821   /* Begin the function body.  */
21822   body = begin_function_body ();
21823   /* Parse the optional ctor-initializer.  */
21824   cp_parser_ctor_initializer_opt (parser);
21825 
21826   /* If we're parsing a constexpr constructor definition, we need
21827      to check that the constructor body is indeed empty.  However,
21828      before we get to cp_parser_function_body lot of junk has been
21829      generated, so we can't just check that we have an empty block.
21830      Rather we take a snapshot of the outermost block, and check whether
21831      cp_parser_function_body changed its state.  */
21832   if (check_body_p)
21833     {
21834       list = cur_stmt_list;
21835       if (STATEMENT_LIST_TAIL (list))
21836 	last = STATEMENT_LIST_TAIL (list)->stmt;
21837     }
21838   /* Parse the function-body.  */
21839   cp_parser_function_body (parser, in_function_try_block);
21840   if (check_body_p)
21841     check_constexpr_ctor_body (last, list, /*complain=*/true);
21842   /* Finish the function body.  */
21843   finish_function_body (body);
21844 }
21845 
21846 /* Parse an initializer.
21847 
21848    initializer:
21849      = initializer-clause
21850      ( expression-list )
21851 
21852    Returns an expression representing the initializer.  If no
21853    initializer is present, NULL_TREE is returned.
21854 
21855    *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
21856    production is used, and TRUE otherwise.  *IS_DIRECT_INIT is
21857    set to TRUE if there is no initializer present.  If there is an
21858    initializer, and it is not a constant-expression, *NON_CONSTANT_P
21859    is set to true; otherwise it is set to false.  */
21860 
21861 static tree
21862 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
21863 		       bool* non_constant_p)
21864 {
21865   cp_token *token;
21866   tree init;
21867 
21868   /* Peek at the next token.  */
21869   token = cp_lexer_peek_token (parser->lexer);
21870 
21871   /* Let our caller know whether or not this initializer was
21872      parenthesized.  */
21873   *is_direct_init = (token->type != CPP_EQ);
21874   /* Assume that the initializer is constant.  */
21875   *non_constant_p = false;
21876 
21877   if (token->type == CPP_EQ)
21878     {
21879       /* Consume the `='.  */
21880       cp_lexer_consume_token (parser->lexer);
21881       /* Parse the initializer-clause.  */
21882       init = cp_parser_initializer_clause (parser, non_constant_p);
21883     }
21884   else if (token->type == CPP_OPEN_PAREN)
21885     {
21886       vec<tree, va_gc> *vec;
21887       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
21888 						     /*cast_p=*/false,
21889 						     /*allow_expansion_p=*/true,
21890 						     non_constant_p);
21891       if (vec == NULL)
21892 	return error_mark_node;
21893       init = build_tree_list_vec (vec);
21894       release_tree_vector (vec);
21895     }
21896   else if (token->type == CPP_OPEN_BRACE)
21897     {
21898       cp_lexer_set_source_position (parser->lexer);
21899       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
21900       init = cp_parser_braced_list (parser, non_constant_p);
21901       CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
21902     }
21903   else
21904     {
21905       /* Anything else is an error.  */
21906       cp_parser_error (parser, "expected initializer");
21907       init = error_mark_node;
21908     }
21909 
21910   if (check_for_bare_parameter_packs (init))
21911     init = error_mark_node;
21912 
21913   return init;
21914 }
21915 
21916 /* Parse an initializer-clause.
21917 
21918    initializer-clause:
21919      assignment-expression
21920      braced-init-list
21921 
21922    Returns an expression representing the initializer.
21923 
21924    If the `assignment-expression' production is used the value
21925    returned is simply a representation for the expression.
21926 
21927    Otherwise, calls cp_parser_braced_list.  */
21928 
21929 static cp_expr
21930 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
21931 {
21932   cp_expr initializer;
21933 
21934   /* Assume the expression is constant.  */
21935   *non_constant_p = false;
21936 
21937   /* If it is not a `{', then we are looking at an
21938      assignment-expression.  */
21939   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
21940     {
21941       initializer
21942 	= cp_parser_constant_expression (parser,
21943 					/*allow_non_constant_p=*/true,
21944 					non_constant_p);
21945     }
21946   else
21947     initializer = cp_parser_braced_list (parser, non_constant_p);
21948 
21949   return initializer;
21950 }
21951 
21952 /* Parse a brace-enclosed initializer list.
21953 
21954    braced-init-list:
21955      { initializer-list , [opt] }
21956      { designated-initializer-list , [opt] }
21957      { }
21958 
21959    Returns a CONSTRUCTOR.  The CONSTRUCTOR_ELTS will be
21960    the elements of the initializer-list (or NULL, if the last
21961    production is used).  The TREE_TYPE for the CONSTRUCTOR will be
21962    NULL_TREE.  There is no way to detect whether or not the optional
21963    trailing `,' was provided.  NON_CONSTANT_P is as for
21964    cp_parser_initializer.  */
21965 
21966 static cp_expr
21967 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
21968 {
21969   tree initializer;
21970   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
21971 
21972   /* Consume the `{' token.  */
21973   matching_braces braces;
21974   braces.require_open (parser);
21975   /* Create a CONSTRUCTOR to represent the braced-initializer.  */
21976   initializer = make_node (CONSTRUCTOR);
21977   /* If it's not a `}', then there is a non-trivial initializer.  */
21978   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
21979     {
21980       /* Parse the initializer list.  */
21981       CONSTRUCTOR_ELTS (initializer)
21982 	= cp_parser_initializer_list (parser, non_constant_p);
21983       /* A trailing `,' token is allowed.  */
21984       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
21985 	cp_lexer_consume_token (parser->lexer);
21986     }
21987   else
21988     *non_constant_p = false;
21989   /* Now, there should be a trailing `}'.  */
21990   location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location;
21991   braces.require_close (parser);
21992   TREE_TYPE (initializer) = init_list_type_node;
21993 
21994   cp_expr result (initializer);
21995   /* Build a location of the form:
21996        { ... }
21997        ^~~~~~~
21998      with caret==start at the open brace, finish at the close brace.  */
21999   location_t combined_loc = make_location (start_loc, start_loc, finish_loc);
22000   result.set_location (combined_loc);
22001   return result;
22002 }
22003 
22004 /* Consume tokens up to, and including, the next non-nested closing `]'.
22005    Returns true iff we found a closing `]'.  */
22006 
22007 static bool
22008 cp_parser_skip_to_closing_square_bracket (cp_parser *parser)
22009 {
22010   unsigned square_depth = 0;
22011 
22012   while (true)
22013     {
22014       cp_token * token = cp_lexer_peek_token (parser->lexer);
22015 
22016       switch (token->type)
22017 	{
22018 	case CPP_EOF:
22019 	case CPP_PRAGMA_EOL:
22020 	  /* If we've run out of tokens, then there is no closing `]'.  */
22021 	  return false;
22022 
22023         case CPP_OPEN_SQUARE:
22024           ++square_depth;
22025           break;
22026 
22027         case CPP_CLOSE_SQUARE:
22028 	  if (!square_depth--)
22029 	    {
22030 	      cp_lexer_consume_token (parser->lexer);
22031 	      return true;
22032 	    }
22033 	  break;
22034 
22035 	default:
22036 	  break;
22037 	}
22038 
22039       /* Consume the token.  */
22040       cp_lexer_consume_token (parser->lexer);
22041     }
22042 }
22043 
22044 /* Return true if we are looking at an array-designator, false otherwise.  */
22045 
22046 static bool
22047 cp_parser_array_designator_p (cp_parser *parser)
22048 {
22049   /* Consume the `['.  */
22050   cp_lexer_consume_token (parser->lexer);
22051 
22052   cp_lexer_save_tokens (parser->lexer);
22053 
22054   /* Skip tokens until the next token is a closing square bracket.
22055      If we find the closing `]', and the next token is a `=', then
22056      we are looking at an array designator.  */
22057   bool array_designator_p
22058     = (cp_parser_skip_to_closing_square_bracket (parser)
22059        && cp_lexer_next_token_is (parser->lexer, CPP_EQ));
22060 
22061   /* Roll back the tokens we skipped.  */
22062   cp_lexer_rollback_tokens (parser->lexer);
22063 
22064   return array_designator_p;
22065 }
22066 
22067 /* Parse an initializer-list.
22068 
22069    initializer-list:
22070      initializer-clause ... [opt]
22071      initializer-list , initializer-clause ... [opt]
22072 
22073    C++2A Extension:
22074 
22075    designated-initializer-list:
22076      designated-initializer-clause
22077      designated-initializer-list , designated-initializer-clause
22078 
22079    designated-initializer-clause:
22080      designator brace-or-equal-initializer
22081 
22082    designator:
22083      . identifier
22084 
22085    GNU Extension:
22086 
22087    initializer-list:
22088      designation initializer-clause ...[opt]
22089      initializer-list , designation initializer-clause ...[opt]
22090 
22091    designation:
22092      . identifier =
22093      identifier :
22094      [ constant-expression ] =
22095 
22096    Returns a vec of constructor_elt.  The VALUE of each elt is an expression
22097    for the initializer.  If the INDEX of the elt is non-NULL, it is the
22098    IDENTIFIER_NODE naming the field to initialize.  NON_CONSTANT_P is
22099    as for cp_parser_initializer.  */
22100 
22101 static vec<constructor_elt, va_gc> *
22102 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
22103 {
22104   vec<constructor_elt, va_gc> *v = NULL;
22105   bool first_p = true;
22106   tree first_designator = NULL_TREE;
22107 
22108   /* Assume all of the expressions are constant.  */
22109   *non_constant_p = false;
22110 
22111   /* Parse the rest of the list.  */
22112   while (true)
22113     {
22114       cp_token *token;
22115       tree designator;
22116       tree initializer;
22117       bool clause_non_constant_p;
22118       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
22119 
22120       /* Handle the C++2A syntax, '. id ='.  */
22121       if ((cxx_dialect >= cxx2a
22122 	   || cp_parser_allow_gnu_extensions_p (parser))
22123 	  && cp_lexer_next_token_is (parser->lexer, CPP_DOT)
22124 	  && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
22125 	  && (cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ
22126 	      || (cp_lexer_peek_nth_token (parser->lexer, 3)->type
22127 		  == CPP_OPEN_BRACE)))
22128 	{
22129 	  if (cxx_dialect < cxx2a)
22130 	    pedwarn (loc, OPT_Wpedantic,
22131 		     "C++ designated initializers only available with "
22132 		     "-std=c++2a or -std=gnu++2a");
22133 	  /* Consume the `.'.  */
22134 	  cp_lexer_consume_token (parser->lexer);
22135 	  /* Consume the identifier.  */
22136 	  designator = cp_lexer_consume_token (parser->lexer)->u.value;
22137 	  if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
22138 	    /* Consume the `='.  */
22139 	    cp_lexer_consume_token (parser->lexer);
22140 	}
22141       /* Also, if the next token is an identifier and the following one is a
22142 	 colon, we are looking at the GNU designated-initializer
22143 	 syntax.  */
22144       else if (cp_parser_allow_gnu_extensions_p (parser)
22145 	       && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
22146 	       && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
22147 		   == CPP_COLON))
22148 	{
22149 	  /* Warn the user that they are using an extension.  */
22150 	  pedwarn (loc, OPT_Wpedantic,
22151 		   "ISO C++ does not allow GNU designated initializers");
22152 	  /* Consume the identifier.  */
22153 	  designator = cp_lexer_consume_token (parser->lexer)->u.value;
22154 	  /* Consume the `:'.  */
22155 	  cp_lexer_consume_token (parser->lexer);
22156 	}
22157       /* Also handle C99 array designators, '[ const ] ='.  */
22158       else if (cp_parser_allow_gnu_extensions_p (parser)
22159 	       && !c_dialect_objc ()
22160 	       && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
22161 	{
22162 	  /* In C++11, [ could start a lambda-introducer.  */
22163 	  bool non_const = false;
22164 
22165 	  cp_parser_parse_tentatively (parser);
22166 
22167 	  if (!cp_parser_array_designator_p (parser))
22168 	    {
22169 	      cp_parser_simulate_error (parser);
22170 	      designator = NULL_TREE;
22171 	    }
22172 	  else
22173 	    {
22174 	      designator = cp_parser_constant_expression (parser, true,
22175 							  &non_const);
22176 	      cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
22177 	      cp_parser_require (parser, CPP_EQ, RT_EQ);
22178 	    }
22179 
22180 	  if (!cp_parser_parse_definitely (parser))
22181 	    designator = NULL_TREE;
22182 	  else if (non_const
22183 		   && (!require_potential_rvalue_constant_expression
22184 		       (designator)))
22185 	    designator = NULL_TREE;
22186 	  if (designator)
22187 	    /* Warn the user that they are using an extension.  */
22188 	    pedwarn (loc, OPT_Wpedantic,
22189 		     "ISO C++ does not allow C99 designated initializers");
22190 	}
22191       else
22192 	designator = NULL_TREE;
22193 
22194       if (first_p)
22195 	{
22196 	  first_designator = designator;
22197 	  first_p = false;
22198 	}
22199       else if (cxx_dialect >= cxx2a
22200 	       && first_designator != error_mark_node
22201 	       && (!first_designator != !designator))
22202 	{
22203 	  error_at (loc, "either all initializer clauses should be designated "
22204 			 "or none of them should be");
22205 	  first_designator = error_mark_node;
22206 	}
22207       else if (cxx_dialect < cxx2a && !first_designator)
22208 	first_designator = designator;
22209 
22210       /* Parse the initializer.  */
22211       initializer = cp_parser_initializer_clause (parser,
22212 						  &clause_non_constant_p);
22213       /* If any clause is non-constant, so is the entire initializer.  */
22214       if (clause_non_constant_p)
22215 	*non_constant_p = true;
22216 
22217       /* If we have an ellipsis, this is an initializer pack
22218 	 expansion.  */
22219       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
22220         {
22221 	  location_t loc = cp_lexer_peek_token (parser->lexer)->location;
22222 
22223           /* Consume the `...'.  */
22224           cp_lexer_consume_token (parser->lexer);
22225 
22226 	  if (designator && cxx_dialect >= cxx2a)
22227 	    error_at (loc,
22228 		      "%<...%> not allowed in designated initializer list");
22229 
22230 	  /* Turn the initializer into an initializer expansion.  */
22231 	  initializer = make_pack_expansion (initializer);
22232         }
22233 
22234       /* Add it to the vector.  */
22235       CONSTRUCTOR_APPEND_ELT (v, designator, initializer);
22236 
22237       /* If the next token is not a comma, we have reached the end of
22238 	 the list.  */
22239       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
22240 	break;
22241 
22242       /* Peek at the next token.  */
22243       token = cp_lexer_peek_nth_token (parser->lexer, 2);
22244       /* If the next token is a `}', then we're still done.  An
22245 	 initializer-clause can have a trailing `,' after the
22246 	 initializer-list and before the closing `}'.  */
22247       if (token->type == CPP_CLOSE_BRACE)
22248 	break;
22249 
22250       /* Consume the `,' token.  */
22251       cp_lexer_consume_token (parser->lexer);
22252     }
22253 
22254   /* The same identifier shall not appear in multiple designators
22255      of a designated-initializer-list.  */
22256   if (first_designator)
22257     {
22258       unsigned int i;
22259       tree designator, val;
22260       FOR_EACH_CONSTRUCTOR_ELT (v, i, designator, val)
22261 	if (designator && TREE_CODE (designator) == IDENTIFIER_NODE)
22262 	  {
22263 	    if (IDENTIFIER_MARKED (designator))
22264 	      {
22265 		error_at (EXPR_LOC_OR_LOC (val, input_location),
22266 			  "%<.%s%> designator used multiple times in "
22267 			  "the same initializer list",
22268 			  IDENTIFIER_POINTER (designator));
22269 		(*v)[i].index = NULL_TREE;
22270 	      }
22271 	    else
22272 	      IDENTIFIER_MARKED (designator) = 1;
22273 	  }
22274       FOR_EACH_CONSTRUCTOR_ELT (v, i, designator, val)
22275 	if (designator && TREE_CODE (designator) == IDENTIFIER_NODE)
22276 	  IDENTIFIER_MARKED (designator) = 0;
22277     }
22278 
22279   return v;
22280 }
22281 
22282 /* Classes [gram.class] */
22283 
22284 /* Parse a class-name.
22285 
22286    class-name:
22287      identifier
22288      template-id
22289 
22290    TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
22291    to indicate that names looked up in dependent types should be
22292    assumed to be types.  TEMPLATE_KEYWORD_P is true iff the `template'
22293    keyword has been used to indicate that the name that appears next
22294    is a template.  TAG_TYPE indicates the explicit tag given before
22295    the type name, if any.  If CHECK_DEPENDENCY_P is FALSE, names are
22296    looked up in dependent scopes.  If CLASS_HEAD_P is TRUE, this class
22297    is the class being defined in a class-head.  If ENUM_OK is TRUE,
22298    enum-names are also accepted.
22299 
22300    Returns the TYPE_DECL representing the class.  */
22301 
22302 static tree
22303 cp_parser_class_name (cp_parser *parser,
22304 		      bool typename_keyword_p,
22305 		      bool template_keyword_p,
22306 		      enum tag_types tag_type,
22307 		      bool check_dependency_p,
22308 		      bool class_head_p,
22309 		      bool is_declaration,
22310 		      bool enum_ok)
22311 {
22312   tree decl;
22313   tree scope;
22314   bool typename_p;
22315   cp_token *token;
22316   tree identifier = NULL_TREE;
22317 
22318   /* All class-names start with an identifier.  */
22319   token = cp_lexer_peek_token (parser->lexer);
22320   if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
22321     {
22322       cp_parser_error (parser, "expected class-name");
22323       return error_mark_node;
22324     }
22325 
22326   /* PARSER->SCOPE can be cleared when parsing the template-arguments
22327      to a template-id, so we save it here.  */
22328   scope = parser->scope;
22329   if (scope == error_mark_node)
22330     return error_mark_node;
22331 
22332   /* Any name names a type if we're following the `typename' keyword
22333      in a qualified name where the enclosing scope is type-dependent.  */
22334   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
22335 		&& dependent_type_p (scope));
22336   /* Handle the common case (an identifier, but not a template-id)
22337      efficiently.  */
22338   if (token->type == CPP_NAME
22339       && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
22340     {
22341       cp_token *identifier_token;
22342       bool ambiguous_p;
22343 
22344       /* Look for the identifier.  */
22345       identifier_token = cp_lexer_peek_token (parser->lexer);
22346       ambiguous_p = identifier_token->error_reported;
22347       identifier = cp_parser_identifier (parser);
22348       /* If the next token isn't an identifier, we are certainly not
22349 	 looking at a class-name.  */
22350       if (identifier == error_mark_node)
22351 	decl = error_mark_node;
22352       /* If we know this is a type-name, there's no need to look it
22353 	 up.  */
22354       else if (typename_p)
22355 	decl = identifier;
22356       else
22357 	{
22358 	  tree ambiguous_decls;
22359 	  /* If we already know that this lookup is ambiguous, then
22360 	     we've already issued an error message; there's no reason
22361 	     to check again.  */
22362 	  if (ambiguous_p)
22363 	    {
22364 	      cp_parser_simulate_error (parser);
22365 	      return error_mark_node;
22366 	    }
22367 	  /* If the next token is a `::', then the name must be a type
22368 	     name.
22369 
22370 	     [basic.lookup.qual]
22371 
22372 	     During the lookup for a name preceding the :: scope
22373 	     resolution operator, object, function, and enumerator
22374 	     names are ignored.  */
22375 	  if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
22376 	    tag_type = scope_type;
22377 	  /* Look up the name.  */
22378 	  decl = cp_parser_lookup_name (parser, identifier,
22379 					tag_type,
22380 					/*is_template=*/false,
22381 					/*is_namespace=*/false,
22382 					check_dependency_p,
22383 					&ambiguous_decls,
22384 					identifier_token->location);
22385 	  if (ambiguous_decls)
22386 	    {
22387 	      if (cp_parser_parsing_tentatively (parser))
22388 		cp_parser_simulate_error (parser);
22389 	      return error_mark_node;
22390 	    }
22391 	}
22392     }
22393   else
22394     {
22395       /* Try a template-id.  */
22396       decl = cp_parser_template_id (parser, template_keyword_p,
22397 				    check_dependency_p,
22398 				    tag_type,
22399 				    is_declaration);
22400       if (decl == error_mark_node)
22401 	return error_mark_node;
22402     }
22403 
22404   decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
22405 
22406   /* If this is a typename, create a TYPENAME_TYPE.  */
22407   if (typename_p && decl != error_mark_node)
22408     {
22409       decl = make_typename_type (scope, decl, typename_type,
22410 				 /*complain=*/tf_error);
22411       if (decl != error_mark_node)
22412 	decl = TYPE_NAME (decl);
22413     }
22414 
22415   decl = strip_using_decl (decl);
22416 
22417   /* Check to see that it is really the name of a class.  */
22418   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
22419       && identifier_p (TREE_OPERAND (decl, 0))
22420       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
22421     /* Situations like this:
22422 
22423 	 template <typename T> struct A {
22424 	   typename T::template X<int>::I i;
22425 	 };
22426 
22427        are problematic.  Is `T::template X<int>' a class-name?  The
22428        standard does not seem to be definitive, but there is no other
22429        valid interpretation of the following `::'.  Therefore, those
22430        names are considered class-names.  */
22431     {
22432       decl = make_typename_type (scope, decl, tag_type, tf_error);
22433       if (decl != error_mark_node)
22434 	decl = TYPE_NAME (decl);
22435     }
22436   else if (TREE_CODE (decl) != TYPE_DECL
22437 	   || TREE_TYPE (decl) == error_mark_node
22438 	   || !(MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
22439 		|| (enum_ok && TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE))
22440 	   /* In Objective-C 2.0, a classname followed by '.' starts a
22441 	      dot-syntax expression, and it's not a type-name.  */
22442 	   || (c_dialect_objc ()
22443 	       && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
22444 	       && objc_is_class_name (decl)))
22445     decl = error_mark_node;
22446 
22447   if (decl == error_mark_node)
22448     cp_parser_error (parser, "expected class-name");
22449   else if (identifier && !parser->scope)
22450     maybe_note_name_used_in_class (identifier, decl);
22451 
22452   return decl;
22453 }
22454 
22455 /* Parse a class-specifier.
22456 
22457    class-specifier:
22458      class-head { member-specification [opt] }
22459 
22460    Returns the TREE_TYPE representing the class.  */
22461 
22462 static tree
22463 cp_parser_class_specifier_1 (cp_parser* parser)
22464 {
22465   tree type;
22466   tree attributes = NULL_TREE;
22467   bool nested_name_specifier_p;
22468   unsigned saved_num_template_parameter_lists;
22469   bool saved_in_function_body;
22470   unsigned char in_statement;
22471   bool in_switch_statement_p;
22472   bool saved_in_unbraced_linkage_specification_p;
22473   tree old_scope = NULL_TREE;
22474   tree scope = NULL_TREE;
22475   cp_token *closing_brace;
22476 
22477   push_deferring_access_checks (dk_no_deferred);
22478 
22479   /* Parse the class-head.  */
22480   type = cp_parser_class_head (parser,
22481 			       &nested_name_specifier_p);
22482   /* If the class-head was a semantic disaster, skip the entire body
22483      of the class.  */
22484   if (!type)
22485     {
22486       cp_parser_skip_to_end_of_block_or_statement (parser);
22487       pop_deferring_access_checks ();
22488       return error_mark_node;
22489     }
22490 
22491   /* Look for the `{'.  */
22492   matching_braces braces;
22493   if (!braces.require_open (parser))
22494     {
22495       pop_deferring_access_checks ();
22496       return error_mark_node;
22497     }
22498 
22499   cp_ensure_no_omp_declare_simd (parser);
22500   cp_ensure_no_oacc_routine (parser);
22501 
22502   /* Issue an error message if type-definitions are forbidden here.  */
22503   cp_parser_check_type_definition (parser);
22504   /* Remember that we are defining one more class.  */
22505   ++parser->num_classes_being_defined;
22506   /* Inside the class, surrounding template-parameter-lists do not
22507      apply.  */
22508   saved_num_template_parameter_lists
22509     = parser->num_template_parameter_lists;
22510   parser->num_template_parameter_lists = 0;
22511   /* We are not in a function body.  */
22512   saved_in_function_body = parser->in_function_body;
22513   parser->in_function_body = false;
22514   /* Or in a loop.  */
22515   in_statement = parser->in_statement;
22516   parser->in_statement = 0;
22517   /* Or in a switch.  */
22518   in_switch_statement_p = parser->in_switch_statement_p;
22519   parser->in_switch_statement_p = false;
22520   /* We are not immediately inside an extern "lang" block.  */
22521   saved_in_unbraced_linkage_specification_p
22522     = parser->in_unbraced_linkage_specification_p;
22523   parser->in_unbraced_linkage_specification_p = false;
22524 
22525   // Associate constraints with the type.
22526   if (flag_concepts)
22527     type = associate_classtype_constraints (type);
22528 
22529   /* Start the class.  */
22530   if (nested_name_specifier_p)
22531     {
22532       scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
22533       old_scope = push_inner_scope (scope);
22534     }
22535   type = begin_class_definition (type);
22536 
22537   if (type == error_mark_node)
22538     /* If the type is erroneous, skip the entire body of the class.  */
22539     cp_parser_skip_to_closing_brace (parser);
22540   else
22541     /* Parse the member-specification.  */
22542     cp_parser_member_specification_opt (parser);
22543 
22544   /* Look for the trailing `}'.  */
22545   closing_brace = braces.require_close (parser);
22546   /* Look for trailing attributes to apply to this class.  */
22547   if (cp_parser_allow_gnu_extensions_p (parser))
22548     attributes = cp_parser_gnu_attributes_opt (parser);
22549   if (type != error_mark_node)
22550     type = finish_struct (type, attributes);
22551   if (nested_name_specifier_p)
22552     pop_inner_scope (old_scope, scope);
22553 
22554   /* We've finished a type definition.  Check for the common syntax
22555      error of forgetting a semicolon after the definition.  We need to
22556      be careful, as we can't just check for not-a-semicolon and be done
22557      with it; the user might have typed:
22558 
22559      class X { } c = ...;
22560      class X { } *p = ...;
22561 
22562      and so forth.  Instead, enumerate all the possible tokens that
22563      might follow this production; if we don't see one of them, then
22564      complain and silently insert the semicolon.  */
22565   {
22566     cp_token *token = cp_lexer_peek_token (parser->lexer);
22567     bool want_semicolon = true;
22568 
22569     if (cp_next_tokens_can_be_std_attribute_p (parser))
22570       /* Don't try to parse c++11 attributes here.  As per the
22571 	 grammar, that should be a task for
22572 	 cp_parser_decl_specifier_seq.  */
22573       want_semicolon = false;
22574 
22575     switch (token->type)
22576       {
22577       case CPP_NAME:
22578       case CPP_SEMICOLON:
22579       case CPP_MULT:
22580       case CPP_AND:
22581       case CPP_OPEN_PAREN:
22582       case CPP_CLOSE_PAREN:
22583       case CPP_COMMA:
22584         want_semicolon = false;
22585         break;
22586 
22587         /* While it's legal for type qualifiers and storage class
22588            specifiers to follow type definitions in the grammar, only
22589            compiler testsuites contain code like that.  Assume that if
22590            we see such code, then what we're really seeing is a case
22591            like:
22592 
22593            class X { }
22594            const <type> var = ...;
22595 
22596            or
22597 
22598            class Y { }
22599            static <type> func (...) ...
22600 
22601            i.e. the qualifier or specifier applies to the next
22602            declaration.  To do so, however, we need to look ahead one
22603            more token to see if *that* token is a type specifier.
22604 
22605 	   This code could be improved to handle:
22606 
22607 	   class Z { }
22608 	   static const <type> var = ...;  */
22609       case CPP_KEYWORD:
22610 	if (keyword_is_decl_specifier (token->keyword))
22611 	  {
22612 	    cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
22613 
22614 	    /* Handling user-defined types here would be nice, but very
22615 	       tricky.  */
22616 	    want_semicolon
22617 	      = (lookahead->type == CPP_KEYWORD
22618 		 && keyword_begins_type_specifier (lookahead->keyword));
22619 	  }
22620 	break;
22621       default:
22622 	break;
22623       }
22624 
22625     /* If we don't have a type, then something is very wrong and we
22626        shouldn't try to do anything clever.  Likewise for not seeing the
22627        closing brace.  */
22628     if (closing_brace && TYPE_P (type) && want_semicolon)
22629       {
22630 	/* Locate the closing brace.  */
22631 	cp_token_position prev
22632 	  = cp_lexer_previous_token_position (parser->lexer);
22633 	cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
22634 	location_t loc = prev_token->location;
22635 
22636 	/* We want to suggest insertion of a ';' immediately *after* the
22637 	   closing brace, so, if we can, offset the location by 1 column.  */
22638 	location_t next_loc = loc;
22639 	if (!linemap_location_from_macro_expansion_p (line_table, loc))
22640 	  next_loc = linemap_position_for_loc_and_offset (line_table, loc, 1);
22641 
22642 	rich_location richloc (line_table, next_loc);
22643 
22644 	/* If we successfully offset the location, suggest the fix-it.  */
22645 	if (next_loc != loc)
22646 	  richloc.add_fixit_insert_before (next_loc, ";");
22647 
22648 	if (CLASSTYPE_DECLARED_CLASS (type))
22649 	  error_at (&richloc,
22650 		    "expected %<;%> after class definition");
22651 	else if (TREE_CODE (type) == RECORD_TYPE)
22652 	  error_at (&richloc,
22653 		    "expected %<;%> after struct definition");
22654 	else if (TREE_CODE (type) == UNION_TYPE)
22655 	  error_at (&richloc,
22656 		    "expected %<;%> after union definition");
22657 	else
22658 	  gcc_unreachable ();
22659 
22660 	/* Unget one token and smash it to look as though we encountered
22661 	   a semicolon in the input stream.  */
22662 	cp_lexer_set_token_position (parser->lexer, prev);
22663 	token = cp_lexer_peek_token (parser->lexer);
22664 	token->type = CPP_SEMICOLON;
22665 	token->keyword = RID_MAX;
22666       }
22667   }
22668 
22669   /* If this class is not itself within the scope of another class,
22670      then we need to parse the bodies of all of the queued function
22671      definitions.  Note that the queued functions defined in a class
22672      are not always processed immediately following the
22673      class-specifier for that class.  Consider:
22674 
22675        struct A {
22676 	 struct B { void f() { sizeof (A); } };
22677        };
22678 
22679      If `f' were processed before the processing of `A' were
22680      completed, there would be no way to compute the size of `A'.
22681      Note that the nesting we are interested in here is lexical --
22682      not the semantic nesting given by TYPE_CONTEXT.  In particular,
22683      for:
22684 
22685        struct A { struct B; };
22686        struct A::B { void f() { } };
22687 
22688      there is no need to delay the parsing of `A::B::f'.  */
22689   if (--parser->num_classes_being_defined == 0)
22690     {
22691       tree decl;
22692       tree class_type = NULL_TREE;
22693       tree pushed_scope = NULL_TREE;
22694       unsigned ix;
22695       cp_default_arg_entry *e;
22696       tree save_ccp, save_ccr;
22697 
22698       if (any_erroneous_template_args_p (type))
22699 	{
22700 	  /* Skip default arguments, NSDMIs, etc, in order to improve
22701 	     error recovery (c++/71169, c++/71832).  */
22702 	  vec_safe_truncate (unparsed_funs_with_default_args, 0);
22703 	  vec_safe_truncate (unparsed_nsdmis, 0);
22704 	  vec_safe_truncate (unparsed_classes, 0);
22705 	  vec_safe_truncate (unparsed_funs_with_definitions, 0);
22706 	}
22707 
22708       /* In a first pass, parse default arguments to the functions.
22709 	 Then, in a second pass, parse the bodies of the functions.
22710 	 This two-phased approach handles cases like:
22711 
22712 	    struct S {
22713 	      void f() { g(); }
22714 	      void g(int i = 3);
22715 	    };
22716 
22717 	 */
22718       FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_default_args, ix, e)
22719 	{
22720 	  decl = e->decl;
22721 	  /* If there are default arguments that have not yet been processed,
22722 	     take care of them now.  */
22723 	  if (class_type != e->class_type)
22724 	    {
22725 	      if (pushed_scope)
22726 		pop_scope (pushed_scope);
22727 	      class_type = e->class_type;
22728 	      pushed_scope = push_scope (class_type);
22729 	    }
22730 	  /* Make sure that any template parameters are in scope.  */
22731 	  maybe_begin_member_template_processing (decl);
22732 	  /* Parse the default argument expressions.  */
22733 	  cp_parser_late_parsing_default_args (parser, decl);
22734 	  /* Remove any template parameters from the symbol table.  */
22735 	  maybe_end_member_template_processing ();
22736 	}
22737       vec_safe_truncate (unparsed_funs_with_default_args, 0);
22738       /* Now parse any NSDMIs.  */
22739       save_ccp = current_class_ptr;
22740       save_ccr = current_class_ref;
22741       FOR_EACH_VEC_SAFE_ELT (unparsed_nsdmis, ix, decl)
22742 	{
22743 	  if (class_type != DECL_CONTEXT (decl))
22744 	    {
22745 	      if (pushed_scope)
22746 		pop_scope (pushed_scope);
22747 	      class_type = DECL_CONTEXT (decl);
22748 	      pushed_scope = push_scope (class_type);
22749 	    }
22750 	  inject_this_parameter (class_type, TYPE_UNQUALIFIED);
22751 	  cp_parser_late_parsing_nsdmi (parser, decl);
22752 	}
22753       vec_safe_truncate (unparsed_nsdmis, 0);
22754       current_class_ptr = save_ccp;
22755       current_class_ref = save_ccr;
22756       if (pushed_scope)
22757 	pop_scope (pushed_scope);
22758 
22759       /* Now do some post-NSDMI bookkeeping.  */
22760       FOR_EACH_VEC_SAFE_ELT (unparsed_classes, ix, class_type)
22761 	after_nsdmi_defaulted_late_checks (class_type);
22762       vec_safe_truncate (unparsed_classes, 0);
22763       after_nsdmi_defaulted_late_checks (type);
22764 
22765       /* Now parse the body of the functions.  */
22766       if (flag_openmp)
22767 	{
22768 	  /* OpenMP UDRs need to be parsed before all other functions.  */
22769 	  FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
22770 	    if (DECL_OMP_DECLARE_REDUCTION_P (decl))
22771 	      cp_parser_late_parsing_for_member (parser, decl);
22772 	  FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
22773 	    if (!DECL_OMP_DECLARE_REDUCTION_P (decl))
22774 	      cp_parser_late_parsing_for_member (parser, decl);
22775 	}
22776       else
22777 	FOR_EACH_VEC_SAFE_ELT (unparsed_funs_with_definitions, ix, decl)
22778 	  cp_parser_late_parsing_for_member (parser, decl);
22779       vec_safe_truncate (unparsed_funs_with_definitions, 0);
22780     }
22781   else
22782     vec_safe_push (unparsed_classes, type);
22783 
22784   /* Put back any saved access checks.  */
22785   pop_deferring_access_checks ();
22786 
22787   /* Restore saved state.  */
22788   parser->in_switch_statement_p = in_switch_statement_p;
22789   parser->in_statement = in_statement;
22790   parser->in_function_body = saved_in_function_body;
22791   parser->num_template_parameter_lists
22792     = saved_num_template_parameter_lists;
22793   parser->in_unbraced_linkage_specification_p
22794     = saved_in_unbraced_linkage_specification_p;
22795 
22796   return type;
22797 }
22798 
22799 static tree
22800 cp_parser_class_specifier (cp_parser* parser)
22801 {
22802   tree ret;
22803   timevar_push (TV_PARSE_STRUCT);
22804   ret = cp_parser_class_specifier_1 (parser);
22805   timevar_pop (TV_PARSE_STRUCT);
22806   return ret;
22807 }
22808 
22809 /* Parse a class-head.
22810 
22811    class-head:
22812      class-key identifier [opt] base-clause [opt]
22813      class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
22814      class-key nested-name-specifier [opt] template-id
22815        base-clause [opt]
22816 
22817    class-virt-specifier:
22818      final
22819 
22820    GNU Extensions:
22821      class-key attributes identifier [opt] base-clause [opt]
22822      class-key attributes nested-name-specifier identifier base-clause [opt]
22823      class-key attributes nested-name-specifier [opt] template-id
22824        base-clause [opt]
22825 
22826    Upon return BASES is initialized to the list of base classes (or
22827    NULL, if there are none) in the same form returned by
22828    cp_parser_base_clause.
22829 
22830    Returns the TYPE of the indicated class.  Sets
22831    *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
22832    involving a nested-name-specifier was used, and FALSE otherwise.
22833 
22834    Returns error_mark_node if this is not a class-head.
22835 
22836    Returns NULL_TREE if the class-head is syntactically valid, but
22837    semantically invalid in a way that means we should skip the entire
22838    body of the class.  */
22839 
22840 static tree
22841 cp_parser_class_head (cp_parser* parser,
22842 		      bool* nested_name_specifier_p)
22843 {
22844   tree nested_name_specifier;
22845   enum tag_types class_key;
22846   tree id = NULL_TREE;
22847   tree type = NULL_TREE;
22848   tree attributes;
22849   tree bases;
22850   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
22851   bool template_id_p = false;
22852   bool qualified_p = false;
22853   bool invalid_nested_name_p = false;
22854   bool invalid_explicit_specialization_p = false;
22855   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
22856   tree pushed_scope = NULL_TREE;
22857   unsigned num_templates;
22858   cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
22859   /* Assume no nested-name-specifier will be present.  */
22860   *nested_name_specifier_p = false;
22861   /* Assume no template parameter lists will be used in defining the
22862      type.  */
22863   num_templates = 0;
22864   parser->colon_corrects_to_scope_p = false;
22865 
22866   /* Look for the class-key.  */
22867   class_key = cp_parser_class_key (parser);
22868   if (class_key == none_type)
22869     return error_mark_node;
22870 
22871   location_t class_head_start_location = input_location;
22872 
22873   /* Parse the attributes.  */
22874   attributes = cp_parser_attributes_opt (parser);
22875 
22876   /* If the next token is `::', that is invalid -- but sometimes
22877      people do try to write:
22878 
22879        struct ::S {};
22880 
22881      Handle this gracefully by accepting the extra qualifier, and then
22882      issuing an error about it later if this really is a
22883      class-head.  If it turns out just to be an elaborated type
22884      specifier, remain silent.  */
22885   if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
22886     qualified_p = true;
22887 
22888   push_deferring_access_checks (dk_no_check);
22889 
22890   /* Determine the name of the class.  Begin by looking for an
22891      optional nested-name-specifier.  */
22892   nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
22893   nested_name_specifier
22894     = cp_parser_nested_name_specifier_opt (parser,
22895 					   /*typename_keyword_p=*/false,
22896 					   /*check_dependency_p=*/false,
22897 					   /*type_p=*/true,
22898 					   /*is_declaration=*/false);
22899   /* If there was a nested-name-specifier, then there *must* be an
22900      identifier.  */
22901 
22902   cp_token *bad_template_keyword = NULL;
22903 
22904   if (nested_name_specifier)
22905     {
22906       type_start_token = cp_lexer_peek_token (parser->lexer);
22907       /* Although the grammar says `identifier', it really means
22908 	 `class-name' or `template-name'.  You are only allowed to
22909 	 define a class that has already been declared with this
22910 	 syntax.
22911 
22912 	 The proposed resolution for Core Issue 180 says that wherever
22913 	 you see `class T::X' you should treat `X' as a type-name.
22914 
22915 	 It is OK to define an inaccessible class; for example:
22916 
22917 	   class A { class B; };
22918 	   class A::B {};
22919 
22920 	 We do not know if we will see a class-name, or a
22921 	 template-name.  We look for a class-name first, in case the
22922 	 class-name is a template-id; if we looked for the
22923 	 template-name first we would stop after the template-name.  */
22924       cp_parser_parse_tentatively (parser);
22925       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
22926 	bad_template_keyword = cp_lexer_consume_token (parser->lexer);
22927       type = cp_parser_class_name (parser,
22928 				   /*typename_keyword_p=*/false,
22929 				   /*template_keyword_p=*/false,
22930 				   class_type,
22931 				   /*check_dependency_p=*/false,
22932 				   /*class_head_p=*/true,
22933 				   /*is_declaration=*/false);
22934       /* If that didn't work, ignore the nested-name-specifier.  */
22935       if (!cp_parser_parse_definitely (parser))
22936 	{
22937 	  invalid_nested_name_p = true;
22938 	  type_start_token = cp_lexer_peek_token (parser->lexer);
22939 	  id = cp_parser_identifier (parser);
22940 	  if (id == error_mark_node)
22941 	    id = NULL_TREE;
22942 	}
22943       /* If we could not find a corresponding TYPE, treat this
22944 	 declaration like an unqualified declaration.  */
22945       if (type == error_mark_node)
22946 	nested_name_specifier = NULL_TREE;
22947       /* Otherwise, count the number of templates used in TYPE and its
22948 	 containing scopes.  */
22949       else
22950 	{
22951 	  tree scope;
22952 
22953 	  for (scope = TREE_TYPE (type);
22954 	       scope && TREE_CODE (scope) != NAMESPACE_DECL;
22955 	       scope = get_containing_scope (scope))
22956 	    if (TYPE_P (scope)
22957 		&& CLASS_TYPE_P (scope)
22958 		&& CLASSTYPE_TEMPLATE_INFO (scope)
22959 		&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
22960 		&& (!CLASSTYPE_TEMPLATE_SPECIALIZATION (scope)
22961 		    || uses_template_parms (CLASSTYPE_TI_ARGS (scope))))
22962 	      ++num_templates;
22963 	}
22964     }
22965   /* Otherwise, the identifier is optional.  */
22966   else
22967     {
22968       /* We don't know whether what comes next is a template-id,
22969 	 an identifier, or nothing at all.  */
22970       cp_parser_parse_tentatively (parser);
22971       /* Check for a template-id.  */
22972       type_start_token = cp_lexer_peek_token (parser->lexer);
22973       id = cp_parser_template_id (parser,
22974 				  /*template_keyword_p=*/false,
22975 				  /*check_dependency_p=*/true,
22976 				  class_key,
22977 				  /*is_declaration=*/true);
22978       /* If that didn't work, it could still be an identifier.  */
22979       if (!cp_parser_parse_definitely (parser))
22980 	{
22981 	  if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
22982 	    {
22983 	      type_start_token = cp_lexer_peek_token (parser->lexer);
22984 	      id = cp_parser_identifier (parser);
22985 	    }
22986 	  else
22987 	    id = NULL_TREE;
22988 	}
22989       else
22990 	{
22991 	  template_id_p = true;
22992 	  ++num_templates;
22993 	}
22994     }
22995 
22996   pop_deferring_access_checks ();
22997 
22998   if (id)
22999     {
23000       cp_parser_check_for_invalid_template_id (parser, id,
23001 					       class_key,
23002                                                type_start_token->location);
23003     }
23004   virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
23005 
23006   /* If it's not a `:' or a `{' then we can't really be looking at a
23007      class-head, since a class-head only appears as part of a
23008      class-specifier.  We have to detect this situation before calling
23009      xref_tag, since that has irreversible side-effects.  */
23010   if (!cp_parser_next_token_starts_class_definition_p (parser))
23011     {
23012       cp_parser_error (parser, "expected %<{%> or %<:%>");
23013       type = error_mark_node;
23014       goto out;
23015     }
23016 
23017   /* At this point, we're going ahead with the class-specifier, even
23018      if some other problem occurs.  */
23019   cp_parser_commit_to_tentative_parse (parser);
23020   if (virt_specifiers & VIRT_SPEC_OVERRIDE)
23021     {
23022       cp_parser_error (parser,
23023                        "cannot specify %<override%> for a class");
23024       type = error_mark_node;
23025       goto out;
23026     }
23027   /* Issue the error about the overly-qualified name now.  */
23028   if (qualified_p)
23029     {
23030       cp_parser_error (parser,
23031 		       "global qualification of class name is invalid");
23032       type = error_mark_node;
23033       goto out;
23034     }
23035   else if (invalid_nested_name_p)
23036     {
23037       cp_parser_error (parser,
23038 		       "qualified name does not name a class");
23039       type = error_mark_node;
23040       goto out;
23041     }
23042   else if (nested_name_specifier)
23043     {
23044       tree scope;
23045 
23046       if (bad_template_keyword)
23047 	/* [temp.names]: in a qualified-id formed by a class-head-name, the
23048 	   keyword template shall not appear at the top level.  */
23049 	pedwarn (bad_template_keyword->location, OPT_Wpedantic,
23050 		 "keyword %<template%> not allowed in class-head-name");
23051 
23052       /* Reject typedef-names in class heads.  */
23053       if (!DECL_IMPLICIT_TYPEDEF_P (type))
23054 	{
23055 	  error_at (type_start_token->location,
23056 		    "invalid class name in declaration of %qD",
23057 		    type);
23058 	  type = NULL_TREE;
23059 	  goto done;
23060 	}
23061 
23062       /* Figure out in what scope the declaration is being placed.  */
23063       scope = current_scope ();
23064       /* If that scope does not contain the scope in which the
23065 	 class was originally declared, the program is invalid.  */
23066       if (scope && !is_ancestor (scope, nested_name_specifier))
23067 	{
23068 	  if (at_namespace_scope_p ())
23069 	    error_at (type_start_token->location,
23070 		      "declaration of %qD in namespace %qD which does not "
23071 		      "enclose %qD",
23072 		      type, scope, nested_name_specifier);
23073 	  else
23074 	    error_at (type_start_token->location,
23075 		      "declaration of %qD in %qD which does not enclose %qD",
23076 		      type, scope, nested_name_specifier);
23077 	  type = NULL_TREE;
23078 	  goto done;
23079 	}
23080       /* [dcl.meaning]
23081 
23082 	 A declarator-id shall not be qualified except for the
23083 	 definition of a ... nested class outside of its class
23084 	 ... [or] the definition or explicit instantiation of a
23085 	 class member of a namespace outside of its namespace.  */
23086       if (scope == nested_name_specifier)
23087 	{
23088 	  permerror (nested_name_specifier_token_start->location,
23089 		     "extra qualification not allowed");
23090 	  nested_name_specifier = NULL_TREE;
23091 	  num_templates = 0;
23092 	}
23093     }
23094   /* An explicit-specialization must be preceded by "template <>".  If
23095      it is not, try to recover gracefully.  */
23096   if (at_namespace_scope_p ()
23097       && parser->num_template_parameter_lists == 0
23098       && !processing_template_parmlist
23099       && template_id_p)
23100     {
23101       /* Build a location of this form:
23102            struct typename <ARGS>
23103            ^~~~~~~~~~~~~~~~~~~~~~
23104          with caret==start at the start token, and
23105          finishing at the end of the type.  */
23106       location_t reported_loc
23107         = make_location (class_head_start_location,
23108                          class_head_start_location,
23109                          get_finish (type_start_token->location));
23110       rich_location richloc (line_table, reported_loc);
23111       richloc.add_fixit_insert_before (class_head_start_location,
23112                                        "template <> ");
23113       error_at (&richloc,
23114 		"an explicit specialization must be preceded by"
23115 		" %<template <>%>");
23116       invalid_explicit_specialization_p = true;
23117       /* Take the same action that would have been taken by
23118 	 cp_parser_explicit_specialization.  */
23119       ++parser->num_template_parameter_lists;
23120       begin_specialization ();
23121     }
23122   /* There must be no "return" statements between this point and the
23123      end of this function; set "type "to the correct return value and
23124      use "goto done;" to return.  */
23125   /* Make sure that the right number of template parameters were
23126      present.  */
23127   if (!cp_parser_check_template_parameters (parser, num_templates,
23128 					    template_id_p,
23129 					    type_start_token->location,
23130 					    /*declarator=*/NULL))
23131     {
23132       /* If something went wrong, there is no point in even trying to
23133 	 process the class-definition.  */
23134       type = NULL_TREE;
23135       goto done;
23136     }
23137 
23138   /* Look up the type.  */
23139   if (template_id_p)
23140     {
23141       if (TREE_CODE (id) == TEMPLATE_ID_EXPR
23142 	  && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
23143 	      || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
23144 	{
23145 	  error_at (type_start_token->location,
23146 		    "function template %qD redeclared as a class template", id);
23147 	  type = error_mark_node;
23148 	}
23149       else
23150 	{
23151 	  type = TREE_TYPE (id);
23152 	  type = maybe_process_partial_specialization (type);
23153 
23154 	  /* Check the scope while we still know whether or not we had a
23155 	     nested-name-specifier.  */
23156 	  if (type != error_mark_node)
23157 	    check_unqualified_spec_or_inst (type, type_start_token->location);
23158 	}
23159       if (nested_name_specifier)
23160 	pushed_scope = push_scope (nested_name_specifier);
23161     }
23162   else if (nested_name_specifier)
23163     {
23164       tree class_type;
23165 
23166       /* Given:
23167 
23168 	    template <typename T> struct S { struct T };
23169 	    template <typename T> struct S<T>::T { };
23170 
23171 	 we will get a TYPENAME_TYPE when processing the definition of
23172 	 `S::T'.  We need to resolve it to the actual type before we
23173 	 try to define it.  */
23174       if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
23175 	{
23176 	  class_type = resolve_typename_type (TREE_TYPE (type),
23177 					      /*only_current_p=*/false);
23178 	  if (TREE_CODE (class_type) != TYPENAME_TYPE)
23179 	    type = TYPE_NAME (class_type);
23180 	  else
23181 	    {
23182 	      cp_parser_error (parser, "could not resolve typename type");
23183 	      type = error_mark_node;
23184 	    }
23185 	}
23186 
23187       if (maybe_process_partial_specialization (TREE_TYPE (type))
23188 	  == error_mark_node)
23189 	{
23190 	  type = NULL_TREE;
23191 	  goto done;
23192 	}
23193 
23194       class_type = current_class_type;
23195       /* Enter the scope indicated by the nested-name-specifier.  */
23196       pushed_scope = push_scope (nested_name_specifier);
23197       /* Get the canonical version of this type.  */
23198       type = TYPE_MAIN_DECL (TREE_TYPE (type));
23199       /* Call push_template_decl if it seems like we should be defining a
23200 	 template either from the template headers or the type we're
23201 	 defining, so that we diagnose both extra and missing headers.  */
23202       if ((PROCESSING_REAL_TEMPLATE_DECL_P ()
23203 	   || CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (type)))
23204 	  && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
23205 	{
23206 	  type = push_template_decl (type);
23207 	  if (type == error_mark_node)
23208 	    {
23209 	      type = NULL_TREE;
23210 	      goto done;
23211 	    }
23212 	}
23213 
23214       type = TREE_TYPE (type);
23215       *nested_name_specifier_p = true;
23216     }
23217   else      /* The name is not a nested name.  */
23218     {
23219       /* If the class was unnamed, create a dummy name.  */
23220       if (!id)
23221 	id = make_anon_name ();
23222       tag_scope tag_scope = (parser->in_type_id_in_expr_p
23223 			     ? ts_within_enclosing_non_class
23224 			     : ts_current);
23225       type = xref_tag (class_key, id, tag_scope,
23226 		       parser->num_template_parameter_lists);
23227     }
23228 
23229   /* Indicate whether this class was declared as a `class' or as a
23230      `struct'.  */
23231   if (TREE_CODE (type) == RECORD_TYPE)
23232     CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
23233   cp_parser_check_class_key (class_key, type);
23234 
23235   /* If this type was already complete, and we see another definition,
23236      that's an error.  */
23237   if (type != error_mark_node && COMPLETE_TYPE_P (type))
23238     {
23239       error_at (type_start_token->location, "redefinition of %q#T",
23240 		type);
23241       inform (location_of (type), "previous definition of %q#T",
23242 	      type);
23243       type = NULL_TREE;
23244       goto done;
23245     }
23246   else if (type == error_mark_node)
23247     type = NULL_TREE;
23248 
23249   if (type)
23250     {
23251       /* Apply attributes now, before any use of the class as a template
23252 	 argument in its base list.  */
23253       cplus_decl_attributes (&type, attributes, (int)ATTR_FLAG_TYPE_IN_PLACE);
23254       fixup_attribute_variants (type);
23255     }
23256 
23257   /* We will have entered the scope containing the class; the names of
23258      base classes should be looked up in that context.  For example:
23259 
23260        struct A { struct B {}; struct C; };
23261        struct A::C : B {};
23262 
23263      is valid.  */
23264 
23265   /* Get the list of base-classes, if there is one.  */
23266   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
23267     {
23268       /* PR59482: enter the class scope so that base-specifiers are looked
23269 	 up correctly.  */
23270       if (type)
23271 	pushclass (type);
23272       bases = cp_parser_base_clause (parser);
23273       /* PR59482: get out of the previously pushed class scope so that the
23274 	 subsequent pops pop the right thing.  */
23275       if (type)
23276 	popclass ();
23277     }
23278   else
23279     bases = NULL_TREE;
23280 
23281   /* If we're really defining a class, process the base classes.
23282      If they're invalid, fail.  */
23283   if (type && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
23284     xref_basetypes (type, bases);
23285 
23286  done:
23287   /* Leave the scope given by the nested-name-specifier.  We will
23288      enter the class scope itself while processing the members.  */
23289   if (pushed_scope)
23290     pop_scope (pushed_scope);
23291 
23292   if (invalid_explicit_specialization_p)
23293     {
23294       end_specialization ();
23295       --parser->num_template_parameter_lists;
23296     }
23297 
23298   if (type)
23299     DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
23300   if (type && (virt_specifiers & VIRT_SPEC_FINAL))
23301     CLASSTYPE_FINAL (type) = 1;
23302  out:
23303   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
23304   return type;
23305 }
23306 
23307 /* Parse a class-key.
23308 
23309    class-key:
23310      class
23311      struct
23312      union
23313 
23314    Returns the kind of class-key specified, or none_type to indicate
23315    error.  */
23316 
23317 static enum tag_types
23318 cp_parser_class_key (cp_parser* parser)
23319 {
23320   cp_token *token;
23321   enum tag_types tag_type;
23322 
23323   /* Look for the class-key.  */
23324   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
23325   if (!token)
23326     return none_type;
23327 
23328   /* Check to see if the TOKEN is a class-key.  */
23329   tag_type = cp_parser_token_is_class_key (token);
23330   if (!tag_type)
23331     cp_parser_error (parser, "expected class-key");
23332   return tag_type;
23333 }
23334 
23335 /* Parse a type-parameter-key.
23336 
23337    type-parameter-key:
23338      class
23339      typename
23340  */
23341 
23342 static void
23343 cp_parser_type_parameter_key (cp_parser* parser)
23344 {
23345   /* Look for the type-parameter-key.  */
23346   enum tag_types tag_type = none_type;
23347   cp_token *token = cp_lexer_peek_token (parser->lexer);
23348   if ((tag_type = cp_parser_token_is_type_parameter_key (token)) != none_type)
23349     {
23350       cp_lexer_consume_token (parser->lexer);
23351       if (pedantic && tag_type == typename_type && cxx_dialect < cxx17)
23352 	/* typename is not allowed in a template template parameter
23353 	   by the standard until C++17.  */
23354 	pedwarn (token->location, OPT_Wpedantic,
23355 		 "ISO C++ forbids typename key in template template parameter;"
23356 		 " use -std=c++17 or -std=gnu++17");
23357     }
23358   else
23359     cp_parser_error (parser, "expected %<class%> or %<typename%>");
23360 
23361   return;
23362 }
23363 
23364 /* Parse an (optional) member-specification.
23365 
23366    member-specification:
23367      member-declaration member-specification [opt]
23368      access-specifier : member-specification [opt]  */
23369 
23370 static void
23371 cp_parser_member_specification_opt (cp_parser* parser)
23372 {
23373   while (true)
23374     {
23375       cp_token *token;
23376       enum rid keyword;
23377 
23378       /* Peek at the next token.  */
23379       token = cp_lexer_peek_token (parser->lexer);
23380       /* If it's a `}', or EOF then we've seen all the members.  */
23381       if (token->type == CPP_CLOSE_BRACE
23382 	  || token->type == CPP_EOF
23383 	  || token->type == CPP_PRAGMA_EOL)
23384 	break;
23385 
23386       /* See if this token is a keyword.  */
23387       keyword = token->keyword;
23388       switch (keyword)
23389 	{
23390 	case RID_PUBLIC:
23391 	case RID_PROTECTED:
23392 	case RID_PRIVATE:
23393 	  /* Consume the access-specifier.  */
23394 	  cp_lexer_consume_token (parser->lexer);
23395 	  /* Remember which access-specifier is active.  */
23396 	  current_access_specifier = token->u.value;
23397 	  /* Look for the `:'.  */
23398 	  cp_parser_require (parser, CPP_COLON, RT_COLON);
23399 	  break;
23400 
23401 	default:
23402 	  /* Accept #pragmas at class scope.  */
23403 	  if (token->type == CPP_PRAGMA)
23404 	    {
23405 	      cp_parser_pragma (parser, pragma_member, NULL);
23406 	      break;
23407 	    }
23408 
23409 	  /* Otherwise, the next construction must be a
23410 	     member-declaration.  */
23411 	  cp_parser_member_declaration (parser);
23412 	}
23413     }
23414 }
23415 
23416 /* Parse a member-declaration.
23417 
23418    member-declaration:
23419      decl-specifier-seq [opt] member-declarator-list [opt] ;
23420      function-definition ; [opt]
23421      :: [opt] nested-name-specifier template [opt] unqualified-id ;
23422      using-declaration
23423      template-declaration
23424      alias-declaration
23425 
23426    member-declarator-list:
23427      member-declarator
23428      member-declarator-list , member-declarator
23429 
23430    member-declarator:
23431      declarator pure-specifier [opt]
23432      declarator constant-initializer [opt]
23433      identifier [opt] : constant-expression
23434 
23435    GNU Extensions:
23436 
23437    member-declaration:
23438      __extension__ member-declaration
23439 
23440    member-declarator:
23441      declarator attributes [opt] pure-specifier [opt]
23442      declarator attributes [opt] constant-initializer [opt]
23443      identifier [opt] attributes [opt] : constant-expression
23444 
23445    C++0x Extensions:
23446 
23447    member-declaration:
23448      static_assert-declaration  */
23449 
23450 static void
23451 cp_parser_member_declaration (cp_parser* parser)
23452 {
23453   cp_decl_specifier_seq decl_specifiers;
23454   tree prefix_attributes;
23455   tree decl;
23456   int declares_class_or_enum;
23457   bool friend_p;
23458   cp_token *token = NULL;
23459   cp_token *decl_spec_token_start = NULL;
23460   cp_token *initializer_token_start = NULL;
23461   int saved_pedantic;
23462   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
23463 
23464   /* Check for the `__extension__' keyword.  */
23465   if (cp_parser_extension_opt (parser, &saved_pedantic))
23466     {
23467       /* Recurse.  */
23468       cp_parser_member_declaration (parser);
23469       /* Restore the old value of the PEDANTIC flag.  */
23470       pedantic = saved_pedantic;
23471 
23472       return;
23473     }
23474 
23475   /* Check for a template-declaration.  */
23476   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
23477     {
23478       /* An explicit specialization here is an error condition, and we
23479 	 expect the specialization handler to detect and report this.  */
23480       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
23481 	  && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
23482 	cp_parser_explicit_specialization (parser);
23483       else
23484 	cp_parser_template_declaration (parser, /*member_p=*/true);
23485 
23486       return;
23487     }
23488   /* Check for a template introduction.  */
23489   else if (cp_parser_template_declaration_after_export (parser, true))
23490     return;
23491 
23492   /* Check for a using-declaration.  */
23493   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
23494     {
23495       if (cxx_dialect < cxx11)
23496 	{
23497 	  /* Parse the using-declaration.  */
23498 	  cp_parser_using_declaration (parser,
23499 				       /*access_declaration_p=*/false);
23500 	  return;
23501 	}
23502       else
23503 	{
23504 	  tree decl;
23505 	  bool alias_decl_expected;
23506 	  cp_parser_parse_tentatively (parser);
23507 	  decl = cp_parser_alias_declaration (parser);
23508 	  /* Note that if we actually see the '=' token after the
23509 	     identifier, cp_parser_alias_declaration commits the
23510 	     tentative parse.  In that case, we really expect an
23511 	     alias-declaration.  Otherwise, we expect a using
23512 	     declaration.  */
23513 	  alias_decl_expected =
23514 	    !cp_parser_uncommitted_to_tentative_parse_p (parser);
23515 	  cp_parser_parse_definitely (parser);
23516 
23517 	  if (alias_decl_expected)
23518 	    finish_member_declaration (decl);
23519 	  else
23520 	    cp_parser_using_declaration (parser,
23521 					 /*access_declaration_p=*/false);
23522 	  return;
23523 	}
23524     }
23525 
23526   /* Check for @defs.  */
23527   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
23528     {
23529       tree ivar, member;
23530       tree ivar_chains = cp_parser_objc_defs_expression (parser);
23531       ivar = ivar_chains;
23532       while (ivar)
23533 	{
23534 	  member = ivar;
23535 	  ivar = TREE_CHAIN (member);
23536 	  TREE_CHAIN (member) = NULL_TREE;
23537 	  finish_member_declaration (member);
23538 	}
23539       return;
23540     }
23541 
23542   /* If the next token is `static_assert' we have a static assertion.  */
23543   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
23544     {
23545       cp_parser_static_assert (parser, /*member_p=*/true);
23546       return;
23547     }
23548 
23549   parser->colon_corrects_to_scope_p = false;
23550 
23551   if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
23552       goto out;
23553 
23554   /* Parse the decl-specifier-seq.  */
23555   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
23556   cp_parser_decl_specifier_seq (parser,
23557 				CP_PARSER_FLAGS_OPTIONAL,
23558 				&decl_specifiers,
23559 				&declares_class_or_enum);
23560   /* Check for an invalid type-name.  */
23561   if (!decl_specifiers.any_type_specifiers_p
23562       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
23563     goto out;
23564   /* If there is no declarator, then the decl-specifier-seq should
23565      specify a type.  */
23566   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23567     {
23568       /* If there was no decl-specifier-seq, and the next token is a
23569 	 `;', then we have something like:
23570 
23571 	   struct S { ; };
23572 
23573 	 [class.mem]
23574 
23575 	 Each member-declaration shall declare at least one member
23576 	 name of the class.  */
23577       if (!decl_specifiers.any_specifiers_p)
23578 	{
23579 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
23580 	  if (!in_system_header_at (token->location))
23581 	    {
23582 	      gcc_rich_location richloc (token->location);
23583 	      richloc.add_fixit_remove ();
23584 	      pedwarn (&richloc, OPT_Wpedantic, "extra %<;%>");
23585 	    }
23586 	}
23587       else
23588 	{
23589 	  tree type;
23590 
23591 	  /* See if this declaration is a friend.  */
23592 	  friend_p = cp_parser_friend_p (&decl_specifiers);
23593 	  /* If there were decl-specifiers, check to see if there was
23594 	     a class-declaration.  */
23595 	  type = check_tag_decl (&decl_specifiers,
23596 				 /*explicit_type_instantiation_p=*/false);
23597 	  /* Nested classes have already been added to the class, but
23598 	     a `friend' needs to be explicitly registered.  */
23599 	  if (friend_p)
23600 	    {
23601 	      /* If the `friend' keyword was present, the friend must
23602 		 be introduced with a class-key.  */
23603 	       if (!declares_class_or_enum && cxx_dialect < cxx11)
23604 		 pedwarn (decl_spec_token_start->location, OPT_Wpedantic,
23605 			  "in C++03 a class-key must be used "
23606 			  "when declaring a friend");
23607 	       /* In this case:
23608 
23609 		    template <typename T> struct A {
23610 		      friend struct A<T>::B;
23611 		    };
23612 
23613 		  A<T>::B will be represented by a TYPENAME_TYPE, and
23614 		  therefore not recognized by check_tag_decl.  */
23615 	       if (!type)
23616 		 {
23617 		   type = decl_specifiers.type;
23618 		   if (type && TREE_CODE (type) == TYPE_DECL)
23619 		     type = TREE_TYPE (type);
23620 		 }
23621 	       if (!type || !TYPE_P (type))
23622 		 error_at (decl_spec_token_start->location,
23623 			   "friend declaration does not name a class or "
23624 			   "function");
23625 	       else
23626 		 make_friend_class (current_class_type, type,
23627 				    /*complain=*/true);
23628 	    }
23629 	  /* If there is no TYPE, an error message will already have
23630 	     been issued.  */
23631 	  else if (!type || type == error_mark_node)
23632 	    ;
23633 	  /* An anonymous aggregate has to be handled specially; such
23634 	     a declaration really declares a data member (with a
23635 	     particular type), as opposed to a nested class.  */
23636 	  else if (ANON_AGGR_TYPE_P (type))
23637 	    {
23638 	      /* C++11 9.5/6.  */
23639 	      if (decl_specifiers.storage_class != sc_none)
23640 		error_at (decl_spec_token_start->location,
23641 			  "a storage class on an anonymous aggregate "
23642 			  "in class scope is not allowed");
23643 
23644 	      /* Remove constructors and such from TYPE, now that we
23645 		 know it is an anonymous aggregate.  */
23646 	      fixup_anonymous_aggr (type);
23647 	      /* And make the corresponding data member.  */
23648 	      decl = build_decl (decl_spec_token_start->location,
23649 				 FIELD_DECL, NULL_TREE, type);
23650 	      /* Add it to the class.  */
23651 	      finish_member_declaration (decl);
23652 	    }
23653 	  else
23654 	    cp_parser_check_access_in_redeclaration
23655 					      (TYPE_NAME (type),
23656 					       decl_spec_token_start->location);
23657 	}
23658     }
23659   else
23660     {
23661       bool assume_semicolon = false;
23662 
23663       /* Clear attributes from the decl_specifiers but keep them
23664 	 around as prefix attributes that apply them to the entity
23665 	 being declared.  */
23666       prefix_attributes = decl_specifiers.attributes;
23667       decl_specifiers.attributes = NULL_TREE;
23668 
23669       /* See if these declarations will be friends.  */
23670       friend_p = cp_parser_friend_p (&decl_specifiers);
23671 
23672       /* Keep going until we hit the `;' at the end of the
23673 	 declaration.  */
23674       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23675 	{
23676 	  tree attributes = NULL_TREE;
23677 	  tree first_attribute;
23678 	  tree initializer;
23679 	  bool named_bitfld = false;
23680 
23681 	  /* Peek at the next token.  */
23682 	  token = cp_lexer_peek_token (parser->lexer);
23683 
23684 	  /* The following code wants to know early if it is a bit-field
23685 	     or some other declaration.  Attributes can appear before
23686 	     the `:' token.  Skip over them without consuming any tokens
23687 	     to peek if they are followed by `:'.  */
23688 	  if (cp_next_tokens_can_be_attribute_p (parser)
23689 	      || (token->type == CPP_NAME
23690 		  && cp_nth_tokens_can_be_attribute_p (parser, 2)
23691 		  && (named_bitfld = true)))
23692 	    {
23693 	      size_t n
23694 		= cp_parser_skip_attributes_opt (parser, 1 + named_bitfld);
23695 	      token = cp_lexer_peek_nth_token (parser->lexer, n);
23696 	    }
23697 
23698 	  /* Check for a bitfield declaration.  */
23699 	  if (token->type == CPP_COLON
23700 	      || (token->type == CPP_NAME
23701 		  && token == cp_lexer_peek_token (parser->lexer)
23702 		  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_COLON)
23703 		  && (named_bitfld = true)))
23704 	    {
23705 	      tree identifier;
23706 	      tree width;
23707 	      tree late_attributes = NULL_TREE;
23708 
23709 	      if (named_bitfld)
23710 		identifier = cp_parser_identifier (parser);
23711 	      else
23712 		identifier = NULL_TREE;
23713 
23714 	      /* Look for attributes that apply to the bitfield.  */
23715 	      attributes = cp_parser_attributes_opt (parser);
23716 
23717 	      /* Consume the `:' token.  */
23718 	      cp_lexer_consume_token (parser->lexer);
23719 
23720 	      /* Get the width of the bitfield.  */
23721 	      width = cp_parser_constant_expression (parser, false, NULL,
23722 						     cxx_dialect >= cxx11);
23723 
23724 	      /* In C++2A and as extension for C++11 and above we allow
23725 		 default member initializers for bit-fields.  */
23726 	      initializer = NULL_TREE;
23727 	      if (cxx_dialect >= cxx11
23728 		  && (cp_lexer_next_token_is (parser->lexer, CPP_EQ)
23729 		      || cp_lexer_next_token_is (parser->lexer,
23730 						 CPP_OPEN_BRACE)))
23731 		{
23732 		  location_t loc
23733 		    = cp_lexer_peek_token (parser->lexer)->location;
23734 		  if (cxx_dialect < cxx2a
23735 		      && !in_system_header_at (loc)
23736 		      && identifier != NULL_TREE)
23737 		    pedwarn (loc, 0,
23738 			     "default member initializers for bit-fields "
23739 			     "only available with -std=c++2a or "
23740 			     "-std=gnu++2a");
23741 
23742 		  initializer = cp_parser_save_nsdmi (parser);
23743 		  if (identifier == NULL_TREE)
23744 		    {
23745 		      error_at (loc, "default member initializer for "
23746 				     "unnamed bit-field");
23747 		      initializer = NULL_TREE;
23748 		    }
23749 		}
23750 	      else
23751 		{
23752 		  /* Look for attributes that apply to the bitfield after
23753 		     the `:' token and width.  This is where GCC used to
23754 		     parse attributes in the past, pedwarn if there is
23755 		     a std attribute.  */
23756 		  if (cp_next_tokens_can_be_std_attribute_p (parser))
23757 		    pedwarn (input_location, OPT_Wpedantic,
23758 			     "ISO C++ allows bit-field attributes only "
23759 			     "before the %<:%> token");
23760 
23761 		  late_attributes = cp_parser_attributes_opt (parser);
23762 		}
23763 
23764 	      attributes = attr_chainon (attributes, late_attributes);
23765 
23766 	      /* Remember which attributes are prefix attributes and
23767 		 which are not.  */
23768 	      first_attribute = attributes;
23769 	      /* Combine the attributes.  */
23770 	      attributes = attr_chainon (prefix_attributes, attributes);
23771 
23772 	      /* Create the bitfield declaration.  */
23773 	      decl = grokbitfield (identifier
23774 				   ? make_id_declarator (NULL_TREE,
23775 							 identifier,
23776 							 sfk_none)
23777 				   : NULL,
23778 				   &decl_specifiers,
23779 				   width, initializer,
23780 				   attributes);
23781 	    }
23782 	  else
23783 	    {
23784 	      cp_declarator *declarator;
23785 	      tree asm_specification;
23786 	      int ctor_dtor_or_conv_p;
23787 
23788 	      /* Parse the declarator.  */
23789 	      declarator
23790 		= cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
23791 					&ctor_dtor_or_conv_p,
23792 					/*parenthesized_p=*/NULL,
23793 					/*member_p=*/true,
23794 					friend_p);
23795 
23796 	      /* If something went wrong parsing the declarator, make sure
23797 		 that we at least consume some tokens.  */
23798 	      if (declarator == cp_error_declarator)
23799 		{
23800 		  /* Skip to the end of the statement.  */
23801 		  cp_parser_skip_to_end_of_statement (parser);
23802 		  /* If the next token is not a semicolon, that is
23803 		     probably because we just skipped over the body of
23804 		     a function.  So, we consume a semicolon if
23805 		     present, but do not issue an error message if it
23806 		     is not present.  */
23807 		  if (cp_lexer_next_token_is (parser->lexer,
23808 					      CPP_SEMICOLON))
23809 		    cp_lexer_consume_token (parser->lexer);
23810 		  goto out;
23811 		}
23812 
23813 	      if (declares_class_or_enum & 2)
23814 		cp_parser_check_for_definition_in_return_type
23815 					    (declarator, decl_specifiers.type,
23816 					     decl_specifiers.locations[ds_type_spec]);
23817 
23818 	      /* Look for an asm-specification.  */
23819 	      asm_specification = cp_parser_asm_specification_opt (parser);
23820 	      /* Look for attributes that apply to the declaration.  */
23821 	      attributes = cp_parser_attributes_opt (parser);
23822 	      /* Remember which attributes are prefix attributes and
23823 		 which are not.  */
23824 	      first_attribute = attributes;
23825 	      /* Combine the attributes.  */
23826 	      attributes = attr_chainon (prefix_attributes, attributes);
23827 
23828 	      /* If it's an `=', then we have a constant-initializer or a
23829 		 pure-specifier.  It is not correct to parse the
23830 		 initializer before registering the member declaration
23831 		 since the member declaration should be in scope while
23832 		 its initializer is processed.  However, the rest of the
23833 		 front end does not yet provide an interface that allows
23834 		 us to handle this correctly.  */
23835 	      if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
23836 		{
23837 		  /* In [class.mem]:
23838 
23839 		     A pure-specifier shall be used only in the declaration of
23840 		     a virtual function.
23841 
23842 		     A member-declarator can contain a constant-initializer
23843 		     only if it declares a static member of integral or
23844 		     enumeration type.
23845 
23846 		     Therefore, if the DECLARATOR is for a function, we look
23847 		     for a pure-specifier; otherwise, we look for a
23848 		     constant-initializer.  When we call `grokfield', it will
23849 		     perform more stringent semantics checks.  */
23850 		  initializer_token_start = cp_lexer_peek_token (parser->lexer);
23851 		  if (function_declarator_p (declarator)
23852 		      || (decl_specifiers.type
23853 			  && TREE_CODE (decl_specifiers.type) == TYPE_DECL
23854 			  && declarator->kind == cdk_id
23855 			  && (TREE_CODE (TREE_TYPE (decl_specifiers.type))
23856 			      == FUNCTION_TYPE)))
23857 		    initializer = cp_parser_pure_specifier (parser);
23858 		  else if (decl_specifiers.storage_class != sc_static)
23859 		    initializer = cp_parser_save_nsdmi (parser);
23860 		  else if (cxx_dialect >= cxx11)
23861 		    {
23862 		      bool nonconst;
23863 		      /* Don't require a constant rvalue in C++11, since we
23864 			 might want a reference constant.  We'll enforce
23865 		         constancy later.  */
23866 		      cp_lexer_consume_token (parser->lexer);
23867 		      /* Parse the initializer.  */
23868 		      initializer = cp_parser_initializer_clause (parser,
23869 								  &nonconst);
23870 		    }
23871 		  else
23872 		    /* Parse the initializer.  */
23873 		    initializer = cp_parser_constant_initializer (parser);
23874 		}
23875 	      else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)
23876 		       && !function_declarator_p (declarator))
23877 		{
23878 		  bool x;
23879 		  if (decl_specifiers.storage_class != sc_static)
23880 		    initializer = cp_parser_save_nsdmi (parser);
23881 		  else
23882 		    initializer = cp_parser_initializer (parser, &x, &x);
23883 		}
23884 	      /* Otherwise, there is no initializer.  */
23885 	      else
23886 		initializer = NULL_TREE;
23887 
23888 	      /* See if we are probably looking at a function
23889 		 definition.  We are certainly not looking at a
23890 		 member-declarator.  Calling `grokfield' has
23891 		 side-effects, so we must not do it unless we are sure
23892 		 that we are looking at a member-declarator.  */
23893 	      if (cp_parser_token_starts_function_definition_p
23894 		  (cp_lexer_peek_token (parser->lexer)))
23895 		{
23896 		  /* The grammar does not allow a pure-specifier to be
23897 		     used when a member function is defined.  (It is
23898 		     possible that this fact is an oversight in the
23899 		     standard, since a pure function may be defined
23900 		     outside of the class-specifier.  */
23901 		  if (initializer && initializer_token_start)
23902 		    error_at (initializer_token_start->location,
23903 			      "pure-specifier on function-definition");
23904 		  decl = cp_parser_save_member_function_body (parser,
23905 							      &decl_specifiers,
23906 							      declarator,
23907 							      attributes);
23908 		  if (parser->fully_implicit_function_template_p)
23909 		    decl = finish_fully_implicit_template (parser, decl);
23910 		  /* If the member was not a friend, declare it here.  */
23911 		  if (!friend_p)
23912 		    finish_member_declaration (decl);
23913 		  /* Peek at the next token.  */
23914 		  token = cp_lexer_peek_token (parser->lexer);
23915 		  /* If the next token is a semicolon, consume it.  */
23916 		  if (token->type == CPP_SEMICOLON)
23917 		    {
23918 		      location_t semicolon_loc
23919 			= cp_lexer_consume_token (parser->lexer)->location;
23920 		      gcc_rich_location richloc (semicolon_loc);
23921 		      richloc.add_fixit_remove ();
23922 		      warning_at (&richloc, OPT_Wextra_semi,
23923 				  "extra %<;%> after in-class "
23924 				  "function definition");
23925 		    }
23926 		  goto out;
23927 		}
23928 	      else
23929 		if (declarator->kind == cdk_function)
23930 		  declarator->id_loc = token->location;
23931 	      /* Create the declaration.  */
23932 	      decl = grokfield (declarator, &decl_specifiers,
23933 				initializer, /*init_const_expr_p=*/true,
23934 				asm_specification, attributes);
23935 	      if (parser->fully_implicit_function_template_p)
23936 		{
23937 		  if (friend_p)
23938 		    finish_fully_implicit_template (parser, 0);
23939 		  else
23940 		    decl = finish_fully_implicit_template (parser, decl);
23941 		}
23942 	    }
23943 
23944 	  cp_finalize_omp_declare_simd (parser, decl);
23945 	  cp_finalize_oacc_routine (parser, decl, false);
23946 
23947 	  /* Reset PREFIX_ATTRIBUTES.  */
23948 	  if (attributes != error_mark_node)
23949 	    {
23950 	      while (attributes && TREE_CHAIN (attributes) != first_attribute)
23951 		attributes = TREE_CHAIN (attributes);
23952 	      if (attributes)
23953 		TREE_CHAIN (attributes) = NULL_TREE;
23954 	    }
23955 
23956 	  /* If there is any qualification still in effect, clear it
23957 	     now; we will be starting fresh with the next declarator.  */
23958 	  parser->scope = NULL_TREE;
23959 	  parser->qualifying_scope = NULL_TREE;
23960 	  parser->object_scope = NULL_TREE;
23961 	  /* If it's a `,', then there are more declarators.  */
23962 	  if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23963 	    {
23964 	      cp_lexer_consume_token (parser->lexer);
23965 	      if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23966 		{
23967 		  cp_token *token = cp_lexer_previous_token (parser->lexer);
23968 		  gcc_rich_location richloc (token->location);
23969 		  richloc.add_fixit_remove ();
23970 		  error_at (&richloc, "stray %<,%> at end of "
23971 			    "member declaration");
23972 		}
23973 	    }
23974 	  /* If the next token isn't a `;', then we have a parse error.  */
23975 	  else if (cp_lexer_next_token_is_not (parser->lexer,
23976 					       CPP_SEMICOLON))
23977 	    {
23978 	      /* The next token might be a ways away from where the
23979 		 actual semicolon is missing.  Find the previous token
23980 		 and use that for our error position.  */
23981 	      cp_token *token = cp_lexer_previous_token (parser->lexer);
23982 	      gcc_rich_location richloc (token->location);
23983 	      richloc.add_fixit_insert_after (";");
23984 	      error_at (&richloc, "expected %<;%> at end of "
23985 			"member declaration");
23986 
23987 	      /* Assume that the user meant to provide a semicolon.  If
23988 		 we were to cp_parser_skip_to_end_of_statement, we might
23989 		 skip to a semicolon inside a member function definition
23990 		 and issue nonsensical error messages.  */
23991 	      assume_semicolon = true;
23992 	    }
23993 
23994 	  if (decl)
23995 	    {
23996 	      /* Add DECL to the list of members.  */
23997 	      if (!friend_p
23998 		  /* Explicitly include, eg, NSDMIs, for better error
23999 		     recovery (c++/58650).  */
24000 		  || !DECL_DECLARES_FUNCTION_P (decl))
24001 		finish_member_declaration (decl);
24002 
24003 	      if (TREE_CODE (decl) == FUNCTION_DECL)
24004 		cp_parser_save_default_args (parser, decl);
24005 	      else if (TREE_CODE (decl) == FIELD_DECL
24006 		       && DECL_INITIAL (decl))
24007 		/* Add DECL to the queue of NSDMI to be parsed later.  */
24008 		vec_safe_push (unparsed_nsdmis, decl);
24009 	    }
24010 
24011 	  if (assume_semicolon)
24012 	    goto out;
24013 	}
24014     }
24015 
24016   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
24017  out:
24018   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
24019 }
24020 
24021 /* Parse a pure-specifier.
24022 
24023    pure-specifier:
24024      = 0
24025 
24026    Returns INTEGER_ZERO_NODE if a pure specifier is found.
24027    Otherwise, ERROR_MARK_NODE is returned.  */
24028 
24029 static tree
24030 cp_parser_pure_specifier (cp_parser* parser)
24031 {
24032   cp_token *token;
24033 
24034   /* Look for the `=' token.  */
24035   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24036     return error_mark_node;
24037   /* Look for the `0' token.  */
24038   token = cp_lexer_peek_token (parser->lexer);
24039 
24040   if (token->type == CPP_EOF
24041       || token->type == CPP_PRAGMA_EOL)
24042     return error_mark_node;
24043 
24044   cp_lexer_consume_token (parser->lexer);
24045 
24046   /* Accept = default or = delete in c++0x mode.  */
24047   if (token->keyword == RID_DEFAULT
24048       || token->keyword == RID_DELETE)
24049     {
24050       maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
24051       return token->u.value;
24052     }
24053 
24054   /* c_lex_with_flags marks a single digit '0' with PURE_ZERO.  */
24055   if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
24056     {
24057       cp_parser_error (parser,
24058 		       "invalid pure specifier (only %<= 0%> is allowed)");
24059       cp_parser_skip_to_end_of_statement (parser);
24060       return error_mark_node;
24061     }
24062   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
24063     {
24064       error_at (token->location, "templates may not be %<virtual%>");
24065       return error_mark_node;
24066     }
24067 
24068   return integer_zero_node;
24069 }
24070 
24071 /* Parse a constant-initializer.
24072 
24073    constant-initializer:
24074      = constant-expression
24075 
24076    Returns a representation of the constant-expression.  */
24077 
24078 static tree
24079 cp_parser_constant_initializer (cp_parser* parser)
24080 {
24081   /* Look for the `=' token.  */
24082   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24083     return error_mark_node;
24084 
24085   /* It is invalid to write:
24086 
24087        struct S { static const int i = { 7 }; };
24088 
24089      */
24090   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
24091     {
24092       cp_parser_error (parser,
24093 		       "a brace-enclosed initializer is not allowed here");
24094       /* Consume the opening brace.  */
24095       matching_braces braces;
24096       braces.consume_open (parser);
24097       /* Skip the initializer.  */
24098       cp_parser_skip_to_closing_brace (parser);
24099       /* Look for the trailing `}'.  */
24100       braces.require_close (parser);
24101 
24102       return error_mark_node;
24103     }
24104 
24105   return cp_parser_constant_expression (parser);
24106 }
24107 
24108 /* Derived classes [gram.class.derived] */
24109 
24110 /* Parse a base-clause.
24111 
24112    base-clause:
24113      : base-specifier-list
24114 
24115    base-specifier-list:
24116      base-specifier ... [opt]
24117      base-specifier-list , base-specifier ... [opt]
24118 
24119    Returns a TREE_LIST representing the base-classes, in the order in
24120    which they were declared.  The representation of each node is as
24121    described by cp_parser_base_specifier.
24122 
24123    In the case that no bases are specified, this function will return
24124    NULL_TREE, not ERROR_MARK_NODE.  */
24125 
24126 static tree
24127 cp_parser_base_clause (cp_parser* parser)
24128 {
24129   tree bases = NULL_TREE;
24130 
24131   /* Look for the `:' that begins the list.  */
24132   cp_parser_require (parser, CPP_COLON, RT_COLON);
24133 
24134   /* Scan the base-specifier-list.  */
24135   while (true)
24136     {
24137       cp_token *token;
24138       tree base;
24139       bool pack_expansion_p = false;
24140 
24141       /* Look for the base-specifier.  */
24142       base = cp_parser_base_specifier (parser);
24143       /* Look for the (optional) ellipsis. */
24144       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
24145         {
24146           /* Consume the `...'. */
24147           cp_lexer_consume_token (parser->lexer);
24148 
24149           pack_expansion_p = true;
24150         }
24151 
24152       /* Add BASE to the front of the list.  */
24153       if (base && base != error_mark_node)
24154 	{
24155           if (pack_expansion_p)
24156             /* Make this a pack expansion type. */
24157             TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
24158 
24159           if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
24160             {
24161               TREE_CHAIN (base) = bases;
24162               bases = base;
24163             }
24164 	}
24165       /* Peek at the next token.  */
24166       token = cp_lexer_peek_token (parser->lexer);
24167       /* If it's not a comma, then the list is complete.  */
24168       if (token->type != CPP_COMMA)
24169 	break;
24170       /* Consume the `,'.  */
24171       cp_lexer_consume_token (parser->lexer);
24172     }
24173 
24174   /* PARSER->SCOPE may still be non-NULL at this point, if the last
24175      base class had a qualified name.  However, the next name that
24176      appears is certainly not qualified.  */
24177   parser->scope = NULL_TREE;
24178   parser->qualifying_scope = NULL_TREE;
24179   parser->object_scope = NULL_TREE;
24180 
24181   return nreverse (bases);
24182 }
24183 
24184 /* Parse a base-specifier.
24185 
24186    base-specifier:
24187      :: [opt] nested-name-specifier [opt] class-name
24188      virtual access-specifier [opt] :: [opt] nested-name-specifier
24189        [opt] class-name
24190      access-specifier virtual [opt] :: [opt] nested-name-specifier
24191        [opt] class-name
24192 
24193    Returns a TREE_LIST.  The TREE_PURPOSE will be one of
24194    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
24195    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
24196    (or the ERROR_MARK_NODE) indicating the type that was specified.  */
24197 
24198 static tree
24199 cp_parser_base_specifier (cp_parser* parser)
24200 {
24201   cp_token *token;
24202   bool done = false;
24203   bool virtual_p = false;
24204   bool duplicate_virtual_error_issued_p = false;
24205   bool duplicate_access_error_issued_p = false;
24206   bool class_scope_p, template_p;
24207   tree access = access_default_node;
24208   tree type;
24209 
24210   /* Process the optional `virtual' and `access-specifier'.  */
24211   while (!done)
24212     {
24213       /* Peek at the next token.  */
24214       token = cp_lexer_peek_token (parser->lexer);
24215       /* Process `virtual'.  */
24216       switch (token->keyword)
24217 	{
24218 	case RID_VIRTUAL:
24219 	  /* If `virtual' appears more than once, issue an error.  */
24220 	  if (virtual_p && !duplicate_virtual_error_issued_p)
24221 	    {
24222 	      cp_parser_error (parser,
24223 			       "%<virtual%> specified more than once in base-specifier");
24224 	      duplicate_virtual_error_issued_p = true;
24225 	    }
24226 
24227 	  virtual_p = true;
24228 
24229 	  /* Consume the `virtual' token.  */
24230 	  cp_lexer_consume_token (parser->lexer);
24231 
24232 	  break;
24233 
24234 	case RID_PUBLIC:
24235 	case RID_PROTECTED:
24236 	case RID_PRIVATE:
24237 	  /* If more than one access specifier appears, issue an
24238 	     error.  */
24239 	  if (access != access_default_node
24240 	      && !duplicate_access_error_issued_p)
24241 	    {
24242 	      cp_parser_error (parser,
24243 			       "more than one access specifier in base-specifier");
24244 	      duplicate_access_error_issued_p = true;
24245 	    }
24246 
24247 	  access = ridpointers[(int) token->keyword];
24248 
24249 	  /* Consume the access-specifier.  */
24250 	  cp_lexer_consume_token (parser->lexer);
24251 
24252 	  break;
24253 
24254 	default:
24255 	  done = true;
24256 	  break;
24257 	}
24258     }
24259   /* It is not uncommon to see programs mechanically, erroneously, use
24260      the 'typename' keyword to denote (dependent) qualified types
24261      as base classes.  */
24262   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
24263     {
24264       token = cp_lexer_peek_token (parser->lexer);
24265       if (!processing_template_decl)
24266 	error_at (token->location,
24267 		  "keyword %<typename%> not allowed outside of templates");
24268       else
24269 	error_at (token->location,
24270 		  "keyword %<typename%> not allowed in this context "
24271 		  "(the base class is implicitly a type)");
24272       cp_lexer_consume_token (parser->lexer);
24273     }
24274 
24275   /* Look for the optional `::' operator.  */
24276   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
24277   /* Look for the nested-name-specifier.  The simplest way to
24278      implement:
24279 
24280        [temp.res]
24281 
24282        The keyword `typename' is not permitted in a base-specifier or
24283        mem-initializer; in these contexts a qualified name that
24284        depends on a template-parameter is implicitly assumed to be a
24285        type name.
24286 
24287      is to pretend that we have seen the `typename' keyword at this
24288      point.  */
24289   cp_parser_nested_name_specifier_opt (parser,
24290 				       /*typename_keyword_p=*/true,
24291 				       /*check_dependency_p=*/true,
24292 				       /*type_p=*/true,
24293 				       /*is_declaration=*/true);
24294   /* If the base class is given by a qualified name, assume that names
24295      we see are type names or templates, as appropriate.  */
24296   class_scope_p = (parser->scope && TYPE_P (parser->scope));
24297   template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
24298 
24299   if (!parser->scope
24300       && cp_lexer_next_token_is_decltype (parser->lexer))
24301     /* DR 950 allows decltype as a base-specifier.  */
24302     type = cp_parser_decltype (parser);
24303   else
24304     {
24305       /* Otherwise, look for the class-name.  */
24306       type = cp_parser_class_name (parser,
24307 				   class_scope_p,
24308 				   template_p,
24309 				   typename_type,
24310 				   /*check_dependency_p=*/true,
24311 				   /*class_head_p=*/false,
24312 				   /*is_declaration=*/true);
24313       type = TREE_TYPE (type);
24314     }
24315 
24316   if (type == error_mark_node)
24317     return error_mark_node;
24318 
24319   return finish_base_specifier (type, access, virtual_p);
24320 }
24321 
24322 /* Exception handling [gram.exception] */
24323 
24324 /* Parse an (optional) noexcept-specification.
24325 
24326    noexcept-specification:
24327      noexcept ( constant-expression ) [opt]
24328 
24329    If no noexcept-specification is present, returns NULL_TREE.
24330    Otherwise, if REQUIRE_CONSTEXPR is false, then either parse and return any
24331    expression if parentheses follow noexcept, or return BOOLEAN_TRUE_NODE if
24332    there are no parentheses.  CONSUMED_EXPR will be set accordingly.
24333    Otherwise, returns a noexcept specification unless RETURN_COND is true,
24334    in which case a boolean condition is returned instead.  */
24335 
24336 static tree
24337 cp_parser_noexcept_specification_opt (cp_parser* parser,
24338 				      bool require_constexpr,
24339 				      bool* consumed_expr,
24340 				      bool return_cond)
24341 {
24342   cp_token *token;
24343   const char *saved_message;
24344 
24345   /* Peek at the next token.  */
24346   token = cp_lexer_peek_token (parser->lexer);
24347 
24348   /* Is it a noexcept-specification?  */
24349   if (cp_parser_is_keyword (token, RID_NOEXCEPT))
24350     {
24351       tree expr;
24352       cp_lexer_consume_token (parser->lexer);
24353 
24354       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
24355 	{
24356 	  matching_parens parens;
24357 	  parens.consume_open (parser);
24358 
24359 	  if (require_constexpr)
24360 	    {
24361 	      /* Types may not be defined in an exception-specification.  */
24362 	      saved_message = parser->type_definition_forbidden_message;
24363 	      parser->type_definition_forbidden_message
24364 	      = G_("types may not be defined in an exception-specification");
24365 
24366 	      expr = cp_parser_constant_expression (parser);
24367 
24368 	      /* Restore the saved message.  */
24369 	      parser->type_definition_forbidden_message = saved_message;
24370 	    }
24371 	  else
24372 	    {
24373 	      expr = cp_parser_expression (parser);
24374 	      *consumed_expr = true;
24375 	    }
24376 
24377 	  parens.require_close (parser);
24378 	}
24379       else
24380 	{
24381 	  expr = boolean_true_node;
24382 	  if (!require_constexpr)
24383 	    *consumed_expr = false;
24384 	}
24385 
24386       /* We cannot build a noexcept-spec right away because this will check
24387 	 that expr is a constexpr.  */
24388       if (!return_cond)
24389 	return build_noexcept_spec (expr, tf_warning_or_error);
24390       else
24391 	return expr;
24392     }
24393   else
24394     return NULL_TREE;
24395 }
24396 
24397 /* Parse an (optional) exception-specification.
24398 
24399    exception-specification:
24400      throw ( type-id-list [opt] )
24401 
24402    Returns a TREE_LIST representing the exception-specification.  The
24403    TREE_VALUE of each node is a type.  */
24404 
24405 static tree
24406 cp_parser_exception_specification_opt (cp_parser* parser)
24407 {
24408   cp_token *token;
24409   tree type_id_list;
24410   const char *saved_message;
24411 
24412   /* Peek at the next token.  */
24413   token = cp_lexer_peek_token (parser->lexer);
24414 
24415   /* Is it a noexcept-specification?  */
24416   type_id_list = cp_parser_noexcept_specification_opt (parser, true, NULL,
24417 						       false);
24418   if (type_id_list != NULL_TREE)
24419     return type_id_list;
24420 
24421   /* If it's not `throw', then there's no exception-specification.  */
24422   if (!cp_parser_is_keyword (token, RID_THROW))
24423     return NULL_TREE;
24424 
24425   location_t loc = token->location;
24426 
24427   /* Consume the `throw'.  */
24428   cp_lexer_consume_token (parser->lexer);
24429 
24430   /* Look for the `('.  */
24431   matching_parens parens;
24432   parens.require_open (parser);
24433 
24434   /* Peek at the next token.  */
24435   token = cp_lexer_peek_token (parser->lexer);
24436   /* If it's not a `)', then there is a type-id-list.  */
24437   if (token->type != CPP_CLOSE_PAREN)
24438     {
24439       /* Types may not be defined in an exception-specification.  */
24440       saved_message = parser->type_definition_forbidden_message;
24441       parser->type_definition_forbidden_message
24442 	= G_("types may not be defined in an exception-specification");
24443       /* Parse the type-id-list.  */
24444       type_id_list = cp_parser_type_id_list (parser);
24445       /* Restore the saved message.  */
24446       parser->type_definition_forbidden_message = saved_message;
24447 
24448       if (cxx_dialect >= cxx17)
24449 	{
24450 	  error_at (loc, "ISO C++17 does not allow dynamic exception "
24451 			 "specifications");
24452 	  type_id_list = NULL_TREE;
24453 	}
24454       else if (cxx_dialect >= cxx11 && !in_system_header_at (loc))
24455 	warning_at (loc, OPT_Wdeprecated,
24456 		    "dynamic exception specifications are deprecated in "
24457 		    "C++11");
24458     }
24459   /* In C++17, throw() is equivalent to noexcept (true).  throw()
24460      is deprecated in C++11 and above as well, but is still widely used,
24461      so don't warn about it yet.  */
24462   else if (cxx_dialect >= cxx17)
24463     type_id_list = noexcept_true_spec;
24464   else
24465     type_id_list = empty_except_spec;
24466 
24467   /* Look for the `)'.  */
24468   parens.require_close (parser);
24469 
24470   return type_id_list;
24471 }
24472 
24473 /* Parse an (optional) type-id-list.
24474 
24475    type-id-list:
24476      type-id ... [opt]
24477      type-id-list , type-id ... [opt]
24478 
24479    Returns a TREE_LIST.  The TREE_VALUE of each node is a TYPE,
24480    in the order that the types were presented.  */
24481 
24482 static tree
24483 cp_parser_type_id_list (cp_parser* parser)
24484 {
24485   tree types = NULL_TREE;
24486 
24487   while (true)
24488     {
24489       cp_token *token;
24490       tree type;
24491 
24492       token = cp_lexer_peek_token (parser->lexer);
24493 
24494       /* Get the next type-id.  */
24495       type = cp_parser_type_id (parser);
24496       /* Check for invalid 'auto'.  */
24497       if (flag_concepts && type_uses_auto (type))
24498 	{
24499 	  error_at (token->location,
24500 		    "invalid use of %<auto%> in exception-specification");
24501 	  type = error_mark_node;
24502 	}
24503       /* Parse the optional ellipsis. */
24504       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
24505         {
24506           /* Consume the `...'. */
24507           cp_lexer_consume_token (parser->lexer);
24508 
24509           /* Turn the type into a pack expansion expression. */
24510           type = make_pack_expansion (type);
24511         }
24512       /* Add it to the list.  */
24513       types = add_exception_specifier (types, type, /*complain=*/1);
24514       /* Peek at the next token.  */
24515       token = cp_lexer_peek_token (parser->lexer);
24516       /* If it is not a `,', we are done.  */
24517       if (token->type != CPP_COMMA)
24518 	break;
24519       /* Consume the `,'.  */
24520       cp_lexer_consume_token (parser->lexer);
24521     }
24522 
24523   return nreverse (types);
24524 }
24525 
24526 /* Parse a try-block.
24527 
24528    try-block:
24529      try compound-statement handler-seq  */
24530 
24531 static tree
24532 cp_parser_try_block (cp_parser* parser)
24533 {
24534   tree try_block;
24535 
24536   cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
24537   if (parser->in_function_body
24538       && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
24539     error ("%<try%> in %<constexpr%> function");
24540 
24541   try_block = begin_try_block ();
24542   cp_parser_compound_statement (parser, NULL, BCS_TRY_BLOCK, false);
24543   finish_try_block (try_block);
24544   cp_parser_handler_seq (parser);
24545   finish_handler_sequence (try_block);
24546 
24547   return try_block;
24548 }
24549 
24550 /* Parse a function-try-block.
24551 
24552    function-try-block:
24553      try ctor-initializer [opt] function-body handler-seq  */
24554 
24555 static void
24556 cp_parser_function_try_block (cp_parser* parser)
24557 {
24558   tree compound_stmt;
24559   tree try_block;
24560 
24561   /* Look for the `try' keyword.  */
24562   if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
24563     return;
24564   /* Let the rest of the front end know where we are.  */
24565   try_block = begin_function_try_block (&compound_stmt);
24566   /* Parse the function-body.  */
24567   cp_parser_ctor_initializer_opt_and_function_body
24568     (parser, /*in_function_try_block=*/true);
24569   /* We're done with the `try' part.  */
24570   finish_function_try_block (try_block);
24571   /* Parse the handlers.  */
24572   cp_parser_handler_seq (parser);
24573   /* We're done with the handlers.  */
24574   finish_function_handler_sequence (try_block, compound_stmt);
24575 }
24576 
24577 /* Parse a handler-seq.
24578 
24579    handler-seq:
24580      handler handler-seq [opt]  */
24581 
24582 static void
24583 cp_parser_handler_seq (cp_parser* parser)
24584 {
24585   while (true)
24586     {
24587       cp_token *token;
24588 
24589       /* Parse the handler.  */
24590       cp_parser_handler (parser);
24591       /* Peek at the next token.  */
24592       token = cp_lexer_peek_token (parser->lexer);
24593       /* If it's not `catch' then there are no more handlers.  */
24594       if (!cp_parser_is_keyword (token, RID_CATCH))
24595 	break;
24596     }
24597 }
24598 
24599 /* Parse a handler.
24600 
24601    handler:
24602      catch ( exception-declaration ) compound-statement  */
24603 
24604 static void
24605 cp_parser_handler (cp_parser* parser)
24606 {
24607   tree handler;
24608   tree declaration;
24609 
24610   cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
24611   handler = begin_handler ();
24612   matching_parens parens;
24613   parens.require_open (parser);
24614   declaration = cp_parser_exception_declaration (parser);
24615   finish_handler_parms (declaration, handler);
24616   parens.require_close (parser);
24617   cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
24618   finish_handler (handler);
24619 }
24620 
24621 /* Parse an exception-declaration.
24622 
24623    exception-declaration:
24624      type-specifier-seq declarator
24625      type-specifier-seq abstract-declarator
24626      type-specifier-seq
24627      ...
24628 
24629    Returns a VAR_DECL for the declaration, or NULL_TREE if the
24630    ellipsis variant is used.  */
24631 
24632 static tree
24633 cp_parser_exception_declaration (cp_parser* parser)
24634 {
24635   cp_decl_specifier_seq type_specifiers;
24636   cp_declarator *declarator;
24637   const char *saved_message;
24638 
24639   /* If it's an ellipsis, it's easy to handle.  */
24640   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
24641     {
24642       /* Consume the `...' token.  */
24643       cp_lexer_consume_token (parser->lexer);
24644       return NULL_TREE;
24645     }
24646 
24647   /* Types may not be defined in exception-declarations.  */
24648   saved_message = parser->type_definition_forbidden_message;
24649   parser->type_definition_forbidden_message
24650     = G_("types may not be defined in exception-declarations");
24651 
24652   /* Parse the type-specifier-seq.  */
24653   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
24654 				/*is_trailing_return=*/false,
24655 				&type_specifiers);
24656   /* If it's a `)', then there is no declarator.  */
24657   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
24658     declarator = NULL;
24659   else
24660     declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
24661 				       /*ctor_dtor_or_conv_p=*/NULL,
24662 				       /*parenthesized_p=*/NULL,
24663 				       /*member_p=*/false,
24664 				       /*friend_p=*/false);
24665 
24666   /* Restore the saved message.  */
24667   parser->type_definition_forbidden_message = saved_message;
24668 
24669   if (!type_specifiers.any_specifiers_p)
24670     return error_mark_node;
24671 
24672   return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
24673 }
24674 
24675 /* Parse a throw-expression.
24676 
24677    throw-expression:
24678      throw assignment-expression [opt]
24679 
24680    Returns a THROW_EXPR representing the throw-expression.  */
24681 
24682 static tree
24683 cp_parser_throw_expression (cp_parser* parser)
24684 {
24685   tree expression;
24686   cp_token* token;
24687 
24688   cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
24689   token = cp_lexer_peek_token (parser->lexer);
24690   /* Figure out whether or not there is an assignment-expression
24691      following the "throw" keyword.  */
24692   if (token->type == CPP_COMMA
24693       || token->type == CPP_SEMICOLON
24694       || token->type == CPP_CLOSE_PAREN
24695       || token->type == CPP_CLOSE_SQUARE
24696       || token->type == CPP_CLOSE_BRACE
24697       || token->type == CPP_COLON)
24698     expression = NULL_TREE;
24699   else
24700     expression = cp_parser_assignment_expression (parser);
24701 
24702   return build_throw (expression);
24703 }
24704 
24705 /* GNU Extensions */
24706 
24707 /* Parse an (optional) asm-specification.
24708 
24709    asm-specification:
24710      asm ( string-literal )
24711 
24712    If the asm-specification is present, returns a STRING_CST
24713    corresponding to the string-literal.  Otherwise, returns
24714    NULL_TREE.  */
24715 
24716 static tree
24717 cp_parser_asm_specification_opt (cp_parser* parser)
24718 {
24719   cp_token *token;
24720   tree asm_specification;
24721 
24722   /* Peek at the next token.  */
24723   token = cp_lexer_peek_token (parser->lexer);
24724   /* If the next token isn't the `asm' keyword, then there's no
24725      asm-specification.  */
24726   if (!cp_parser_is_keyword (token, RID_ASM))
24727     return NULL_TREE;
24728 
24729   /* Consume the `asm' token.  */
24730   cp_lexer_consume_token (parser->lexer);
24731   /* Look for the `('.  */
24732   matching_parens parens;
24733   parens.require_open (parser);
24734 
24735   /* Look for the string-literal.  */
24736   asm_specification = cp_parser_string_literal (parser, false, false);
24737 
24738   /* Look for the `)'.  */
24739   parens.require_close (parser);
24740 
24741   return asm_specification;
24742 }
24743 
24744 /* Parse an asm-operand-list.
24745 
24746    asm-operand-list:
24747      asm-operand
24748      asm-operand-list , asm-operand
24749 
24750    asm-operand:
24751      string-literal ( expression )
24752      [ string-literal ] string-literal ( expression )
24753 
24754    Returns a TREE_LIST representing the operands.  The TREE_VALUE of
24755    each node is the expression.  The TREE_PURPOSE is itself a
24756    TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
24757    string-literal (or NULL_TREE if not present) and whose TREE_VALUE
24758    is a STRING_CST for the string literal before the parenthesis. Returns
24759    ERROR_MARK_NODE if any of the operands are invalid.  */
24760 
24761 static tree
24762 cp_parser_asm_operand_list (cp_parser* parser)
24763 {
24764   tree asm_operands = NULL_TREE;
24765   bool invalid_operands = false;
24766 
24767   while (true)
24768     {
24769       tree string_literal;
24770       tree expression;
24771       tree name;
24772 
24773       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
24774 	{
24775 	  /* Consume the `[' token.  */
24776 	  cp_lexer_consume_token (parser->lexer);
24777 	  /* Read the operand name.  */
24778 	  name = cp_parser_identifier (parser);
24779 	  if (name != error_mark_node)
24780 	    name = build_string (IDENTIFIER_LENGTH (name),
24781 				 IDENTIFIER_POINTER (name));
24782 	  /* Look for the closing `]'.  */
24783 	  cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
24784 	}
24785       else
24786 	name = NULL_TREE;
24787       /* Look for the string-literal.  */
24788       string_literal = cp_parser_string_literal (parser, false, false);
24789 
24790       /* Look for the `('.  */
24791       matching_parens parens;
24792       parens.require_open (parser);
24793       /* Parse the expression.  */
24794       expression = cp_parser_expression (parser);
24795       /* Look for the `)'.  */
24796       parens.require_close (parser);
24797 
24798       if (name == error_mark_node
24799 	  || string_literal == error_mark_node
24800 	  || expression == error_mark_node)
24801         invalid_operands = true;
24802 
24803       /* Add this operand to the list.  */
24804       asm_operands = tree_cons (build_tree_list (name, string_literal),
24805 				expression,
24806 				asm_operands);
24807       /* If the next token is not a `,', there are no more
24808 	 operands.  */
24809       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
24810 	break;
24811       /* Consume the `,'.  */
24812       cp_lexer_consume_token (parser->lexer);
24813     }
24814 
24815   return invalid_operands ? error_mark_node : nreverse (asm_operands);
24816 }
24817 
24818 /* Parse an asm-clobber-list.
24819 
24820    asm-clobber-list:
24821      string-literal
24822      asm-clobber-list , string-literal
24823 
24824    Returns a TREE_LIST, indicating the clobbers in the order that they
24825    appeared.  The TREE_VALUE of each node is a STRING_CST.  */
24826 
24827 static tree
24828 cp_parser_asm_clobber_list (cp_parser* parser)
24829 {
24830   tree clobbers = NULL_TREE;
24831 
24832   while (true)
24833     {
24834       tree string_literal;
24835 
24836       /* Look for the string literal.  */
24837       string_literal = cp_parser_string_literal (parser, false, false);
24838       /* Add it to the list.  */
24839       clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
24840       /* If the next token is not a `,', then the list is
24841 	 complete.  */
24842       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
24843 	break;
24844       /* Consume the `,' token.  */
24845       cp_lexer_consume_token (parser->lexer);
24846     }
24847 
24848   return clobbers;
24849 }
24850 
24851 /* Parse an asm-label-list.
24852 
24853    asm-label-list:
24854      identifier
24855      asm-label-list , identifier
24856 
24857    Returns a TREE_LIST, indicating the labels in the order that they
24858    appeared.  The TREE_VALUE of each node is a label.  */
24859 
24860 static tree
24861 cp_parser_asm_label_list (cp_parser* parser)
24862 {
24863   tree labels = NULL_TREE;
24864 
24865   while (true)
24866     {
24867       tree identifier, label, name;
24868 
24869       /* Look for the identifier.  */
24870       identifier = cp_parser_identifier (parser);
24871       if (!error_operand_p (identifier))
24872         {
24873 	  label = lookup_label (identifier);
24874 	  if (TREE_CODE (label) == LABEL_DECL)
24875 	    {
24876 	      TREE_USED (label) = 1;
24877 	      check_goto (label);
24878 	      name = build_string (IDENTIFIER_LENGTH (identifier),
24879 				   IDENTIFIER_POINTER (identifier));
24880 	      labels = tree_cons (name, label, labels);
24881 	    }
24882 	}
24883       /* If the next token is not a `,', then the list is
24884 	 complete.  */
24885       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
24886 	break;
24887       /* Consume the `,' token.  */
24888       cp_lexer_consume_token (parser->lexer);
24889     }
24890 
24891   return nreverse (labels);
24892 }
24893 
24894 /* Return TRUE iff the next tokens in the stream are possibly the
24895    beginning of a GNU extension attribute. */
24896 
24897 static bool
24898 cp_next_tokens_can_be_gnu_attribute_p (cp_parser *parser)
24899 {
24900   return cp_nth_tokens_can_be_gnu_attribute_p (parser, 1);
24901 }
24902 
24903 /* Return TRUE iff the next tokens in the stream are possibly the
24904    beginning of a standard C++-11 attribute specifier.  */
24905 
24906 static bool
24907 cp_next_tokens_can_be_std_attribute_p (cp_parser *parser)
24908 {
24909   return cp_nth_tokens_can_be_std_attribute_p (parser, 1);
24910 }
24911 
24912 /* Return TRUE iff the next Nth tokens in the stream are possibly the
24913    beginning of a standard C++-11 attribute specifier.  */
24914 
24915 static bool
24916 cp_nth_tokens_can_be_std_attribute_p (cp_parser *parser, size_t n)
24917 {
24918   cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
24919 
24920   return (cxx_dialect >= cxx11
24921 	  && ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
24922 	      || (token->type == CPP_OPEN_SQUARE
24923 		  && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
24924 		  && token->type == CPP_OPEN_SQUARE)));
24925 }
24926 
24927 /* Return TRUE iff the next Nth tokens in the stream are possibly the
24928    beginning of a GNU extension attribute.  */
24929 
24930 static bool
24931 cp_nth_tokens_can_be_gnu_attribute_p (cp_parser *parser, size_t n)
24932 {
24933   cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
24934 
24935   return token->type == CPP_KEYWORD && token->keyword == RID_ATTRIBUTE;
24936 }
24937 
24938 /* Return true iff the next tokens can be the beginning of either a
24939    GNU attribute list, or a standard C++11 attribute sequence.  */
24940 
24941 static bool
24942 cp_next_tokens_can_be_attribute_p (cp_parser *parser)
24943 {
24944   return (cp_next_tokens_can_be_gnu_attribute_p (parser)
24945 	  || cp_next_tokens_can_be_std_attribute_p (parser));
24946 }
24947 
24948 /* Return true iff the next Nth tokens can be the beginning of either
24949    a GNU attribute list, or a standard C++11 attribute sequence.  */
24950 
24951 static bool
24952 cp_nth_tokens_can_be_attribute_p (cp_parser *parser, size_t n)
24953 {
24954   return (cp_nth_tokens_can_be_gnu_attribute_p (parser, n)
24955 	  || cp_nth_tokens_can_be_std_attribute_p (parser, n));
24956 }
24957 
24958 /* Parse either a standard C++-11 attribute-specifier-seq, or a series
24959    of GNU attributes, or return NULL.  */
24960 
24961 static tree
24962 cp_parser_attributes_opt (cp_parser *parser)
24963 {
24964   if (cp_next_tokens_can_be_gnu_attribute_p (parser))
24965     return cp_parser_gnu_attributes_opt (parser);
24966   return cp_parser_std_attribute_spec_seq (parser);
24967 }
24968 
24969 /* Parse an (optional) series of attributes.
24970 
24971    attributes:
24972      attributes attribute
24973 
24974    attribute:
24975      __attribute__ (( attribute-list [opt] ))
24976 
24977    The return value is as for cp_parser_gnu_attribute_list.  */
24978 
24979 static tree
24980 cp_parser_gnu_attributes_opt (cp_parser* parser)
24981 {
24982   tree attributes = NULL_TREE;
24983 
24984   temp_override<bool> cleanup
24985     (parser->auto_is_implicit_function_template_parm_p, false);
24986 
24987   while (true)
24988     {
24989       cp_token *token;
24990       tree attribute_list;
24991       bool ok = true;
24992 
24993       /* Peek at the next token.  */
24994       token = cp_lexer_peek_token (parser->lexer);
24995       /* If it's not `__attribute__', then we're done.  */
24996       if (token->keyword != RID_ATTRIBUTE)
24997 	break;
24998 
24999       /* Consume the `__attribute__' keyword.  */
25000       cp_lexer_consume_token (parser->lexer);
25001       /* Look for the two `(' tokens.  */
25002       matching_parens outer_parens;
25003       outer_parens.require_open (parser);
25004       matching_parens inner_parens;
25005       inner_parens.require_open (parser);
25006 
25007       /* Peek at the next token.  */
25008       token = cp_lexer_peek_token (parser->lexer);
25009       if (token->type != CPP_CLOSE_PAREN)
25010 	/* Parse the attribute-list.  */
25011 	attribute_list = cp_parser_gnu_attribute_list (parser);
25012       else
25013 	/* If the next token is a `)', then there is no attribute
25014 	   list.  */
25015 	attribute_list = NULL;
25016 
25017       /* Look for the two `)' tokens.  */
25018       if (!inner_parens.require_close (parser))
25019 	ok = false;
25020       if (!outer_parens.require_close (parser))
25021 	ok = false;
25022       if (!ok)
25023 	cp_parser_skip_to_end_of_statement (parser);
25024 
25025       /* Add these new attributes to the list.  */
25026       attributes = attr_chainon (attributes, attribute_list);
25027     }
25028 
25029   return attributes;
25030 }
25031 
25032 /* Parse a GNU attribute-list.
25033 
25034    attribute-list:
25035      attribute
25036      attribute-list , attribute
25037 
25038    attribute:
25039      identifier
25040      identifier ( identifier )
25041      identifier ( identifier , expression-list )
25042      identifier ( expression-list )
25043 
25044    Returns a TREE_LIST, or NULL_TREE on error.  Each node corresponds
25045    to an attribute.  The TREE_PURPOSE of each node is the identifier
25046    indicating which attribute is in use.  The TREE_VALUE represents
25047    the arguments, if any.  */
25048 
25049 static tree
25050 cp_parser_gnu_attribute_list (cp_parser* parser)
25051 {
25052   tree attribute_list = NULL_TREE;
25053   bool save_translate_strings_p = parser->translate_strings_p;
25054 
25055   parser->translate_strings_p = false;
25056   while (true)
25057     {
25058       cp_token *token;
25059       tree identifier;
25060       tree attribute;
25061 
25062       /* Look for the identifier.  We also allow keywords here; for
25063 	 example `__attribute__ ((const))' is legal.  */
25064       token = cp_lexer_peek_token (parser->lexer);
25065       if (token->type == CPP_NAME
25066 	  || token->type == CPP_KEYWORD)
25067 	{
25068 	  tree arguments = NULL_TREE;
25069 
25070 	  /* Consume the token, but save it since we need it for the
25071 	     SIMD enabled function parsing.  */
25072 	  cp_token *id_token = cp_lexer_consume_token (parser->lexer);
25073 
25074 	  /* Save away the identifier that indicates which attribute
25075 	     this is.  */
25076 	  identifier = (token->type == CPP_KEYWORD)
25077 	    /* For keywords, use the canonical spelling, not the
25078 	       parsed identifier.  */
25079 	    ? ridpointers[(int) token->keyword]
25080 	    : id_token->u.value;
25081 
25082 	  identifier = canonicalize_attr_name (identifier);
25083 	  attribute = build_tree_list (identifier, NULL_TREE);
25084 
25085 	  /* Peek at the next token.  */
25086 	  token = cp_lexer_peek_token (parser->lexer);
25087 	  /* If it's an `(', then parse the attribute arguments.  */
25088 	  if (token->type == CPP_OPEN_PAREN)
25089 	    {
25090 	      vec<tree, va_gc> *vec;
25091 	      int attr_flag = (attribute_takes_identifier_p (identifier)
25092 			       ? id_attr : normal_attr);
25093 	      vec = cp_parser_parenthesized_expression_list
25094 		    (parser, attr_flag, /*cast_p=*/false,
25095 		    /*allow_expansion_p=*/false,
25096 		    /*non_constant_p=*/NULL);
25097 	      if (vec == NULL)
25098 		arguments = error_mark_node;
25099 	      else
25100 		{
25101 		  arguments = build_tree_list_vec (vec);
25102 		  release_tree_vector (vec);
25103 		}
25104 	      /* Save the arguments away.  */
25105 	      TREE_VALUE (attribute) = arguments;
25106 	    }
25107 
25108 	  if (arguments != error_mark_node)
25109 	    {
25110 	      /* Add this attribute to the list.  */
25111 	      TREE_CHAIN (attribute) = attribute_list;
25112 	      attribute_list = attribute;
25113 	    }
25114 
25115 	  token = cp_lexer_peek_token (parser->lexer);
25116 	}
25117       /* Now, look for more attributes.  If the next token isn't a
25118 	 `,', we're done.  */
25119       if (token->type != CPP_COMMA)
25120 	break;
25121 
25122       /* Consume the comma and keep going.  */
25123       cp_lexer_consume_token (parser->lexer);
25124     }
25125   parser->translate_strings_p = save_translate_strings_p;
25126 
25127   /* We built up the list in reverse order.  */
25128   return nreverse (attribute_list);
25129 }
25130 
25131 /*  Parse a standard C++11 attribute.
25132 
25133     The returned representation is a TREE_LIST which TREE_PURPOSE is
25134     the scoped name of the attribute, and the TREE_VALUE is its
25135     arguments list.
25136 
25137     Note that the scoped name of the attribute is itself a TREE_LIST
25138     which TREE_PURPOSE is the namespace of the attribute, and
25139     TREE_VALUE its name.  This is unlike a GNU attribute -- as parsed
25140     by cp_parser_gnu_attribute_list -- that doesn't have any namespace
25141     and which TREE_PURPOSE is directly the attribute name.
25142 
25143     Clients of the attribute code should use get_attribute_namespace
25144     and get_attribute_name to get the actual namespace and name of
25145     attributes, regardless of their being GNU or C++11 attributes.
25146 
25147     attribute:
25148       attribute-token attribute-argument-clause [opt]
25149 
25150     attribute-token:
25151       identifier
25152       attribute-scoped-token
25153 
25154     attribute-scoped-token:
25155       attribute-namespace :: identifier
25156 
25157     attribute-namespace:
25158       identifier
25159 
25160     attribute-argument-clause:
25161       ( balanced-token-seq )
25162 
25163     balanced-token-seq:
25164       balanced-token [opt]
25165       balanced-token-seq balanced-token
25166 
25167     balanced-token:
25168       ( balanced-token-seq )
25169       [ balanced-token-seq ]
25170       { balanced-token-seq }.  */
25171 
25172 static tree
25173 cp_parser_std_attribute (cp_parser *parser, tree attr_ns)
25174 {
25175   tree attribute, attr_id = NULL_TREE, arguments;
25176   cp_token *token;
25177 
25178   temp_override<bool> cleanup
25179     (parser->auto_is_implicit_function_template_parm_p, false);
25180 
25181   /* First, parse name of the attribute, a.k.a attribute-token.  */
25182 
25183   token = cp_lexer_peek_token (parser->lexer);
25184   if (token->type == CPP_NAME)
25185     attr_id = token->u.value;
25186   else if (token->type == CPP_KEYWORD)
25187     attr_id = ridpointers[(int) token->keyword];
25188   else if (token->flags & NAMED_OP)
25189     attr_id = get_identifier (cpp_type2name (token->type, token->flags));
25190 
25191   if (attr_id == NULL_TREE)
25192     return NULL_TREE;
25193 
25194   cp_lexer_consume_token (parser->lexer);
25195 
25196   token = cp_lexer_peek_token (parser->lexer);
25197   if (token->type == CPP_SCOPE)
25198     {
25199       /* We are seeing a scoped attribute token.  */
25200 
25201       cp_lexer_consume_token (parser->lexer);
25202       if (attr_ns)
25203 	error_at (token->location, "attribute using prefix used together "
25204 				   "with scoped attribute token");
25205       attr_ns = attr_id;
25206 
25207       token = cp_lexer_consume_token (parser->lexer);
25208       if (token->type == CPP_NAME)
25209 	attr_id = token->u.value;
25210       else if (token->type == CPP_KEYWORD)
25211 	attr_id = ridpointers[(int) token->keyword];
25212       else if (token->flags & NAMED_OP)
25213 	attr_id = get_identifier (cpp_type2name (token->type, token->flags));
25214       else
25215 	{
25216 	  error_at (token->location,
25217 		    "expected an identifier for the attribute name");
25218 	  return error_mark_node;
25219 	}
25220 
25221       attr_id = canonicalize_attr_name (attr_id);
25222       attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
25223 				   NULL_TREE);
25224       token = cp_lexer_peek_token (parser->lexer);
25225     }
25226   else if (attr_ns)
25227     attribute = build_tree_list (build_tree_list (attr_ns, attr_id),
25228 				 NULL_TREE);
25229   else
25230     {
25231       attr_id = canonicalize_attr_name (attr_id);
25232       attribute = build_tree_list (build_tree_list (NULL_TREE, attr_id),
25233 				   NULL_TREE);
25234       /* C++11 noreturn attribute is equivalent to GNU's.  */
25235       if (is_attribute_p ("noreturn", attr_id))
25236 	TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
25237       /* C++14 deprecated attribute is equivalent to GNU's.  */
25238       else if (is_attribute_p ("deprecated", attr_id))
25239 	TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
25240       /* C++17 fallthrough attribute is equivalent to GNU's.  */
25241       else if (is_attribute_p ("fallthrough", attr_id))
25242 	TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu");
25243       /* Transactional Memory TS optimize_for_synchronized attribute is
25244 	 equivalent to GNU transaction_callable.  */
25245       else if (is_attribute_p ("optimize_for_synchronized", attr_id))
25246 	TREE_PURPOSE (attribute)
25247 	  = get_identifier ("transaction_callable");
25248       /* Transactional Memory attributes are GNU attributes.  */
25249       else if (tm_attr_to_mask (attr_id))
25250 	TREE_PURPOSE (attribute) = attr_id;
25251     }
25252 
25253   /* Now parse the optional argument clause of the attribute.  */
25254 
25255   if (token->type != CPP_OPEN_PAREN)
25256     return attribute;
25257 
25258   {
25259     vec<tree, va_gc> *vec;
25260     int attr_flag = normal_attr;
25261 
25262     if (attr_ns == get_identifier ("gnu")
25263 	&& attribute_takes_identifier_p (attr_id))
25264       /* A GNU attribute that takes an identifier in parameter.  */
25265       attr_flag = id_attr;
25266 
25267     vec = cp_parser_parenthesized_expression_list
25268       (parser, attr_flag, /*cast_p=*/false,
25269        /*allow_expansion_p=*/true,
25270        /*non_constant_p=*/NULL);
25271     if (vec == NULL)
25272       arguments = error_mark_node;
25273     else
25274       {
25275 	arguments = build_tree_list_vec (vec);
25276 	release_tree_vector (vec);
25277       }
25278 
25279     if (arguments == error_mark_node)
25280       attribute = error_mark_node;
25281     else
25282       TREE_VALUE (attribute) = arguments;
25283   }
25284 
25285   return attribute;
25286 }
25287 
25288 /* Check that the attribute ATTRIBUTE appears at most once in the
25289    attribute-list ATTRIBUTES.  This is enforced for noreturn (7.6.3)
25290    and deprecated (7.6.5).  Note that carries_dependency (7.6.4)
25291    isn't implemented yet in GCC.  */
25292 
25293 static void
25294 cp_parser_check_std_attribute (tree attributes, tree attribute)
25295 {
25296   if (attributes)
25297     {
25298       tree name = get_attribute_name (attribute);
25299       if (is_attribute_p ("noreturn", name)
25300 	  && lookup_attribute ("noreturn", attributes))
25301 	error ("attribute %<noreturn%> can appear at most once "
25302 	       "in an attribute-list");
25303       else if (is_attribute_p ("deprecated", name)
25304 	       && lookup_attribute ("deprecated", attributes))
25305 	error ("attribute %<deprecated%> can appear at most once "
25306 	       "in an attribute-list");
25307     }
25308 }
25309 
25310 /* Parse a list of standard C++-11 attributes.
25311 
25312    attribute-list:
25313      attribute [opt]
25314      attribute-list , attribute[opt]
25315      attribute ...
25316      attribute-list , attribute ...
25317 */
25318 
25319 static tree
25320 cp_parser_std_attribute_list (cp_parser *parser, tree attr_ns)
25321 {
25322   tree attributes = NULL_TREE, attribute = NULL_TREE;
25323   cp_token *token = NULL;
25324 
25325   while (true)
25326     {
25327       attribute = cp_parser_std_attribute (parser, attr_ns);
25328       if (attribute == error_mark_node)
25329 	break;
25330       if (attribute != NULL_TREE)
25331 	{
25332 	  cp_parser_check_std_attribute (attributes, attribute);
25333 	  TREE_CHAIN (attribute) = attributes;
25334 	  attributes = attribute;
25335 	}
25336       token = cp_lexer_peek_token (parser->lexer);
25337       if (token->type == CPP_ELLIPSIS)
25338 	{
25339 	  cp_lexer_consume_token (parser->lexer);
25340 	  if (attribute == NULL_TREE)
25341 	    error_at (token->location,
25342 		      "expected attribute before %<...%>");
25343 	  else
25344 	    {
25345 	      tree pack = make_pack_expansion (TREE_VALUE (attribute));
25346 	      if (pack == error_mark_node)
25347 		return error_mark_node;
25348 	      TREE_VALUE (attribute) = pack;
25349 	    }
25350 	  token = cp_lexer_peek_token (parser->lexer);
25351 	}
25352       if (token->type != CPP_COMMA)
25353 	break;
25354       cp_lexer_consume_token (parser->lexer);
25355     }
25356   attributes = nreverse (attributes);
25357   return attributes;
25358 }
25359 
25360 /* Parse a standard C++-11 attribute specifier.
25361 
25362    attribute-specifier:
25363      [ [ attribute-using-prefix [opt] attribute-list ] ]
25364      alignment-specifier
25365 
25366    attribute-using-prefix:
25367      using attribute-namespace :
25368 
25369    alignment-specifier:
25370      alignas ( type-id ... [opt] )
25371      alignas ( alignment-expression ... [opt] ).  */
25372 
25373 static tree
25374 cp_parser_std_attribute_spec (cp_parser *parser)
25375 {
25376   tree attributes = NULL_TREE;
25377   cp_token *token = cp_lexer_peek_token (parser->lexer);
25378 
25379   if (token->type == CPP_OPEN_SQUARE
25380       && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_OPEN_SQUARE)
25381     {
25382       tree attr_ns = NULL_TREE;
25383 
25384       cp_lexer_consume_token (parser->lexer);
25385       cp_lexer_consume_token (parser->lexer);
25386 
25387       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
25388 	{
25389 	  token = cp_lexer_peek_nth_token (parser->lexer, 2);
25390 	  if (token->type == CPP_NAME)
25391 	    attr_ns = token->u.value;
25392 	  else if (token->type == CPP_KEYWORD)
25393 	    attr_ns = ridpointers[(int) token->keyword];
25394 	  else if (token->flags & NAMED_OP)
25395 	    attr_ns = get_identifier (cpp_type2name (token->type,
25396 						     token->flags));
25397 	  if (attr_ns
25398 	      && cp_lexer_nth_token_is (parser->lexer, 3, CPP_COLON))
25399 	    {
25400 	      if (cxx_dialect < cxx17
25401 		  && !in_system_header_at (input_location))
25402 		pedwarn (input_location, 0,
25403 			 "attribute using prefix only available "
25404 			 "with -std=c++17 or -std=gnu++17");
25405 
25406 	      cp_lexer_consume_token (parser->lexer);
25407 	      cp_lexer_consume_token (parser->lexer);
25408 	      cp_lexer_consume_token (parser->lexer);
25409 	    }
25410 	  else
25411 	    attr_ns = NULL_TREE;
25412 	}
25413 
25414       attributes = cp_parser_std_attribute_list (parser, attr_ns);
25415 
25416       if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE)
25417 	  || !cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
25418 	cp_parser_skip_to_end_of_statement (parser);
25419       else
25420 	/* Warn about parsing c++11 attribute in non-c++1 mode, only
25421 	   when we are sure that we have actually parsed them.  */
25422 	maybe_warn_cpp0x (CPP0X_ATTRIBUTES);
25423     }
25424   else
25425     {
25426       tree alignas_expr;
25427 
25428       /* Look for an alignment-specifier.  */
25429 
25430       token = cp_lexer_peek_token (parser->lexer);
25431 
25432       if (token->type != CPP_KEYWORD
25433 	  || token->keyword != RID_ALIGNAS)
25434 	return NULL_TREE;
25435 
25436       cp_lexer_consume_token (parser->lexer);
25437       maybe_warn_cpp0x (CPP0X_ATTRIBUTES);
25438 
25439       matching_parens parens;
25440       if (!parens.require_open (parser))
25441 	return error_mark_node;
25442 
25443       cp_parser_parse_tentatively (parser);
25444       alignas_expr = cp_parser_type_id (parser);
25445 
25446       if (!cp_parser_parse_definitely (parser))
25447 	{
25448 	  alignas_expr = cp_parser_assignment_expression (parser);
25449 	  if (alignas_expr == error_mark_node)
25450 	    cp_parser_skip_to_end_of_statement (parser);
25451 	  if (alignas_expr == NULL_TREE
25452 	      || alignas_expr == error_mark_node)
25453 	    return alignas_expr;
25454 	}
25455 
25456       alignas_expr = cxx_alignas_expr (alignas_expr);
25457       alignas_expr = build_tree_list (NULL_TREE, alignas_expr);
25458 
25459       /* Handle alignas (pack...).  */
25460       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
25461 	{
25462 	  cp_lexer_consume_token (parser->lexer);
25463 	  alignas_expr = make_pack_expansion (alignas_expr);
25464 	}
25465 
25466       /* Something went wrong, so don't build the attribute.  */
25467       if (alignas_expr == error_mark_node)
25468 	return error_mark_node;
25469 
25470       if (!parens.require_close (parser))
25471 	return error_mark_node;
25472 
25473       /* Build the C++-11 representation of an 'aligned'
25474 	 attribute.  */
25475       attributes =
25476 	build_tree_list (build_tree_list (get_identifier ("gnu"),
25477 					  get_identifier ("aligned")),
25478 			 alignas_expr);
25479     }
25480 
25481   return attributes;
25482 }
25483 
25484 /* Parse a standard C++-11 attribute-specifier-seq.
25485 
25486    attribute-specifier-seq:
25487      attribute-specifier-seq [opt] attribute-specifier
25488  */
25489 
25490 static tree
25491 cp_parser_std_attribute_spec_seq (cp_parser *parser)
25492 {
25493   tree attr_specs = NULL_TREE;
25494   tree attr_last = NULL_TREE;
25495 
25496   while (true)
25497     {
25498       tree attr_spec = cp_parser_std_attribute_spec (parser);
25499       if (attr_spec == NULL_TREE)
25500 	break;
25501       if (attr_spec == error_mark_node)
25502 	return error_mark_node;
25503 
25504       if (attr_last)
25505 	TREE_CHAIN (attr_last) = attr_spec;
25506       else
25507 	attr_specs = attr_last = attr_spec;
25508       attr_last = tree_last (attr_last);
25509     }
25510 
25511   return attr_specs;
25512 }
25513 
25514 /* Skip a balanced-token starting at Nth token (with 1 as the next token),
25515    return index of the first token after balanced-token, or N on failure.  */
25516 
25517 static size_t
25518 cp_parser_skip_balanced_tokens (cp_parser *parser, size_t n)
25519 {
25520   size_t orig_n = n;
25521   int nparens = 0, nbraces = 0, nsquares = 0;
25522   do
25523     switch (cp_lexer_peek_nth_token (parser->lexer, n++)->type)
25524       {
25525       case CPP_EOF:
25526       case CPP_PRAGMA_EOL:
25527 	/* Ran out of tokens.  */
25528 	return orig_n;
25529       case CPP_OPEN_PAREN:
25530 	++nparens;
25531 	break;
25532       case CPP_OPEN_BRACE:
25533 	++nbraces;
25534 	break;
25535       case CPP_OPEN_SQUARE:
25536 	++nsquares;
25537 	break;
25538       case CPP_CLOSE_PAREN:
25539 	--nparens;
25540 	break;
25541       case CPP_CLOSE_BRACE:
25542 	--nbraces;
25543 	break;
25544       case CPP_CLOSE_SQUARE:
25545 	--nsquares;
25546 	break;
25547       default:
25548 	break;
25549       }
25550   while (nparens || nbraces || nsquares);
25551   return n;
25552 }
25553 
25554 /* Skip GNU attribute tokens starting at Nth token (with 1 as the next token),
25555    return index of the first token after the GNU attribute tokens, or N on
25556    failure.  */
25557 
25558 static size_t
25559 cp_parser_skip_gnu_attributes_opt (cp_parser *parser, size_t n)
25560 {
25561   while (true)
25562     {
25563       if (!cp_lexer_nth_token_is_keyword (parser->lexer, n, RID_ATTRIBUTE)
25564 	  || !cp_lexer_nth_token_is (parser->lexer, n + 1, CPP_OPEN_PAREN)
25565 	  || !cp_lexer_nth_token_is (parser->lexer, n + 2, CPP_OPEN_PAREN))
25566 	break;
25567 
25568       size_t n2 = cp_parser_skip_balanced_tokens (parser, n + 2);
25569       if (n2 == n + 2)
25570 	break;
25571       if (!cp_lexer_nth_token_is (parser->lexer, n2, CPP_CLOSE_PAREN))
25572 	break;
25573       n = n2 + 1;
25574     }
25575   return n;
25576 }
25577 
25578 /* Skip standard C++11 attribute tokens starting at Nth token (with 1 as the
25579    next token), return index of the first token after the standard C++11
25580    attribute tokens, or N on failure.  */
25581 
25582 static size_t
25583 cp_parser_skip_std_attribute_spec_seq (cp_parser *parser, size_t n)
25584 {
25585   while (true)
25586     {
25587       if (cp_lexer_nth_token_is (parser->lexer, n, CPP_OPEN_SQUARE)
25588 	  && cp_lexer_nth_token_is (parser->lexer, n + 1, CPP_OPEN_SQUARE))
25589 	{
25590 	  size_t n2 = cp_parser_skip_balanced_tokens (parser, n + 1);
25591 	  if (n2 == n + 1)
25592 	    break;
25593 	  if (!cp_lexer_nth_token_is (parser->lexer, n2, CPP_CLOSE_SQUARE))
25594 	    break;
25595 	  n = n2 + 1;
25596 	}
25597       else if (cp_lexer_nth_token_is_keyword (parser->lexer, n, RID_ALIGNAS)
25598 	       && cp_lexer_nth_token_is (parser->lexer, n + 1, CPP_OPEN_PAREN))
25599 	{
25600 	  size_t n2 = cp_parser_skip_balanced_tokens (parser, n + 1);
25601 	  if (n2 == n + 1)
25602 	    break;
25603 	  n = n2;
25604 	}
25605       else
25606 	break;
25607     }
25608   return n;
25609 }
25610 
25611 /* Skip standard C++11 or GNU attribute tokens starting at Nth token (with 1
25612    as the next token), return index of the first token after the attribute
25613    tokens, or N on failure.  */
25614 
25615 static size_t
25616 cp_parser_skip_attributes_opt (cp_parser *parser, size_t n)
25617 {
25618   if (cp_nth_tokens_can_be_gnu_attribute_p (parser, n))
25619     return cp_parser_skip_gnu_attributes_opt (parser, n);
25620   return cp_parser_skip_std_attribute_spec_seq (parser, n);
25621 }
25622 
25623 /* Parse an optional `__extension__' keyword.  Returns TRUE if it is
25624    present, and FALSE otherwise.  *SAVED_PEDANTIC is set to the
25625    current value of the PEDANTIC flag, regardless of whether or not
25626    the `__extension__' keyword is present.  The caller is responsible
25627    for restoring the value of the PEDANTIC flag.  */
25628 
25629 static bool
25630 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
25631 {
25632   /* Save the old value of the PEDANTIC flag.  */
25633   *saved_pedantic = pedantic;
25634 
25635   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
25636     {
25637       /* Consume the `__extension__' token.  */
25638       cp_lexer_consume_token (parser->lexer);
25639       /* We're not being pedantic while the `__extension__' keyword is
25640 	 in effect.  */
25641       pedantic = 0;
25642 
25643       return true;
25644     }
25645 
25646   return false;
25647 }
25648 
25649 /* Parse a label declaration.
25650 
25651    label-declaration:
25652      __label__ label-declarator-seq ;
25653 
25654    label-declarator-seq:
25655      identifier , label-declarator-seq
25656      identifier  */
25657 
25658 static void
25659 cp_parser_label_declaration (cp_parser* parser)
25660 {
25661   /* Look for the `__label__' keyword.  */
25662   cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
25663 
25664   while (true)
25665     {
25666       tree identifier;
25667 
25668       /* Look for an identifier.  */
25669       identifier = cp_parser_identifier (parser);
25670       /* If we failed, stop.  */
25671       if (identifier == error_mark_node)
25672 	break;
25673       /* Declare it as a label.  */
25674       finish_label_decl (identifier);
25675       /* If the next token is a `;', stop.  */
25676       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25677 	break;
25678       /* Look for the `,' separating the label declarations.  */
25679       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
25680     }
25681 
25682   /* Look for the final `;'.  */
25683   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
25684 }
25685 
25686 // -------------------------------------------------------------------------- //
25687 // Requires Clause
25688 
25689 // Parse a requires clause.
25690 //
25691 //    requires-clause:
25692 //      'requires' logical-or-expression
25693 //
25694 // The required logical-or-expression must be a constant expression. Note
25695 // that we don't check that the expression is constepxr here. We defer until
25696 // we analyze constraints and then, we only check atomic constraints.
25697 static tree
25698 cp_parser_requires_clause (cp_parser *parser)
25699 {
25700   // Parse the requires clause so that it is not automatically folded.
25701   ++processing_template_decl;
25702   tree expr = cp_parser_binary_expression (parser, false, false,
25703 					   PREC_NOT_OPERATOR, NULL);
25704   if (check_for_bare_parameter_packs (expr))
25705     expr = error_mark_node;
25706   --processing_template_decl;
25707   return expr;
25708 }
25709 
25710 // Optionally parse a requires clause:
25711 static tree
25712 cp_parser_requires_clause_opt (cp_parser *parser)
25713 {
25714   cp_token *tok = cp_lexer_peek_token (parser->lexer);
25715   if (tok->keyword != RID_REQUIRES)
25716     {
25717       if (!flag_concepts && tok->type == CPP_NAME
25718 	  && tok->u.value == ridpointers[RID_REQUIRES])
25719 	{
25720 	  error_at (cp_lexer_peek_token (parser->lexer)->location,
25721 		    "%<requires%> only available with -fconcepts");
25722 	  /* Parse and discard the requires-clause.  */
25723 	  cp_lexer_consume_token (parser->lexer);
25724 	  cp_parser_requires_clause (parser);
25725 	}
25726       return NULL_TREE;
25727     }
25728   cp_lexer_consume_token (parser->lexer);
25729   return cp_parser_requires_clause (parser);
25730 }
25731 
25732 
25733 /*---------------------------------------------------------------------------
25734                            Requires expressions
25735 ---------------------------------------------------------------------------*/
25736 
25737 /* Parse a requires expression
25738 
25739    requirement-expression:
25740        'requires' requirement-parameter-list [opt] requirement-body */
25741 static tree
25742 cp_parser_requires_expression (cp_parser *parser)
25743 {
25744   gcc_assert (cp_lexer_next_token_is_keyword (parser->lexer, RID_REQUIRES));
25745   location_t loc = cp_lexer_consume_token (parser->lexer)->location;
25746 
25747   /* A requires-expression shall appear only within a concept
25748      definition or a requires-clause.
25749 
25750      TODO: Implement this diagnostic correctly. */
25751   if (!processing_template_decl)
25752     {
25753       error_at (loc, "a requires expression cannot appear outside a template");
25754       cp_parser_skip_to_end_of_statement (parser);
25755       return error_mark_node;
25756     }
25757 
25758   tree parms, reqs;
25759   {
25760     /* Local parameters are delared as variables within the scope
25761        of the expression.  They are not visible past the end of
25762        the expression.  Expressions within the requires-expression
25763        are unevaluated.  */
25764     struct scope_sentinel
25765     {
25766       scope_sentinel ()
25767       {
25768 	++cp_unevaluated_operand;
25769 	begin_scope (sk_block, NULL_TREE);
25770       }
25771 
25772       ~scope_sentinel ()
25773       {
25774 	pop_bindings_and_leave_scope ();
25775 	--cp_unevaluated_operand;
25776       }
25777     } s;
25778 
25779     /* Parse the optional parameter list. */
25780     if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
25781       {
25782 	parms = cp_parser_requirement_parameter_list (parser);
25783 	if (parms == error_mark_node)
25784 	  return error_mark_node;
25785       }
25786     else
25787       parms = NULL_TREE;
25788 
25789     /* Parse the requirement body. */
25790     reqs = cp_parser_requirement_body (parser);
25791     if (reqs == error_mark_node)
25792       return error_mark_node;
25793   }
25794 
25795   /* This needs to happen after pop_bindings_and_leave_scope, as it reverses
25796      the parm chain.  */
25797   grokparms (parms, &parms);
25798   return finish_requires_expr (parms, reqs);
25799 }
25800 
25801 /* Parse a parameterized requirement.
25802 
25803    requirement-parameter-list:
25804        '(' parameter-declaration-clause ')' */
25805 static tree
25806 cp_parser_requirement_parameter_list (cp_parser *parser)
25807 {
25808   matching_parens parens;
25809   if (!parens.require_open (parser))
25810     return error_mark_node;
25811 
25812   tree parms = cp_parser_parameter_declaration_clause (parser);
25813 
25814   if (!parens.require_close (parser))
25815     return error_mark_node;
25816 
25817   return parms;
25818 }
25819 
25820 /* Parse the body of a requirement.
25821 
25822    requirement-body:
25823        '{' requirement-list '}' */
25824 static tree
25825 cp_parser_requirement_body (cp_parser *parser)
25826 {
25827   matching_braces braces;
25828   if (!braces.require_open (parser))
25829     return error_mark_node;
25830 
25831   tree reqs = cp_parser_requirement_list (parser);
25832 
25833   if (!braces.require_close (parser))
25834     return error_mark_node;
25835 
25836   return reqs;
25837 }
25838 
25839 /* Parse a list of requirements.
25840 
25841    requirement-list:
25842        requirement
25843        requirement-list ';' requirement[opt] */
25844 static tree
25845 cp_parser_requirement_list (cp_parser *parser)
25846 {
25847   tree result = NULL_TREE;
25848   while (true)
25849     {
25850       tree req = cp_parser_requirement (parser);
25851       if (req == error_mark_node)
25852         return error_mark_node;
25853 
25854       result = tree_cons (NULL_TREE, req, result);
25855 
25856       /* If we see a semi-colon, consume it. */
25857       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25858 	cp_lexer_consume_token (parser->lexer);
25859 
25860       /* Stop processing at the end of the list. */
25861       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
25862         break;
25863     }
25864 
25865   /* Reverse the order of requirements so they are analyzed in
25866      declaration order. */
25867   return nreverse (result);
25868 }
25869 
25870 /* Parse a syntactic requirement or type requirement.
25871 
25872      requirement:
25873        simple-requirement
25874        compound-requirement
25875        type-requirement
25876        nested-requirement */
25877 static tree
25878 cp_parser_requirement (cp_parser *parser)
25879 {
25880   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
25881     return cp_parser_compound_requirement (parser);
25882   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
25883     return cp_parser_type_requirement (parser);
25884   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_REQUIRES))
25885     return cp_parser_nested_requirement (parser);
25886   else
25887     return cp_parser_simple_requirement (parser);
25888 }
25889 
25890 /* Parse a simple requirement.
25891 
25892      simple-requirement:
25893        expression ';' */
25894 static tree
25895 cp_parser_simple_requirement (cp_parser *parser)
25896 {
25897   tree expr = cp_parser_expression (parser, NULL, false, false);
25898   if (!expr || expr == error_mark_node)
25899     return error_mark_node;
25900 
25901   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
25902     return error_mark_node;
25903 
25904   return finish_simple_requirement (expr);
25905 }
25906 
25907 /* Parse a type requirement
25908 
25909      type-requirement
25910          nested-name-specifier [opt] required-type-name ';'
25911 
25912      required-type-name:
25913          type-name
25914          'template' [opt] simple-template-id  */
25915 static tree
25916 cp_parser_type_requirement (cp_parser *parser)
25917 {
25918   cp_lexer_consume_token (parser->lexer);
25919 
25920   // Save the scope before parsing name specifiers.
25921   tree saved_scope = parser->scope;
25922   tree saved_object_scope = parser->object_scope;
25923   tree saved_qualifying_scope = parser->qualifying_scope;
25924   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
25925   cp_parser_nested_name_specifier_opt (parser,
25926                                        /*typename_keyword_p=*/true,
25927                                        /*check_dependency_p=*/false,
25928                                        /*type_p=*/true,
25929                                        /*is_declaration=*/false);
25930 
25931   tree type;
25932   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
25933     {
25934       cp_lexer_consume_token (parser->lexer);
25935       type = cp_parser_template_id (parser,
25936                                     /*template_keyword_p=*/true,
25937                                     /*check_dependency=*/false,
25938                                     /*tag_type=*/none_type,
25939                                     /*is_declaration=*/false);
25940       type = make_typename_type (parser->scope, type, typename_type,
25941                                  /*complain=*/tf_error);
25942     }
25943   else
25944    type = cp_parser_type_name (parser, /*typename_keyword_p=*/true);
25945 
25946   if (TREE_CODE (type) == TYPE_DECL)
25947     type = TREE_TYPE (type);
25948 
25949   parser->scope = saved_scope;
25950   parser->object_scope = saved_object_scope;
25951   parser->qualifying_scope = saved_qualifying_scope;
25952 
25953   if (type == error_mark_node)
25954     cp_parser_skip_to_end_of_statement (parser);
25955 
25956   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
25957     return error_mark_node;
25958   if (type == error_mark_node)
25959     return error_mark_node;
25960 
25961   return finish_type_requirement (type);
25962 }
25963 
25964 /* Parse a compound requirement
25965 
25966      compound-requirement:
25967          '{' expression '}' 'noexcept' [opt] trailing-return-type [opt] ';' */
25968 static tree
25969 cp_parser_compound_requirement (cp_parser *parser)
25970 {
25971   /* Parse an expression enclosed in '{ }'s. */
25972   matching_braces braces;
25973   if (!braces.require_open (parser))
25974     return error_mark_node;
25975 
25976   tree expr = cp_parser_expression (parser, NULL, false, false);
25977   if (!expr || expr == error_mark_node)
25978     return error_mark_node;
25979 
25980   if (!braces.require_close (parser))
25981     return error_mark_node;
25982 
25983   /* Parse the optional noexcept. */
25984   bool noexcept_p = false;
25985   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_NOEXCEPT))
25986     {
25987       cp_lexer_consume_token (parser->lexer);
25988       noexcept_p = true;
25989     }
25990 
25991   /* Parse the optional trailing return type. */
25992   tree type = NULL_TREE;
25993   if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
25994     {
25995       cp_lexer_consume_token (parser->lexer);
25996       bool saved_result_type_constraint_p = parser->in_result_type_constraint_p;
25997       parser->in_result_type_constraint_p = true;
25998       type = cp_parser_trailing_type_id (parser);
25999       parser->in_result_type_constraint_p = saved_result_type_constraint_p;
26000       if (type == error_mark_node)
26001         return error_mark_node;
26002     }
26003 
26004   return finish_compound_requirement (expr, type, noexcept_p);
26005 }
26006 
26007 /* Parse a nested requirement. This is the same as a requires clause.
26008 
26009    nested-requirement:
26010      requires-clause */
26011 static tree
26012 cp_parser_nested_requirement (cp_parser *parser)
26013 {
26014   cp_lexer_consume_token (parser->lexer);
26015   tree req = cp_parser_requires_clause (parser);
26016   if (req == error_mark_node)
26017     return error_mark_node;
26018   return finish_nested_requirement (req);
26019 }
26020 
26021 /* Support Functions */
26022 
26023 /* Return the appropriate prefer_type argument for lookup_name_real based on
26024    tag_type and template_mem_access.  */
26025 
26026 static inline int
26027 prefer_type_arg (tag_types tag_type, bool template_mem_access = false)
26028 {
26029   /* DR 141: When looking in the current enclosing context for a template-name
26030      after -> or ., only consider class templates.  */
26031   if (template_mem_access)
26032     return 2;
26033   switch (tag_type)
26034     {
26035     case none_type:  return 0;	// No preference.
26036     case scope_type: return 1;	// Type or namespace.
26037     default:         return 2;	// Type only.
26038     }
26039 }
26040 
26041 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
26042    NAME should have one of the representations used for an
26043    id-expression.  If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
26044    is returned.  If PARSER->SCOPE is a dependent type, then a
26045    SCOPE_REF is returned.
26046 
26047    If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
26048    returned; the name was already resolved when the TEMPLATE_ID_EXPR
26049    was formed.  Abstractly, such entities should not be passed to this
26050    function, because they do not need to be looked up, but it is
26051    simpler to check for this special case here, rather than at the
26052    call-sites.
26053 
26054    In cases not explicitly covered above, this function returns a
26055    DECL, OVERLOAD, or baselink representing the result of the lookup.
26056    If there was no entity with the indicated NAME, the ERROR_MARK_NODE
26057    is returned.
26058 
26059    If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
26060    (e.g., "struct") that was used.  In that case bindings that do not
26061    refer to types are ignored.
26062 
26063    If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
26064    ignored.
26065 
26066    If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
26067    are ignored.
26068 
26069    If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
26070    types.
26071 
26072    If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
26073    TREE_LIST of candidates if name-lookup results in an ambiguity, and
26074    NULL_TREE otherwise.  */
26075 
26076 static cp_expr
26077 cp_parser_lookup_name (cp_parser *parser, tree name,
26078 		       enum tag_types tag_type,
26079 		       bool is_template,
26080 		       bool is_namespace,
26081 		       bool check_dependency,
26082 		       tree *ambiguous_decls,
26083 		       location_t name_location)
26084 {
26085   tree decl;
26086   tree object_type = parser->context->object_type;
26087 
26088   /* Assume that the lookup will be unambiguous.  */
26089   if (ambiguous_decls)
26090     *ambiguous_decls = NULL_TREE;
26091 
26092   /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
26093      no longer valid.  Note that if we are parsing tentatively, and
26094      the parse fails, OBJECT_TYPE will be automatically restored.  */
26095   parser->context->object_type = NULL_TREE;
26096 
26097   if (name == error_mark_node)
26098     return error_mark_node;
26099 
26100   /* A template-id has already been resolved; there is no lookup to
26101      do.  */
26102   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
26103     return name;
26104   if (BASELINK_P (name))
26105     {
26106       gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
26107 		  == TEMPLATE_ID_EXPR);
26108       return name;
26109     }
26110 
26111   /* A BIT_NOT_EXPR is used to represent a destructor.  By this point,
26112      it should already have been checked to make sure that the name
26113      used matches the type being destroyed.  */
26114   if (TREE_CODE (name) == BIT_NOT_EXPR)
26115     {
26116       tree type;
26117 
26118       /* Figure out to which type this destructor applies.  */
26119       if (parser->scope)
26120 	type = parser->scope;
26121       else if (object_type)
26122 	type = object_type;
26123       else
26124 	type = current_class_type;
26125       /* If that's not a class type, there is no destructor.  */
26126       if (!type || !CLASS_TYPE_P (type))
26127 	return error_mark_node;
26128 
26129       if (CLASSTYPE_LAZY_DESTRUCTOR (type))
26130 	lazily_declare_fn (sfk_destructor, type);
26131 
26132       if (tree dtor = CLASSTYPE_DESTRUCTOR (type))
26133 	return dtor;
26134 
26135       return error_mark_node;
26136     }
26137 
26138   /* By this point, the NAME should be an ordinary identifier.  If
26139      the id-expression was a qualified name, the qualifying scope is
26140      stored in PARSER->SCOPE at this point.  */
26141   gcc_assert (identifier_p (name));
26142 
26143   /* Perform the lookup.  */
26144   if (parser->scope)
26145     {
26146       bool dependent_p;
26147 
26148       if (parser->scope == error_mark_node)
26149 	return error_mark_node;
26150 
26151       /* If the SCOPE is dependent, the lookup must be deferred until
26152 	 the template is instantiated -- unless we are explicitly
26153 	 looking up names in uninstantiated templates.  Even then, we
26154 	 cannot look up the name if the scope is not a class type; it
26155 	 might, for example, be a template type parameter.  */
26156       dependent_p = (TYPE_P (parser->scope)
26157 		     && dependent_scope_p (parser->scope));
26158       if ((check_dependency || !CLASS_TYPE_P (parser->scope))
26159 	  && dependent_p)
26160 	/* Defer lookup.  */
26161 	decl = error_mark_node;
26162       else
26163 	{
26164 	  tree pushed_scope = NULL_TREE;
26165 
26166 	  /* If PARSER->SCOPE is a dependent type, then it must be a
26167 	     class type, and we must not be checking dependencies;
26168 	     otherwise, we would have processed this lookup above.  So
26169 	     that PARSER->SCOPE is not considered a dependent base by
26170 	     lookup_member, we must enter the scope here.  */
26171 	  if (dependent_p)
26172 	    pushed_scope = push_scope (parser->scope);
26173 
26174 	  /* If the PARSER->SCOPE is a template specialization, it
26175 	     may be instantiated during name lookup.  In that case,
26176 	     errors may be issued.  Even if we rollback the current
26177 	     tentative parse, those errors are valid.  */
26178 	  decl = lookup_qualified_name (parser->scope, name,
26179 					prefer_type_arg (tag_type),
26180 					/*complain=*/true);
26181 
26182 	  /* 3.4.3.1: In a lookup in which the constructor is an acceptable
26183 	     lookup result and the nested-name-specifier nominates a class C:
26184 	       * if the name specified after the nested-name-specifier, when
26185 	       looked up in C, is the injected-class-name of C (Clause 9), or
26186 	       * if the name specified after the nested-name-specifier is the
26187 	       same as the identifier or the simple-template-id's template-
26188 	       name in the last component of the nested-name-specifier,
26189 	     the name is instead considered to name the constructor of
26190 	     class C. [ Note: for example, the constructor is not an
26191 	     acceptable lookup result in an elaborated-type-specifier so
26192 	     the constructor would not be used in place of the
26193 	     injected-class-name. --end note ] Such a constructor name
26194 	     shall be used only in the declarator-id of a declaration that
26195 	     names a constructor or in a using-declaration.  */
26196 	  if (tag_type == none_type
26197 	      && DECL_SELF_REFERENCE_P (decl)
26198 	      && same_type_p (DECL_CONTEXT (decl), parser->scope))
26199 	    decl = lookup_qualified_name (parser->scope, ctor_identifier,
26200 					  prefer_type_arg (tag_type),
26201 					  /*complain=*/true);
26202 
26203 	  /* If we have a single function from a using decl, pull it out.  */
26204 	  if (TREE_CODE (decl) == OVERLOAD
26205 	      && !really_overloaded_fn (decl))
26206 	    decl = OVL_FUNCTION (decl);
26207 
26208 	  if (pushed_scope)
26209 	    pop_scope (pushed_scope);
26210 	}
26211 
26212       /* If the scope is a dependent type and either we deferred lookup or
26213 	 we did lookup but didn't find the name, rememeber the name.  */
26214       if (decl == error_mark_node && TYPE_P (parser->scope)
26215 	  && dependent_type_p (parser->scope))
26216 	{
26217 	  if (tag_type)
26218 	    {
26219 	      tree type;
26220 
26221 	      /* The resolution to Core Issue 180 says that `struct
26222 		 A::B' should be considered a type-name, even if `A'
26223 		 is dependent.  */
26224 	      type = make_typename_type (parser->scope, name, tag_type,
26225 					 /*complain=*/tf_error);
26226 	      if (type != error_mark_node)
26227 		decl = TYPE_NAME (type);
26228 	    }
26229 	  else if (is_template
26230 		   && (cp_parser_next_token_ends_template_argument_p (parser)
26231 		       || cp_lexer_next_token_is (parser->lexer,
26232 						  CPP_CLOSE_PAREN)))
26233 	    decl = make_unbound_class_template (parser->scope,
26234 						name, NULL_TREE,
26235 						/*complain=*/tf_error);
26236 	  else
26237 	    decl = build_qualified_name (/*type=*/NULL_TREE,
26238 					 parser->scope, name,
26239 					 is_template);
26240 	}
26241       parser->qualifying_scope = parser->scope;
26242       parser->object_scope = NULL_TREE;
26243     }
26244   else if (object_type)
26245     {
26246       /* Look up the name in the scope of the OBJECT_TYPE, unless the
26247 	 OBJECT_TYPE is not a class.  */
26248       if (CLASS_TYPE_P (object_type))
26249 	/* If the OBJECT_TYPE is a template specialization, it may
26250 	   be instantiated during name lookup.  In that case, errors
26251 	   may be issued.  Even if we rollback the current tentative
26252 	   parse, those errors are valid.  */
26253 	decl = lookup_member (object_type,
26254 			      name,
26255 			      /*protect=*/0,
26256 			      prefer_type_arg (tag_type),
26257 			      tf_warning_or_error);
26258       else
26259 	decl = NULL_TREE;
26260 
26261       if (!decl)
26262 	/* Look it up in the enclosing context.  DR 141: When looking for a
26263 	   template-name after -> or ., only consider class templates.  */
26264 	decl = lookup_name_real (name, prefer_type_arg (tag_type, is_template),
26265 				 /*nonclass=*/0,
26266 				 /*block_p=*/true, is_namespace, 0);
26267       if (object_type == unknown_type_node)
26268 	/* The object is type-dependent, so we can't look anything up; we used
26269 	   this to get the DR 141 behavior.  */
26270 	object_type = NULL_TREE;
26271       parser->object_scope = object_type;
26272       parser->qualifying_scope = NULL_TREE;
26273     }
26274   else
26275     {
26276       decl = lookup_name_real (name, prefer_type_arg (tag_type),
26277 			       /*nonclass=*/0,
26278 			       /*block_p=*/true, is_namespace, 0);
26279       parser->qualifying_scope = NULL_TREE;
26280       parser->object_scope = NULL_TREE;
26281     }
26282 
26283   /* If the lookup failed, let our caller know.  */
26284   if (!decl || decl == error_mark_node)
26285     return error_mark_node;
26286 
26287   /* Pull out the template from an injected-class-name (or multiple).  */
26288   if (is_template)
26289     decl = maybe_get_template_decl_from_type_decl (decl);
26290 
26291   /* If it's a TREE_LIST, the result of the lookup was ambiguous.  */
26292   if (TREE_CODE (decl) == TREE_LIST)
26293     {
26294       if (ambiguous_decls)
26295 	*ambiguous_decls = decl;
26296       /* The error message we have to print is too complicated for
26297 	 cp_parser_error, so we incorporate its actions directly.  */
26298       if (!cp_parser_simulate_error (parser))
26299 	{
26300 	  error_at (name_location, "reference to %qD is ambiguous",
26301 		    name);
26302 	  print_candidates (decl);
26303 	}
26304       return error_mark_node;
26305     }
26306 
26307   gcc_assert (DECL_P (decl)
26308 	      || TREE_CODE (decl) == OVERLOAD
26309 	      || TREE_CODE (decl) == SCOPE_REF
26310 	      || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
26311 	      || BASELINK_P (decl));
26312 
26313   /* If we have resolved the name of a member declaration, check to
26314      see if the declaration is accessible.  When the name resolves to
26315      set of overloaded functions, accessibility is checked when
26316      overload resolution is done.
26317 
26318      During an explicit instantiation, access is not checked at all,
26319      as per [temp.explicit].  */
26320   if (DECL_P (decl))
26321     check_accessibility_of_qualified_id (decl, object_type, parser->scope);
26322 
26323   maybe_record_typedef_use (decl);
26324 
26325   return cp_expr (decl, name_location);
26326 }
26327 
26328 /* Like cp_parser_lookup_name, but for use in the typical case where
26329    CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
26330    IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE.  */
26331 
26332 static tree
26333 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
26334 {
26335   return cp_parser_lookup_name (parser, name,
26336 				none_type,
26337 				/*is_template=*/false,
26338 				/*is_namespace=*/false,
26339 				/*check_dependency=*/true,
26340 				/*ambiguous_decls=*/NULL,
26341 				location);
26342 }
26343 
26344 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
26345    the current context, return the TYPE_DECL.  If TAG_NAME_P is
26346    true, the DECL indicates the class being defined in a class-head,
26347    or declared in an elaborated-type-specifier.
26348 
26349    Otherwise, return DECL.  */
26350 
26351 static tree
26352 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
26353 {
26354   /* If the TEMPLATE_DECL is being declared as part of a class-head,
26355      the translation from TEMPLATE_DECL to TYPE_DECL occurs:
26356 
26357        struct A {
26358 	 template <typename T> struct B;
26359        };
26360 
26361        template <typename T> struct A::B {};
26362 
26363      Similarly, in an elaborated-type-specifier:
26364 
26365        namespace N { struct X{}; }
26366 
26367        struct A {
26368 	 template <typename T> friend struct N::X;
26369        };
26370 
26371      However, if the DECL refers to a class type, and we are in
26372      the scope of the class, then the name lookup automatically
26373      finds the TYPE_DECL created by build_self_reference rather
26374      than a TEMPLATE_DECL.  For example, in:
26375 
26376        template <class T> struct S {
26377 	 S s;
26378        };
26379 
26380      there is no need to handle such case.  */
26381 
26382   if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
26383     return DECL_TEMPLATE_RESULT (decl);
26384 
26385   return decl;
26386 }
26387 
26388 /* If too many, or too few, template-parameter lists apply to the
26389    declarator, issue an error message.  Returns TRUE if all went well,
26390    and FALSE otherwise.  */
26391 
26392 static bool
26393 cp_parser_check_declarator_template_parameters (cp_parser* parser,
26394 						cp_declarator *declarator,
26395 						location_t declarator_location)
26396 {
26397   switch (declarator->kind)
26398     {
26399     case cdk_id:
26400       {
26401 	unsigned num_templates = 0;
26402 	tree scope = declarator->u.id.qualifying_scope;
26403 	bool template_id_p = false;
26404 
26405 	if (scope)
26406 	  num_templates = num_template_headers_for_class (scope);
26407 	else if (TREE_CODE (declarator->u.id.unqualified_name)
26408 		 == TEMPLATE_ID_EXPR)
26409 	  {
26410 	    /* If the DECLARATOR has the form `X<y>' then it uses one
26411 	       additional level of template parameters.  */
26412 	    ++num_templates;
26413 	    template_id_p = true;
26414 	  }
26415 
26416 	return cp_parser_check_template_parameters
26417 	  (parser, num_templates, template_id_p, declarator_location,
26418 	   declarator);
26419       }
26420 
26421     case cdk_function:
26422     case cdk_array:
26423     case cdk_pointer:
26424     case cdk_reference:
26425     case cdk_ptrmem:
26426       return (cp_parser_check_declarator_template_parameters
26427 	      (parser, declarator->declarator, declarator_location));
26428 
26429     case cdk_decomp:
26430     case cdk_error:
26431       return true;
26432 
26433     default:
26434       gcc_unreachable ();
26435     }
26436   return false;
26437 }
26438 
26439 /* NUM_TEMPLATES were used in the current declaration.  If that is
26440    invalid, return FALSE and issue an error messages.  Otherwise,
26441    return TRUE.  If DECLARATOR is non-NULL, then we are checking a
26442    declarator and we can print more accurate diagnostics.  */
26443 
26444 static bool
26445 cp_parser_check_template_parameters (cp_parser* parser,
26446 				     unsigned num_templates,
26447 				     bool template_id_p,
26448 				     location_t location,
26449 				     cp_declarator *declarator)
26450 {
26451   /* If there are the same number of template classes and parameter
26452      lists, that's OK.  */
26453   if (parser->num_template_parameter_lists == num_templates)
26454     return true;
26455   /* If there are more, but only one more, and the name ends in an identifier,
26456      then we are declaring a primary template.  That's OK too.  */
26457   if (!template_id_p
26458       && parser->num_template_parameter_lists == num_templates + 1)
26459     return true;
26460   /* If there are more template classes than parameter lists, we have
26461      something like:
26462 
26463        template <class T> void S<T>::R<T>::f ();  */
26464   if (parser->num_template_parameter_lists < num_templates)
26465     {
26466       if (declarator && !current_function_decl)
26467 	error_at (location, "specializing member %<%T::%E%> "
26468 		  "requires %<template<>%> syntax",
26469 		  declarator->u.id.qualifying_scope,
26470 		  declarator->u.id.unqualified_name);
26471       else if (declarator)
26472 	error_at (location, "invalid declaration of %<%T::%E%>",
26473 		  declarator->u.id.qualifying_scope,
26474 		  declarator->u.id.unqualified_name);
26475       else
26476 	error_at (location, "too few template-parameter-lists");
26477       return false;
26478     }
26479   /* Otherwise, there are too many template parameter lists.  We have
26480      something like:
26481 
26482      template <class T> template <class U> void S::f();  */
26483   error_at (location, "too many template-parameter-lists");
26484   return false;
26485 }
26486 
26487 /* Parse an optional `::' token indicating that the following name is
26488    from the global namespace.  If so, PARSER->SCOPE is set to the
26489    GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
26490    unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
26491    Returns the new value of PARSER->SCOPE, if the `::' token is
26492    present, and NULL_TREE otherwise.  */
26493 
26494 static tree
26495 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
26496 {
26497   cp_token *token;
26498 
26499   /* Peek at the next token.  */
26500   token = cp_lexer_peek_token (parser->lexer);
26501   /* If we're looking at a `::' token then we're starting from the
26502      global namespace, not our current location.  */
26503   if (token->type == CPP_SCOPE)
26504     {
26505       /* Consume the `::' token.  */
26506       cp_lexer_consume_token (parser->lexer);
26507       /* Set the SCOPE so that we know where to start the lookup.  */
26508       parser->scope = global_namespace;
26509       parser->qualifying_scope = global_namespace;
26510       parser->object_scope = NULL_TREE;
26511 
26512       return parser->scope;
26513     }
26514   else if (!current_scope_valid_p)
26515     {
26516       parser->scope = NULL_TREE;
26517       parser->qualifying_scope = NULL_TREE;
26518       parser->object_scope = NULL_TREE;
26519     }
26520 
26521   return NULL_TREE;
26522 }
26523 
26524 /* Returns TRUE if the upcoming token sequence is the start of a
26525    constructor declarator or C++17 deduction guide.  If FRIEND_P is true, the
26526    declarator is preceded by the `friend' specifier.  */
26527 
26528 static bool
26529 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
26530 {
26531   bool constructor_p;
26532   bool outside_class_specifier_p;
26533   tree nested_name_specifier;
26534   cp_token *next_token;
26535 
26536   /* The common case is that this is not a constructor declarator, so
26537      try to avoid doing lots of work if at all possible.  It's not
26538      valid declare a constructor at function scope.  */
26539   if (parser->in_function_body)
26540     return false;
26541   /* And only certain tokens can begin a constructor declarator.  */
26542   next_token = cp_lexer_peek_token (parser->lexer);
26543   if (next_token->type != CPP_NAME
26544       && next_token->type != CPP_SCOPE
26545       && next_token->type != CPP_NESTED_NAME_SPECIFIER
26546       && next_token->type != CPP_TEMPLATE_ID)
26547     return false;
26548 
26549   /* Parse tentatively; we are going to roll back all of the tokens
26550      consumed here.  */
26551   cp_parser_parse_tentatively (parser);
26552   /* Assume that we are looking at a constructor declarator.  */
26553   constructor_p = true;
26554 
26555   /* Look for the optional `::' operator.  */
26556   cp_parser_global_scope_opt (parser,
26557 			      /*current_scope_valid_p=*/false);
26558   /* Look for the nested-name-specifier.  */
26559   nested_name_specifier
26560     = (cp_parser_nested_name_specifier_opt (parser,
26561 					    /*typename_keyword_p=*/false,
26562 					    /*check_dependency_p=*/false,
26563 					    /*type_p=*/false,
26564 					    /*is_declaration=*/false));
26565 
26566   outside_class_specifier_p = (!at_class_scope_p ()
26567 			       || !TYPE_BEING_DEFINED (current_class_type)
26568 			       || friend_p);
26569 
26570   /* Outside of a class-specifier, there must be a
26571      nested-name-specifier.  Except in C++17 mode, where we
26572      might be declaring a guiding declaration.  */
26573   if (!nested_name_specifier && outside_class_specifier_p
26574       && cxx_dialect < cxx17)
26575     constructor_p = false;
26576   else if (nested_name_specifier == error_mark_node)
26577     constructor_p = false;
26578 
26579   /* If we have a class scope, this is easy; DR 147 says that S::S always
26580      names the constructor, and no other qualified name could.  */
26581   if (constructor_p && nested_name_specifier
26582       && CLASS_TYPE_P (nested_name_specifier))
26583     {
26584       tree id = cp_parser_unqualified_id (parser,
26585 					  /*template_keyword_p=*/false,
26586 					  /*check_dependency_p=*/false,
26587 					  /*declarator_p=*/true,
26588 					  /*optional_p=*/false);
26589       if (is_overloaded_fn (id))
26590 	id = DECL_NAME (get_first_fn (id));
26591       if (!constructor_name_p (id, nested_name_specifier))
26592 	constructor_p = false;
26593     }
26594   /* If we still think that this might be a constructor-declarator,
26595      look for a class-name.  */
26596   else if (constructor_p)
26597     {
26598       /* If we have:
26599 
26600 	   template <typename T> struct S {
26601 	     S();
26602 	   };
26603 
26604 	 we must recognize that the nested `S' names a class.  */
26605       if (cxx_dialect >= cxx17)
26606 	cp_parser_parse_tentatively (parser);
26607 
26608       tree type_decl;
26609       type_decl = cp_parser_class_name (parser,
26610 					/*typename_keyword_p=*/false,
26611 					/*template_keyword_p=*/false,
26612 					none_type,
26613 					/*check_dependency_p=*/false,
26614 					/*class_head_p=*/false,
26615 					/*is_declaration=*/false);
26616 
26617       if (cxx_dialect >= cxx17
26618 	  && !cp_parser_parse_definitely (parser))
26619 	{
26620 	  type_decl = NULL_TREE;
26621 	  tree tmpl = cp_parser_template_name (parser,
26622 					       /*template_keyword*/false,
26623 					       /*check_dependency_p*/false,
26624 					       /*is_declaration*/false,
26625 					       none_type,
26626 					       /*is_identifier*/NULL);
26627 	  if (DECL_CLASS_TEMPLATE_P (tmpl)
26628 	      || DECL_TEMPLATE_TEMPLATE_PARM_P (tmpl))
26629 	    /* It's a deduction guide, return true.  */;
26630 	  else
26631 	    cp_parser_simulate_error (parser);
26632 	}
26633 
26634       /* If there was no class-name, then this is not a constructor.
26635 	 Otherwise, if we are in a class-specifier and we aren't
26636 	 handling a friend declaration, check that its type matches
26637 	 current_class_type (c++/38313).  Note: error_mark_node
26638 	 is left alone for error recovery purposes.  */
26639       constructor_p = (!cp_parser_error_occurred (parser)
26640 		       && (outside_class_specifier_p
26641 			   || type_decl == NULL_TREE
26642 			   || type_decl == error_mark_node
26643 			   || same_type_p (current_class_type,
26644 					   TREE_TYPE (type_decl))));
26645 
26646       /* If we're still considering a constructor, we have to see a `(',
26647 	 to begin the parameter-declaration-clause, followed by either a
26648 	 `)', an `...', or a decl-specifier.  We need to check for a
26649 	 type-specifier to avoid being fooled into thinking that:
26650 
26651 	   S (f) (int);
26652 
26653 	 is a constructor.  (It is actually a function named `f' that
26654 	 takes one parameter (of type `int') and returns a value of type
26655 	 `S'.  */
26656       if (constructor_p
26657 	  && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
26658 	constructor_p = false;
26659 
26660       if (constructor_p
26661 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
26662 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
26663 	  /* A parameter declaration begins with a decl-specifier,
26664 	     which is either the "attribute" keyword, a storage class
26665 	     specifier, or (usually) a type-specifier.  */
26666 	  && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
26667 	{
26668 	  tree type;
26669 	  tree pushed_scope = NULL_TREE;
26670 	  unsigned saved_num_template_parameter_lists;
26671 
26672 	  /* Names appearing in the type-specifier should be looked up
26673 	     in the scope of the class.  */
26674 	  if (current_class_type)
26675 	    type = NULL_TREE;
26676 	  else if (type_decl)
26677 	    {
26678 	      type = TREE_TYPE (type_decl);
26679 	      if (TREE_CODE (type) == TYPENAME_TYPE)
26680 		{
26681 		  type = resolve_typename_type (type,
26682 						/*only_current_p=*/false);
26683 		  if (TREE_CODE (type) == TYPENAME_TYPE)
26684 		    {
26685 		      cp_parser_abort_tentative_parse (parser);
26686 		      return false;
26687 		    }
26688 		}
26689 	      pushed_scope = push_scope (type);
26690 	    }
26691 
26692 	  /* Inside the constructor parameter list, surrounding
26693 	     template-parameter-lists do not apply.  */
26694 	  saved_num_template_parameter_lists
26695 	    = parser->num_template_parameter_lists;
26696 	  parser->num_template_parameter_lists = 0;
26697 
26698 	  /* Look for the type-specifier.  */
26699 	  cp_parser_type_specifier (parser,
26700 				    CP_PARSER_FLAGS_NONE,
26701 				    /*decl_specs=*/NULL,
26702 				    /*is_declarator=*/true,
26703 				    /*declares_class_or_enum=*/NULL,
26704 				    /*is_cv_qualifier=*/NULL);
26705 
26706 	  parser->num_template_parameter_lists
26707 	    = saved_num_template_parameter_lists;
26708 
26709 	  /* Leave the scope of the class.  */
26710 	  if (pushed_scope)
26711 	    pop_scope (pushed_scope);
26712 
26713 	  constructor_p = !cp_parser_error_occurred (parser);
26714 	}
26715     }
26716 
26717   /* We did not really want to consume any tokens.  */
26718   cp_parser_abort_tentative_parse (parser);
26719 
26720   return constructor_p;
26721 }
26722 
26723 /* Parse the definition of the function given by the DECL_SPECIFIERS,
26724    ATTRIBUTES, and DECLARATOR.  The access checks have been deferred;
26725    they must be performed once we are in the scope of the function.
26726 
26727    Returns the function defined.  */
26728 
26729 static tree
26730 cp_parser_function_definition_from_specifiers_and_declarator
26731   (cp_parser* parser,
26732    cp_decl_specifier_seq *decl_specifiers,
26733    tree attributes,
26734    const cp_declarator *declarator)
26735 {
26736   tree fn;
26737   bool success_p;
26738 
26739   /* Begin the function-definition.  */
26740   success_p = start_function (decl_specifiers, declarator, attributes);
26741 
26742   /* The things we're about to see are not directly qualified by any
26743      template headers we've seen thus far.  */
26744   reset_specialization ();
26745 
26746   /* If there were names looked up in the decl-specifier-seq that we
26747      did not check, check them now.  We must wait until we are in the
26748      scope of the function to perform the checks, since the function
26749      might be a friend.  */
26750   perform_deferred_access_checks (tf_warning_or_error);
26751 
26752   if (success_p)
26753     {
26754       cp_finalize_omp_declare_simd (parser, current_function_decl);
26755       parser->omp_declare_simd = NULL;
26756       cp_finalize_oacc_routine (parser, current_function_decl, true);
26757       parser->oacc_routine = NULL;
26758     }
26759 
26760   if (!success_p)
26761     {
26762       /* Skip the entire function.  */
26763       cp_parser_skip_to_end_of_block_or_statement (parser);
26764       fn = error_mark_node;
26765     }
26766   else if (DECL_INITIAL (current_function_decl) != error_mark_node)
26767     {
26768       /* Seen already, skip it.  An error message has already been output.  */
26769       cp_parser_skip_to_end_of_block_or_statement (parser);
26770       fn = current_function_decl;
26771       current_function_decl = NULL_TREE;
26772       /* If this is a function from a class, pop the nested class.  */
26773       if (current_class_name)
26774 	pop_nested_class ();
26775     }
26776   else
26777     {
26778       timevar_id_t tv;
26779       if (DECL_DECLARED_INLINE_P (current_function_decl))
26780         tv = TV_PARSE_INLINE;
26781       else
26782         tv = TV_PARSE_FUNC;
26783       timevar_push (tv);
26784       fn = cp_parser_function_definition_after_declarator (parser,
26785 							 /*inline_p=*/false);
26786       timevar_pop (tv);
26787     }
26788 
26789   return fn;
26790 }
26791 
26792 /* Parse the part of a function-definition that follows the
26793    declarator.  INLINE_P is TRUE iff this function is an inline
26794    function defined within a class-specifier.
26795 
26796    Returns the function defined.  */
26797 
26798 static tree
26799 cp_parser_function_definition_after_declarator (cp_parser* parser,
26800 						bool inline_p)
26801 {
26802   tree fn;
26803   bool saved_in_unbraced_linkage_specification_p;
26804   bool saved_in_function_body;
26805   unsigned saved_num_template_parameter_lists;
26806   cp_token *token;
26807   bool fully_implicit_function_template_p
26808     = parser->fully_implicit_function_template_p;
26809   parser->fully_implicit_function_template_p = false;
26810   tree implicit_template_parms
26811     = parser->implicit_template_parms;
26812   parser->implicit_template_parms = 0;
26813   cp_binding_level* implicit_template_scope
26814     = parser->implicit_template_scope;
26815   parser->implicit_template_scope = 0;
26816 
26817   saved_in_function_body = parser->in_function_body;
26818   parser->in_function_body = true;
26819   /* If the next token is `return', then the code may be trying to
26820      make use of the "named return value" extension that G++ used to
26821      support.  */
26822   token = cp_lexer_peek_token (parser->lexer);
26823   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
26824     {
26825       /* Consume the `return' keyword.  */
26826       cp_lexer_consume_token (parser->lexer);
26827       /* Look for the identifier that indicates what value is to be
26828 	 returned.  */
26829       cp_parser_identifier (parser);
26830       /* Issue an error message.  */
26831       error_at (token->location,
26832 		"named return values are no longer supported");
26833       /* Skip tokens until we reach the start of the function body.  */
26834       while (true)
26835 	{
26836 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
26837 	  if (token->type == CPP_OPEN_BRACE
26838 	      || token->type == CPP_EOF
26839 	      || token->type == CPP_PRAGMA_EOL)
26840 	    break;
26841 	  cp_lexer_consume_token (parser->lexer);
26842 	}
26843     }
26844   /* The `extern' in `extern "C" void f () { ... }' does not apply to
26845      anything declared inside `f'.  */
26846   saved_in_unbraced_linkage_specification_p
26847     = parser->in_unbraced_linkage_specification_p;
26848   parser->in_unbraced_linkage_specification_p = false;
26849   /* Inside the function, surrounding template-parameter-lists do not
26850      apply.  */
26851   saved_num_template_parameter_lists
26852     = parser->num_template_parameter_lists;
26853   parser->num_template_parameter_lists = 0;
26854 
26855   /* If the next token is `try', `__transaction_atomic', or
26856      `__transaction_relaxed`, then we are looking at either function-try-block
26857      or function-transaction-block.  Note that all of these include the
26858      function-body.  */
26859   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRANSACTION_ATOMIC))
26860     cp_parser_function_transaction (parser, RID_TRANSACTION_ATOMIC);
26861   else if (cp_lexer_next_token_is_keyword (parser->lexer,
26862       RID_TRANSACTION_RELAXED))
26863     cp_parser_function_transaction (parser, RID_TRANSACTION_RELAXED);
26864   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
26865     cp_parser_function_try_block (parser);
26866   else
26867     cp_parser_ctor_initializer_opt_and_function_body
26868       (parser, /*in_function_try_block=*/false);
26869 
26870   /* Finish the function.  */
26871   fn = finish_function (inline_p);
26872   /* Generate code for it, if necessary.  */
26873   expand_or_defer_fn (fn);
26874   /* Restore the saved values.  */
26875   parser->in_unbraced_linkage_specification_p
26876     = saved_in_unbraced_linkage_specification_p;
26877   parser->num_template_parameter_lists
26878     = saved_num_template_parameter_lists;
26879   parser->in_function_body = saved_in_function_body;
26880 
26881   parser->fully_implicit_function_template_p
26882     = fully_implicit_function_template_p;
26883   parser->implicit_template_parms
26884     = implicit_template_parms;
26885   parser->implicit_template_scope
26886     = implicit_template_scope;
26887 
26888   if (parser->fully_implicit_function_template_p)
26889     finish_fully_implicit_template (parser, /*member_decl_opt=*/0);
26890 
26891   return fn;
26892 }
26893 
26894 /* Parse a template-declaration body (following argument list).  */
26895 
26896 static void
26897 cp_parser_template_declaration_after_parameters (cp_parser* parser,
26898 						 tree parameter_list,
26899 						 bool member_p)
26900 {
26901   tree decl = NULL_TREE;
26902   bool friend_p = false;
26903 
26904   /* We just processed one more parameter list.  */
26905   ++parser->num_template_parameter_lists;
26906 
26907   /* Get the deferred access checks from the parameter list.  These
26908      will be checked once we know what is being declared, as for a
26909      member template the checks must be performed in the scope of the
26910      class containing the member.  */
26911   vec<deferred_access_check, va_gc> *checks = get_deferred_access_checks ();
26912 
26913   /* Tentatively parse for a new template parameter list, which can either be
26914      the template keyword or a template introduction.  */
26915   if (cp_parser_template_declaration_after_export (parser, member_p))
26916     /* OK */;
26917   else if (cxx_dialect >= cxx11
26918 	   && cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
26919     decl = cp_parser_alias_declaration (parser);
26920   else
26921     {
26922       /* There are no access checks when parsing a template, as we do not
26923 	 know if a specialization will be a friend.  */
26924       push_deferring_access_checks (dk_no_check);
26925       cp_token *token = cp_lexer_peek_token (parser->lexer);
26926       decl = cp_parser_single_declaration (parser,
26927 					   checks,
26928 					   member_p,
26929                                            /*explicit_specialization_p=*/false,
26930 					   &friend_p);
26931       pop_deferring_access_checks ();
26932 
26933       /* If this is a member template declaration, let the front
26934 	 end know.  */
26935       if (member_p && !friend_p && decl)
26936 	{
26937 	  if (TREE_CODE (decl) == TYPE_DECL)
26938 	    cp_parser_check_access_in_redeclaration (decl, token->location);
26939 
26940 	  decl = finish_member_template_decl (decl);
26941 	}
26942       else if (friend_p && decl
26943 	       && DECL_DECLARES_TYPE_P (decl))
26944 	make_friend_class (current_class_type, TREE_TYPE (decl),
26945 			   /*complain=*/true);
26946     }
26947   /* We are done with the current parameter list.  */
26948   --parser->num_template_parameter_lists;
26949 
26950   pop_deferring_access_checks ();
26951 
26952   /* Finish up.  */
26953   finish_template_decl (parameter_list);
26954 
26955   /* Check the template arguments for a literal operator template.  */
26956   if (decl
26957       && DECL_DECLARES_FUNCTION_P (decl)
26958       && UDLIT_OPER_P (DECL_NAME (decl)))
26959     {
26960       bool ok = true;
26961       if (parameter_list == NULL_TREE)
26962 	ok = false;
26963       else
26964 	{
26965 	  int num_parms = TREE_VEC_LENGTH (parameter_list);
26966 	  if (num_parms == 1)
26967 	    {
26968 	      tree parm_list = TREE_VEC_ELT (parameter_list, 0);
26969 	      tree parm = INNERMOST_TEMPLATE_PARMS (parm_list);
26970 	      if (TREE_TYPE (parm) != char_type_node
26971 		  || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))
26972 		ok = false;
26973 	    }
26974 	  else if (num_parms == 2 && cxx_dialect >= cxx14)
26975 	    {
26976 	      tree parm_type = TREE_VEC_ELT (parameter_list, 0);
26977 	      tree type = INNERMOST_TEMPLATE_PARMS (parm_type);
26978 	      tree parm_list = TREE_VEC_ELT (parameter_list, 1);
26979 	      tree parm = INNERMOST_TEMPLATE_PARMS (parm_list);
26980 	      if (parm == error_mark_node
26981 		  || TREE_TYPE (parm) != TREE_TYPE (type)
26982 		  || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))
26983 		ok = false;
26984 	    }
26985 	  else
26986 	    ok = false;
26987 	}
26988       if (!ok)
26989 	{
26990 	  if (cxx_dialect >= cxx14)
26991 	    error ("literal operator template %qD has invalid parameter list."
26992 		   "  Expected non-type template argument pack <char...>"
26993 		   " or <typename CharT, CharT...>",
26994 		   decl);
26995 	  else
26996 	    error ("literal operator template %qD has invalid parameter list."
26997 		   "  Expected non-type template argument pack <char...>",
26998 		   decl);
26999 	}
27000     }
27001 
27002   /* Register member declarations.  */
27003   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
27004     finish_member_declaration (decl);
27005   /* If DECL is a function template, we must return to parse it later.
27006      (Even though there is no definition, there might be default
27007      arguments that need handling.)  */
27008   if (member_p && decl
27009       && DECL_DECLARES_FUNCTION_P (decl))
27010     vec_safe_push (unparsed_funs_with_definitions, decl);
27011 }
27012 
27013 /* Parse a template introduction header for a template-declaration.  Returns
27014    false if tentative parse fails.  */
27015 
27016 static bool
27017 cp_parser_template_introduction (cp_parser* parser, bool member_p)
27018 {
27019   cp_parser_parse_tentatively (parser);
27020 
27021   tree saved_scope = parser->scope;
27022   tree saved_object_scope = parser->object_scope;
27023   tree saved_qualifying_scope = parser->qualifying_scope;
27024 
27025   /* Look for the optional `::' operator.  */
27026   cp_parser_global_scope_opt (parser,
27027 			      /*current_scope_valid_p=*/false);
27028   /* Look for the nested-name-specifier.  */
27029   cp_parser_nested_name_specifier_opt (parser,
27030 				       /*typename_keyword_p=*/false,
27031 				       /*check_dependency_p=*/true,
27032 				       /*type_p=*/false,
27033 				       /*is_declaration=*/false);
27034 
27035   cp_token *token = cp_lexer_peek_token (parser->lexer);
27036   tree concept_name = cp_parser_identifier (parser);
27037 
27038   /* Look up the concept for which we will be matching
27039      template parameters.  */
27040   tree tmpl_decl = cp_parser_lookup_name_simple (parser, concept_name,
27041 						 token->location);
27042   parser->scope = saved_scope;
27043   parser->object_scope = saved_object_scope;
27044   parser->qualifying_scope = saved_qualifying_scope;
27045 
27046   if (concept_name == error_mark_node)
27047     cp_parser_simulate_error (parser);
27048 
27049   /* Look for opening brace for introduction.  */
27050   matching_braces braces;
27051   braces.require_open (parser);
27052 
27053   if (!cp_parser_parse_definitely (parser))
27054     return false;
27055 
27056   push_deferring_access_checks (dk_deferred);
27057 
27058   /* Build vector of placeholder parameters and grab
27059      matching identifiers.  */
27060   tree introduction_list = cp_parser_introduction_list (parser);
27061 
27062   /* The introduction-list shall not be empty.  */
27063   int nargs = TREE_VEC_LENGTH (introduction_list);
27064   if (nargs == 0)
27065     {
27066       error ("empty introduction-list");
27067       return true;
27068     }
27069 
27070   /* Look for closing brace for introduction.  */
27071   if (!braces.require_close (parser))
27072     return true;
27073 
27074   if (tmpl_decl == error_mark_node)
27075     {
27076       cp_parser_name_lookup_error (parser, concept_name, tmpl_decl, NLE_NULL,
27077 				   token->location);
27078       return true;
27079     }
27080 
27081   /* Build and associate the constraint.  */
27082   tree parms = finish_template_introduction (tmpl_decl, introduction_list);
27083   if (parms && parms != error_mark_node)
27084     {
27085       cp_parser_template_declaration_after_parameters (parser, parms,
27086 						       member_p);
27087       return true;
27088     }
27089 
27090   error_at (token->location, "no matching concept for template-introduction");
27091   return true;
27092 }
27093 
27094 /* Parse a normal template-declaration following the template keyword.  */
27095 
27096 static void
27097 cp_parser_explicit_template_declaration (cp_parser* parser, bool member_p)
27098 {
27099   tree parameter_list;
27100   bool need_lang_pop;
27101   location_t location = input_location;
27102 
27103   /* Look for the `<' token.  */
27104   if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
27105     return;
27106   if (at_class_scope_p () && current_function_decl)
27107     {
27108       /* 14.5.2.2 [temp.mem]
27109 
27110          A local class shall not have member templates.  */
27111       error_at (location,
27112                 "invalid declaration of member template in local class");
27113       cp_parser_skip_to_end_of_block_or_statement (parser);
27114       return;
27115     }
27116   /* [temp]
27117 
27118      A template ... shall not have C linkage.  */
27119   if (current_lang_name == lang_name_c)
27120     {
27121       error_at (location, "template with C linkage");
27122       maybe_show_extern_c_location ();
27123       /* Give it C++ linkage to avoid confusing other parts of the
27124          front end.  */
27125       push_lang_context (lang_name_cplusplus);
27126       need_lang_pop = true;
27127     }
27128   else
27129     need_lang_pop = false;
27130 
27131   /* We cannot perform access checks on the template parameter
27132      declarations until we know what is being declared, just as we
27133      cannot check the decl-specifier list.  */
27134   push_deferring_access_checks (dk_deferred);
27135 
27136   /* If the next token is `>', then we have an invalid
27137      specialization.  Rather than complain about an invalid template
27138      parameter, issue an error message here.  */
27139   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
27140     {
27141       cp_parser_error (parser, "invalid explicit specialization");
27142       begin_specialization ();
27143       parameter_list = NULL_TREE;
27144     }
27145   else
27146     {
27147       /* Parse the template parameters.  */
27148       parameter_list = cp_parser_template_parameter_list (parser);
27149     }
27150 
27151   /* Look for the `>'.  */
27152   cp_parser_skip_to_end_of_template_parameter_list (parser);
27153 
27154   /* Manage template requirements */
27155   if (flag_concepts)
27156   {
27157     tree reqs = get_shorthand_constraints (current_template_parms);
27158     if (tree r = cp_parser_requires_clause_opt (parser))
27159       reqs = conjoin_constraints (reqs, normalize_expression (r));
27160     TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
27161   }
27162 
27163   cp_parser_template_declaration_after_parameters (parser, parameter_list,
27164 						   member_p);
27165 
27166   /* For the erroneous case of a template with C linkage, we pushed an
27167      implicit C++ linkage scope; exit that scope now.  */
27168   if (need_lang_pop)
27169     pop_lang_context ();
27170 }
27171 
27172 /* Parse a template-declaration, assuming that the `export' (and
27173    `extern') keywords, if present, has already been scanned.  MEMBER_P
27174    is as for cp_parser_template_declaration.  */
27175 
27176 static bool
27177 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
27178 {
27179   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
27180     {
27181       cp_lexer_consume_token (parser->lexer);
27182       cp_parser_explicit_template_declaration (parser, member_p);
27183       return true;
27184     }
27185   else if (flag_concepts)
27186     return cp_parser_template_introduction (parser, member_p);
27187 
27188   return false;
27189 }
27190 
27191 /* Perform the deferred access checks from a template-parameter-list.
27192    CHECKS is a TREE_LIST of access checks, as returned by
27193    get_deferred_access_checks.  */
27194 
27195 static void
27196 cp_parser_perform_template_parameter_access_checks (vec<deferred_access_check, va_gc> *checks)
27197 {
27198   ++processing_template_parmlist;
27199   perform_access_checks (checks, tf_warning_or_error);
27200   --processing_template_parmlist;
27201 }
27202 
27203 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
27204    `function-definition' sequence that follows a template header.
27205    If MEMBER_P is true, this declaration appears in a class scope.
27206 
27207    Returns the DECL for the declared entity.  If FRIEND_P is non-NULL,
27208    *FRIEND_P is set to TRUE iff the declaration is a friend.  */
27209 
27210 static tree
27211 cp_parser_single_declaration (cp_parser* parser,
27212 			      vec<deferred_access_check, va_gc> *checks,
27213 			      bool member_p,
27214                               bool explicit_specialization_p,
27215 			      bool* friend_p)
27216 {
27217   int declares_class_or_enum;
27218   tree decl = NULL_TREE;
27219   cp_decl_specifier_seq decl_specifiers;
27220   bool function_definition_p = false;
27221   cp_token *decl_spec_token_start;
27222 
27223   /* This function is only used when processing a template
27224      declaration.  */
27225   gcc_assert (innermost_scope_kind () == sk_template_parms
27226 	      || innermost_scope_kind () == sk_template_spec);
27227 
27228   /* Defer access checks until we know what is being declared.  */
27229   push_deferring_access_checks (dk_deferred);
27230 
27231   /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
27232      alternative.  */
27233   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
27234   cp_parser_decl_specifier_seq (parser,
27235 				CP_PARSER_FLAGS_OPTIONAL,
27236 				&decl_specifiers,
27237 				&declares_class_or_enum);
27238   if (friend_p)
27239     *friend_p = cp_parser_friend_p (&decl_specifiers);
27240 
27241   /* There are no template typedefs.  */
27242   if (decl_spec_seq_has_spec_p (&decl_specifiers, ds_typedef))
27243     {
27244       error_at (decl_spec_token_start->location,
27245 		"template declaration of %<typedef%>");
27246       decl = error_mark_node;
27247     }
27248 
27249   /* Gather up the access checks that occurred the
27250      decl-specifier-seq.  */
27251   stop_deferring_access_checks ();
27252 
27253   /* Check for the declaration of a template class.  */
27254   if (declares_class_or_enum)
27255     {
27256       if (cp_parser_declares_only_class_p (parser)
27257 	  || (declares_class_or_enum & 2))
27258 	{
27259 	  // If this is a declaration, but not a definition, associate
27260 	  // any constraints with the type declaration. Constraints
27261 	  // are associated with definitions in cp_parser_class_specifier.
27262 	  if (declares_class_or_enum == 1)
27263 	    associate_classtype_constraints (decl_specifiers.type);
27264 
27265 	  decl = shadow_tag (&decl_specifiers);
27266 
27267 	  /* In this case:
27268 
27269 	       struct C {
27270 		 friend template <typename T> struct A<T>::B;
27271 	       };
27272 
27273 	     A<T>::B will be represented by a TYPENAME_TYPE, and
27274 	     therefore not recognized by shadow_tag.  */
27275 	  if (friend_p && *friend_p
27276 	      && !decl
27277 	      && decl_specifiers.type
27278 	      && TYPE_P (decl_specifiers.type))
27279 	    decl = decl_specifiers.type;
27280 
27281 	  if (decl && decl != error_mark_node)
27282 	    decl = TYPE_NAME (decl);
27283 	  else
27284 	    decl = error_mark_node;
27285 
27286 	  /* Perform access checks for template parameters.  */
27287 	  cp_parser_perform_template_parameter_access_checks (checks);
27288 
27289 	  /* Give a helpful diagnostic for
27290 	       template <class T> struct A { } a;
27291 	     if we aren't already recovering from an error.  */
27292 	  if (!cp_parser_declares_only_class_p (parser)
27293 	      && !seen_error ())
27294 	    {
27295 	      error_at (cp_lexer_peek_token (parser->lexer)->location,
27296 			"a class template declaration must not declare "
27297 			"anything else");
27298 	      cp_parser_skip_to_end_of_block_or_statement (parser);
27299 	      goto out;
27300 	    }
27301 	}
27302     }
27303 
27304   /* Complain about missing 'typename' or other invalid type names.  */
27305   if (!decl_specifiers.any_type_specifiers_p
27306       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
27307     {
27308       /* cp_parser_parse_and_diagnose_invalid_type_name calls
27309 	 cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
27310 	 the rest of this declaration.  */
27311       decl = error_mark_node;
27312       goto out;
27313     }
27314 
27315   /* If it's not a template class, try for a template function.  If
27316      the next token is a `;', then this declaration does not declare
27317      anything.  But, if there were errors in the decl-specifiers, then
27318      the error might well have come from an attempted class-specifier.
27319      In that case, there's no need to warn about a missing declarator.  */
27320   if (!decl
27321       && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
27322 	  || decl_specifiers.type != error_mark_node))
27323     {
27324       decl = cp_parser_init_declarator (parser,
27325 				        &decl_specifiers,
27326 				        checks,
27327 				        /*function_definition_allowed_p=*/true,
27328 				        member_p,
27329 				        declares_class_or_enum,
27330 				        &function_definition_p,
27331 					NULL, NULL, NULL);
27332 
27333     /* 7.1.1-1 [dcl.stc]
27334 
27335        A storage-class-specifier shall not be specified in an explicit
27336        specialization...  */
27337     if (decl
27338         && explicit_specialization_p
27339         && decl_specifiers.storage_class != sc_none)
27340       {
27341         error_at (decl_spec_token_start->location,
27342 		  "explicit template specialization cannot have a storage class");
27343         decl = error_mark_node;
27344       }
27345 
27346     if (decl && VAR_P (decl))
27347       check_template_variable (decl);
27348     }
27349 
27350   /* Look for a trailing `;' after the declaration.  */
27351   if (!function_definition_p
27352       && (decl == error_mark_node
27353 	  || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
27354     cp_parser_skip_to_end_of_block_or_statement (parser);
27355 
27356  out:
27357   pop_deferring_access_checks ();
27358 
27359   /* Clear any current qualification; whatever comes next is the start
27360      of something new.  */
27361   parser->scope = NULL_TREE;
27362   parser->qualifying_scope = NULL_TREE;
27363   parser->object_scope = NULL_TREE;
27364 
27365   return decl;
27366 }
27367 
27368 /* Parse a cast-expression that is not the operand of a unary "&".  */
27369 
27370 static cp_expr
27371 cp_parser_simple_cast_expression (cp_parser *parser)
27372 {
27373   return cp_parser_cast_expression (parser, /*address_p=*/false,
27374 				    /*cast_p=*/false, /*decltype*/false, NULL);
27375 }
27376 
27377 /* Parse a functional cast to TYPE.  Returns an expression
27378    representing the cast.  */
27379 
27380 static cp_expr
27381 cp_parser_functional_cast (cp_parser* parser, tree type)
27382 {
27383   vec<tree, va_gc> *vec;
27384   tree expression_list;
27385   cp_expr cast;
27386   bool nonconst_p;
27387 
27388   location_t start_loc = input_location;
27389 
27390   if (!type)
27391     type = error_mark_node;
27392 
27393   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
27394     {
27395       cp_lexer_set_source_position (parser->lexer);
27396       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
27397       expression_list = cp_parser_braced_list (parser, &nonconst_p);
27398       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
27399       if (TREE_CODE (type) == TYPE_DECL)
27400 	type = TREE_TYPE (type);
27401 
27402       cast = finish_compound_literal (type, expression_list,
27403 				      tf_warning_or_error, fcl_functional);
27404       /* Create a location of the form:
27405 	    type_name{i, f}
27406 	    ^~~~~~~~~~~~~~~
27407 	 with caret == start at the start of the type name,
27408 	 finishing at the closing brace.  */
27409       location_t finish_loc
27410 	= get_finish (cp_lexer_previous_token (parser->lexer)->location);
27411       location_t combined_loc = make_location (start_loc, start_loc,
27412 					       finish_loc);
27413       cast.set_location (combined_loc);
27414       return cast;
27415    }
27416 
27417 
27418   vec = cp_parser_parenthesized_expression_list (parser, non_attr,
27419 						 /*cast_p=*/true,
27420 						 /*allow_expansion_p=*/true,
27421 						 /*non_constant_p=*/NULL);
27422   if (vec == NULL)
27423     expression_list = error_mark_node;
27424   else
27425     {
27426       expression_list = build_tree_list_vec (vec);
27427       release_tree_vector (vec);
27428     }
27429 
27430   cast = build_functional_cast (type, expression_list,
27431                                 tf_warning_or_error);
27432   /* [expr.const]/1: In an integral constant expression "only type
27433      conversions to integral or enumeration type can be used".  */
27434   if (TREE_CODE (type) == TYPE_DECL)
27435     type = TREE_TYPE (type);
27436   if (cast != error_mark_node
27437       && !cast_valid_in_integral_constant_expression_p (type)
27438       && cp_parser_non_integral_constant_expression (parser,
27439 						     NIC_CONSTRUCTOR))
27440     return error_mark_node;
27441 
27442   /* Create a location of the form:
27443        float(i)
27444        ^~~~~~~~
27445      with caret == start at the start of the type name,
27446      finishing at the closing paren.  */
27447   location_t finish_loc
27448     = get_finish (cp_lexer_previous_token (parser->lexer)->location);
27449   location_t combined_loc = make_location (start_loc, start_loc, finish_loc);
27450   cast.set_location (combined_loc);
27451   return cast;
27452 }
27453 
27454 /* Save the tokens that make up the body of a member function defined
27455    in a class-specifier.  The DECL_SPECIFIERS and DECLARATOR have
27456    already been parsed.  The ATTRIBUTES are any GNU "__attribute__"
27457    specifiers applied to the declaration.  Returns the FUNCTION_DECL
27458    for the member function.  */
27459 
27460 static tree
27461 cp_parser_save_member_function_body (cp_parser* parser,
27462 				     cp_decl_specifier_seq *decl_specifiers,
27463 				     cp_declarator *declarator,
27464 				     tree attributes)
27465 {
27466   cp_token *first;
27467   cp_token *last;
27468   tree fn;
27469   bool function_try_block = false;
27470 
27471   /* Create the FUNCTION_DECL.  */
27472   fn = grokmethod (decl_specifiers, declarator, attributes);
27473   cp_finalize_omp_declare_simd (parser, fn);
27474   cp_finalize_oacc_routine (parser, fn, true);
27475   /* If something went badly wrong, bail out now.  */
27476   if (fn == error_mark_node)
27477     {
27478       /* If there's a function-body, skip it.  */
27479       if (cp_parser_token_starts_function_definition_p
27480 	  (cp_lexer_peek_token (parser->lexer)))
27481 	cp_parser_skip_to_end_of_block_or_statement (parser);
27482       return error_mark_node;
27483     }
27484 
27485   /* Remember it, if there default args to post process.  */
27486   cp_parser_save_default_args (parser, fn);
27487 
27488   /* Save away the tokens that make up the body of the
27489      function.  */
27490   first = parser->lexer->next_token;
27491 
27492   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRANSACTION_RELAXED))
27493     cp_lexer_consume_token (parser->lexer);
27494   else if (cp_lexer_next_token_is_keyword (parser->lexer,
27495 					   RID_TRANSACTION_ATOMIC))
27496     {
27497       cp_lexer_consume_token (parser->lexer);
27498       /* Match cp_parser_txn_attribute_opt [[ identifier ]].  */
27499       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE)
27500 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_SQUARE)
27501 	  && (cp_lexer_nth_token_is (parser->lexer, 3, CPP_NAME)
27502 	      || cp_lexer_nth_token_is (parser->lexer, 3, CPP_KEYWORD))
27503 	  && cp_lexer_nth_token_is (parser->lexer, 4, CPP_CLOSE_SQUARE)
27504 	  && cp_lexer_nth_token_is (parser->lexer, 5, CPP_CLOSE_SQUARE))
27505 	{
27506 	  cp_lexer_consume_token (parser->lexer);
27507 	  cp_lexer_consume_token (parser->lexer);
27508 	  cp_lexer_consume_token (parser->lexer);
27509 	  cp_lexer_consume_token (parser->lexer);
27510 	  cp_lexer_consume_token (parser->lexer);
27511 	}
27512       else
27513 	while (cp_next_tokens_can_be_gnu_attribute_p (parser)
27514 	       && cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_PAREN))
27515 	  {
27516 	    cp_lexer_consume_token (parser->lexer);
27517 	    if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
27518 	      break;
27519 	  }
27520     }
27521 
27522   /* Handle function try blocks.  */
27523   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
27524     {
27525       cp_lexer_consume_token (parser->lexer);
27526       function_try_block = true;
27527     }
27528   /* We can have braced-init-list mem-initializers before the fn body.  */
27529   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
27530     {
27531       cp_lexer_consume_token (parser->lexer);
27532       while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
27533 	{
27534 	  /* cache_group will stop after an un-nested { } pair, too.  */
27535 	  if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
27536 	    break;
27537 
27538 	  /* variadic mem-inits have ... after the ')'.  */
27539 	  if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
27540 	    cp_lexer_consume_token (parser->lexer);
27541 	}
27542     }
27543   cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
27544   /* Handle function try blocks.  */
27545   if (function_try_block)
27546     while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
27547       cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
27548   last = parser->lexer->next_token;
27549 
27550   /* Save away the inline definition; we will process it when the
27551      class is complete.  */
27552   DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
27553   DECL_PENDING_INLINE_P (fn) = 1;
27554 
27555   /* We need to know that this was defined in the class, so that
27556      friend templates are handled correctly.  */
27557   DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
27558 
27559   /* Add FN to the queue of functions to be parsed later.  */
27560   vec_safe_push (unparsed_funs_with_definitions, fn);
27561 
27562   return fn;
27563 }
27564 
27565 /* Save the tokens that make up the in-class initializer for a non-static
27566    data member.  Returns a DEFAULT_ARG.  */
27567 
27568 static tree
27569 cp_parser_save_nsdmi (cp_parser* parser)
27570 {
27571   return cp_parser_cache_defarg (parser, /*nsdmi=*/true);
27572 }
27573 
27574 /* Parse a template-argument-list, as well as the trailing ">" (but
27575    not the opening "<").  See cp_parser_template_argument_list for the
27576    return value.  */
27577 
27578 static tree
27579 cp_parser_enclosed_template_argument_list (cp_parser* parser)
27580 {
27581   tree arguments;
27582   tree saved_scope;
27583   tree saved_qualifying_scope;
27584   tree saved_object_scope;
27585   bool saved_greater_than_is_operator_p;
27586   int saved_unevaluated_operand;
27587   int saved_inhibit_evaluation_warnings;
27588 
27589   /* [temp.names]
27590 
27591      When parsing a template-id, the first non-nested `>' is taken as
27592      the end of the template-argument-list rather than a greater-than
27593      operator.  */
27594   saved_greater_than_is_operator_p
27595     = parser->greater_than_is_operator_p;
27596   parser->greater_than_is_operator_p = false;
27597   /* Parsing the argument list may modify SCOPE, so we save it
27598      here.  */
27599   saved_scope = parser->scope;
27600   saved_qualifying_scope = parser->qualifying_scope;
27601   saved_object_scope = parser->object_scope;
27602   /* We need to evaluate the template arguments, even though this
27603      template-id may be nested within a "sizeof".  */
27604   saved_unevaluated_operand = cp_unevaluated_operand;
27605   cp_unevaluated_operand = 0;
27606   saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
27607   c_inhibit_evaluation_warnings = 0;
27608   /* Parse the template-argument-list itself.  */
27609   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
27610       || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
27611     arguments = NULL_TREE;
27612   else
27613     arguments = cp_parser_template_argument_list (parser);
27614   /* Look for the `>' that ends the template-argument-list. If we find
27615      a '>>' instead, it's probably just a typo.  */
27616   if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
27617     {
27618       if (cxx_dialect != cxx98)
27619         {
27620           /* In C++0x, a `>>' in a template argument list or cast
27621              expression is considered to be two separate `>'
27622              tokens. So, change the current token to a `>', but don't
27623              consume it: it will be consumed later when the outer
27624              template argument list (or cast expression) is parsed.
27625              Note that this replacement of `>' for `>>' is necessary
27626              even if we are parsing tentatively: in the tentative
27627              case, after calling
27628              cp_parser_enclosed_template_argument_list we will always
27629              throw away all of the template arguments and the first
27630              closing `>', either because the template argument list
27631              was erroneous or because we are replacing those tokens
27632              with a CPP_TEMPLATE_ID token.  The second `>' (which will
27633              not have been thrown away) is needed either to close an
27634              outer template argument list or to complete a new-style
27635              cast.  */
27636 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
27637           token->type = CPP_GREATER;
27638         }
27639       else if (!saved_greater_than_is_operator_p)
27640 	{
27641 	  /* If we're in a nested template argument list, the '>>' has
27642 	    to be a typo for '> >'. We emit the error message, but we
27643 	    continue parsing and we push a '>' as next token, so that
27644 	    the argument list will be parsed correctly.  Note that the
27645 	    global source location is still on the token before the
27646 	    '>>', so we need to say explicitly where we want it.  */
27647 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
27648 	  gcc_rich_location richloc (token->location);
27649 	  richloc.add_fixit_replace ("> >");
27650 	  error_at (&richloc, "%<>>%> should be %<> >%> "
27651 		    "within a nested template argument list");
27652 
27653 	  token->type = CPP_GREATER;
27654 	}
27655       else
27656 	{
27657 	  /* If this is not a nested template argument list, the '>>'
27658 	    is a typo for '>'. Emit an error message and continue.
27659 	    Same deal about the token location, but here we can get it
27660 	    right by consuming the '>>' before issuing the diagnostic.  */
27661 	  cp_token *token = cp_lexer_consume_token (parser->lexer);
27662 	  error_at (token->location,
27663 		    "spurious %<>>%>, use %<>%> to terminate "
27664 		    "a template argument list");
27665 	}
27666     }
27667   else
27668     cp_parser_skip_to_end_of_template_parameter_list (parser);
27669   /* The `>' token might be a greater-than operator again now.  */
27670   parser->greater_than_is_operator_p
27671     = saved_greater_than_is_operator_p;
27672   /* Restore the SAVED_SCOPE.  */
27673   parser->scope = saved_scope;
27674   parser->qualifying_scope = saved_qualifying_scope;
27675   parser->object_scope = saved_object_scope;
27676   cp_unevaluated_operand = saved_unevaluated_operand;
27677   c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
27678 
27679   return arguments;
27680 }
27681 
27682 /* MEMBER_FUNCTION is a member function, or a friend.  If default
27683    arguments, or the body of the function have not yet been parsed,
27684    parse them now.  */
27685 
27686 static void
27687 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
27688 {
27689   timevar_push (TV_PARSE_INMETH);
27690   /* If this member is a template, get the underlying
27691      FUNCTION_DECL.  */
27692   if (DECL_FUNCTION_TEMPLATE_P (member_function))
27693     member_function = DECL_TEMPLATE_RESULT (member_function);
27694 
27695   /* There should not be any class definitions in progress at this
27696      point; the bodies of members are only parsed outside of all class
27697      definitions.  */
27698   gcc_assert (parser->num_classes_being_defined == 0);
27699   /* While we're parsing the member functions we might encounter more
27700      classes.  We want to handle them right away, but we don't want
27701      them getting mixed up with functions that are currently in the
27702      queue.  */
27703   push_unparsed_function_queues (parser);
27704 
27705   /* Make sure that any template parameters are in scope.  */
27706   maybe_begin_member_template_processing (member_function);
27707 
27708   /* If the body of the function has not yet been parsed, parse it
27709      now.  */
27710   if (DECL_PENDING_INLINE_P (member_function))
27711     {
27712       tree function_scope;
27713       cp_token_cache *tokens;
27714 
27715       /* The function is no longer pending; we are processing it.  */
27716       tokens = DECL_PENDING_INLINE_INFO (member_function);
27717       DECL_PENDING_INLINE_INFO (member_function) = NULL;
27718       DECL_PENDING_INLINE_P (member_function) = 0;
27719 
27720       /* If this is a local class, enter the scope of the containing
27721 	 function.  */
27722       function_scope = current_function_decl;
27723       if (function_scope)
27724 	push_function_context ();
27725 
27726       /* Push the body of the function onto the lexer stack.  */
27727       cp_parser_push_lexer_for_tokens (parser, tokens);
27728 
27729       /* Let the front end know that we going to be defining this
27730 	 function.  */
27731       start_preparsed_function (member_function, NULL_TREE,
27732 				SF_PRE_PARSED | SF_INCLASS_INLINE);
27733 
27734       /* Don't do access checking if it is a templated function.  */
27735       if (processing_template_decl)
27736 	push_deferring_access_checks (dk_no_check);
27737 
27738       /* #pragma omp declare reduction needs special parsing.  */
27739       if (DECL_OMP_DECLARE_REDUCTION_P (member_function))
27740 	{
27741 	  parser->lexer->in_pragma = true;
27742 	  cp_parser_omp_declare_reduction_exprs (member_function, parser);
27743 	  finish_function (/*inline_p=*/true);
27744 	  cp_check_omp_declare_reduction (member_function);
27745 	}
27746       else
27747 	/* Now, parse the body of the function.  */
27748 	cp_parser_function_definition_after_declarator (parser,
27749 							/*inline_p=*/true);
27750 
27751       if (processing_template_decl)
27752 	pop_deferring_access_checks ();
27753 
27754       /* Leave the scope of the containing function.  */
27755       if (function_scope)
27756 	pop_function_context ();
27757       cp_parser_pop_lexer (parser);
27758     }
27759 
27760   /* Remove any template parameters from the symbol table.  */
27761   maybe_end_member_template_processing ();
27762 
27763   /* Restore the queue.  */
27764   pop_unparsed_function_queues (parser);
27765   timevar_pop (TV_PARSE_INMETH);
27766 }
27767 
27768 /* If DECL contains any default args, remember it on the unparsed
27769    functions queue.  */
27770 
27771 static void
27772 cp_parser_save_default_args (cp_parser* parser, tree decl)
27773 {
27774   tree probe;
27775 
27776   for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
27777        probe;
27778        probe = TREE_CHAIN (probe))
27779     if (TREE_PURPOSE (probe))
27780       {
27781 	cp_default_arg_entry entry = {current_class_type, decl};
27782 	vec_safe_push (unparsed_funs_with_default_args, entry);
27783 	break;
27784       }
27785 }
27786 
27787 /* DEFAULT_ARG contains the saved tokens for the initializer of DECL,
27788    which is either a FIELD_DECL or PARM_DECL.  Parse it and return
27789    the result.  For a PARM_DECL, PARMTYPE is the corresponding type
27790    from the parameter-type-list.  */
27791 
27792 static tree
27793 cp_parser_late_parse_one_default_arg (cp_parser *parser, tree decl,
27794 				      tree default_arg, tree parmtype)
27795 {
27796   cp_token_cache *tokens;
27797   tree parsed_arg;
27798   bool dummy;
27799 
27800   if (default_arg == error_mark_node)
27801     return error_mark_node;
27802 
27803   /* Push the saved tokens for the default argument onto the parser's
27804      lexer stack.  */
27805   tokens = DEFARG_TOKENS (default_arg);
27806   cp_parser_push_lexer_for_tokens (parser, tokens);
27807 
27808   start_lambda_scope (decl);
27809 
27810   /* Parse the default argument.  */
27811   parsed_arg = cp_parser_initializer (parser, &dummy, &dummy);
27812   if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg))
27813     maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
27814 
27815   finish_lambda_scope ();
27816 
27817   if (parsed_arg == error_mark_node)
27818     cp_parser_skip_to_end_of_statement (parser);
27819 
27820   if (!processing_template_decl)
27821     {
27822       /* In a non-template class, check conversions now.  In a template,
27823 	 we'll wait and instantiate these as needed.  */
27824       if (TREE_CODE (decl) == PARM_DECL)
27825 	parsed_arg = check_default_argument (parmtype, parsed_arg,
27826 					     tf_warning_or_error);
27827       else if (maybe_reject_flexarray_init (decl, parsed_arg))
27828 	parsed_arg = error_mark_node;
27829       else
27830 	parsed_arg = digest_nsdmi_init (decl, parsed_arg, tf_warning_or_error);
27831     }
27832 
27833   /* If the token stream has not been completely used up, then
27834      there was extra junk after the end of the default
27835      argument.  */
27836   if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
27837     {
27838       if (TREE_CODE (decl) == PARM_DECL)
27839 	cp_parser_error (parser, "expected %<,%>");
27840       else
27841 	cp_parser_error (parser, "expected %<;%>");
27842     }
27843 
27844   /* Revert to the main lexer.  */
27845   cp_parser_pop_lexer (parser);
27846 
27847   return parsed_arg;
27848 }
27849 
27850 /* FIELD is a non-static data member with an initializer which we saved for
27851    later; parse it now.  */
27852 
27853 static void
27854 cp_parser_late_parsing_nsdmi (cp_parser *parser, tree field)
27855 {
27856   tree def;
27857 
27858   maybe_begin_member_template_processing (field);
27859 
27860   push_unparsed_function_queues (parser);
27861   def = cp_parser_late_parse_one_default_arg (parser, field,
27862 					      DECL_INITIAL (field),
27863 					      NULL_TREE);
27864   pop_unparsed_function_queues (parser);
27865 
27866   maybe_end_member_template_processing ();
27867 
27868   DECL_INITIAL (field) = def;
27869 }
27870 
27871 /* FN is a FUNCTION_DECL which may contains a parameter with an
27872    unparsed DEFAULT_ARG.  Parse the default args now.  This function
27873    assumes that the current scope is the scope in which the default
27874    argument should be processed.  */
27875 
27876 static void
27877 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
27878 {
27879   bool saved_local_variables_forbidden_p;
27880   tree parm, parmdecl;
27881 
27882   /* While we're parsing the default args, we might (due to the
27883      statement expression extension) encounter more classes.  We want
27884      to handle them right away, but we don't want them getting mixed
27885      up with default args that are currently in the queue.  */
27886   push_unparsed_function_queues (parser);
27887 
27888   /* Local variable names (and the `this' keyword) may not appear
27889      in a default argument.  */
27890   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
27891   parser->local_variables_forbidden_p = true;
27892 
27893   push_defarg_context (fn);
27894 
27895   for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
27896 	 parmdecl = DECL_ARGUMENTS (fn);
27897        parm && parm != void_list_node;
27898        parm = TREE_CHAIN (parm),
27899 	 parmdecl = DECL_CHAIN (parmdecl))
27900     {
27901       tree default_arg = TREE_PURPOSE (parm);
27902       tree parsed_arg;
27903       vec<tree, va_gc> *insts;
27904       tree copy;
27905       unsigned ix;
27906 
27907       if (!default_arg)
27908 	continue;
27909 
27910       if (TREE_CODE (default_arg) != DEFAULT_ARG)
27911 	/* This can happen for a friend declaration for a function
27912 	   already declared with default arguments.  */
27913 	continue;
27914 
27915       parsed_arg
27916 	= cp_parser_late_parse_one_default_arg (parser, parmdecl,
27917 						default_arg,
27918 						TREE_VALUE (parm));
27919       TREE_PURPOSE (parm) = parsed_arg;
27920 
27921       /* Update any instantiations we've already created.  */
27922       for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
27923 	   vec_safe_iterate (insts, ix, &copy); ix++)
27924 	TREE_PURPOSE (copy) = parsed_arg;
27925     }
27926 
27927   pop_defarg_context ();
27928 
27929   /* Make sure no default arg is missing.  */
27930   check_default_args (fn);
27931 
27932   /* Restore the state of local_variables_forbidden_p.  */
27933   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
27934 
27935   /* Restore the queue.  */
27936   pop_unparsed_function_queues (parser);
27937 }
27938 
27939 /* Subroutine of cp_parser_sizeof_operand, for handling C++11
27940 
27941      sizeof ... ( identifier )
27942 
27943    where the 'sizeof' token has already been consumed.  */
27944 
27945 static tree
27946 cp_parser_sizeof_pack (cp_parser *parser)
27947 {
27948   /* Consume the `...'.  */
27949   cp_lexer_consume_token (parser->lexer);
27950   maybe_warn_variadic_templates ();
27951 
27952   matching_parens parens;
27953   bool paren = cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN);
27954   if (paren)
27955     parens.consume_open (parser);
27956   else
27957     permerror (cp_lexer_peek_token (parser->lexer)->location,
27958 	       "%<sizeof...%> argument must be surrounded by parentheses");
27959 
27960   cp_token *token = cp_lexer_peek_token (parser->lexer);
27961   tree name = cp_parser_identifier (parser);
27962   if (name == error_mark_node)
27963     return error_mark_node;
27964   /* The name is not qualified.  */
27965   parser->scope = NULL_TREE;
27966   parser->qualifying_scope = NULL_TREE;
27967   parser->object_scope = NULL_TREE;
27968   tree expr = cp_parser_lookup_name_simple (parser, name, token->location);
27969   if (expr == error_mark_node)
27970     cp_parser_name_lookup_error (parser, name, expr, NLE_NULL,
27971 				 token->location);
27972   if (TREE_CODE (expr) == TYPE_DECL || TREE_CODE (expr) == TEMPLATE_DECL)
27973     expr = TREE_TYPE (expr);
27974   else if (TREE_CODE (expr) == CONST_DECL)
27975     expr = DECL_INITIAL (expr);
27976   expr = make_pack_expansion (expr);
27977   PACK_EXPANSION_SIZEOF_P (expr) = true;
27978 
27979   if (paren)
27980     parens.require_close (parser);
27981 
27982   return expr;
27983 }
27984 
27985 /* Parse the operand of `sizeof' (or a similar operator).  Returns
27986    either a TYPE or an expression, depending on the form of the
27987    input.  The KEYWORD indicates which kind of expression we have
27988    encountered.  */
27989 
27990 static tree
27991 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
27992 {
27993   tree expr = NULL_TREE;
27994   const char *saved_message;
27995   char *tmp;
27996   bool saved_integral_constant_expression_p;
27997   bool saved_non_integral_constant_expression_p;
27998 
27999   /* If it's a `...', then we are computing the length of a parameter
28000      pack.  */
28001   if (keyword == RID_SIZEOF
28002       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
28003     return cp_parser_sizeof_pack (parser);
28004 
28005   /* Types cannot be defined in a `sizeof' expression.  Save away the
28006      old message.  */
28007   saved_message = parser->type_definition_forbidden_message;
28008   /* And create the new one.  */
28009   tmp = concat ("types may not be defined in %<",
28010 		IDENTIFIER_POINTER (ridpointers[keyword]),
28011 		"%> expressions", NULL);
28012   parser->type_definition_forbidden_message = tmp;
28013 
28014   /* The restrictions on constant-expressions do not apply inside
28015      sizeof expressions.  */
28016   saved_integral_constant_expression_p
28017     = parser->integral_constant_expression_p;
28018   saved_non_integral_constant_expression_p
28019     = parser->non_integral_constant_expression_p;
28020   parser->integral_constant_expression_p = false;
28021 
28022   /* Do not actually evaluate the expression.  */
28023   ++cp_unevaluated_operand;
28024   ++c_inhibit_evaluation_warnings;
28025   /* If it's a `(', then we might be looking at the type-id
28026      construction.  */
28027   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
28028     {
28029       tree type = NULL_TREE;
28030 
28031       /* We can't be sure yet whether we're looking at a type-id or an
28032 	 expression.  */
28033       cp_parser_parse_tentatively (parser);
28034 
28035       matching_parens parens;
28036       parens.consume_open (parser);
28037 
28038       /* Note: as a GNU Extension, compound literals are considered
28039 	 postfix-expressions as they are in C99, so they are valid
28040 	 arguments to sizeof.  See comment in cp_parser_cast_expression
28041 	 for details.  */
28042       if (cp_parser_compound_literal_p (parser))
28043 	cp_parser_simulate_error (parser);
28044       else
28045 	{
28046 	  bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
28047 	  parser->in_type_id_in_expr_p = true;
28048 	  /* Look for the type-id.  */
28049 	  type = cp_parser_type_id (parser);
28050 	  /* Look for the closing `)'.  */
28051 	  parens.require_close (parser);
28052 	  parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
28053 	}
28054 
28055       /* If all went well, then we're done.  */
28056       if (cp_parser_parse_definitely (parser))
28057 	{
28058 	  cp_decl_specifier_seq decl_specs;
28059 
28060 	  /* Build a trivial decl-specifier-seq.  */
28061 	  clear_decl_specs (&decl_specs);
28062 	  decl_specs.type = type;
28063 
28064 	  /* Call grokdeclarator to figure out what type this is.  */
28065 	  expr = grokdeclarator (NULL,
28066 				 &decl_specs,
28067 				 TYPENAME,
28068 				 /*initialized=*/0,
28069 				 /*attrlist=*/NULL);
28070 	}
28071     }
28072 
28073   /* If the type-id production did not work out, then we must be
28074      looking at the unary-expression production.  */
28075   if (!expr)
28076     expr = cp_parser_unary_expression (parser);
28077 
28078   /* Go back to evaluating expressions.  */
28079   --cp_unevaluated_operand;
28080   --c_inhibit_evaluation_warnings;
28081 
28082   /* Free the message we created.  */
28083   free (tmp);
28084   /* And restore the old one.  */
28085   parser->type_definition_forbidden_message = saved_message;
28086   parser->integral_constant_expression_p
28087     = saved_integral_constant_expression_p;
28088   parser->non_integral_constant_expression_p
28089     = saved_non_integral_constant_expression_p;
28090 
28091   return expr;
28092 }
28093 
28094 /* If the current declaration has no declarator, return true.  */
28095 
28096 static bool
28097 cp_parser_declares_only_class_p (cp_parser *parser)
28098 {
28099   /* If the next token is a `;' or a `,' then there is no
28100      declarator.  */
28101   return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
28102 	  || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
28103 }
28104 
28105 /* Update the DECL_SPECS to reflect the storage class indicated by
28106    KEYWORD.  */
28107 
28108 static void
28109 cp_parser_set_storage_class (cp_parser *parser,
28110 			     cp_decl_specifier_seq *decl_specs,
28111 			     enum rid keyword,
28112 			     cp_token *token)
28113 {
28114   cp_storage_class storage_class;
28115 
28116   if (parser->in_unbraced_linkage_specification_p)
28117     {
28118       error_at (token->location, "invalid use of %qD in linkage specification",
28119 		ridpointers[keyword]);
28120       return;
28121     }
28122   else if (decl_specs->storage_class != sc_none)
28123     {
28124       decl_specs->conflicting_specifiers_p = true;
28125       return;
28126     }
28127 
28128   if ((keyword == RID_EXTERN || keyword == RID_STATIC)
28129       && decl_spec_seq_has_spec_p (decl_specs, ds_thread)
28130       && decl_specs->gnu_thread_keyword_p)
28131     {
28132       pedwarn (decl_specs->locations[ds_thread], 0,
28133 		"%<__thread%> before %qD", ridpointers[keyword]);
28134     }
28135 
28136   switch (keyword)
28137     {
28138     case RID_AUTO:
28139       storage_class = sc_auto;
28140       break;
28141     case RID_REGISTER:
28142       storage_class = sc_register;
28143       break;
28144     case RID_STATIC:
28145       storage_class = sc_static;
28146       break;
28147     case RID_EXTERN:
28148       storage_class = sc_extern;
28149       break;
28150     case RID_MUTABLE:
28151       storage_class = sc_mutable;
28152       break;
28153     default:
28154       gcc_unreachable ();
28155     }
28156   decl_specs->storage_class = storage_class;
28157   set_and_check_decl_spec_loc (decl_specs, ds_storage_class, token);
28158 
28159   /* A storage class specifier cannot be applied alongside a typedef
28160      specifier. If there is a typedef specifier present then set
28161      conflicting_specifiers_p which will trigger an error later
28162      on in grokdeclarator. */
28163   if (decl_spec_seq_has_spec_p (decl_specs, ds_typedef))
28164     decl_specs->conflicting_specifiers_p = true;
28165 }
28166 
28167 /* Update the DECL_SPECS to reflect the TYPE_SPEC.  If TYPE_DEFINITION_P
28168    is true, the type is a class or enum definition.  */
28169 
28170 static void
28171 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
28172 			      tree type_spec,
28173 			      cp_token *token,
28174 			      bool type_definition_p)
28175 {
28176   decl_specs->any_specifiers_p = true;
28177 
28178   /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
28179      (with, for example, in "typedef int wchar_t;") we remember that
28180      this is what happened.  In system headers, we ignore these
28181      declarations so that G++ can work with system headers that are not
28182      C++-safe.  */
28183   if (decl_spec_seq_has_spec_p (decl_specs, ds_typedef)
28184       && !type_definition_p
28185       && (type_spec == boolean_type_node
28186 	  || type_spec == char16_type_node
28187 	  || type_spec == char32_type_node
28188 	  || type_spec == wchar_type_node)
28189       && (decl_specs->type
28190 	  || decl_spec_seq_has_spec_p (decl_specs, ds_long)
28191 	  || decl_spec_seq_has_spec_p (decl_specs, ds_short)
28192 	  || decl_spec_seq_has_spec_p (decl_specs, ds_unsigned)
28193 	  || decl_spec_seq_has_spec_p (decl_specs, ds_signed)))
28194     {
28195       decl_specs->redefined_builtin_type = type_spec;
28196       set_and_check_decl_spec_loc (decl_specs,
28197 				   ds_redefined_builtin_type_spec,
28198 				   token);
28199       if (!decl_specs->type)
28200 	{
28201 	  decl_specs->type = type_spec;
28202 	  decl_specs->type_definition_p = false;
28203 	  set_and_check_decl_spec_loc (decl_specs,ds_type_spec, token);
28204 	}
28205     }
28206   else if (decl_specs->type)
28207     decl_specs->multiple_types_p = true;
28208   else
28209     {
28210       decl_specs->type = type_spec;
28211       decl_specs->type_definition_p = type_definition_p;
28212       decl_specs->redefined_builtin_type = NULL_TREE;
28213       set_and_check_decl_spec_loc (decl_specs, ds_type_spec, token);
28214     }
28215 }
28216 
28217 /* True iff TOKEN is the GNU keyword __thread.  */
28218 
28219 static bool
28220 token_is__thread (cp_token *token)
28221 {
28222   gcc_assert (token->keyword == RID_THREAD);
28223   return id_equal (token->u.value, "__thread");
28224 }
28225 
28226 /* Set the location for a declarator specifier and check if it is
28227    duplicated.
28228 
28229    DECL_SPECS is the sequence of declarator specifiers onto which to
28230    set the location.
28231 
28232    DS is the single declarator specifier to set which location  is to
28233    be set onto the existing sequence of declarators.
28234 
28235    LOCATION is the location for the declarator specifier to
28236    consider.  */
28237 
28238 static void
28239 set_and_check_decl_spec_loc (cp_decl_specifier_seq *decl_specs,
28240 			     cp_decl_spec ds, cp_token *token)
28241 {
28242   gcc_assert (ds < ds_last);
28243 
28244   if (decl_specs == NULL)
28245     return;
28246 
28247   source_location location = token->location;
28248 
28249   if (decl_specs->locations[ds] == 0)
28250     {
28251       decl_specs->locations[ds] = location;
28252       if (ds == ds_thread)
28253 	decl_specs->gnu_thread_keyword_p = token_is__thread (token);
28254     }
28255   else
28256     {
28257       if (ds == ds_long)
28258 	{
28259 	  if (decl_specs->locations[ds_long_long] != 0)
28260 	    error_at (location,
28261 		      "%<long long long%> is too long for GCC");
28262 	  else
28263 	    {
28264 	      decl_specs->locations[ds_long_long] = location;
28265 	      pedwarn_cxx98 (location,
28266 			     OPT_Wlong_long,
28267 			     "ISO C++ 1998 does not support %<long long%>");
28268 	    }
28269 	}
28270       else if (ds == ds_thread)
28271 	{
28272 	  bool gnu = token_is__thread (token);
28273 	  if (gnu != decl_specs->gnu_thread_keyword_p)
28274 	    error_at (location,
28275 		      "both %<__thread%> and %<thread_local%> specified");
28276 	  else
28277 	    {
28278 	      gcc_rich_location richloc (location);
28279 	      richloc.add_fixit_remove ();
28280 	      error_at (&richloc, "duplicate %qD", token->u.value);
28281 	    }
28282 	}
28283       else
28284 	{
28285 	  static const char *const decl_spec_names[] = {
28286 	    "signed",
28287 	    "unsigned",
28288 	    "short",
28289 	    "long",
28290 	    "const",
28291 	    "volatile",
28292 	    "restrict",
28293 	    "inline",
28294 	    "virtual",
28295 	    "explicit",
28296 	    "friend",
28297 	    "typedef",
28298 	    "using",
28299             "constexpr",
28300 	    "__complex"
28301 	  };
28302 	  gcc_rich_location richloc (location);
28303 	  richloc.add_fixit_remove ();
28304 	  error_at (&richloc, "duplicate %qs", decl_spec_names[ds]);
28305 	}
28306     }
28307 }
28308 
28309 /* Return true iff the declarator specifier DS is present in the
28310    sequence of declarator specifiers DECL_SPECS.  */
28311 
28312 bool
28313 decl_spec_seq_has_spec_p (const cp_decl_specifier_seq * decl_specs,
28314 			  cp_decl_spec ds)
28315 {
28316   gcc_assert (ds < ds_last);
28317 
28318   if (decl_specs == NULL)
28319     return false;
28320 
28321   return decl_specs->locations[ds] != 0;
28322 }
28323 
28324 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
28325    Returns TRUE iff `friend' appears among the DECL_SPECIFIERS.  */
28326 
28327 static bool
28328 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
28329 {
28330   return decl_spec_seq_has_spec_p (decl_specifiers, ds_friend);
28331 }
28332 
28333 /* Issue an error message indicating that TOKEN_DESC was expected.
28334    If KEYWORD is true, it indicated this function is called by
28335    cp_parser_require_keword and the required token can only be
28336    a indicated keyword.
28337 
28338    If MATCHING_LOCATION is not UNKNOWN_LOCATION, then highlight it
28339    within any error as the location of an "opening" token matching
28340    the close token TYPE (e.g. the location of the '(' when TOKEN_DESC is
28341    RT_CLOSE_PAREN).  */
28342 
28343 static void
28344 cp_parser_required_error (cp_parser *parser,
28345 			  required_token token_desc,
28346 			  bool keyword,
28347 			  location_t matching_location)
28348 {
28349   if (cp_parser_simulate_error (parser))
28350     return;
28351 
28352   const char *gmsgid = NULL;
28353   switch (token_desc)
28354     {
28355       case RT_NEW:
28356 	gmsgid = G_("expected %<new%>");
28357 	break;
28358       case RT_DELETE:
28359 	gmsgid = G_("expected %<delete%>");
28360 	break;
28361       case RT_RETURN:
28362 	gmsgid = G_("expected %<return%>");
28363 	break;
28364       case RT_WHILE:
28365 	gmsgid = G_("expected %<while%>");
28366 	break;
28367       case RT_EXTERN:
28368 	gmsgid = G_("expected %<extern%>");
28369 	break;
28370       case RT_STATIC_ASSERT:
28371 	gmsgid = G_("expected %<static_assert%>");
28372 	break;
28373       case RT_DECLTYPE:
28374 	gmsgid = G_("expected %<decltype%>");
28375 	break;
28376       case RT_OPERATOR:
28377 	gmsgid = G_("expected %<operator%>");
28378 	break;
28379       case RT_CLASS:
28380 	gmsgid = G_("expected %<class%>");
28381 	break;
28382       case RT_TEMPLATE:
28383 	gmsgid = G_("expected %<template%>");
28384 	break;
28385       case RT_NAMESPACE:
28386 	gmsgid = G_("expected %<namespace%>");
28387 	break;
28388       case RT_USING:
28389 	gmsgid = G_("expected %<using%>");
28390 	break;
28391       case RT_ASM:
28392 	gmsgid = G_("expected %<asm%>");
28393 	break;
28394       case RT_TRY:
28395 	gmsgid = G_("expected %<try%>");
28396 	break;
28397       case RT_CATCH:
28398 	gmsgid = G_("expected %<catch%>");
28399 	break;
28400       case RT_THROW:
28401 	gmsgid = G_("expected %<throw%>");
28402 	break;
28403       case RT_LABEL:
28404 	gmsgid = G_("expected %<__label__%>");
28405 	break;
28406       case RT_AT_TRY:
28407 	gmsgid = G_("expected %<@try%>");
28408 	break;
28409       case RT_AT_SYNCHRONIZED:
28410 	gmsgid = G_("expected %<@synchronized%>");
28411 	break;
28412       case RT_AT_THROW:
28413 	gmsgid = G_("expected %<@throw%>");
28414 	break;
28415       case RT_TRANSACTION_ATOMIC:
28416 	gmsgid = G_("expected %<__transaction_atomic%>");
28417 	break;
28418       case RT_TRANSACTION_RELAXED:
28419 	gmsgid = G_("expected %<__transaction_relaxed%>");
28420 	break;
28421       default:
28422 	break;
28423     }
28424 
28425   if (!gmsgid && !keyword)
28426     {
28427       switch (token_desc)
28428         {
28429 	  case RT_SEMICOLON:
28430 	    gmsgid = G_("expected %<;%>");
28431 	    break;
28432 	  case RT_OPEN_PAREN:
28433 	    gmsgid = G_("expected %<(%>");
28434 	    break;
28435 	  case RT_CLOSE_BRACE:
28436 	    gmsgid = G_("expected %<}%>");
28437 	    break;
28438 	  case RT_OPEN_BRACE:
28439 	    gmsgid = G_("expected %<{%>");
28440 	    break;
28441 	  case RT_CLOSE_SQUARE:
28442 	    gmsgid = G_("expected %<]%>");
28443 	    break;
28444 	  case RT_OPEN_SQUARE:
28445 	    gmsgid = G_("expected %<[%>");
28446 	    break;
28447 	  case RT_COMMA:
28448 	    gmsgid = G_("expected %<,%>");
28449 	    break;
28450 	  case RT_SCOPE:
28451 	    gmsgid = G_("expected %<::%>");
28452 	    break;
28453 	  case RT_LESS:
28454 	    gmsgid = G_("expected %<<%>");
28455 	    break;
28456 	  case RT_GREATER:
28457 	    gmsgid = G_("expected %<>%>");
28458 	    break;
28459 	  case RT_EQ:
28460 	    gmsgid = G_("expected %<=%>");
28461 	    break;
28462 	  case RT_ELLIPSIS:
28463 	    gmsgid = G_("expected %<...%>");
28464 	    break;
28465 	  case RT_MULT:
28466 	    gmsgid = G_("expected %<*%>");
28467 	    break;
28468 	  case RT_COMPL:
28469 	    gmsgid = G_("expected %<~%>");
28470 	    break;
28471 	  case RT_COLON:
28472 	    gmsgid = G_("expected %<:%>");
28473 	    break;
28474 	  case RT_COLON_SCOPE:
28475 	    gmsgid = G_("expected %<:%> or %<::%>");
28476 	    break;
28477 	  case RT_CLOSE_PAREN:
28478 	    gmsgid = G_("expected %<)%>");
28479 	    break;
28480 	  case RT_COMMA_CLOSE_PAREN:
28481 	    gmsgid = G_("expected %<,%> or %<)%>");
28482 	    break;
28483 	  case RT_PRAGMA_EOL:
28484 	    gmsgid = G_("expected end of line");
28485 	    break;
28486 	  case RT_NAME:
28487 	    gmsgid = G_("expected identifier");
28488 	    break;
28489 	  case RT_SELECT:
28490 	    gmsgid = G_("expected selection-statement");
28491 	    break;
28492 	  case RT_ITERATION:
28493 	    gmsgid = G_("expected iteration-statement");
28494 	    break;
28495 	  case RT_JUMP:
28496 	    gmsgid = G_("expected jump-statement");
28497 	    break;
28498 	  case RT_CLASS_KEY:
28499 	    gmsgid = G_("expected class-key");
28500 	    break;
28501 	  case RT_CLASS_TYPENAME_TEMPLATE:
28502 	    gmsgid = G_("expected %<class%>, %<typename%>, or %<template%>");
28503 	    break;
28504 	  default:
28505 	    gcc_unreachable ();
28506 	}
28507     }
28508 
28509   if (gmsgid)
28510     cp_parser_error_1 (parser, gmsgid, token_desc, matching_location);
28511 }
28512 
28513 
28514 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
28515    issue an error message indicating that TOKEN_DESC was expected.
28516 
28517    Returns the token consumed, if the token had the appropriate type.
28518    Otherwise, returns NULL.
28519 
28520    If MATCHING_LOCATION is not UNKNOWN_LOCATION, then highlight it
28521    within any error as the location of an "opening" token matching
28522    the close token TYPE (e.g. the location of the '(' when TOKEN_DESC is
28523    RT_CLOSE_PAREN).  */
28524 
28525 static cp_token *
28526 cp_parser_require (cp_parser* parser,
28527 		   enum cpp_ttype type,
28528 		   required_token token_desc,
28529 		   location_t matching_location)
28530 {
28531   if (cp_lexer_next_token_is (parser->lexer, type))
28532     return cp_lexer_consume_token (parser->lexer);
28533   else
28534     {
28535       /* Output the MESSAGE -- unless we're parsing tentatively.  */
28536       if (!cp_parser_simulate_error (parser))
28537 	cp_parser_required_error (parser, token_desc, /*keyword=*/false,
28538 				  matching_location);
28539       return NULL;
28540     }
28541 }
28542 
28543 /* An error message is produced if the next token is not '>'.
28544    All further tokens are skipped until the desired token is
28545    found or '{', '}', ';' or an unbalanced ')' or ']'.  */
28546 
28547 static void
28548 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
28549 {
28550   /* Current level of '< ... >'.  */
28551   unsigned level = 0;
28552   /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'.  */
28553   unsigned nesting_depth = 0;
28554 
28555   /* Are we ready, yet?  If not, issue error message.  */
28556   if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
28557     return;
28558 
28559   /* Skip tokens until the desired token is found.  */
28560   while (true)
28561     {
28562       /* Peek at the next token.  */
28563       switch (cp_lexer_peek_token (parser->lexer)->type)
28564 	{
28565 	case CPP_LESS:
28566 	  if (!nesting_depth)
28567 	    ++level;
28568 	  break;
28569 
28570         case CPP_RSHIFT:
28571           if (cxx_dialect == cxx98)
28572             /* C++0x views the `>>' operator as two `>' tokens, but
28573                C++98 does not. */
28574             break;
28575           else if (!nesting_depth && level-- == 0)
28576 	    {
28577               /* We've hit a `>>' where the first `>' closes the
28578                  template argument list, and the second `>' is
28579                  spurious.  Just consume the `>>' and stop; we've
28580                  already produced at least one error.  */
28581 	      cp_lexer_consume_token (parser->lexer);
28582 	      return;
28583 	    }
28584           /* Fall through for C++0x, so we handle the second `>' in
28585              the `>>'.  */
28586 	  gcc_fallthrough ();
28587 
28588 	case CPP_GREATER:
28589 	  if (!nesting_depth && level-- == 0)
28590 	    {
28591 	      /* We've reached the token we want, consume it and stop.  */
28592 	      cp_lexer_consume_token (parser->lexer);
28593 	      return;
28594 	    }
28595 	  break;
28596 
28597 	case CPP_OPEN_PAREN:
28598 	case CPP_OPEN_SQUARE:
28599 	  ++nesting_depth;
28600 	  break;
28601 
28602 	case CPP_CLOSE_PAREN:
28603 	case CPP_CLOSE_SQUARE:
28604 	  if (nesting_depth-- == 0)
28605 	    return;
28606 	  break;
28607 
28608 	case CPP_EOF:
28609 	case CPP_PRAGMA_EOL:
28610 	case CPP_SEMICOLON:
28611 	case CPP_OPEN_BRACE:
28612 	case CPP_CLOSE_BRACE:
28613 	  /* The '>' was probably forgotten, don't look further.  */
28614 	  return;
28615 
28616 	default:
28617 	  break;
28618 	}
28619 
28620       /* Consume this token.  */
28621       cp_lexer_consume_token (parser->lexer);
28622     }
28623 }
28624 
28625 /* If the next token is the indicated keyword, consume it.  Otherwise,
28626    issue an error message indicating that TOKEN_DESC was expected.
28627 
28628    Returns the token consumed, if the token had the appropriate type.
28629    Otherwise, returns NULL.  */
28630 
28631 static cp_token *
28632 cp_parser_require_keyword (cp_parser* parser,
28633 			   enum rid keyword,
28634 			   required_token token_desc)
28635 {
28636   cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
28637 
28638   if (token && token->keyword != keyword)
28639     {
28640       cp_parser_required_error (parser, token_desc, /*keyword=*/true,
28641                                 UNKNOWN_LOCATION);
28642       return NULL;
28643     }
28644 
28645   return token;
28646 }
28647 
28648 /* Returns TRUE iff TOKEN is a token that can begin the body of a
28649    function-definition.  */
28650 
28651 static bool
28652 cp_parser_token_starts_function_definition_p (cp_token* token)
28653 {
28654   return (/* An ordinary function-body begins with an `{'.  */
28655 	  token->type == CPP_OPEN_BRACE
28656 	  /* A ctor-initializer begins with a `:'.  */
28657 	  || token->type == CPP_COLON
28658 	  /* A function-try-block begins with `try'.  */
28659 	  || token->keyword == RID_TRY
28660 	  /* A function-transaction-block begins with `__transaction_atomic'
28661 	     or `__transaction_relaxed'.  */
28662 	  || token->keyword == RID_TRANSACTION_ATOMIC
28663 	  || token->keyword == RID_TRANSACTION_RELAXED
28664 	  /* The named return value extension begins with `return'.  */
28665 	  || token->keyword == RID_RETURN);
28666 }
28667 
28668 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
28669    definition.  */
28670 
28671 static bool
28672 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
28673 {
28674   cp_token *token;
28675 
28676   token = cp_lexer_peek_token (parser->lexer);
28677   return (token->type == CPP_OPEN_BRACE
28678 	  || (token->type == CPP_COLON
28679 	      && !parser->colon_doesnt_start_class_def_p));
28680 }
28681 
28682 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
28683    C++0x) ending a template-argument.  */
28684 
28685 static bool
28686 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
28687 {
28688   cp_token *token;
28689 
28690   token = cp_lexer_peek_token (parser->lexer);
28691   return (token->type == CPP_COMMA
28692           || token->type == CPP_GREATER
28693           || token->type == CPP_ELLIPSIS
28694 	  || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
28695 }
28696 
28697 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
28698    (n+1)-th is a ":" (which is a possible digraph typo for "< ::").  */
28699 
28700 static bool
28701 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
28702 						     size_t n)
28703 {
28704   cp_token *token;
28705 
28706   token = cp_lexer_peek_nth_token (parser->lexer, n);
28707   if (token->type == CPP_LESS)
28708     return true;
28709   /* Check for the sequence `<::' in the original code. It would be lexed as
28710      `[:', where `[' is a digraph, and there is no whitespace before
28711      `:'.  */
28712   if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
28713     {
28714       cp_token *token2;
28715       token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
28716       if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
28717 	return true;
28718     }
28719   return false;
28720 }
28721 
28722 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
28723    or none_type otherwise.  */
28724 
28725 static enum tag_types
28726 cp_parser_token_is_class_key (cp_token* token)
28727 {
28728   switch (token->keyword)
28729     {
28730     case RID_CLASS:
28731       return class_type;
28732     case RID_STRUCT:
28733       return record_type;
28734     case RID_UNION:
28735       return union_type;
28736 
28737     default:
28738       return none_type;
28739     }
28740 }
28741 
28742 /* Returns the kind of tag indicated by TOKEN, if it is a type-parameter-key,
28743    or none_type otherwise or if the token is null.  */
28744 
28745 static enum tag_types
28746 cp_parser_token_is_type_parameter_key (cp_token* token)
28747 {
28748   if (!token)
28749     return none_type;
28750 
28751   switch (token->keyword)
28752     {
28753     case RID_CLASS:
28754       return class_type;
28755     case RID_TYPENAME:
28756       return typename_type;
28757 
28758     default:
28759       return none_type;
28760     }
28761 }
28762 
28763 /* Issue an error message if the CLASS_KEY does not match the TYPE.  */
28764 
28765 static void
28766 cp_parser_check_class_key (enum tag_types class_key, tree type)
28767 {
28768   if (type == error_mark_node)
28769     return;
28770   if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
28771     {
28772       if (permerror (input_location, "%qs tag used in naming %q#T",
28773 		     class_key == union_type ? "union"
28774 		     : class_key == record_type ? "struct" : "class",
28775 		     type))
28776 	inform (DECL_SOURCE_LOCATION (TYPE_NAME (type)),
28777 		"%q#T was previously declared here", type);
28778     }
28779 }
28780 
28781 /* Issue an error message if DECL is redeclared with different
28782    access than its original declaration [class.access.spec/3].
28783    This applies to nested classes, nested class templates and
28784    enumerations [class.mem/1].  */
28785 
28786 static void
28787 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
28788 {
28789   if (!decl
28790       || (!CLASS_TYPE_P (TREE_TYPE (decl))
28791 	  && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE))
28792     return;
28793 
28794   if ((TREE_PRIVATE (decl)
28795        != (current_access_specifier == access_private_node))
28796       || (TREE_PROTECTED (decl)
28797 	  != (current_access_specifier == access_protected_node)))
28798     error_at (location, "%qD redeclared with different access", decl);
28799 }
28800 
28801 /* Look for the `template' keyword, as a syntactic disambiguator.
28802    Return TRUE iff it is present, in which case it will be
28803    consumed.  */
28804 
28805 static bool
28806 cp_parser_optional_template_keyword (cp_parser *parser)
28807 {
28808   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
28809     {
28810       /* In C++98 the `template' keyword can only be used within templates;
28811 	 outside templates the parser can always figure out what is a
28812 	 template and what is not.  In C++11,  per the resolution of DR 468,
28813 	 `template' is allowed in cases where it is not strictly necessary.  */
28814       if (!processing_template_decl
28815 	  && pedantic && cxx_dialect == cxx98)
28816 	{
28817 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
28818 	  pedwarn (token->location, OPT_Wpedantic,
28819 		   "in C++98 %<template%> (as a disambiguator) is only "
28820 		   "allowed within templates");
28821 	  /* If this part of the token stream is rescanned, the same
28822 	     error message would be generated.  So, we purge the token
28823 	     from the stream.  */
28824 	  cp_lexer_purge_token (parser->lexer);
28825 	  return false;
28826 	}
28827       else
28828 	{
28829 	  /* Consume the `template' keyword.  */
28830 	  cp_lexer_consume_token (parser->lexer);
28831 	  return true;
28832 	}
28833     }
28834   return false;
28835 }
28836 
28837 /* The next token is a CPP_NESTED_NAME_SPECIFIER.  Consume the token,
28838    set PARSER->SCOPE, and perform other related actions.  */
28839 
28840 static void
28841 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
28842 {
28843   struct tree_check *check_value;
28844 
28845   /* Get the stored value.  */
28846   check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
28847   /* Set the scope from the stored value.  */
28848   parser->scope = saved_checks_value (check_value);
28849   parser->qualifying_scope = check_value->qualifying_scope;
28850   parser->object_scope = NULL_TREE;
28851 }
28852 
28853 /* Consume tokens up through a non-nested END token.  Returns TRUE if we
28854    encounter the end of a block before what we were looking for.  */
28855 
28856 static bool
28857 cp_parser_cache_group (cp_parser *parser,
28858 		       enum cpp_ttype end,
28859 		       unsigned depth)
28860 {
28861   while (true)
28862     {
28863       cp_token *token = cp_lexer_peek_token (parser->lexer);
28864 
28865       /* Abort a parenthesized expression if we encounter a semicolon.  */
28866       if ((end == CPP_CLOSE_PAREN || depth == 0)
28867 	  && token->type == CPP_SEMICOLON)
28868 	return true;
28869       /* If we've reached the end of the file, stop.  */
28870       if (token->type == CPP_EOF
28871 	  || (end != CPP_PRAGMA_EOL
28872 	      && token->type == CPP_PRAGMA_EOL))
28873 	return true;
28874       if (token->type == CPP_CLOSE_BRACE && depth == 0)
28875 	/* We've hit the end of an enclosing block, so there's been some
28876 	   kind of syntax error.  */
28877 	return true;
28878 
28879       /* Consume the token.  */
28880       cp_lexer_consume_token (parser->lexer);
28881       /* See if it starts a new group.  */
28882       if (token->type == CPP_OPEN_BRACE)
28883 	{
28884 	  cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
28885 	  /* In theory this should probably check end == '}', but
28886 	     cp_parser_save_member_function_body needs it to exit
28887 	     after either '}' or ')' when called with ')'.  */
28888 	  if (depth == 0)
28889 	    return false;
28890 	}
28891       else if (token->type == CPP_OPEN_PAREN)
28892 	{
28893 	  cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
28894 	  if (depth == 0 && end == CPP_CLOSE_PAREN)
28895 	    return false;
28896 	}
28897       else if (token->type == CPP_PRAGMA)
28898 	cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
28899       else if (token->type == end)
28900 	return false;
28901     }
28902 }
28903 
28904 /* Like above, for caching a default argument or NSDMI.  Both of these are
28905    terminated by a non-nested comma, but it can be unclear whether or not a
28906    comma is nested in a template argument list unless we do more parsing.
28907    In order to handle this ambiguity, when we encounter a ',' after a '<'
28908    we try to parse what follows as a parameter-declaration-list (in the
28909    case of a default argument) or a member-declarator (in the case of an
28910    NSDMI).  If that succeeds, then we stop caching.  */
28911 
28912 static tree
28913 cp_parser_cache_defarg (cp_parser *parser, bool nsdmi)
28914 {
28915   unsigned depth = 0;
28916   int maybe_template_id = 0;
28917   cp_token *first_token;
28918   cp_token *token;
28919   tree default_argument;
28920 
28921   /* Add tokens until we have processed the entire default
28922      argument.  We add the range [first_token, token).  */
28923   first_token = cp_lexer_peek_token (parser->lexer);
28924   if (first_token->type == CPP_OPEN_BRACE)
28925     {
28926       /* For list-initialization, this is straightforward.  */
28927       cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
28928       token = cp_lexer_peek_token (parser->lexer);
28929     }
28930   else while (true)
28931     {
28932       bool done = false;
28933 
28934       /* Peek at the next token.  */
28935       token = cp_lexer_peek_token (parser->lexer);
28936       /* What we do depends on what token we have.  */
28937       switch (token->type)
28938 	{
28939 	  /* In valid code, a default argument must be
28940 	     immediately followed by a `,' `)', or `...'.  */
28941 	case CPP_COMMA:
28942 	  if (depth == 0 && maybe_template_id)
28943 	    {
28944 	      /* If we've seen a '<', we might be in a
28945 		 template-argument-list.  Until Core issue 325 is
28946 		 resolved, we don't know how this situation ought
28947 		 to be handled, so try to DTRT.  We check whether
28948 		 what comes after the comma is a valid parameter
28949 		 declaration list.  If it is, then the comma ends
28950 		 the default argument; otherwise the default
28951 		 argument continues.  */
28952 	      bool error = false;
28953 	      cp_token *peek;
28954 
28955 	      /* Set ITALP so cp_parser_parameter_declaration_list
28956 		 doesn't decide to commit to this parse.  */
28957 	      bool saved_italp = parser->in_template_argument_list_p;
28958 	      parser->in_template_argument_list_p = true;
28959 
28960 	      cp_parser_parse_tentatively (parser);
28961 
28962 	      if (nsdmi)
28963 		{
28964 		  /* Parse declarators until we reach a non-comma or
28965 		     somthing that cannot be an initializer.
28966 		     Just checking whether we're looking at a single
28967 		     declarator is insufficient.  Consider:
28968 		       int var = tuple<T,U>::x;
28969 		     The template parameter 'U' looks exactly like a
28970 		     declarator.  */
28971 		  do
28972 		    {
28973 		      int ctor_dtor_or_conv_p;
28974 		      cp_lexer_consume_token (parser->lexer);
28975 		      cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
28976 					    &ctor_dtor_or_conv_p,
28977 					    /*parenthesized_p=*/NULL,
28978 					    /*member_p=*/true,
28979 					    /*friend_p=*/false);
28980 		      peek = cp_lexer_peek_token (parser->lexer);
28981 		      if (cp_parser_error_occurred (parser))
28982 			break;
28983 		    }
28984 		  while (peek->type == CPP_COMMA);
28985 		  /* If we met an '=' or ';' then the original comma
28986 		     was the end of the NSDMI.  Otherwise assume
28987 		     we're still in the NSDMI.  */
28988 		  error = (peek->type != CPP_EQ
28989 			   && peek->type != CPP_SEMICOLON);
28990 		}
28991 	      else
28992 		{
28993 		  cp_lexer_consume_token (parser->lexer);
28994 		  begin_scope (sk_function_parms, NULL_TREE);
28995 		  cp_parser_parameter_declaration_list (parser, &error);
28996 		  pop_bindings_and_leave_scope ();
28997 		}
28998 	      if (!cp_parser_error_occurred (parser) && !error)
28999 		done = true;
29000 	      cp_parser_abort_tentative_parse (parser);
29001 
29002 	      parser->in_template_argument_list_p = saved_italp;
29003 	      break;
29004 	    }
29005 	  /* FALLTHRU */
29006 	case CPP_CLOSE_PAREN:
29007 	case CPP_ELLIPSIS:
29008 	  /* If we run into a non-nested `;', `}', or `]',
29009 	     then the code is invalid -- but the default
29010 	     argument is certainly over.  */
29011 	case CPP_SEMICOLON:
29012 	case CPP_CLOSE_BRACE:
29013 	case CPP_CLOSE_SQUARE:
29014 	  if (depth == 0
29015 	      /* Handle correctly int n = sizeof ... ( p );  */
29016 	      && token->type != CPP_ELLIPSIS)
29017 	    done = true;
29018 	  /* Update DEPTH, if necessary.  */
29019 	  else if (token->type == CPP_CLOSE_PAREN
29020 		   || token->type == CPP_CLOSE_BRACE
29021 		   || token->type == CPP_CLOSE_SQUARE)
29022 	    --depth;
29023 	  break;
29024 
29025 	case CPP_OPEN_PAREN:
29026 	case CPP_OPEN_SQUARE:
29027 	case CPP_OPEN_BRACE:
29028 	  ++depth;
29029 	  break;
29030 
29031 	case CPP_LESS:
29032 	  if (depth == 0)
29033 	    /* This might be the comparison operator, or it might
29034 	       start a template argument list.  */
29035 	    ++maybe_template_id;
29036 	  break;
29037 
29038 	case CPP_RSHIFT:
29039 	  if (cxx_dialect == cxx98)
29040 	    break;
29041 	  /* Fall through for C++0x, which treats the `>>'
29042 	     operator like two `>' tokens in certain
29043 	     cases.  */
29044 	  gcc_fallthrough ();
29045 
29046 	case CPP_GREATER:
29047 	  if (depth == 0)
29048 	    {
29049 	      /* This might be an operator, or it might close a
29050 		 template argument list.  But if a previous '<'
29051 		 started a template argument list, this will have
29052 		 closed it, so we can't be in one anymore.  */
29053 	      maybe_template_id -= 1 + (token->type == CPP_RSHIFT);
29054 	      if (maybe_template_id < 0)
29055 		maybe_template_id = 0;
29056 	    }
29057 	  break;
29058 
29059 	  /* If we run out of tokens, issue an error message.  */
29060 	case CPP_EOF:
29061 	case CPP_PRAGMA_EOL:
29062 	  error_at (token->location, "file ends in default argument");
29063 	  return error_mark_node;
29064 
29065 	case CPP_NAME:
29066 	case CPP_SCOPE:
29067 	  /* In these cases, we should look for template-ids.
29068 	     For example, if the default argument is
29069 	     `X<int, double>()', we need to do name lookup to
29070 	     figure out whether or not `X' is a template; if
29071 	     so, the `,' does not end the default argument.
29072 
29073 	     That is not yet done.  */
29074 	  break;
29075 
29076 	default:
29077 	  break;
29078 	}
29079 
29080       /* If we've reached the end, stop.  */
29081       if (done)
29082 	break;
29083 
29084       /* Add the token to the token block.  */
29085       token = cp_lexer_consume_token (parser->lexer);
29086     }
29087 
29088   /* Create a DEFAULT_ARG to represent the unparsed default
29089      argument.  */
29090   default_argument = make_node (DEFAULT_ARG);
29091   DEFARG_TOKENS (default_argument)
29092     = cp_token_cache_new (first_token, token);
29093   DEFARG_INSTANTIATIONS (default_argument) = NULL;
29094 
29095   return default_argument;
29096 }
29097 
29098 /* A location to use for diagnostics about an unparsed DEFAULT_ARG.  */
29099 
29100 location_t
29101 defarg_location (tree default_argument)
29102 {
29103   cp_token_cache *tokens = DEFARG_TOKENS (default_argument);
29104   location_t start = tokens->first->location;
29105   location_t end = tokens->last->location;
29106   return make_location (start, start, end);
29107 }
29108 
29109 /* Begin parsing tentatively.  We always save tokens while parsing
29110    tentatively so that if the tentative parsing fails we can restore the
29111    tokens.  */
29112 
29113 static void
29114 cp_parser_parse_tentatively (cp_parser* parser)
29115 {
29116   /* Enter a new parsing context.  */
29117   parser->context = cp_parser_context_new (parser->context);
29118   /* Begin saving tokens.  */
29119   cp_lexer_save_tokens (parser->lexer);
29120   /* In order to avoid repetitive access control error messages,
29121      access checks are queued up until we are no longer parsing
29122      tentatively.  */
29123   push_deferring_access_checks (dk_deferred);
29124 }
29125 
29126 /* Commit to the currently active tentative parse.  */
29127 
29128 static void
29129 cp_parser_commit_to_tentative_parse (cp_parser* parser)
29130 {
29131   cp_parser_context *context;
29132   cp_lexer *lexer;
29133 
29134   /* Mark all of the levels as committed.  */
29135   lexer = parser->lexer;
29136   for (context = parser->context; context->next; context = context->next)
29137     {
29138       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
29139 	break;
29140       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
29141       while (!cp_lexer_saving_tokens (lexer))
29142 	lexer = lexer->next;
29143       cp_lexer_commit_tokens (lexer);
29144     }
29145 }
29146 
29147 /* Commit to the topmost currently active tentative parse.
29148 
29149    Note that this function shouldn't be called when there are
29150    irreversible side-effects while in a tentative state.  For
29151    example, we shouldn't create a permanent entry in the symbol
29152    table, or issue an error message that might not apply if the
29153    tentative parse is aborted.  */
29154 
29155 static void
29156 cp_parser_commit_to_topmost_tentative_parse (cp_parser* parser)
29157 {
29158   cp_parser_context *context = parser->context;
29159   cp_lexer *lexer = parser->lexer;
29160 
29161   if (context)
29162     {
29163       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
29164 	return;
29165       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
29166 
29167       while (!cp_lexer_saving_tokens (lexer))
29168 	lexer = lexer->next;
29169       cp_lexer_commit_tokens (lexer);
29170     }
29171 }
29172 
29173 /* Abort the currently active tentative parse.  All consumed tokens
29174    will be rolled back, and no diagnostics will be issued.  */
29175 
29176 static void
29177 cp_parser_abort_tentative_parse (cp_parser* parser)
29178 {
29179   gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
29180 	      || errorcount > 0);
29181   cp_parser_simulate_error (parser);
29182   /* Now, pretend that we want to see if the construct was
29183      successfully parsed.  */
29184   cp_parser_parse_definitely (parser);
29185 }
29186 
29187 /* Stop parsing tentatively.  If a parse error has occurred, restore the
29188    token stream.  Otherwise, commit to the tokens we have consumed.
29189    Returns true if no error occurred; false otherwise.  */
29190 
29191 static bool
29192 cp_parser_parse_definitely (cp_parser* parser)
29193 {
29194   bool error_occurred;
29195   cp_parser_context *context;
29196 
29197   /* Remember whether or not an error occurred, since we are about to
29198      destroy that information.  */
29199   error_occurred = cp_parser_error_occurred (parser);
29200   /* Remove the topmost context from the stack.  */
29201   context = parser->context;
29202   parser->context = context->next;
29203   /* If no parse errors occurred, commit to the tentative parse.  */
29204   if (!error_occurred)
29205     {
29206       /* Commit to the tokens read tentatively, unless that was
29207 	 already done.  */
29208       if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
29209 	cp_lexer_commit_tokens (parser->lexer);
29210 
29211       pop_to_parent_deferring_access_checks ();
29212     }
29213   /* Otherwise, if errors occurred, roll back our state so that things
29214      are just as they were before we began the tentative parse.  */
29215   else
29216     {
29217       cp_lexer_rollback_tokens (parser->lexer);
29218       pop_deferring_access_checks ();
29219     }
29220   /* Add the context to the front of the free list.  */
29221   context->next = cp_parser_context_free_list;
29222   cp_parser_context_free_list = context;
29223 
29224   return !error_occurred;
29225 }
29226 
29227 /* Returns true if we are parsing tentatively and are not committed to
29228    this tentative parse.  */
29229 
29230 static bool
29231 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
29232 {
29233   return (cp_parser_parsing_tentatively (parser)
29234 	  && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
29235 }
29236 
29237 /* Returns nonzero iff an error has occurred during the most recent
29238    tentative parse.  */
29239 
29240 static bool
29241 cp_parser_error_occurred (cp_parser* parser)
29242 {
29243   return (cp_parser_parsing_tentatively (parser)
29244 	  && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
29245 }
29246 
29247 /* Returns nonzero if GNU extensions are allowed.  */
29248 
29249 static bool
29250 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
29251 {
29252   return parser->allow_gnu_extensions_p;
29253 }
29254 
29255 /* Objective-C++ Productions */
29256 
29257 
29258 /* Parse an Objective-C expression, which feeds into a primary-expression
29259    above.
29260 
29261    objc-expression:
29262      objc-message-expression
29263      objc-string-literal
29264      objc-encode-expression
29265      objc-protocol-expression
29266      objc-selector-expression
29267 
29268   Returns a tree representation of the expression.  */
29269 
29270 static cp_expr
29271 cp_parser_objc_expression (cp_parser* parser)
29272 {
29273   /* Try to figure out what kind of declaration is present.  */
29274   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
29275 
29276   switch (kwd->type)
29277     {
29278     case CPP_OPEN_SQUARE:
29279       return cp_parser_objc_message_expression (parser);
29280 
29281     case CPP_OBJC_STRING:
29282       kwd = cp_lexer_consume_token (parser->lexer);
29283       return objc_build_string_object (kwd->u.value);
29284 
29285     case CPP_KEYWORD:
29286       switch (kwd->keyword)
29287 	{
29288 	case RID_AT_ENCODE:
29289 	  return cp_parser_objc_encode_expression (parser);
29290 
29291 	case RID_AT_PROTOCOL:
29292 	  return cp_parser_objc_protocol_expression (parser);
29293 
29294 	case RID_AT_SELECTOR:
29295 	  return cp_parser_objc_selector_expression (parser);
29296 
29297 	default:
29298 	  break;
29299 	}
29300       /* FALLTHRU */
29301     default:
29302       error_at (kwd->location,
29303 		"misplaced %<@%D%> Objective-C++ construct",
29304 		kwd->u.value);
29305       cp_parser_skip_to_end_of_block_or_statement (parser);
29306     }
29307 
29308   return error_mark_node;
29309 }
29310 
29311 /* Parse an Objective-C message expression.
29312 
29313    objc-message-expression:
29314      [ objc-message-receiver objc-message-args ]
29315 
29316    Returns a representation of an Objective-C message.  */
29317 
29318 static tree
29319 cp_parser_objc_message_expression (cp_parser* parser)
29320 {
29321   tree receiver, messageargs;
29322 
29323   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
29324   cp_lexer_consume_token (parser->lexer);  /* Eat '['.  */
29325   receiver = cp_parser_objc_message_receiver (parser);
29326   messageargs = cp_parser_objc_message_args (parser);
29327   location_t end_loc = cp_lexer_peek_token (parser->lexer)->location;
29328   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
29329 
29330   tree result = objc_build_message_expr (receiver, messageargs);
29331 
29332   /* Construct a location e.g.
29333        [self func1:5]
29334        ^~~~~~~~~~~~~~
29335      ranging from the '[' to the ']', with the caret at the start.  */
29336   location_t combined_loc = make_location (start_loc, start_loc, end_loc);
29337   protected_set_expr_location (result, combined_loc);
29338 
29339   return result;
29340 }
29341 
29342 /* Parse an objc-message-receiver.
29343 
29344    objc-message-receiver:
29345      expression
29346      simple-type-specifier
29347 
29348   Returns a representation of the type or expression.  */
29349 
29350 static tree
29351 cp_parser_objc_message_receiver (cp_parser* parser)
29352 {
29353   tree rcv;
29354 
29355   /* An Objective-C message receiver may be either (1) a type
29356      or (2) an expression.  */
29357   cp_parser_parse_tentatively (parser);
29358   rcv = cp_parser_expression (parser);
29359 
29360   /* If that worked out, fine.  */
29361   if (cp_parser_parse_definitely (parser))
29362     return rcv;
29363 
29364   cp_parser_parse_tentatively (parser);
29365   rcv = cp_parser_simple_type_specifier (parser,
29366 					 /*decl_specs=*/NULL,
29367 					 CP_PARSER_FLAGS_NONE);
29368 
29369   if (cp_parser_parse_definitely (parser))
29370     return objc_get_class_reference (rcv);
29371 
29372   cp_parser_error (parser, "objective-c++ message receiver expected");
29373   return error_mark_node;
29374 }
29375 
29376 /* Parse the arguments and selectors comprising an Objective-C message.
29377 
29378    objc-message-args:
29379      objc-selector
29380      objc-selector-args
29381      objc-selector-args , objc-comma-args
29382 
29383    objc-selector-args:
29384      objc-selector [opt] : assignment-expression
29385      objc-selector-args objc-selector [opt] : assignment-expression
29386 
29387    objc-comma-args:
29388      assignment-expression
29389      objc-comma-args , assignment-expression
29390 
29391    Returns a TREE_LIST, with TREE_PURPOSE containing a list of
29392    selector arguments and TREE_VALUE containing a list of comma
29393    arguments.  */
29394 
29395 static tree
29396 cp_parser_objc_message_args (cp_parser* parser)
29397 {
29398   tree sel_args = NULL_TREE, addl_args = NULL_TREE;
29399   bool maybe_unary_selector_p = true;
29400   cp_token *token = cp_lexer_peek_token (parser->lexer);
29401 
29402   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
29403     {
29404       tree selector = NULL_TREE, arg;
29405 
29406       if (token->type != CPP_COLON)
29407 	selector = cp_parser_objc_selector (parser);
29408 
29409       /* Detect if we have a unary selector.  */
29410       if (maybe_unary_selector_p
29411 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
29412 	return build_tree_list (selector, NULL_TREE);
29413 
29414       maybe_unary_selector_p = false;
29415       cp_parser_require (parser, CPP_COLON, RT_COLON);
29416       arg = cp_parser_assignment_expression (parser);
29417 
29418       sel_args
29419 	= chainon (sel_args,
29420 		   build_tree_list (selector, arg));
29421 
29422       token = cp_lexer_peek_token (parser->lexer);
29423     }
29424 
29425   /* Handle non-selector arguments, if any. */
29426   while (token->type == CPP_COMMA)
29427     {
29428       tree arg;
29429 
29430       cp_lexer_consume_token (parser->lexer);
29431       arg = cp_parser_assignment_expression (parser);
29432 
29433       addl_args
29434 	= chainon (addl_args,
29435 		   build_tree_list (NULL_TREE, arg));
29436 
29437       token = cp_lexer_peek_token (parser->lexer);
29438     }
29439 
29440   if (sel_args == NULL_TREE && addl_args == NULL_TREE)
29441     {
29442       cp_parser_error (parser, "objective-c++ message argument(s) are expected");
29443       return build_tree_list (error_mark_node, error_mark_node);
29444     }
29445 
29446   return build_tree_list (sel_args, addl_args);
29447 }
29448 
29449 /* Parse an Objective-C encode expression.
29450 
29451    objc-encode-expression:
29452      @encode objc-typename
29453 
29454    Returns an encoded representation of the type argument.  */
29455 
29456 static cp_expr
29457 cp_parser_objc_encode_expression (cp_parser* parser)
29458 {
29459   tree type;
29460   cp_token *token;
29461   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
29462 
29463   cp_lexer_consume_token (parser->lexer);  /* Eat '@encode'.  */
29464   matching_parens parens;
29465   parens.require_open (parser);
29466   token = cp_lexer_peek_token (parser->lexer);
29467   type = complete_type (cp_parser_type_id (parser));
29468   parens.require_close (parser);
29469 
29470   if (!type)
29471     {
29472       error_at (token->location,
29473 		"%<@encode%> must specify a type as an argument");
29474       return error_mark_node;
29475     }
29476 
29477   /* This happens if we find @encode(T) (where T is a template
29478      typename or something dependent on a template typename) when
29479      parsing a template.  In that case, we can't compile it
29480      immediately, but we rather create an AT_ENCODE_EXPR which will
29481      need to be instantiated when the template is used.
29482   */
29483   if (dependent_type_p (type))
29484     {
29485       tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
29486       TREE_READONLY (value) = 1;
29487       return value;
29488     }
29489 
29490 
29491   /* Build a location of the form:
29492        @encode(int)
29493        ^~~~~~~~~~~~
29494      with caret==start at the @ token, finishing at the close paren.  */
29495   location_t combined_loc
29496     = make_location (start_loc, start_loc,
29497                      cp_lexer_previous_token (parser->lexer)->location);
29498 
29499   return cp_expr (objc_build_encode_expr (type), combined_loc);
29500 }
29501 
29502 /* Parse an Objective-C @defs expression.  */
29503 
29504 static tree
29505 cp_parser_objc_defs_expression (cp_parser *parser)
29506 {
29507   tree name;
29508 
29509   cp_lexer_consume_token (parser->lexer);  /* Eat '@defs'.  */
29510   matching_parens parens;
29511   parens.require_open (parser);
29512   name = cp_parser_identifier (parser);
29513   parens.require_close (parser);
29514 
29515   return objc_get_class_ivars (name);
29516 }
29517 
29518 /* Parse an Objective-C protocol expression.
29519 
29520   objc-protocol-expression:
29521     @protocol ( identifier )
29522 
29523   Returns a representation of the protocol expression.  */
29524 
29525 static tree
29526 cp_parser_objc_protocol_expression (cp_parser* parser)
29527 {
29528   tree proto;
29529   location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
29530 
29531   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
29532   matching_parens parens;
29533   parens.require_open (parser);
29534   proto = cp_parser_identifier (parser);
29535   parens.require_close (parser);
29536 
29537   /* Build a location of the form:
29538        @protocol(prot)
29539        ^~~~~~~~~~~~~~~
29540      with caret==start at the @ token, finishing at the close paren.  */
29541   location_t combined_loc
29542     = make_location (start_loc, start_loc,
29543                      cp_lexer_previous_token (parser->lexer)->location);
29544   tree result = objc_build_protocol_expr (proto);
29545   protected_set_expr_location (result, combined_loc);
29546   return result;
29547 }
29548 
29549 /* Parse an Objective-C selector expression.
29550 
29551    objc-selector-expression:
29552      @selector ( objc-method-signature )
29553 
29554    objc-method-signature:
29555      objc-selector
29556      objc-selector-seq
29557 
29558    objc-selector-seq:
29559      objc-selector :
29560      objc-selector-seq objc-selector :
29561 
29562   Returns a representation of the method selector.  */
29563 
29564 static tree
29565 cp_parser_objc_selector_expression (cp_parser* parser)
29566 {
29567   tree sel_seq = NULL_TREE;
29568   bool maybe_unary_selector_p = true;
29569   cp_token *token;
29570   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
29571 
29572   cp_lexer_consume_token (parser->lexer);  /* Eat '@selector'.  */
29573   matching_parens parens;
29574   parens.require_open (parser);
29575   token = cp_lexer_peek_token (parser->lexer);
29576 
29577   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
29578 	 || token->type == CPP_SCOPE)
29579     {
29580       tree selector = NULL_TREE;
29581 
29582       if (token->type != CPP_COLON
29583 	  || token->type == CPP_SCOPE)
29584 	selector = cp_parser_objc_selector (parser);
29585 
29586       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
29587 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
29588 	{
29589 	  /* Detect if we have a unary selector.  */
29590 	  if (maybe_unary_selector_p)
29591 	    {
29592 	      sel_seq = selector;
29593 	      goto finish_selector;
29594 	    }
29595 	  else
29596 	    {
29597 	      cp_parser_error (parser, "expected %<:%>");
29598 	    }
29599 	}
29600       maybe_unary_selector_p = false;
29601       token = cp_lexer_consume_token (parser->lexer);
29602 
29603       if (token->type == CPP_SCOPE)
29604 	{
29605 	  sel_seq
29606 	    = chainon (sel_seq,
29607 		       build_tree_list (selector, NULL_TREE));
29608 	  sel_seq
29609 	    = chainon (sel_seq,
29610 		       build_tree_list (NULL_TREE, NULL_TREE));
29611 	}
29612       else
29613 	sel_seq
29614 	  = chainon (sel_seq,
29615 		     build_tree_list (selector, NULL_TREE));
29616 
29617       token = cp_lexer_peek_token (parser->lexer);
29618     }
29619 
29620  finish_selector:
29621   parens.require_close (parser);
29622 
29623 
29624   /* Build a location of the form:
29625        @selector(func)
29626        ^~~~~~~~~~~~~~~
29627      with caret==start at the @ token, finishing at the close paren.  */
29628   location_t combined_loc
29629     = make_location (loc, loc,
29630                      cp_lexer_previous_token (parser->lexer)->location);
29631   tree result = objc_build_selector_expr (combined_loc, sel_seq);
29632   /* TODO: objc_build_selector_expr doesn't always honor the location.  */
29633   protected_set_expr_location (result, combined_loc);
29634   return result;
29635 }
29636 
29637 /* Parse a list of identifiers.
29638 
29639    objc-identifier-list:
29640      identifier
29641      objc-identifier-list , identifier
29642 
29643    Returns a TREE_LIST of identifier nodes.  */
29644 
29645 static tree
29646 cp_parser_objc_identifier_list (cp_parser* parser)
29647 {
29648   tree identifier;
29649   tree list;
29650   cp_token *sep;
29651 
29652   identifier = cp_parser_identifier (parser);
29653   if (identifier == error_mark_node)
29654     return error_mark_node;
29655 
29656   list = build_tree_list (NULL_TREE, identifier);
29657   sep = cp_lexer_peek_token (parser->lexer);
29658 
29659   while (sep->type == CPP_COMMA)
29660     {
29661       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
29662       identifier = cp_parser_identifier (parser);
29663       if (identifier == error_mark_node)
29664 	return list;
29665 
29666       list = chainon (list, build_tree_list (NULL_TREE,
29667 					     identifier));
29668       sep = cp_lexer_peek_token (parser->lexer);
29669     }
29670 
29671   return list;
29672 }
29673 
29674 /* Parse an Objective-C alias declaration.
29675 
29676    objc-alias-declaration:
29677      @compatibility_alias identifier identifier ;
29678 
29679    This function registers the alias mapping with the Objective-C front end.
29680    It returns nothing.  */
29681 
29682 static void
29683 cp_parser_objc_alias_declaration (cp_parser* parser)
29684 {
29685   tree alias, orig;
29686 
29687   cp_lexer_consume_token (parser->lexer);  /* Eat '@compatibility_alias'.  */
29688   alias = cp_parser_identifier (parser);
29689   orig = cp_parser_identifier (parser);
29690   objc_declare_alias (alias, orig);
29691   cp_parser_consume_semicolon_at_end_of_statement (parser);
29692 }
29693 
29694 /* Parse an Objective-C class forward-declaration.
29695 
29696    objc-class-declaration:
29697      @class objc-identifier-list ;
29698 
29699    The function registers the forward declarations with the Objective-C
29700    front end.  It returns nothing.  */
29701 
29702 static void
29703 cp_parser_objc_class_declaration (cp_parser* parser)
29704 {
29705   cp_lexer_consume_token (parser->lexer);  /* Eat '@class'.  */
29706   while (true)
29707     {
29708       tree id;
29709 
29710       id = cp_parser_identifier (parser);
29711       if (id == error_mark_node)
29712 	break;
29713 
29714       objc_declare_class (id);
29715 
29716       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
29717 	cp_lexer_consume_token (parser->lexer);
29718       else
29719 	break;
29720     }
29721   cp_parser_consume_semicolon_at_end_of_statement (parser);
29722 }
29723 
29724 /* Parse a list of Objective-C protocol references.
29725 
29726    objc-protocol-refs-opt:
29727      objc-protocol-refs [opt]
29728 
29729    objc-protocol-refs:
29730      < objc-identifier-list >
29731 
29732    Returns a TREE_LIST of identifiers, if any.  */
29733 
29734 static tree
29735 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
29736 {
29737   tree protorefs = NULL_TREE;
29738 
29739   if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
29740     {
29741       cp_lexer_consume_token (parser->lexer);  /* Eat '<'.  */
29742       protorefs = cp_parser_objc_identifier_list (parser);
29743       cp_parser_require (parser, CPP_GREATER, RT_GREATER);
29744     }
29745 
29746   return protorefs;
29747 }
29748 
29749 /* Parse a Objective-C visibility specification.  */
29750 
29751 static void
29752 cp_parser_objc_visibility_spec (cp_parser* parser)
29753 {
29754   cp_token *vis = cp_lexer_peek_token (parser->lexer);
29755 
29756   switch (vis->keyword)
29757     {
29758     case RID_AT_PRIVATE:
29759       objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
29760       break;
29761     case RID_AT_PROTECTED:
29762       objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
29763       break;
29764     case RID_AT_PUBLIC:
29765       objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
29766       break;
29767     case RID_AT_PACKAGE:
29768       objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
29769       break;
29770     default:
29771       return;
29772     }
29773 
29774   /* Eat '@private'/'@protected'/'@public'.  */
29775   cp_lexer_consume_token (parser->lexer);
29776 }
29777 
29778 /* Parse an Objective-C method type.  Return 'true' if it is a class
29779    (+) method, and 'false' if it is an instance (-) method.  */
29780 
29781 static inline bool
29782 cp_parser_objc_method_type (cp_parser* parser)
29783 {
29784   if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
29785     return true;
29786   else
29787     return false;
29788 }
29789 
29790 /* Parse an Objective-C protocol qualifier.  */
29791 
29792 static tree
29793 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
29794 {
29795   tree quals = NULL_TREE, node;
29796   cp_token *token = cp_lexer_peek_token (parser->lexer);
29797 
29798   node = token->u.value;
29799 
29800   while (node && identifier_p (node)
29801 	 && (node == ridpointers [(int) RID_IN]
29802 	     || node == ridpointers [(int) RID_OUT]
29803 	     || node == ridpointers [(int) RID_INOUT]
29804 	     || node == ridpointers [(int) RID_BYCOPY]
29805 	     || node == ridpointers [(int) RID_BYREF]
29806 	     || node == ridpointers [(int) RID_ONEWAY]))
29807     {
29808       quals = tree_cons (NULL_TREE, node, quals);
29809       cp_lexer_consume_token (parser->lexer);
29810       token = cp_lexer_peek_token (parser->lexer);
29811       node = token->u.value;
29812     }
29813 
29814   return quals;
29815 }
29816 
29817 /* Parse an Objective-C typename.  */
29818 
29819 static tree
29820 cp_parser_objc_typename (cp_parser* parser)
29821 {
29822   tree type_name = NULL_TREE;
29823 
29824   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
29825     {
29826       tree proto_quals, cp_type = NULL_TREE;
29827 
29828       matching_parens parens;
29829       parens.consume_open (parser); /* Eat '('.  */
29830       proto_quals = cp_parser_objc_protocol_qualifiers (parser);
29831 
29832       /* An ObjC type name may consist of just protocol qualifiers, in which
29833 	 case the type shall default to 'id'.  */
29834       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
29835 	{
29836 	  cp_type = cp_parser_type_id (parser);
29837 
29838 	  /* If the type could not be parsed, an error has already
29839 	     been produced.  For error recovery, behave as if it had
29840 	     not been specified, which will use the default type
29841 	     'id'.  */
29842 	  if (cp_type == error_mark_node)
29843 	    {
29844 	      cp_type = NULL_TREE;
29845 	      /* We need to skip to the closing parenthesis as
29846 		 cp_parser_type_id() does not seem to do it for
29847 		 us.  */
29848 	      cp_parser_skip_to_closing_parenthesis (parser,
29849 						     /*recovering=*/true,
29850 						     /*or_comma=*/false,
29851 						     /*consume_paren=*/false);
29852 	    }
29853 	}
29854 
29855       parens.require_close (parser);
29856       type_name = build_tree_list (proto_quals, cp_type);
29857     }
29858 
29859   return type_name;
29860 }
29861 
29862 /* Check to see if TYPE refers to an Objective-C selector name.  */
29863 
29864 static bool
29865 cp_parser_objc_selector_p (enum cpp_ttype type)
29866 {
29867   return (type == CPP_NAME || type == CPP_KEYWORD
29868 	  || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
29869 	  || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
29870 	  || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
29871 	  || type == CPP_XOR || type == CPP_XOR_EQ);
29872 }
29873 
29874 /* Parse an Objective-C selector.  */
29875 
29876 static tree
29877 cp_parser_objc_selector (cp_parser* parser)
29878 {
29879   cp_token *token = cp_lexer_consume_token (parser->lexer);
29880 
29881   if (!cp_parser_objc_selector_p (token->type))
29882     {
29883       error_at (token->location, "invalid Objective-C++ selector name");
29884       return error_mark_node;
29885     }
29886 
29887   /* C++ operator names are allowed to appear in ObjC selectors.  */
29888   switch (token->type)
29889     {
29890     case CPP_AND_AND: return get_identifier ("and");
29891     case CPP_AND_EQ: return get_identifier ("and_eq");
29892     case CPP_AND: return get_identifier ("bitand");
29893     case CPP_OR: return get_identifier ("bitor");
29894     case CPP_COMPL: return get_identifier ("compl");
29895     case CPP_NOT: return get_identifier ("not");
29896     case CPP_NOT_EQ: return get_identifier ("not_eq");
29897     case CPP_OR_OR: return get_identifier ("or");
29898     case CPP_OR_EQ: return get_identifier ("or_eq");
29899     case CPP_XOR: return get_identifier ("xor");
29900     case CPP_XOR_EQ: return get_identifier ("xor_eq");
29901     default: return token->u.value;
29902     }
29903 }
29904 
29905 /* Parse an Objective-C params list.  */
29906 
29907 static tree
29908 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
29909 {
29910   tree params = NULL_TREE;
29911   bool maybe_unary_selector_p = true;
29912   cp_token *token = cp_lexer_peek_token (parser->lexer);
29913 
29914   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
29915     {
29916       tree selector = NULL_TREE, type_name, identifier;
29917       tree parm_attr = NULL_TREE;
29918 
29919       if (token->keyword == RID_ATTRIBUTE)
29920 	break;
29921 
29922       if (token->type != CPP_COLON)
29923 	selector = cp_parser_objc_selector (parser);
29924 
29925       /* Detect if we have a unary selector.  */
29926       if (maybe_unary_selector_p
29927 	  && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
29928 	{
29929 	  params = selector; /* Might be followed by attributes.  */
29930 	  break;
29931 	}
29932 
29933       maybe_unary_selector_p = false;
29934       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
29935 	{
29936 	  /* Something went quite wrong.  There should be a colon
29937 	     here, but there is not.  Stop parsing parameters.  */
29938 	  break;
29939 	}
29940       type_name = cp_parser_objc_typename (parser);
29941       /* New ObjC allows attributes on parameters too.  */
29942       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
29943 	parm_attr = cp_parser_attributes_opt (parser);
29944       identifier = cp_parser_identifier (parser);
29945 
29946       params
29947 	= chainon (params,
29948 		   objc_build_keyword_decl (selector,
29949 					    type_name,
29950 					    identifier,
29951 					    parm_attr));
29952 
29953       token = cp_lexer_peek_token (parser->lexer);
29954     }
29955 
29956   if (params == NULL_TREE)
29957     {
29958       cp_parser_error (parser, "objective-c++ method declaration is expected");
29959       return error_mark_node;
29960     }
29961 
29962   /* We allow tail attributes for the method.  */
29963   if (token->keyword == RID_ATTRIBUTE)
29964     {
29965       *attributes = cp_parser_attributes_opt (parser);
29966       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
29967 	  || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
29968 	return params;
29969       cp_parser_error (parser,
29970 		       "method attributes must be specified at the end");
29971       return error_mark_node;
29972     }
29973 
29974   if (params == NULL_TREE)
29975     {
29976       cp_parser_error (parser, "objective-c++ method declaration is expected");
29977       return error_mark_node;
29978     }
29979   return params;
29980 }
29981 
29982 /* Parse the non-keyword Objective-C params.  */
29983 
29984 static tree
29985 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp,
29986 				       tree* attributes)
29987 {
29988   tree params = make_node (TREE_LIST);
29989   cp_token *token = cp_lexer_peek_token (parser->lexer);
29990   *ellipsisp = false;  /* Initially, assume no ellipsis.  */
29991 
29992   while (token->type == CPP_COMMA)
29993     {
29994       cp_parameter_declarator *parmdecl;
29995       tree parm;
29996 
29997       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
29998       token = cp_lexer_peek_token (parser->lexer);
29999 
30000       if (token->type == CPP_ELLIPSIS)
30001 	{
30002 	  cp_lexer_consume_token (parser->lexer);  /* Eat '...'.  */
30003 	  *ellipsisp = true;
30004 	  token = cp_lexer_peek_token (parser->lexer);
30005 	  break;
30006 	}
30007 
30008       /* TODO: parse attributes for tail parameters.  */
30009       parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
30010       parm = grokdeclarator (parmdecl->declarator,
30011 			     &parmdecl->decl_specifiers,
30012 			     PARM, /*initialized=*/0,
30013 			     /*attrlist=*/NULL);
30014 
30015       chainon (params, build_tree_list (NULL_TREE, parm));
30016       token = cp_lexer_peek_token (parser->lexer);
30017     }
30018 
30019   /* We allow tail attributes for the method.  */
30020   if (token->keyword == RID_ATTRIBUTE)
30021     {
30022       if (*attributes == NULL_TREE)
30023 	{
30024 	  *attributes = cp_parser_attributes_opt (parser);
30025 	  if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
30026 	      || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
30027 	    return params;
30028 	}
30029       else
30030 	/* We have an error, but parse the attributes, so that we can
30031 	   carry on.  */
30032 	*attributes = cp_parser_attributes_opt (parser);
30033 
30034       cp_parser_error (parser,
30035 		       "method attributes must be specified at the end");
30036       return error_mark_node;
30037     }
30038 
30039   return params;
30040 }
30041 
30042 /* Parse a linkage specification, a pragma, an extra semicolon or a block.  */
30043 
30044 static void
30045 cp_parser_objc_interstitial_code (cp_parser* parser)
30046 {
30047   cp_token *token = cp_lexer_peek_token (parser->lexer);
30048 
30049   /* If the next token is `extern' and the following token is a string
30050      literal, then we have a linkage specification.  */
30051   if (token->keyword == RID_EXTERN
30052       && cp_parser_is_pure_string_literal
30053 	 (cp_lexer_peek_nth_token (parser->lexer, 2)))
30054     cp_parser_linkage_specification (parser);
30055   /* Handle #pragma, if any.  */
30056   else if (token->type == CPP_PRAGMA)
30057     cp_parser_pragma (parser, pragma_objc_icode, NULL);
30058   /* Allow stray semicolons.  */
30059   else if (token->type == CPP_SEMICOLON)
30060     cp_lexer_consume_token (parser->lexer);
30061   /* Mark methods as optional or required, when building protocols.  */
30062   else if (token->keyword == RID_AT_OPTIONAL)
30063     {
30064       cp_lexer_consume_token (parser->lexer);
30065       objc_set_method_opt (true);
30066     }
30067   else if (token->keyword == RID_AT_REQUIRED)
30068     {
30069       cp_lexer_consume_token (parser->lexer);
30070       objc_set_method_opt (false);
30071     }
30072   else if (token->keyword == RID_NAMESPACE)
30073     cp_parser_namespace_definition (parser);
30074   /* Other stray characters must generate errors.  */
30075   else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
30076     {
30077       cp_lexer_consume_token (parser->lexer);
30078       error ("stray %qs between Objective-C++ methods",
30079 	     token->type == CPP_OPEN_BRACE ? "{" : "}");
30080     }
30081   /* Finally, try to parse a block-declaration, or a function-definition.  */
30082   else
30083     cp_parser_block_declaration (parser, /*statement_p=*/false);
30084 }
30085 
30086 /* Parse a method signature.  */
30087 
30088 static tree
30089 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
30090 {
30091   tree rettype, kwdparms, optparms;
30092   bool ellipsis = false;
30093   bool is_class_method;
30094 
30095   is_class_method = cp_parser_objc_method_type (parser);
30096   rettype = cp_parser_objc_typename (parser);
30097   *attributes = NULL_TREE;
30098   kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
30099   if (kwdparms == error_mark_node)
30100     return error_mark_node;
30101   optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
30102   if (optparms == error_mark_node)
30103     return error_mark_node;
30104 
30105   return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
30106 }
30107 
30108 static bool
30109 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
30110 {
30111   tree tattr;
30112   cp_lexer_save_tokens (parser->lexer);
30113   tattr = cp_parser_attributes_opt (parser);
30114   gcc_assert (tattr) ;
30115 
30116   /* If the attributes are followed by a method introducer, this is not allowed.
30117      Dump the attributes and flag the situation.  */
30118   if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
30119       || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
30120     return true;
30121 
30122   /* Otherwise, the attributes introduce some interstitial code, possibly so
30123      rewind to allow that check.  */
30124   cp_lexer_rollback_tokens (parser->lexer);
30125   return false;
30126 }
30127 
30128 /* Parse an Objective-C method prototype list.  */
30129 
30130 static void
30131 cp_parser_objc_method_prototype_list (cp_parser* parser)
30132 {
30133   cp_token *token = cp_lexer_peek_token (parser->lexer);
30134 
30135   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
30136     {
30137       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
30138 	{
30139 	  tree attributes, sig;
30140 	  bool is_class_method;
30141 	  if (token->type == CPP_PLUS)
30142 	    is_class_method = true;
30143 	  else
30144 	    is_class_method = false;
30145 	  sig = cp_parser_objc_method_signature (parser, &attributes);
30146 	  if (sig == error_mark_node)
30147 	    {
30148 	      cp_parser_skip_to_end_of_block_or_statement (parser);
30149 	      token = cp_lexer_peek_token (parser->lexer);
30150 	      continue;
30151 	    }
30152 	  objc_add_method_declaration (is_class_method, sig, attributes);
30153 	  cp_parser_consume_semicolon_at_end_of_statement (parser);
30154 	}
30155       else if (token->keyword == RID_AT_PROPERTY)
30156 	cp_parser_objc_at_property_declaration (parser);
30157       else if (token->keyword == RID_ATTRIBUTE
30158       	       && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
30159 	warning_at (cp_lexer_peek_token (parser->lexer)->location,
30160 		    OPT_Wattributes,
30161 		    "prefix attributes are ignored for methods");
30162       else
30163 	/* Allow for interspersed non-ObjC++ code.  */
30164 	cp_parser_objc_interstitial_code (parser);
30165 
30166       token = cp_lexer_peek_token (parser->lexer);
30167     }
30168 
30169   if (token->type != CPP_EOF)
30170     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
30171   else
30172     cp_parser_error (parser, "expected %<@end%>");
30173 
30174   objc_finish_interface ();
30175 }
30176 
30177 /* Parse an Objective-C method definition list.  */
30178 
30179 static void
30180 cp_parser_objc_method_definition_list (cp_parser* parser)
30181 {
30182   cp_token *token = cp_lexer_peek_token (parser->lexer);
30183 
30184   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
30185     {
30186       tree meth;
30187 
30188       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
30189 	{
30190 	  cp_token *ptk;
30191 	  tree sig, attribute;
30192 	  bool is_class_method;
30193 	  if (token->type == CPP_PLUS)
30194 	    is_class_method = true;
30195 	  else
30196 	    is_class_method = false;
30197 	  push_deferring_access_checks (dk_deferred);
30198 	  sig = cp_parser_objc_method_signature (parser, &attribute);
30199 	  if (sig == error_mark_node)
30200 	    {
30201 	      cp_parser_skip_to_end_of_block_or_statement (parser);
30202 	      token = cp_lexer_peek_token (parser->lexer);
30203 	      continue;
30204 	    }
30205 	  objc_start_method_definition (is_class_method, sig, attribute,
30206 					NULL_TREE);
30207 
30208 	  /* For historical reasons, we accept an optional semicolon.  */
30209 	  if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
30210 	    cp_lexer_consume_token (parser->lexer);
30211 
30212 	  ptk = cp_lexer_peek_token (parser->lexer);
30213 	  if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS
30214 		|| ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
30215 	    {
30216 	      perform_deferred_access_checks (tf_warning_or_error);
30217 	      stop_deferring_access_checks ();
30218 	      meth = cp_parser_function_definition_after_declarator (parser,
30219 								     false);
30220 	      pop_deferring_access_checks ();
30221 	      objc_finish_method_definition (meth);
30222 	    }
30223 	}
30224       /* The following case will be removed once @synthesize is
30225 	 completely implemented.  */
30226       else if (token->keyword == RID_AT_PROPERTY)
30227 	cp_parser_objc_at_property_declaration (parser);
30228       else if (token->keyword == RID_AT_SYNTHESIZE)
30229 	cp_parser_objc_at_synthesize_declaration (parser);
30230       else if (token->keyword == RID_AT_DYNAMIC)
30231 	cp_parser_objc_at_dynamic_declaration (parser);
30232       else if (token->keyword == RID_ATTRIBUTE
30233       	       && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
30234 	warning_at (token->location, OPT_Wattributes,
30235 	       	    "prefix attributes are ignored for methods");
30236       else
30237 	/* Allow for interspersed non-ObjC++ code.  */
30238 	cp_parser_objc_interstitial_code (parser);
30239 
30240       token = cp_lexer_peek_token (parser->lexer);
30241     }
30242 
30243   if (token->type != CPP_EOF)
30244     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
30245   else
30246     cp_parser_error (parser, "expected %<@end%>");
30247 
30248   objc_finish_implementation ();
30249 }
30250 
30251 /* Parse Objective-C ivars.  */
30252 
30253 static void
30254 cp_parser_objc_class_ivars (cp_parser* parser)
30255 {
30256   cp_token *token = cp_lexer_peek_token (parser->lexer);
30257 
30258   if (token->type != CPP_OPEN_BRACE)
30259     return;	/* No ivars specified.  */
30260 
30261   cp_lexer_consume_token (parser->lexer);  /* Eat '{'.  */
30262   token = cp_lexer_peek_token (parser->lexer);
30263 
30264   while (token->type != CPP_CLOSE_BRACE
30265 	&& token->keyword != RID_AT_END && token->type != CPP_EOF)
30266     {
30267       cp_decl_specifier_seq declspecs;
30268       int decl_class_or_enum_p;
30269       tree prefix_attributes;
30270 
30271       cp_parser_objc_visibility_spec (parser);
30272 
30273       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
30274 	break;
30275 
30276       cp_parser_decl_specifier_seq (parser,
30277 				    CP_PARSER_FLAGS_OPTIONAL,
30278 				    &declspecs,
30279 				    &decl_class_or_enum_p);
30280 
30281       /* auto, register, static, extern, mutable.  */
30282       if (declspecs.storage_class != sc_none)
30283 	{
30284 	  cp_parser_error (parser, "invalid type for instance variable");
30285 	  declspecs.storage_class = sc_none;
30286 	}
30287 
30288       /* thread_local.  */
30289       if (decl_spec_seq_has_spec_p (&declspecs, ds_thread))
30290 	{
30291 	  cp_parser_error (parser, "invalid type for instance variable");
30292 	  declspecs.locations[ds_thread] = 0;
30293 	}
30294 
30295       /* typedef.  */
30296       if (decl_spec_seq_has_spec_p (&declspecs, ds_typedef))
30297 	{
30298 	  cp_parser_error (parser, "invalid type for instance variable");
30299 	  declspecs.locations[ds_typedef] = 0;
30300 	}
30301 
30302       prefix_attributes = declspecs.attributes;
30303       declspecs.attributes = NULL_TREE;
30304 
30305       /* Keep going until we hit the `;' at the end of the
30306 	 declaration.  */
30307       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
30308 	{
30309 	  tree width = NULL_TREE, attributes, first_attribute, decl;
30310 	  cp_declarator *declarator = NULL;
30311 	  int ctor_dtor_or_conv_p;
30312 
30313 	  /* Check for a (possibly unnamed) bitfield declaration.  */
30314 	  token = cp_lexer_peek_token (parser->lexer);
30315 	  if (token->type == CPP_COLON)
30316 	    goto eat_colon;
30317 
30318 	  if (token->type == CPP_NAME
30319 	      && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
30320 		  == CPP_COLON))
30321 	    {
30322 	      /* Get the name of the bitfield.  */
30323 	      declarator = make_id_declarator (NULL_TREE,
30324 					       cp_parser_identifier (parser),
30325 					       sfk_none);
30326 
30327 	     eat_colon:
30328 	      cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
30329 	      /* Get the width of the bitfield.  */
30330 	      width
30331 		= cp_parser_constant_expression (parser);
30332 	    }
30333 	  else
30334 	    {
30335 	      /* Parse the declarator.  */
30336 	      declarator
30337 		= cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
30338 					&ctor_dtor_or_conv_p,
30339 					/*parenthesized_p=*/NULL,
30340 					/*member_p=*/false,
30341 					/*friend_p=*/false);
30342 	    }
30343 
30344 	  /* Look for attributes that apply to the ivar.  */
30345 	  attributes = cp_parser_attributes_opt (parser);
30346 	  /* Remember which attributes are prefix attributes and
30347 	     which are not.  */
30348 	  first_attribute = attributes;
30349 	  /* Combine the attributes.  */
30350 	  attributes = attr_chainon (prefix_attributes, attributes);
30351 
30352 	  if (width)
30353 	    /* Create the bitfield declaration.  */
30354 	    decl = grokbitfield (declarator, &declspecs,
30355 				 width, NULL_TREE, attributes);
30356 	  else
30357 	    decl = grokfield (declarator, &declspecs,
30358 			      NULL_TREE, /*init_const_expr_p=*/false,
30359 			      NULL_TREE, attributes);
30360 
30361 	  /* Add the instance variable.  */
30362 	  if (decl != error_mark_node && decl != NULL_TREE)
30363 	    objc_add_instance_variable (decl);
30364 
30365 	  /* Reset PREFIX_ATTRIBUTES.  */
30366 	  if (attributes != error_mark_node)
30367 	    {
30368 	      while (attributes && TREE_CHAIN (attributes) != first_attribute)
30369 		attributes = TREE_CHAIN (attributes);
30370 	      if (attributes)
30371 		TREE_CHAIN (attributes) = NULL_TREE;
30372 	    }
30373 
30374 	  token = cp_lexer_peek_token (parser->lexer);
30375 
30376 	  if (token->type == CPP_COMMA)
30377 	    {
30378 	      cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
30379 	      continue;
30380 	    }
30381 	  break;
30382 	}
30383 
30384       cp_parser_consume_semicolon_at_end_of_statement (parser);
30385       token = cp_lexer_peek_token (parser->lexer);
30386     }
30387 
30388   if (token->keyword == RID_AT_END)
30389     cp_parser_error (parser, "expected %<}%>");
30390 
30391   /* Do not consume the RID_AT_END, so it will be read again as terminating
30392      the @interface of @implementation.  */
30393   if (token->keyword != RID_AT_END && token->type != CPP_EOF)
30394     cp_lexer_consume_token (parser->lexer);  /* Eat '}'.  */
30395 
30396   /* For historical reasons, we accept an optional semicolon.  */
30397   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
30398     cp_lexer_consume_token (parser->lexer);
30399 }
30400 
30401 /* Parse an Objective-C protocol declaration.  */
30402 
30403 static void
30404 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
30405 {
30406   tree proto, protorefs;
30407   cp_token *tok;
30408 
30409   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
30410   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
30411     {
30412       tok = cp_lexer_peek_token (parser->lexer);
30413       error_at (tok->location, "identifier expected after %<@protocol%>");
30414       cp_parser_consume_semicolon_at_end_of_statement (parser);
30415       return;
30416     }
30417 
30418   /* See if we have a forward declaration or a definition.  */
30419   tok = cp_lexer_peek_nth_token (parser->lexer, 2);
30420 
30421   /* Try a forward declaration first.  */
30422   if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
30423     {
30424       while (true)
30425 	{
30426 	  tree id;
30427 
30428 	  id = cp_parser_identifier (parser);
30429 	  if (id == error_mark_node)
30430 	    break;
30431 
30432 	  objc_declare_protocol (id, attributes);
30433 
30434 	  if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
30435 	    cp_lexer_consume_token (parser->lexer);
30436 	  else
30437 	    break;
30438 	}
30439       cp_parser_consume_semicolon_at_end_of_statement (parser);
30440     }
30441 
30442   /* Ok, we got a full-fledged definition (or at least should).  */
30443   else
30444     {
30445       proto = cp_parser_identifier (parser);
30446       protorefs = cp_parser_objc_protocol_refs_opt (parser);
30447       objc_start_protocol (proto, protorefs, attributes);
30448       cp_parser_objc_method_prototype_list (parser);
30449     }
30450 }
30451 
30452 /* Parse an Objective-C superclass or category.  */
30453 
30454 static void
30455 cp_parser_objc_superclass_or_category (cp_parser *parser,
30456 				       bool iface_p,
30457 				       tree *super,
30458 				       tree *categ, bool *is_class_extension)
30459 {
30460   cp_token *next = cp_lexer_peek_token (parser->lexer);
30461 
30462   *super = *categ = NULL_TREE;
30463   *is_class_extension = false;
30464   if (next->type == CPP_COLON)
30465     {
30466       cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
30467       *super = cp_parser_identifier (parser);
30468     }
30469   else if (next->type == CPP_OPEN_PAREN)
30470     {
30471       matching_parens parens;
30472       parens.consume_open (parser);  /* Eat '('.  */
30473 
30474       /* If there is no category name, and this is an @interface, we
30475 	 have a class extension.  */
30476       if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
30477 	{
30478 	  *categ = NULL_TREE;
30479 	  *is_class_extension = true;
30480 	}
30481       else
30482 	*categ = cp_parser_identifier (parser);
30483 
30484       parens.require_close (parser);
30485     }
30486 }
30487 
30488 /* Parse an Objective-C class interface.  */
30489 
30490 static void
30491 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
30492 {
30493   tree name, super, categ, protos;
30494   bool is_class_extension;
30495 
30496   cp_lexer_consume_token (parser->lexer);  /* Eat '@interface'.  */
30497   name = cp_parser_identifier (parser);
30498   if (name == error_mark_node)
30499     {
30500       /* It's hard to recover because even if valid @interface stuff
30501 	 is to follow, we can't compile it (or validate it) if we
30502 	 don't even know which class it refers to.  Let's assume this
30503 	 was a stray '@interface' token in the stream and skip it.
30504       */
30505       return;
30506     }
30507   cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
30508 					 &is_class_extension);
30509   protos = cp_parser_objc_protocol_refs_opt (parser);
30510 
30511   /* We have either a class or a category on our hands.  */
30512   if (categ || is_class_extension)
30513     objc_start_category_interface (name, categ, protos, attributes);
30514   else
30515     {
30516       objc_start_class_interface (name, super, protos, attributes);
30517       /* Handle instance variable declarations, if any.  */
30518       cp_parser_objc_class_ivars (parser);
30519       objc_continue_interface ();
30520     }
30521 
30522   cp_parser_objc_method_prototype_list (parser);
30523 }
30524 
30525 /* Parse an Objective-C class implementation.  */
30526 
30527 static void
30528 cp_parser_objc_class_implementation (cp_parser* parser)
30529 {
30530   tree name, super, categ;
30531   bool is_class_extension;
30532 
30533   cp_lexer_consume_token (parser->lexer);  /* Eat '@implementation'.  */
30534   name = cp_parser_identifier (parser);
30535   if (name == error_mark_node)
30536     {
30537       /* It's hard to recover because even if valid @implementation
30538 	 stuff is to follow, we can't compile it (or validate it) if
30539 	 we don't even know which class it refers to.  Let's assume
30540 	 this was a stray '@implementation' token in the stream and
30541 	 skip it.
30542       */
30543       return;
30544     }
30545   cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
30546 					 &is_class_extension);
30547 
30548   /* We have either a class or a category on our hands.  */
30549   if (categ)
30550     objc_start_category_implementation (name, categ);
30551   else
30552     {
30553       objc_start_class_implementation (name, super);
30554       /* Handle instance variable declarations, if any.  */
30555       cp_parser_objc_class_ivars (parser);
30556       objc_continue_implementation ();
30557     }
30558 
30559   cp_parser_objc_method_definition_list (parser);
30560 }
30561 
30562 /* Consume the @end token and finish off the implementation.  */
30563 
30564 static void
30565 cp_parser_objc_end_implementation (cp_parser* parser)
30566 {
30567   cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
30568   objc_finish_implementation ();
30569 }
30570 
30571 /* Parse an Objective-C declaration.  */
30572 
30573 static void
30574 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
30575 {
30576   /* Try to figure out what kind of declaration is present.  */
30577   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
30578 
30579   if (attributes)
30580     switch (kwd->keyword)
30581       {
30582 	case RID_AT_ALIAS:
30583 	case RID_AT_CLASS:
30584 	case RID_AT_END:
30585 	  error_at (kwd->location, "attributes may not be specified before"
30586 	            " the %<@%D%> Objective-C++ keyword",
30587 		    kwd->u.value);
30588 	  attributes = NULL;
30589 	  break;
30590 	case RID_AT_IMPLEMENTATION:
30591 	  warning_at (kwd->location, OPT_Wattributes,
30592 		      "prefix attributes are ignored before %<@%D%>",
30593 		      kwd->u.value);
30594 	  attributes = NULL;
30595 	default:
30596 	  break;
30597       }
30598 
30599   switch (kwd->keyword)
30600     {
30601     case RID_AT_ALIAS:
30602       cp_parser_objc_alias_declaration (parser);
30603       break;
30604     case RID_AT_CLASS:
30605       cp_parser_objc_class_declaration (parser);
30606       break;
30607     case RID_AT_PROTOCOL:
30608       cp_parser_objc_protocol_declaration (parser, attributes);
30609       break;
30610     case RID_AT_INTERFACE:
30611       cp_parser_objc_class_interface (parser, attributes);
30612       break;
30613     case RID_AT_IMPLEMENTATION:
30614       cp_parser_objc_class_implementation (parser);
30615       break;
30616     case RID_AT_END:
30617       cp_parser_objc_end_implementation (parser);
30618       break;
30619     default:
30620       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
30621 		kwd->u.value);
30622       cp_parser_skip_to_end_of_block_or_statement (parser);
30623     }
30624 }
30625 
30626 /* Parse an Objective-C try-catch-finally statement.
30627 
30628    objc-try-catch-finally-stmt:
30629      @try compound-statement objc-catch-clause-seq [opt]
30630        objc-finally-clause [opt]
30631 
30632    objc-catch-clause-seq:
30633      objc-catch-clause objc-catch-clause-seq [opt]
30634 
30635    objc-catch-clause:
30636      @catch ( objc-exception-declaration ) compound-statement
30637 
30638    objc-finally-clause:
30639      @finally compound-statement
30640 
30641    objc-exception-declaration:
30642      parameter-declaration
30643      '...'
30644 
30645    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
30646 
30647    Returns NULL_TREE.
30648 
30649    PS: This function is identical to c_parser_objc_try_catch_finally_statement
30650    for C.  Keep them in sync.  */
30651 
30652 static tree
30653 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
30654 {
30655   location_t location;
30656   tree stmt;
30657 
30658   cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
30659   location = cp_lexer_peek_token (parser->lexer)->location;
30660   objc_maybe_warn_exceptions (location);
30661   /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
30662      node, lest it get absorbed into the surrounding block.  */
30663   stmt = push_stmt_list ();
30664   cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
30665   objc_begin_try_stmt (location, pop_stmt_list (stmt));
30666 
30667   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
30668     {
30669       cp_parameter_declarator *parm;
30670       tree parameter_declaration = error_mark_node;
30671       bool seen_open_paren = false;
30672       matching_parens parens;
30673 
30674       cp_lexer_consume_token (parser->lexer);
30675       if (parens.require_open (parser))
30676 	seen_open_paren = true;
30677       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
30678 	{
30679 	  /* We have "@catch (...)" (where the '...' are literally
30680 	     what is in the code).  Skip the '...'.
30681 	     parameter_declaration is set to NULL_TREE, and
30682 	     objc_being_catch_clauses() knows that that means
30683 	     '...'.  */
30684 	  cp_lexer_consume_token (parser->lexer);
30685 	  parameter_declaration = NULL_TREE;
30686 	}
30687       else
30688 	{
30689 	  /* We have "@catch (NSException *exception)" or something
30690 	     like that.  Parse the parameter declaration.  */
30691 	  parm = cp_parser_parameter_declaration (parser, false, NULL);
30692 	  if (parm == NULL)
30693 	    parameter_declaration = error_mark_node;
30694 	  else
30695 	    parameter_declaration = grokdeclarator (parm->declarator,
30696 						    &parm->decl_specifiers,
30697 						    PARM, /*initialized=*/0,
30698 						    /*attrlist=*/NULL);
30699 	}
30700       if (seen_open_paren)
30701 	parens.require_close (parser);
30702       else
30703 	{
30704 	  /* If there was no open parenthesis, we are recovering from
30705 	     an error, and we are trying to figure out what mistake
30706 	     the user has made.  */
30707 
30708 	  /* If there is an immediate closing parenthesis, the user
30709 	     probably forgot the opening one (ie, they typed "@catch
30710 	     NSException *e)".  Parse the closing parenthesis and keep
30711 	     going.  */
30712 	  if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
30713 	    cp_lexer_consume_token (parser->lexer);
30714 
30715 	  /* If these is no immediate closing parenthesis, the user
30716 	     probably doesn't know that parenthesis are required at
30717 	     all (ie, they typed "@catch NSException *e").  So, just
30718 	     forget about the closing parenthesis and keep going.  */
30719 	}
30720       objc_begin_catch_clause (parameter_declaration);
30721       cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
30722       objc_finish_catch_clause ();
30723     }
30724   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
30725     {
30726       cp_lexer_consume_token (parser->lexer);
30727       location = cp_lexer_peek_token (parser->lexer)->location;
30728       /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
30729 	 node, lest it get absorbed into the surrounding block.  */
30730       stmt = push_stmt_list ();
30731       cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
30732       objc_build_finally_clause (location, pop_stmt_list (stmt));
30733     }
30734 
30735   return objc_finish_try_stmt ();
30736 }
30737 
30738 /* Parse an Objective-C synchronized statement.
30739 
30740    objc-synchronized-stmt:
30741      @synchronized ( expression ) compound-statement
30742 
30743    Returns NULL_TREE.  */
30744 
30745 static tree
30746 cp_parser_objc_synchronized_statement (cp_parser *parser)
30747 {
30748   location_t location;
30749   tree lock, stmt;
30750 
30751   cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
30752 
30753   location = cp_lexer_peek_token (parser->lexer)->location;
30754   objc_maybe_warn_exceptions (location);
30755   matching_parens parens;
30756   parens.require_open (parser);
30757   lock = cp_parser_expression (parser);
30758   parens.require_close (parser);
30759 
30760   /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
30761      node, lest it get absorbed into the surrounding block.  */
30762   stmt = push_stmt_list ();
30763   cp_parser_compound_statement (parser, NULL, BCS_NORMAL, false);
30764 
30765   return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
30766 }
30767 
30768 /* Parse an Objective-C throw statement.
30769 
30770    objc-throw-stmt:
30771      @throw assignment-expression [opt] ;
30772 
30773    Returns a constructed '@throw' statement.  */
30774 
30775 static tree
30776 cp_parser_objc_throw_statement (cp_parser *parser)
30777 {
30778   tree expr = NULL_TREE;
30779   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
30780 
30781   cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
30782 
30783   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
30784     expr = cp_parser_expression (parser);
30785 
30786   cp_parser_consume_semicolon_at_end_of_statement (parser);
30787 
30788   return objc_build_throw_stmt (loc, expr);
30789 }
30790 
30791 /* Parse an Objective-C statement.  */
30792 
30793 static tree
30794 cp_parser_objc_statement (cp_parser * parser)
30795 {
30796   /* Try to figure out what kind of declaration is present.  */
30797   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
30798 
30799   switch (kwd->keyword)
30800     {
30801     case RID_AT_TRY:
30802       return cp_parser_objc_try_catch_finally_statement (parser);
30803     case RID_AT_SYNCHRONIZED:
30804       return cp_parser_objc_synchronized_statement (parser);
30805     case RID_AT_THROW:
30806       return cp_parser_objc_throw_statement (parser);
30807     default:
30808       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
30809 	       kwd->u.value);
30810       cp_parser_skip_to_end_of_block_or_statement (parser);
30811     }
30812 
30813   return error_mark_node;
30814 }
30815 
30816 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to
30817    look ahead to see if an objc keyword follows the attributes.  This
30818    is to detect the use of prefix attributes on ObjC @interface and
30819    @protocol.  */
30820 
30821 static bool
30822 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
30823 {
30824   cp_lexer_save_tokens (parser->lexer);
30825   *attrib = cp_parser_attributes_opt (parser);
30826   gcc_assert (*attrib);
30827   if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
30828     {
30829       cp_lexer_commit_tokens (parser->lexer);
30830       return true;
30831     }
30832   cp_lexer_rollback_tokens (parser->lexer);
30833   return false;
30834 }
30835 
30836 /* This routine is a minimal replacement for
30837    c_parser_struct_declaration () used when parsing the list of
30838    types/names or ObjC++ properties.  For example, when parsing the
30839    code
30840 
30841    @property (readonly) int a, b, c;
30842 
30843    this function is responsible for parsing "int a, int b, int c" and
30844    returning the declarations as CHAIN of DECLs.
30845 
30846    TODO: Share this code with cp_parser_objc_class_ivars.  It's very
30847    similar parsing.  */
30848 static tree
30849 cp_parser_objc_struct_declaration (cp_parser *parser)
30850 {
30851   tree decls = NULL_TREE;
30852   cp_decl_specifier_seq declspecs;
30853   int decl_class_or_enum_p;
30854   tree prefix_attributes;
30855 
30856   cp_parser_decl_specifier_seq (parser,
30857 				CP_PARSER_FLAGS_NONE,
30858 				&declspecs,
30859 				&decl_class_or_enum_p);
30860 
30861   if (declspecs.type == error_mark_node)
30862     return error_mark_node;
30863 
30864   /* auto, register, static, extern, mutable.  */
30865   if (declspecs.storage_class != sc_none)
30866     {
30867       cp_parser_error (parser, "invalid type for property");
30868       declspecs.storage_class = sc_none;
30869     }
30870 
30871   /* thread_local.  */
30872   if (decl_spec_seq_has_spec_p (&declspecs, ds_thread))
30873     {
30874       cp_parser_error (parser, "invalid type for property");
30875       declspecs.locations[ds_thread] = 0;
30876     }
30877 
30878   /* typedef.  */
30879   if (decl_spec_seq_has_spec_p (&declspecs, ds_typedef))
30880     {
30881       cp_parser_error (parser, "invalid type for property");
30882       declspecs.locations[ds_typedef] = 0;
30883     }
30884 
30885   prefix_attributes = declspecs.attributes;
30886   declspecs.attributes = NULL_TREE;
30887 
30888   /* Keep going until we hit the `;' at the end of the declaration. */
30889   while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
30890     {
30891       tree attributes, first_attribute, decl;
30892       cp_declarator *declarator;
30893       cp_token *token;
30894 
30895       /* Parse the declarator.  */
30896       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
30897 					 NULL, NULL, false, false);
30898 
30899       /* Look for attributes that apply to the ivar.  */
30900       attributes = cp_parser_attributes_opt (parser);
30901       /* Remember which attributes are prefix attributes and
30902 	 which are not.  */
30903       first_attribute = attributes;
30904       /* Combine the attributes.  */
30905       attributes = attr_chainon (prefix_attributes, attributes);
30906 
30907       decl = grokfield (declarator, &declspecs,
30908 			NULL_TREE, /*init_const_expr_p=*/false,
30909 			NULL_TREE, attributes);
30910 
30911       if (decl == error_mark_node || decl == NULL_TREE)
30912 	return error_mark_node;
30913 
30914       /* Reset PREFIX_ATTRIBUTES.  */
30915       if (attributes != error_mark_node)
30916 	{
30917 	  while (attributes && TREE_CHAIN (attributes) != first_attribute)
30918 	    attributes = TREE_CHAIN (attributes);
30919 	  if (attributes)
30920 	    TREE_CHAIN (attributes) = NULL_TREE;
30921 	}
30922 
30923       DECL_CHAIN (decl) = decls;
30924       decls = decl;
30925 
30926       token = cp_lexer_peek_token (parser->lexer);
30927       if (token->type == CPP_COMMA)
30928 	{
30929 	  cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
30930 	  continue;
30931 	}
30932       else
30933 	break;
30934     }
30935   return decls;
30936 }
30937 
30938 /* Parse an Objective-C @property declaration.  The syntax is:
30939 
30940    objc-property-declaration:
30941      '@property' objc-property-attributes[opt] struct-declaration ;
30942 
30943    objc-property-attributes:
30944     '(' objc-property-attribute-list ')'
30945 
30946    objc-property-attribute-list:
30947      objc-property-attribute
30948      objc-property-attribute-list, objc-property-attribute
30949 
30950    objc-property-attribute
30951      'getter' = identifier
30952      'setter' = identifier
30953      'readonly'
30954      'readwrite'
30955      'assign'
30956      'retain'
30957      'copy'
30958      'nonatomic'
30959 
30960   For example:
30961     @property NSString *name;
30962     @property (readonly) id object;
30963     @property (retain, nonatomic, getter=getTheName) id name;
30964     @property int a, b, c;
30965 
30966    PS: This function is identical to
30967    c_parser_objc_at_property_declaration for C.  Keep them in sync.  */
30968 static void
30969 cp_parser_objc_at_property_declaration (cp_parser *parser)
30970 {
30971   /* The following variables hold the attributes of the properties as
30972      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
30973      seen.  When we see an attribute, we set them to 'true' (if they
30974      are boolean properties) or to the identifier (if they have an
30975      argument, ie, for getter and setter).  Note that here we only
30976      parse the list of attributes, check the syntax and accumulate the
30977      attributes that we find.  objc_add_property_declaration() will
30978      then process the information.  */
30979   bool property_assign = false;
30980   bool property_copy = false;
30981   tree property_getter_ident = NULL_TREE;
30982   bool property_nonatomic = false;
30983   bool property_readonly = false;
30984   bool property_readwrite = false;
30985   bool property_retain = false;
30986   tree property_setter_ident = NULL_TREE;
30987 
30988   /* 'properties' is the list of properties that we read.  Usually a
30989      single one, but maybe more (eg, in "@property int a, b, c;" there
30990      are three).  */
30991   tree properties;
30992   location_t loc;
30993 
30994   loc = cp_lexer_peek_token (parser->lexer)->location;
30995 
30996   cp_lexer_consume_token (parser->lexer);  /* Eat '@property'.  */
30997 
30998   /* Parse the optional attribute list...  */
30999   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
31000     {
31001       /* Eat the '('.  */
31002       matching_parens parens;
31003       parens.consume_open (parser);
31004 
31005       while (true)
31006 	{
31007 	  bool syntax_error = false;
31008 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
31009       	  enum rid keyword;
31010 
31011 	  if (token->type != CPP_NAME)
31012 	    {
31013 	      cp_parser_error (parser, "expected identifier");
31014 	      break;
31015 	    }
31016 	  keyword = C_RID_CODE (token->u.value);
31017 	  cp_lexer_consume_token (parser->lexer);
31018 	  switch (keyword)
31019 	    {
31020 	    case RID_ASSIGN:    property_assign = true;    break;
31021 	    case RID_COPY:      property_copy = true;      break;
31022 	    case RID_NONATOMIC: property_nonatomic = true; break;
31023 	    case RID_READONLY:  property_readonly = true;  break;
31024 	    case RID_READWRITE: property_readwrite = true; break;
31025 	    case RID_RETAIN:    property_retain = true;    break;
31026 
31027 	    case RID_GETTER:
31028 	    case RID_SETTER:
31029 	      if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
31030 		{
31031 		  if (keyword == RID_GETTER)
31032 		    cp_parser_error (parser,
31033 				     "missing %<=%> (after %<getter%> attribute)");
31034 		  else
31035 		    cp_parser_error (parser,
31036 				     "missing %<=%> (after %<setter%> attribute)");
31037 		  syntax_error = true;
31038 		  break;
31039 		}
31040 	      cp_lexer_consume_token (parser->lexer); /* eat the = */
31041 	      if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
31042 		{
31043 		  cp_parser_error (parser, "expected identifier");
31044 		  syntax_error = true;
31045 		  break;
31046 		}
31047 	      if (keyword == RID_SETTER)
31048 		{
31049 		  if (property_setter_ident != NULL_TREE)
31050 		    {
31051 		      cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
31052 		      cp_lexer_consume_token (parser->lexer);
31053 		    }
31054 		  else
31055 		    property_setter_ident = cp_parser_objc_selector (parser);
31056 		  if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
31057 		    cp_parser_error (parser, "setter name must terminate with %<:%>");
31058 		  else
31059 		    cp_lexer_consume_token (parser->lexer);
31060 		}
31061 	      else
31062 		{
31063 		  if (property_getter_ident != NULL_TREE)
31064 		    {
31065 		      cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
31066 		      cp_lexer_consume_token (parser->lexer);
31067 		    }
31068 		  else
31069 		    property_getter_ident = cp_parser_objc_selector (parser);
31070 		}
31071 	      break;
31072 	    default:
31073 	      cp_parser_error (parser, "unknown property attribute");
31074 	      syntax_error = true;
31075 	      break;
31076 	    }
31077 
31078 	  if (syntax_error)
31079 	    break;
31080 
31081 	  if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
31082 	    cp_lexer_consume_token (parser->lexer);
31083 	  else
31084 	    break;
31085 	}
31086 
31087       /* FIXME: "@property (setter, assign);" will generate a spurious
31088 	 "error: expected ‘)’ before ‘,’ token".  This is because
31089 	 cp_parser_require, unlike the C counterpart, will produce an
31090 	 error even if we are in error recovery.  */
31091       if (!parens.require_close (parser))
31092 	{
31093 	  cp_parser_skip_to_closing_parenthesis (parser,
31094 						 /*recovering=*/true,
31095 						 /*or_comma=*/false,
31096 						 /*consume_paren=*/true);
31097 	}
31098     }
31099 
31100   /* ... and the property declaration(s).  */
31101   properties = cp_parser_objc_struct_declaration (parser);
31102 
31103   if (properties == error_mark_node)
31104     {
31105       cp_parser_skip_to_end_of_statement (parser);
31106       /* If the next token is now a `;', consume it.  */
31107       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
31108 	cp_lexer_consume_token (parser->lexer);
31109       return;
31110     }
31111 
31112   if (properties == NULL_TREE)
31113     cp_parser_error (parser, "expected identifier");
31114   else
31115     {
31116       /* Comma-separated properties are chained together in
31117 	 reverse order; add them one by one.  */
31118       properties = nreverse (properties);
31119 
31120       for (; properties; properties = TREE_CHAIN (properties))
31121 	objc_add_property_declaration (loc, copy_node (properties),
31122 				       property_readonly, property_readwrite,
31123 				       property_assign, property_retain,
31124 				       property_copy, property_nonatomic,
31125 				       property_getter_ident, property_setter_ident);
31126     }
31127 
31128   cp_parser_consume_semicolon_at_end_of_statement (parser);
31129 }
31130 
31131 /* Parse an Objective-C++ @synthesize declaration.  The syntax is:
31132 
31133    objc-synthesize-declaration:
31134      @synthesize objc-synthesize-identifier-list ;
31135 
31136    objc-synthesize-identifier-list:
31137      objc-synthesize-identifier
31138      objc-synthesize-identifier-list, objc-synthesize-identifier
31139 
31140    objc-synthesize-identifier
31141      identifier
31142      identifier = identifier
31143 
31144   For example:
31145     @synthesize MyProperty;
31146     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
31147 
31148   PS: This function is identical to c_parser_objc_at_synthesize_declaration
31149   for C.  Keep them in sync.
31150 */
31151 static void
31152 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
31153 {
31154   tree list = NULL_TREE;
31155   location_t loc;
31156   loc = cp_lexer_peek_token (parser->lexer)->location;
31157 
31158   cp_lexer_consume_token (parser->lexer);  /* Eat '@synthesize'.  */
31159   while (true)
31160     {
31161       tree property, ivar;
31162       property = cp_parser_identifier (parser);
31163       if (property == error_mark_node)
31164 	{
31165 	  cp_parser_consume_semicolon_at_end_of_statement (parser);
31166 	  return;
31167 	}
31168       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
31169 	{
31170 	  cp_lexer_consume_token (parser->lexer);
31171 	  ivar = cp_parser_identifier (parser);
31172 	  if (ivar == error_mark_node)
31173 	    {
31174 	      cp_parser_consume_semicolon_at_end_of_statement (parser);
31175 	      return;
31176 	    }
31177 	}
31178       else
31179 	ivar = NULL_TREE;
31180       list = chainon (list, build_tree_list (ivar, property));
31181       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
31182 	cp_lexer_consume_token (parser->lexer);
31183       else
31184 	break;
31185     }
31186   cp_parser_consume_semicolon_at_end_of_statement (parser);
31187   objc_add_synthesize_declaration (loc, list);
31188 }
31189 
31190 /* Parse an Objective-C++ @dynamic declaration.  The syntax is:
31191 
31192    objc-dynamic-declaration:
31193      @dynamic identifier-list ;
31194 
31195    For example:
31196      @dynamic MyProperty;
31197      @dynamic MyProperty, AnotherProperty;
31198 
31199   PS: This function is identical to c_parser_objc_at_dynamic_declaration
31200   for C.  Keep them in sync.
31201 */
31202 static void
31203 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
31204 {
31205   tree list = NULL_TREE;
31206   location_t loc;
31207   loc = cp_lexer_peek_token (parser->lexer)->location;
31208 
31209   cp_lexer_consume_token (parser->lexer);  /* Eat '@dynamic'.  */
31210   while (true)
31211     {
31212       tree property;
31213       property = cp_parser_identifier (parser);
31214       if (property == error_mark_node)
31215 	{
31216 	  cp_parser_consume_semicolon_at_end_of_statement (parser);
31217 	  return;
31218 	}
31219       list = chainon (list, build_tree_list (NULL, property));
31220       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
31221 	cp_lexer_consume_token (parser->lexer);
31222       else
31223 	break;
31224     }
31225   cp_parser_consume_semicolon_at_end_of_statement (parser);
31226   objc_add_dynamic_declaration (loc, list);
31227 }
31228 
31229 
31230 /* OpenMP 2.5 / 3.0 / 3.1 / 4.0 parsing routines.  */
31231 
31232 /* Returns name of the next clause.
31233    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
31234    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
31235    returned and the token is consumed.  */
31236 
31237 static pragma_omp_clause
31238 cp_parser_omp_clause_name (cp_parser *parser)
31239 {
31240   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
31241 
31242   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
31243     result = PRAGMA_OACC_CLAUSE_AUTO;
31244   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
31245     result = PRAGMA_OMP_CLAUSE_IF;
31246   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
31247     result = PRAGMA_OMP_CLAUSE_DEFAULT;
31248   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DELETE))
31249     result = PRAGMA_OACC_CLAUSE_DELETE;
31250   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
31251     result = PRAGMA_OMP_CLAUSE_PRIVATE;
31252   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
31253     result = PRAGMA_OMP_CLAUSE_FOR;
31254   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
31255     {
31256       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
31257       const char *p = IDENTIFIER_POINTER (id);
31258 
31259       switch (p[0])
31260 	{
31261 	case 'a':
31262 	  if (!strcmp ("aligned", p))
31263 	    result = PRAGMA_OMP_CLAUSE_ALIGNED;
31264 	  else if (!strcmp ("async", p))
31265 	    result = PRAGMA_OACC_CLAUSE_ASYNC;
31266 	  break;
31267 	case 'c':
31268 	  if (!strcmp ("collapse", p))
31269 	    result = PRAGMA_OMP_CLAUSE_COLLAPSE;
31270 	  else if (!strcmp ("copy", p))
31271 	    result = PRAGMA_OACC_CLAUSE_COPY;
31272 	  else if (!strcmp ("copyin", p))
31273 	    result = PRAGMA_OMP_CLAUSE_COPYIN;
31274 	  else if (!strcmp ("copyout", p))
31275 	    result = PRAGMA_OACC_CLAUSE_COPYOUT;
31276 	  else if (!strcmp ("copyprivate", p))
31277 	    result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
31278 	  else if (!strcmp ("create", p))
31279 	    result = PRAGMA_OACC_CLAUSE_CREATE;
31280 	  break;
31281 	case 'd':
31282 	  if (!strcmp ("defaultmap", p))
31283 	    result = PRAGMA_OMP_CLAUSE_DEFAULTMAP;
31284 	  else if (!strcmp ("depend", p))
31285 	    result = PRAGMA_OMP_CLAUSE_DEPEND;
31286 	  else if (!strcmp ("device", p))
31287 	    result = PRAGMA_OMP_CLAUSE_DEVICE;
31288 	  else if (!strcmp ("deviceptr", p))
31289 	    result = PRAGMA_OACC_CLAUSE_DEVICEPTR;
31290 	  else if (!strcmp ("device_resident", p))
31291 	    result = PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT;
31292 	  else if (!strcmp ("dist_schedule", p))
31293 	    result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE;
31294 	  break;
31295 	case 'f':
31296 	  if (!strcmp ("final", p))
31297 	    result = PRAGMA_OMP_CLAUSE_FINAL;
31298 	  else if (!strcmp ("firstprivate", p))
31299 	    result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
31300 	  else if (!strcmp ("from", p))
31301 	    result = PRAGMA_OMP_CLAUSE_FROM;
31302 	  break;
31303 	case 'g':
31304 	  if (!strcmp ("gang", p))
31305 	    result = PRAGMA_OACC_CLAUSE_GANG;
31306 	  else if (!strcmp ("grainsize", p))
31307 	    result = PRAGMA_OMP_CLAUSE_GRAINSIZE;
31308 	  break;
31309 	case 'h':
31310 	  if (!strcmp ("hint", p))
31311 	    result = PRAGMA_OMP_CLAUSE_HINT;
31312 	  else if (!strcmp ("host", p))
31313 	    result = PRAGMA_OACC_CLAUSE_HOST;
31314 	  break;
31315 	case 'i':
31316 	  if (!strcmp ("inbranch", p))
31317 	    result = PRAGMA_OMP_CLAUSE_INBRANCH;
31318 	  else if (!strcmp ("independent", p))
31319 	    result = PRAGMA_OACC_CLAUSE_INDEPENDENT;
31320 	  else if (!strcmp ("is_device_ptr", p))
31321 	    result = PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR;
31322 	  break;
31323 	case 'l':
31324 	  if (!strcmp ("lastprivate", p))
31325 	    result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
31326 	  else if (!strcmp ("linear", p))
31327 	    result = PRAGMA_OMP_CLAUSE_LINEAR;
31328 	  else if (!strcmp ("link", p))
31329 	    result = PRAGMA_OMP_CLAUSE_LINK;
31330 	  break;
31331 	case 'm':
31332 	  if (!strcmp ("map", p))
31333 	    result = PRAGMA_OMP_CLAUSE_MAP;
31334 	  else if (!strcmp ("mergeable", p))
31335 	    result = PRAGMA_OMP_CLAUSE_MERGEABLE;
31336 	  break;
31337 	case 'n':
31338 	  if (!strcmp ("nogroup", p))
31339 	    result = PRAGMA_OMP_CLAUSE_NOGROUP;
31340 	  else if (!strcmp ("notinbranch", p))
31341 	    result = PRAGMA_OMP_CLAUSE_NOTINBRANCH;
31342 	  else if (!strcmp ("nowait", p))
31343 	    result = PRAGMA_OMP_CLAUSE_NOWAIT;
31344 	  else if (!strcmp ("num_gangs", p))
31345 	    result = PRAGMA_OACC_CLAUSE_NUM_GANGS;
31346 	  else if (!strcmp ("num_tasks", p))
31347 	    result = PRAGMA_OMP_CLAUSE_NUM_TASKS;
31348 	  else if (!strcmp ("num_teams", p))
31349 	    result = PRAGMA_OMP_CLAUSE_NUM_TEAMS;
31350 	  else if (!strcmp ("num_threads", p))
31351 	    result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
31352 	  else if (!strcmp ("num_workers", p))
31353 	    result = PRAGMA_OACC_CLAUSE_NUM_WORKERS;
31354 	  break;
31355 	case 'o':
31356 	  if (!strcmp ("ordered", p))
31357 	    result = PRAGMA_OMP_CLAUSE_ORDERED;
31358 	  break;
31359 	case 'p':
31360 	  if (!strcmp ("parallel", p))
31361 	    result = PRAGMA_OMP_CLAUSE_PARALLEL;
31362 	  else if (!strcmp ("present", p))
31363 	    result = PRAGMA_OACC_CLAUSE_PRESENT;
31364 	  else if (!strcmp ("present_or_copy", p)
31365 		   || !strcmp ("pcopy", p))
31366 	    result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY;
31367 	  else if (!strcmp ("present_or_copyin", p)
31368 		   || !strcmp ("pcopyin", p))
31369 	    result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN;
31370 	  else if (!strcmp ("present_or_copyout", p)
31371 		   || !strcmp ("pcopyout", p))
31372 	    result = PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT;
31373 	  else if (!strcmp ("present_or_create", p)
31374 		   || !strcmp ("pcreate", p))
31375 	    result = PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE;
31376 	  else if (!strcmp ("priority", p))
31377 	    result = PRAGMA_OMP_CLAUSE_PRIORITY;
31378 	  else if (!strcmp ("proc_bind", p))
31379 	    result = PRAGMA_OMP_CLAUSE_PROC_BIND;
31380 	  break;
31381 	case 'r':
31382 	  if (!strcmp ("reduction", p))
31383 	    result = PRAGMA_OMP_CLAUSE_REDUCTION;
31384 	  break;
31385 	case 's':
31386 	  if (!strcmp ("safelen", p))
31387 	    result = PRAGMA_OMP_CLAUSE_SAFELEN;
31388 	  else if (!strcmp ("schedule", p))
31389 	    result = PRAGMA_OMP_CLAUSE_SCHEDULE;
31390 	  else if (!strcmp ("sections", p))
31391 	    result = PRAGMA_OMP_CLAUSE_SECTIONS;
31392 	  else if (!strcmp ("self", p))
31393 	    result = PRAGMA_OACC_CLAUSE_SELF;
31394 	  else if (!strcmp ("seq", p))
31395 	    result = PRAGMA_OACC_CLAUSE_SEQ;
31396 	  else if (!strcmp ("shared", p))
31397 	    result = PRAGMA_OMP_CLAUSE_SHARED;
31398 	  else if (!strcmp ("simd", p))
31399 	    result = PRAGMA_OMP_CLAUSE_SIMD;
31400 	  else if (!strcmp ("simdlen", p))
31401 	    result = PRAGMA_OMP_CLAUSE_SIMDLEN;
31402 	  break;
31403 	case 't':
31404 	  if (!strcmp ("taskgroup", p))
31405 	    result = PRAGMA_OMP_CLAUSE_TASKGROUP;
31406 	  else if (!strcmp ("thread_limit", p))
31407 	    result = PRAGMA_OMP_CLAUSE_THREAD_LIMIT;
31408 	  else if (!strcmp ("threads", p))
31409 	    result = PRAGMA_OMP_CLAUSE_THREADS;
31410 	  else if (!strcmp ("tile", p))
31411 	    result = PRAGMA_OACC_CLAUSE_TILE;
31412 	  else if (!strcmp ("to", p))
31413 	    result = PRAGMA_OMP_CLAUSE_TO;
31414 	  break;
31415 	case 'u':
31416 	  if (!strcmp ("uniform", p))
31417 	    result = PRAGMA_OMP_CLAUSE_UNIFORM;
31418 	  else if (!strcmp ("untied", p))
31419 	    result = PRAGMA_OMP_CLAUSE_UNTIED;
31420 	  else if (!strcmp ("use_device", p))
31421 	    result = PRAGMA_OACC_CLAUSE_USE_DEVICE;
31422 	  else if (!strcmp ("use_device_ptr", p))
31423 	    result = PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR;
31424 	  break;
31425 	case 'v':
31426 	  if (!strcmp ("vector", p))
31427 	    result = PRAGMA_OACC_CLAUSE_VECTOR;
31428 	  else if (!strcmp ("vector_length", p))
31429 	    result = PRAGMA_OACC_CLAUSE_VECTOR_LENGTH;
31430 	  break;
31431 	case 'w':
31432 	  if (!strcmp ("wait", p))
31433 	    result = PRAGMA_OACC_CLAUSE_WAIT;
31434 	  else if (!strcmp ("worker", p))
31435 	    result = PRAGMA_OACC_CLAUSE_WORKER;
31436 	  break;
31437 	}
31438     }
31439 
31440   if (result != PRAGMA_OMP_CLAUSE_NONE)
31441     cp_lexer_consume_token (parser->lexer);
31442 
31443   return result;
31444 }
31445 
31446 /* Validate that a clause of the given type does not already exist.  */
31447 
31448 static void
31449 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
31450 			   const char *name, location_t location)
31451 {
31452   tree c;
31453 
31454   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
31455     if (OMP_CLAUSE_CODE (c) == code)
31456       {
31457 	error_at (location, "too many %qs clauses", name);
31458 	break;
31459       }
31460 }
31461 
31462 /* OpenMP 2.5:
31463    variable-list:
31464      identifier
31465      variable-list , identifier
31466 
31467    In addition, we match a closing parenthesis (or, if COLON is non-NULL,
31468    colon).  An opening parenthesis will have been consumed by the caller.
31469 
31470    If KIND is nonzero, create the appropriate node and install the decl
31471    in OMP_CLAUSE_DECL and add the node to the head of the list.
31472 
31473    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
31474    return the list created.
31475 
31476    COLON can be NULL if only closing parenthesis should end the list,
31477    or pointer to bool which will receive false if the list is terminated
31478    by closing parenthesis or true if the list is terminated by colon.  */
31479 
31480 static tree
31481 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
31482 				tree list, bool *colon)
31483 {
31484   cp_token *token;
31485   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
31486   if (colon)
31487     {
31488       parser->colon_corrects_to_scope_p = false;
31489       *colon = false;
31490     }
31491   while (1)
31492     {
31493       tree name, decl;
31494 
31495       token = cp_lexer_peek_token (parser->lexer);
31496       if (kind != 0
31497 	  && current_class_ptr
31498 	  && cp_parser_is_keyword (token, RID_THIS))
31499 	{
31500 	  decl = finish_this_expr ();
31501 	  if (TREE_CODE (decl) == NON_LVALUE_EXPR
31502 	      || CONVERT_EXPR_P (decl))
31503 	    decl = TREE_OPERAND (decl, 0);
31504 	  cp_lexer_consume_token (parser->lexer);
31505 	}
31506       else
31507 	{
31508 	  name = cp_parser_id_expression (parser, /*template_p=*/false,
31509 					  /*check_dependency_p=*/true,
31510 					  /*template_p=*/NULL,
31511 					  /*declarator_p=*/false,
31512 					  /*optional_p=*/false);
31513 	  if (name == error_mark_node)
31514 	    goto skip_comma;
31515 
31516 	  if (identifier_p (name))
31517 	    decl = cp_parser_lookup_name_simple (parser, name, token->location);
31518 	  else
31519 	    decl = name;
31520 	  if (decl == error_mark_node)
31521 	    cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
31522 					 token->location);
31523 	}
31524       if (decl == error_mark_node)
31525 	;
31526       else if (kind != 0)
31527 	{
31528 	  switch (kind)
31529 	    {
31530 	    case OMP_CLAUSE__CACHE_:
31531 	      /* The OpenACC cache directive explicitly only allows "array
31532 		 elements or subarrays".  */
31533 	      if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_SQUARE)
31534 		{
31535 		  error_at (token->location, "expected %<[%>");
31536 		  decl = error_mark_node;
31537 		  break;
31538 		}
31539 	      /* FALLTHROUGH.  */
31540 	    case OMP_CLAUSE_MAP:
31541 	    case OMP_CLAUSE_FROM:
31542 	    case OMP_CLAUSE_TO:
31543 	      while (cp_lexer_next_token_is (parser->lexer, CPP_DOT))
31544 		{
31545 		  location_t loc
31546 		    = cp_lexer_peek_token (parser->lexer)->location;
31547 		  cp_id_kind idk = CP_ID_KIND_NONE;
31548 		  cp_lexer_consume_token (parser->lexer);
31549 		  decl = convert_from_reference (decl);
31550 		  decl
31551 		    = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
31552 							      decl, false,
31553 							      &idk, loc);
31554 		}
31555 	      /* FALLTHROUGH.  */
31556 	    case OMP_CLAUSE_DEPEND:
31557 	    case OMP_CLAUSE_REDUCTION:
31558 	      while (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
31559 		{
31560 		  tree low_bound = NULL_TREE, length = NULL_TREE;
31561 
31562 		  parser->colon_corrects_to_scope_p = false;
31563 		  cp_lexer_consume_token (parser->lexer);
31564 		  if (!cp_lexer_next_token_is (parser->lexer, CPP_COLON))
31565 		    low_bound = cp_parser_expression (parser);
31566 		  if (!colon)
31567 		    parser->colon_corrects_to_scope_p
31568 		      = saved_colon_corrects_to_scope_p;
31569 		  if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_SQUARE))
31570 		    length = integer_one_node;
31571 		  else
31572 		    {
31573 		      /* Look for `:'.  */
31574 		      if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
31575 			goto skip_comma;
31576 		      if (!cp_lexer_next_token_is (parser->lexer,
31577 						   CPP_CLOSE_SQUARE))
31578 			length = cp_parser_expression (parser);
31579 		    }
31580 		  /* Look for the closing `]'.  */
31581 		  if (!cp_parser_require (parser, CPP_CLOSE_SQUARE,
31582 					  RT_CLOSE_SQUARE))
31583 		    goto skip_comma;
31584 
31585 		  decl = tree_cons (low_bound, length, decl);
31586 		}
31587 	      break;
31588 	    default:
31589 	      break;
31590 	    }
31591 
31592 	  tree u = build_omp_clause (token->location, kind);
31593 	  OMP_CLAUSE_DECL (u) = decl;
31594 	  OMP_CLAUSE_CHAIN (u) = list;
31595 	  list = u;
31596 	}
31597       else
31598 	list = tree_cons (decl, NULL_TREE, list);
31599 
31600     get_comma:
31601       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
31602 	break;
31603       cp_lexer_consume_token (parser->lexer);
31604     }
31605 
31606   if (colon)
31607     parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
31608 
31609   if (colon != NULL && cp_lexer_next_token_is (parser->lexer, CPP_COLON))
31610     {
31611       *colon = true;
31612       cp_parser_require (parser, CPP_COLON, RT_COLON);
31613       return list;
31614     }
31615 
31616   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
31617     {
31618       int ending;
31619 
31620       /* Try to resync to an unnested comma.  Copied from
31621 	 cp_parser_parenthesized_expression_list.  */
31622     skip_comma:
31623       if (colon)
31624 	parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
31625       ending = cp_parser_skip_to_closing_parenthesis (parser,
31626 						      /*recovering=*/true,
31627 						      /*or_comma=*/true,
31628 						      /*consume_paren=*/true);
31629       if (ending < 0)
31630 	goto get_comma;
31631     }
31632 
31633   return list;
31634 }
31635 
31636 /* Similarly, but expect leading and trailing parenthesis.  This is a very
31637    common case for omp clauses.  */
31638 
31639 static tree
31640 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
31641 {
31642   if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
31643     return cp_parser_omp_var_list_no_open (parser, kind, list, NULL);
31644   return list;
31645 }
31646 
31647 /* OpenACC 2.0:
31648    copy ( variable-list )
31649    copyin ( variable-list )
31650    copyout ( variable-list )
31651    create ( variable-list )
31652    delete ( variable-list )
31653    present ( variable-list )
31654    present_or_copy ( variable-list )
31655      pcopy ( variable-list )
31656    present_or_copyin ( variable-list )
31657      pcopyin ( variable-list )
31658    present_or_copyout ( variable-list )
31659      pcopyout ( variable-list )
31660    present_or_create ( variable-list )
31661      pcreate ( variable-list ) */
31662 
31663 static tree
31664 cp_parser_oacc_data_clause (cp_parser *parser, pragma_omp_clause c_kind,
31665 			    tree list)
31666 {
31667   enum gomp_map_kind kind;
31668   switch (c_kind)
31669     {
31670     case PRAGMA_OACC_CLAUSE_COPY:
31671       kind = GOMP_MAP_FORCE_TOFROM;
31672       break;
31673     case PRAGMA_OACC_CLAUSE_COPYIN:
31674       kind = GOMP_MAP_FORCE_TO;
31675       break;
31676     case PRAGMA_OACC_CLAUSE_COPYOUT:
31677       kind = GOMP_MAP_FORCE_FROM;
31678       break;
31679     case PRAGMA_OACC_CLAUSE_CREATE:
31680       kind = GOMP_MAP_FORCE_ALLOC;
31681       break;
31682     case PRAGMA_OACC_CLAUSE_DELETE:
31683       kind = GOMP_MAP_DELETE;
31684       break;
31685     case PRAGMA_OACC_CLAUSE_DEVICE:
31686       kind = GOMP_MAP_FORCE_TO;
31687       break;
31688     case PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT:
31689       kind = GOMP_MAP_DEVICE_RESIDENT;
31690       break;
31691     case PRAGMA_OACC_CLAUSE_HOST:
31692     case PRAGMA_OACC_CLAUSE_SELF:
31693       kind = GOMP_MAP_FORCE_FROM;
31694       break;
31695     case PRAGMA_OACC_CLAUSE_LINK:
31696       kind = GOMP_MAP_LINK;
31697       break;
31698     case PRAGMA_OACC_CLAUSE_PRESENT:
31699       kind = GOMP_MAP_FORCE_PRESENT;
31700       break;
31701     case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY:
31702       kind = GOMP_MAP_TOFROM;
31703       break;
31704     case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN:
31705       kind = GOMP_MAP_TO;
31706       break;
31707     case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT:
31708       kind = GOMP_MAP_FROM;
31709       break;
31710     case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE:
31711       kind = GOMP_MAP_ALLOC;
31712       break;
31713     default:
31714       gcc_unreachable ();
31715     }
31716   tree nl, c;
31717   nl = cp_parser_omp_var_list (parser, OMP_CLAUSE_MAP, list);
31718 
31719   for (c = nl; c != list; c = OMP_CLAUSE_CHAIN (c))
31720     OMP_CLAUSE_SET_MAP_KIND (c, kind);
31721 
31722   return nl;
31723 }
31724 
31725 /* OpenACC 2.0:
31726    deviceptr ( variable-list ) */
31727 
31728 static tree
31729 cp_parser_oacc_data_clause_deviceptr (cp_parser *parser, tree list)
31730 {
31731   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
31732   tree vars, t;
31733 
31734   /* Can't use OMP_CLAUSE_MAP here (that is, can't use the generic
31735      cp_parser_oacc_data_clause), as for PRAGMA_OACC_CLAUSE_DEVICEPTR,
31736      variable-list must only allow for pointer variables.  */
31737   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
31738   for (t = vars; t; t = TREE_CHAIN (t))
31739     {
31740       tree v = TREE_PURPOSE (t);
31741       tree u = build_omp_clause (loc, OMP_CLAUSE_MAP);
31742       OMP_CLAUSE_SET_MAP_KIND (u, GOMP_MAP_FORCE_DEVICEPTR);
31743       OMP_CLAUSE_DECL (u) = v;
31744       OMP_CLAUSE_CHAIN (u) = list;
31745       list = u;
31746     }
31747 
31748   return list;
31749 }
31750 
31751 /* OpenACC 2.0:
31752    auto
31753    independent
31754    nohost
31755    seq */
31756 
31757 static tree
31758 cp_parser_oacc_simple_clause (cp_parser * /* parser  */,
31759 			      enum omp_clause_code code,
31760 			      tree list, location_t location)
31761 {
31762   check_no_duplicate_clause (list, code, omp_clause_code_name[code], location);
31763   tree c = build_omp_clause (location, code);
31764   OMP_CLAUSE_CHAIN (c) = list;
31765   return c;
31766 }
31767 
31768  /* OpenACC:
31769    num_gangs ( expression )
31770    num_workers ( expression )
31771    vector_length ( expression )  */
31772 
31773 static tree
31774 cp_parser_oacc_single_int_clause (cp_parser *parser, omp_clause_code code,
31775 				  const char *str, tree list)
31776 {
31777   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
31778 
31779   matching_parens parens;
31780   if (!parens.require_open (parser))
31781     return list;
31782 
31783   tree t = cp_parser_assignment_expression (parser, NULL, false, false);
31784 
31785   if (t == error_mark_node
31786       || !parens.require_close (parser))
31787     {
31788       cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
31789 					     /*or_comma=*/false,
31790 					     /*consume_paren=*/true);
31791       return list;
31792     }
31793 
31794   check_no_duplicate_clause (list, code, str, loc);
31795 
31796   tree c = build_omp_clause (loc, code);
31797   OMP_CLAUSE_OPERAND (c, 0) = t;
31798   OMP_CLAUSE_CHAIN (c) = list;
31799   return c;
31800 }
31801 
31802 /* OpenACC:
31803 
31804     gang [( gang-arg-list )]
31805     worker [( [num:] int-expr )]
31806     vector [( [length:] int-expr )]
31807 
31808   where gang-arg is one of:
31809 
31810     [num:] int-expr
31811     static: size-expr
31812 
31813   and size-expr may be:
31814 
31815     *
31816     int-expr
31817 */
31818 
31819 static tree
31820 cp_parser_oacc_shape_clause (cp_parser *parser, omp_clause_code kind,
31821 			     const char *str, tree list)
31822 {
31823   const char *id = "num";
31824   cp_lexer *lexer = parser->lexer;
31825   tree ops[2] = { NULL_TREE, NULL_TREE }, c;
31826   location_t loc = cp_lexer_peek_token (lexer)->location;
31827 
31828   if (kind == OMP_CLAUSE_VECTOR)
31829     id = "length";
31830 
31831   if (cp_lexer_next_token_is (lexer, CPP_OPEN_PAREN))
31832     {
31833       matching_parens parens;
31834       parens.consume_open (parser);
31835 
31836       do
31837 	{
31838 	  cp_token *next = cp_lexer_peek_token (lexer);
31839 	  int idx = 0;
31840 
31841 	  /* Gang static argument.  */
31842 	  if (kind == OMP_CLAUSE_GANG
31843 	      && cp_lexer_next_token_is_keyword (lexer, RID_STATIC))
31844 	    {
31845 	      cp_lexer_consume_token (lexer);
31846 
31847 	      if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
31848 		goto cleanup_error;
31849 
31850 	      idx = 1;
31851 	      if (ops[idx] != NULL)
31852 		{
31853 		  cp_parser_error (parser, "too many %<static%> arguments");
31854 		  goto cleanup_error;
31855 		}
31856 
31857 	      /* Check for the '*' argument.  */
31858 	      if (cp_lexer_next_token_is (lexer, CPP_MULT)
31859 		  && (cp_lexer_nth_token_is (parser->lexer, 2, CPP_COMMA)
31860 		      || cp_lexer_nth_token_is (parser->lexer, 2,
31861 						CPP_CLOSE_PAREN)))
31862 		{
31863 		  cp_lexer_consume_token (lexer);
31864 		  ops[idx] = integer_minus_one_node;
31865 
31866 		  if (cp_lexer_next_token_is (lexer, CPP_COMMA))
31867 		    {
31868 		      cp_lexer_consume_token (lexer);
31869 		      continue;
31870 		    }
31871 		  else break;
31872 		}
31873 	    }
31874 	  /* Worker num: argument and vector length: arguments.  */
31875 	  else if (cp_lexer_next_token_is (lexer, CPP_NAME)
31876 		   && id_equal (next->u.value, id)
31877 		   && cp_lexer_nth_token_is (lexer, 2, CPP_COLON))
31878 	    {
31879 	      cp_lexer_consume_token (lexer);  /* id  */
31880 	      cp_lexer_consume_token (lexer);  /* ':'  */
31881 	    }
31882 
31883 	  /* Now collect the actual argument.  */
31884 	  if (ops[idx] != NULL_TREE)
31885 	    {
31886 	      cp_parser_error (parser, "unexpected argument");
31887 	      goto cleanup_error;
31888 	    }
31889 
31890 	  tree expr = cp_parser_assignment_expression (parser, NULL, false,
31891 						       false);
31892 	  if (expr == error_mark_node)
31893 	    goto cleanup_error;
31894 
31895 	  mark_exp_read (expr);
31896 	  ops[idx] = expr;
31897 
31898 	  if (kind == OMP_CLAUSE_GANG
31899 	      && cp_lexer_next_token_is (lexer, CPP_COMMA))
31900 	    {
31901 	      cp_lexer_consume_token (lexer);
31902 	      continue;
31903 	    }
31904 	  break;
31905 	}
31906       while (1);
31907 
31908       if (!parens.require_close (parser))
31909 	goto cleanup_error;
31910     }
31911 
31912   check_no_duplicate_clause (list, kind, str, loc);
31913 
31914   c = build_omp_clause (loc, kind);
31915 
31916   if (ops[1])
31917     OMP_CLAUSE_OPERAND (c, 1) = ops[1];
31918 
31919   OMP_CLAUSE_OPERAND (c, 0) = ops[0];
31920   OMP_CLAUSE_CHAIN (c) = list;
31921 
31922   return c;
31923 
31924  cleanup_error:
31925   cp_parser_skip_to_closing_parenthesis (parser, false, false, true);
31926   return list;
31927 }
31928 
31929 /* OpenACC 2.0:
31930    tile ( size-expr-list ) */
31931 
31932 static tree
31933 cp_parser_oacc_clause_tile (cp_parser *parser, location_t clause_loc, tree list)
31934 {
31935   tree c, expr = error_mark_node;
31936   tree tile = NULL_TREE;
31937 
31938   /* Collapse and tile are mutually exclusive.  (The spec doesn't say
31939      so, but the spec authors never considered such a case and have
31940      differing opinions on what it might mean, including 'not
31941      allowed'.)  */
31942   check_no_duplicate_clause (list, OMP_CLAUSE_TILE, "tile", clause_loc);
31943   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse",
31944 			     clause_loc);
31945 
31946   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
31947     return list;
31948 
31949   do
31950     {
31951       if (tile && !cp_parser_require (parser, CPP_COMMA, RT_COMMA))
31952 	return list;
31953 
31954       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT)
31955 	  && (cp_lexer_nth_token_is (parser->lexer, 2, CPP_COMMA)
31956 	      || cp_lexer_nth_token_is (parser->lexer, 2, CPP_CLOSE_PAREN)))
31957 	{
31958 	  cp_lexer_consume_token (parser->lexer);
31959 	  expr = integer_zero_node;
31960 	}
31961       else
31962 	expr = cp_parser_constant_expression (parser);
31963 
31964       tile = tree_cons (NULL_TREE, expr, tile);
31965     }
31966   while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN));
31967 
31968   /* Consume the trailing ')'.  */
31969   cp_lexer_consume_token (parser->lexer);
31970 
31971   c = build_omp_clause (clause_loc, OMP_CLAUSE_TILE);
31972   tile = nreverse (tile);
31973   OMP_CLAUSE_TILE_LIST (c) = tile;
31974   OMP_CLAUSE_CHAIN (c) = list;
31975   return c;
31976 }
31977 
31978 /* OpenACC 2.0
31979    Parse wait clause or directive parameters.  */
31980 
31981 static tree
31982 cp_parser_oacc_wait_list (cp_parser *parser, location_t clause_loc, tree list)
31983 {
31984   vec<tree, va_gc> *args;
31985   tree t, args_tree;
31986 
31987   args = cp_parser_parenthesized_expression_list (parser, non_attr,
31988 						  /*cast_p=*/false,
31989 						  /*allow_expansion_p=*/true,
31990 						  /*non_constant_p=*/NULL);
31991 
31992   if (args == NULL || args->length () == 0)
31993     {
31994       cp_parser_error (parser, "expected integer expression before ')'");
31995       if (args != NULL)
31996 	release_tree_vector (args);
31997       return list;
31998     }
31999 
32000   args_tree = build_tree_list_vec (args);
32001 
32002   release_tree_vector (args);
32003 
32004   for (t = args_tree; t; t = TREE_CHAIN (t))
32005     {
32006       tree targ = TREE_VALUE (t);
32007 
32008       if (targ != error_mark_node)
32009 	{
32010 	  if (!INTEGRAL_TYPE_P (TREE_TYPE (targ)))
32011 	    error ("%<wait%> expression must be integral");
32012 	  else
32013 	    {
32014 	      tree c = build_omp_clause (clause_loc, OMP_CLAUSE_WAIT);
32015 
32016 	      targ = mark_rvalue_use (targ);
32017 	      OMP_CLAUSE_DECL (c) = targ;
32018 	      OMP_CLAUSE_CHAIN (c) = list;
32019 	      list = c;
32020 	    }
32021 	}
32022     }
32023 
32024   return list;
32025 }
32026 
32027 /* OpenACC:
32028    wait ( int-expr-list ) */
32029 
32030 static tree
32031 cp_parser_oacc_clause_wait (cp_parser *parser, tree list)
32032 {
32033   location_t location = cp_lexer_peek_token (parser->lexer)->location;
32034 
32035   if (cp_lexer_peek_token (parser->lexer)->type != CPP_OPEN_PAREN)
32036     return list;
32037 
32038   list = cp_parser_oacc_wait_list (parser, location, list);
32039 
32040   return list;
32041 }
32042 
32043 /* OpenMP 3.0:
32044    collapse ( constant-expression ) */
32045 
32046 static tree
32047 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
32048 {
32049   tree c, num;
32050   location_t loc;
32051   HOST_WIDE_INT n;
32052 
32053   loc = cp_lexer_peek_token (parser->lexer)->location;
32054   matching_parens parens;
32055   if (!parens.require_open (parser))
32056     return list;
32057 
32058   num = cp_parser_constant_expression (parser);
32059 
32060   if (!parens.require_close (parser))
32061     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32062 					   /*or_comma=*/false,
32063 					   /*consume_paren=*/true);
32064 
32065   if (num == error_mark_node)
32066     return list;
32067   num = fold_non_dependent_expr (num);
32068   if (!tree_fits_shwi_p (num)
32069       || !INTEGRAL_TYPE_P (TREE_TYPE (num))
32070       || (n = tree_to_shwi (num)) <= 0
32071       || (int) n != n)
32072     {
32073       error_at (loc, "collapse argument needs positive constant integer expression");
32074       return list;
32075     }
32076 
32077   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
32078   check_no_duplicate_clause (list, OMP_CLAUSE_TILE, "tile", location);
32079   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
32080   OMP_CLAUSE_CHAIN (c) = list;
32081   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
32082 
32083   return c;
32084 }
32085 
32086 /* OpenMP 2.5:
32087    default ( none | shared )
32088 
32089    OpenACC:
32090    default ( none | present ) */
32091 
32092 static tree
32093 cp_parser_omp_clause_default (cp_parser *parser, tree list,
32094 			      location_t location, bool is_oacc)
32095 {
32096   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
32097   tree c;
32098 
32099   matching_parens parens;
32100   if (!parens.require_open (parser))
32101     return list;
32102   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32103     {
32104       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32105       const char *p = IDENTIFIER_POINTER (id);
32106 
32107       switch (p[0])
32108 	{
32109 	case 'n':
32110 	  if (strcmp ("none", p) != 0)
32111 	    goto invalid_kind;
32112 	  kind = OMP_CLAUSE_DEFAULT_NONE;
32113 	  break;
32114 
32115 	case 'p':
32116 	  if (strcmp ("present", p) != 0 || !is_oacc)
32117 	    goto invalid_kind;
32118 	  kind = OMP_CLAUSE_DEFAULT_PRESENT;
32119 	  break;
32120 
32121 	case 's':
32122 	  if (strcmp ("shared", p) != 0 || is_oacc)
32123 	    goto invalid_kind;
32124 	  kind = OMP_CLAUSE_DEFAULT_SHARED;
32125 	  break;
32126 
32127 	default:
32128 	  goto invalid_kind;
32129 	}
32130 
32131       cp_lexer_consume_token (parser->lexer);
32132     }
32133   else
32134     {
32135     invalid_kind:
32136       if (is_oacc)
32137 	cp_parser_error (parser, "expected %<none%> or %<present%>");
32138       else
32139 	cp_parser_error (parser, "expected %<none%> or %<shared%>");
32140     }
32141 
32142   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED
32143       || !parens.require_close (parser))
32144     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32145 					   /*or_comma=*/false,
32146 					   /*consume_paren=*/true);
32147 
32148   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
32149     return list;
32150 
32151   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
32152   c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
32153   OMP_CLAUSE_CHAIN (c) = list;
32154   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
32155 
32156   return c;
32157 }
32158 
32159 /* OpenMP 3.1:
32160    final ( expression ) */
32161 
32162 static tree
32163 cp_parser_omp_clause_final (cp_parser *parser, tree list, location_t location)
32164 {
32165   tree t, c;
32166 
32167   matching_parens parens;
32168   if (!parens.require_open (parser))
32169     return list;
32170 
32171   t = cp_parser_condition (parser);
32172 
32173   if (t == error_mark_node
32174       || !parens.require_close (parser))
32175     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32176 					   /*or_comma=*/false,
32177 					   /*consume_paren=*/true);
32178 
32179   check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final", location);
32180 
32181   c = build_omp_clause (location, OMP_CLAUSE_FINAL);
32182   OMP_CLAUSE_FINAL_EXPR (c) = t;
32183   OMP_CLAUSE_CHAIN (c) = list;
32184 
32185   return c;
32186 }
32187 
32188 /* OpenMP 2.5:
32189    if ( expression )
32190 
32191    OpenMP 4.5:
32192    if ( directive-name-modifier : expression )
32193 
32194    directive-name-modifier:
32195      parallel | task | taskloop | target data | target | target update
32196      | target enter data | target exit data  */
32197 
32198 static tree
32199 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location,
32200 			 bool is_omp)
32201 {
32202   tree t, c;
32203   enum tree_code if_modifier = ERROR_MARK;
32204 
32205   matching_parens parens;
32206   if (!parens.require_open (parser))
32207     return list;
32208 
32209   if (is_omp && cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32210     {
32211       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32212       const char *p = IDENTIFIER_POINTER (id);
32213       int n = 2;
32214 
32215       if (strcmp ("parallel", p) == 0)
32216 	if_modifier = OMP_PARALLEL;
32217       else if (strcmp ("task", p) == 0)
32218 	if_modifier = OMP_TASK;
32219       else if (strcmp ("taskloop", p) == 0)
32220 	if_modifier = OMP_TASKLOOP;
32221       else if (strcmp ("target", p) == 0)
32222 	{
32223 	  if_modifier = OMP_TARGET;
32224 	  if (cp_lexer_nth_token_is (parser->lexer, 2, CPP_NAME))
32225 	    {
32226 	      id = cp_lexer_peek_nth_token (parser->lexer, 2)->u.value;
32227 	      p = IDENTIFIER_POINTER (id);
32228 	      if (strcmp ("data", p) == 0)
32229 		if_modifier = OMP_TARGET_DATA;
32230 	      else if (strcmp ("update", p) == 0)
32231 		if_modifier = OMP_TARGET_UPDATE;
32232 	      else if (strcmp ("enter", p) == 0)
32233 		if_modifier = OMP_TARGET_ENTER_DATA;
32234 	      else if (strcmp ("exit", p) == 0)
32235 		if_modifier = OMP_TARGET_EXIT_DATA;
32236 	      if (if_modifier != OMP_TARGET)
32237 		n = 3;
32238 	      else
32239 		{
32240 		  location_t loc
32241 		    = cp_lexer_peek_nth_token (parser->lexer, 2)->location;
32242 		  error_at (loc, "expected %<data%>, %<update%>, %<enter%> "
32243 				 "or %<exit%>");
32244 		  if_modifier = ERROR_MARK;
32245 		}
32246 	      if (if_modifier == OMP_TARGET_ENTER_DATA
32247 		  || if_modifier == OMP_TARGET_EXIT_DATA)
32248 		{
32249 		  if (cp_lexer_nth_token_is (parser->lexer, 3, CPP_NAME))
32250 		    {
32251 		      id = cp_lexer_peek_nth_token (parser->lexer, 3)->u.value;
32252 		      p = IDENTIFIER_POINTER (id);
32253 		      if (strcmp ("data", p) == 0)
32254 			n = 4;
32255 		    }
32256 		  if (n != 4)
32257 		    {
32258 		      location_t loc
32259 			= cp_lexer_peek_nth_token (parser->lexer, 3)->location;
32260 		      error_at (loc, "expected %<data%>");
32261 		      if_modifier = ERROR_MARK;
32262 		    }
32263 		}
32264 	    }
32265 	}
32266       if (if_modifier != ERROR_MARK)
32267 	{
32268 	  if (cp_lexer_nth_token_is (parser->lexer, n, CPP_COLON))
32269 	    {
32270 	      while (n-- > 0)
32271 		cp_lexer_consume_token (parser->lexer);
32272 	    }
32273 	  else
32274 	    {
32275 	      if (n > 2)
32276 		{
32277 		  location_t loc
32278 		    = cp_lexer_peek_nth_token (parser->lexer, n)->location;
32279 		  error_at (loc, "expected %<:%>");
32280 		}
32281 	      if_modifier = ERROR_MARK;
32282 	    }
32283 	}
32284     }
32285 
32286   t = cp_parser_condition (parser);
32287 
32288   if (t == error_mark_node
32289       || !parens.require_close (parser))
32290     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32291 					   /*or_comma=*/false,
32292 					   /*consume_paren=*/true);
32293 
32294   for (c = list; c ; c = OMP_CLAUSE_CHAIN (c))
32295     if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IF)
32296       {
32297 	if (if_modifier != ERROR_MARK
32298 	    && OMP_CLAUSE_IF_MODIFIER (c) == if_modifier)
32299 	  {
32300 	    const char *p = NULL;
32301 	    switch (if_modifier)
32302 	      {
32303 	      case OMP_PARALLEL: p = "parallel"; break;
32304 	      case OMP_TASK: p = "task"; break;
32305 	      case OMP_TASKLOOP: p = "taskloop"; break;
32306 	      case OMP_TARGET_DATA: p = "target data"; break;
32307 	      case OMP_TARGET: p = "target"; break;
32308 	      case OMP_TARGET_UPDATE: p = "target update"; break;
32309 	      case OMP_TARGET_ENTER_DATA: p = "enter data"; break;
32310 	      case OMP_TARGET_EXIT_DATA: p = "exit data"; break;
32311 	      default: gcc_unreachable ();
32312 	      }
32313 	    error_at (location, "too many %<if%> clauses with %qs modifier",
32314 		      p);
32315 	    return list;
32316 	  }
32317 	else if (OMP_CLAUSE_IF_MODIFIER (c) == if_modifier)
32318 	  {
32319 	    if (!is_omp)
32320 	      error_at (location, "too many %<if%> clauses");
32321 	    else
32322 	      error_at (location, "too many %<if%> clauses without modifier");
32323 	    return list;
32324 	  }
32325 	else if (if_modifier == ERROR_MARK
32326 		 || OMP_CLAUSE_IF_MODIFIER (c) == ERROR_MARK)
32327 	  {
32328 	    error_at (location, "if any %<if%> clause has modifier, then all "
32329 				"%<if%> clauses have to use modifier");
32330 	    return list;
32331 	  }
32332       }
32333 
32334   c = build_omp_clause (location, OMP_CLAUSE_IF);
32335   OMP_CLAUSE_IF_MODIFIER (c) = if_modifier;
32336   OMP_CLAUSE_IF_EXPR (c) = t;
32337   OMP_CLAUSE_CHAIN (c) = list;
32338 
32339   return c;
32340 }
32341 
32342 /* OpenMP 3.1:
32343    mergeable */
32344 
32345 static tree
32346 cp_parser_omp_clause_mergeable (cp_parser * /*parser*/,
32347 				tree list, location_t location)
32348 {
32349   tree c;
32350 
32351   check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable",
32352 			     location);
32353 
32354   c = build_omp_clause (location, OMP_CLAUSE_MERGEABLE);
32355   OMP_CLAUSE_CHAIN (c) = list;
32356   return c;
32357 }
32358 
32359 /* OpenMP 2.5:
32360    nowait */
32361 
32362 static tree
32363 cp_parser_omp_clause_nowait (cp_parser * /*parser*/,
32364 			     tree list, location_t location)
32365 {
32366   tree c;
32367 
32368   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
32369 
32370   c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
32371   OMP_CLAUSE_CHAIN (c) = list;
32372   return c;
32373 }
32374 
32375 /* OpenMP 2.5:
32376    num_threads ( expression ) */
32377 
32378 static tree
32379 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
32380 				  location_t location)
32381 {
32382   tree t, c;
32383 
32384   matching_parens parens;
32385   if (!parens.require_open (parser))
32386     return list;
32387 
32388   t = cp_parser_expression (parser);
32389 
32390   if (t == error_mark_node
32391       || !parens.require_close (parser))
32392     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32393 					   /*or_comma=*/false,
32394 					   /*consume_paren=*/true);
32395 
32396   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
32397 			     "num_threads", location);
32398 
32399   c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
32400   OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
32401   OMP_CLAUSE_CHAIN (c) = list;
32402 
32403   return c;
32404 }
32405 
32406 /* OpenMP 4.5:
32407    num_tasks ( expression ) */
32408 
32409 static tree
32410 cp_parser_omp_clause_num_tasks (cp_parser *parser, tree list,
32411 				location_t location)
32412 {
32413   tree t, c;
32414 
32415   matching_parens parens;
32416   if (!parens.require_open (parser))
32417     return list;
32418 
32419   t = cp_parser_expression (parser);
32420 
32421   if (t == error_mark_node
32422       || !parens.require_close (parser))
32423     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32424 					   /*or_comma=*/false,
32425 					   /*consume_paren=*/true);
32426 
32427   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TASKS,
32428 			     "num_tasks", location);
32429 
32430   c = build_omp_clause (location, OMP_CLAUSE_NUM_TASKS);
32431   OMP_CLAUSE_NUM_TASKS_EXPR (c) = t;
32432   OMP_CLAUSE_CHAIN (c) = list;
32433 
32434   return c;
32435 }
32436 
32437 /* OpenMP 4.5:
32438    grainsize ( expression ) */
32439 
32440 static tree
32441 cp_parser_omp_clause_grainsize (cp_parser *parser, tree list,
32442 				location_t location)
32443 {
32444   tree t, c;
32445 
32446   matching_parens parens;
32447   if (!parens.require_open (parser))
32448     return list;
32449 
32450   t = cp_parser_expression (parser);
32451 
32452   if (t == error_mark_node
32453       || !parens.require_close (parser))
32454     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32455 					   /*or_comma=*/false,
32456 					   /*consume_paren=*/true);
32457 
32458   check_no_duplicate_clause (list, OMP_CLAUSE_GRAINSIZE,
32459 			     "grainsize", location);
32460 
32461   c = build_omp_clause (location, OMP_CLAUSE_GRAINSIZE);
32462   OMP_CLAUSE_GRAINSIZE_EXPR (c) = t;
32463   OMP_CLAUSE_CHAIN (c) = list;
32464 
32465   return c;
32466 }
32467 
32468 /* OpenMP 4.5:
32469    priority ( expression ) */
32470 
32471 static tree
32472 cp_parser_omp_clause_priority (cp_parser *parser, tree list,
32473 			       location_t location)
32474 {
32475   tree t, c;
32476 
32477   matching_parens parens;
32478   if (!parens.require_open (parser))
32479     return list;
32480 
32481   t = cp_parser_expression (parser);
32482 
32483   if (t == error_mark_node
32484       || !parens.require_close (parser))
32485     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32486 					   /*or_comma=*/false,
32487 					   /*consume_paren=*/true);
32488 
32489   check_no_duplicate_clause (list, OMP_CLAUSE_PRIORITY,
32490 			     "priority", location);
32491 
32492   c = build_omp_clause (location, OMP_CLAUSE_PRIORITY);
32493   OMP_CLAUSE_PRIORITY_EXPR (c) = t;
32494   OMP_CLAUSE_CHAIN (c) = list;
32495 
32496   return c;
32497 }
32498 
32499 /* OpenMP 4.5:
32500    hint ( expression ) */
32501 
32502 static tree
32503 cp_parser_omp_clause_hint (cp_parser *parser, tree list,
32504 			   location_t location)
32505 {
32506   tree t, c;
32507 
32508   matching_parens parens;
32509   if (!parens.require_open (parser))
32510     return list;
32511 
32512   t = cp_parser_expression (parser);
32513 
32514   if (t == error_mark_node
32515       || !parens.require_close (parser))
32516     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32517 					   /*or_comma=*/false,
32518 					   /*consume_paren=*/true);
32519 
32520   check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint", location);
32521 
32522   c = build_omp_clause (location, OMP_CLAUSE_HINT);
32523   OMP_CLAUSE_HINT_EXPR (c) = t;
32524   OMP_CLAUSE_CHAIN (c) = list;
32525 
32526   return c;
32527 }
32528 
32529 /* OpenMP 4.5:
32530    defaultmap ( tofrom : scalar ) */
32531 
32532 static tree
32533 cp_parser_omp_clause_defaultmap (cp_parser *parser, tree list,
32534 				 location_t location)
32535 {
32536   tree c, id;
32537   const char *p;
32538 
32539   matching_parens parens;
32540   if (!parens.require_open (parser))
32541     return list;
32542 
32543   if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32544     {
32545       cp_parser_error (parser, "expected %<tofrom%>");
32546       goto out_err;
32547     }
32548   id = cp_lexer_peek_token (parser->lexer)->u.value;
32549   p = IDENTIFIER_POINTER (id);
32550   if (strcmp (p, "tofrom") != 0)
32551     {
32552       cp_parser_error (parser, "expected %<tofrom%>");
32553       goto out_err;
32554     }
32555   cp_lexer_consume_token (parser->lexer);
32556   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
32557     goto out_err;
32558 
32559   if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32560     {
32561       cp_parser_error (parser, "expected %<scalar%>");
32562       goto out_err;
32563     }
32564   id = cp_lexer_peek_token (parser->lexer)->u.value;
32565   p = IDENTIFIER_POINTER (id);
32566   if (strcmp (p, "scalar") != 0)
32567     {
32568       cp_parser_error (parser, "expected %<scalar%>");
32569       goto out_err;
32570     }
32571   cp_lexer_consume_token (parser->lexer);
32572   if (!parens.require_close (parser))
32573     goto out_err;
32574 
32575   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULTMAP, "defaultmap",
32576 			     location);
32577 
32578   c = build_omp_clause (location, OMP_CLAUSE_DEFAULTMAP);
32579   OMP_CLAUSE_CHAIN (c) = list;
32580   return c;
32581 
32582  out_err:
32583   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32584 					 /*or_comma=*/false,
32585 					 /*consume_paren=*/true);
32586   return list;
32587 }
32588 
32589 /* OpenMP 2.5:
32590    ordered
32591 
32592    OpenMP 4.5:
32593    ordered ( constant-expression ) */
32594 
32595 static tree
32596 cp_parser_omp_clause_ordered (cp_parser *parser,
32597 			      tree list, location_t location)
32598 {
32599   tree c, num = NULL_TREE;
32600   HOST_WIDE_INT n;
32601 
32602   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
32603 			     "ordered", location);
32604 
32605   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
32606     {
32607       matching_parens parens;
32608       parens.consume_open (parser);
32609 
32610       num = cp_parser_constant_expression (parser);
32611 
32612       if (!parens.require_close (parser))
32613 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32614 					       /*or_comma=*/false,
32615 					       /*consume_paren=*/true);
32616 
32617       if (num == error_mark_node)
32618 	return list;
32619       num = fold_non_dependent_expr (num);
32620       if (!tree_fits_shwi_p (num)
32621 	  || !INTEGRAL_TYPE_P (TREE_TYPE (num))
32622 	  || (n = tree_to_shwi (num)) <= 0
32623 	  || (int) n != n)
32624 	{
32625 	  error_at (location,
32626 		    "ordered argument needs positive constant integer "
32627 		    "expression");
32628 	  return list;
32629 	}
32630     }
32631 
32632   c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
32633   OMP_CLAUSE_ORDERED_EXPR (c) = num;
32634   OMP_CLAUSE_CHAIN (c) = list;
32635   return c;
32636 }
32637 
32638 /* OpenMP 2.5:
32639    reduction ( reduction-operator : variable-list )
32640 
32641    reduction-operator:
32642      One of: + * - & ^ | && ||
32643 
32644    OpenMP 3.1:
32645 
32646    reduction-operator:
32647      One of: + * - & ^ | && || min max
32648 
32649    OpenMP 4.0:
32650 
32651    reduction-operator:
32652      One of: + * - & ^ | && ||
32653      id-expression  */
32654 
32655 static tree
32656 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
32657 {
32658   enum tree_code code = ERROR_MARK;
32659   tree nlist, c, id = NULL_TREE;
32660 
32661   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
32662     return list;
32663 
32664   switch (cp_lexer_peek_token (parser->lexer)->type)
32665     {
32666     case CPP_PLUS: code = PLUS_EXPR; break;
32667     case CPP_MULT: code = MULT_EXPR; break;
32668     case CPP_MINUS: code = MINUS_EXPR; break;
32669     case CPP_AND: code = BIT_AND_EXPR; break;
32670     case CPP_XOR: code = BIT_XOR_EXPR; break;
32671     case CPP_OR: code = BIT_IOR_EXPR; break;
32672     case CPP_AND_AND: code = TRUTH_ANDIF_EXPR; break;
32673     case CPP_OR_OR: code = TRUTH_ORIF_EXPR; break;
32674     default: break;
32675     }
32676 
32677   if (code != ERROR_MARK)
32678     cp_lexer_consume_token (parser->lexer);
32679   else
32680     {
32681       bool saved_colon_corrects_to_scope_p;
32682       saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
32683       parser->colon_corrects_to_scope_p = false;
32684       id = cp_parser_id_expression (parser, /*template_p=*/false,
32685 				    /*check_dependency_p=*/true,
32686 				    /*template_p=*/NULL,
32687 				    /*declarator_p=*/false,
32688 				    /*optional_p=*/false);
32689       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
32690       if (identifier_p (id))
32691 	{
32692 	  const char *p = IDENTIFIER_POINTER (id);
32693 
32694 	  if (strcmp (p, "min") == 0)
32695 	    code = MIN_EXPR;
32696 	  else if (strcmp (p, "max") == 0)
32697 	    code = MAX_EXPR;
32698 	  else if (id == ovl_op_identifier (false, PLUS_EXPR))
32699 	    code = PLUS_EXPR;
32700 	  else if (id == ovl_op_identifier (false, MULT_EXPR))
32701 	    code = MULT_EXPR;
32702 	  else if (id == ovl_op_identifier (false, MINUS_EXPR))
32703 	    code = MINUS_EXPR;
32704 	  else if (id == ovl_op_identifier (false, BIT_AND_EXPR))
32705 	    code = BIT_AND_EXPR;
32706 	  else if (id == ovl_op_identifier (false, BIT_IOR_EXPR))
32707 	    code = BIT_IOR_EXPR;
32708 	  else if (id == ovl_op_identifier (false, BIT_XOR_EXPR))
32709 	    code = BIT_XOR_EXPR;
32710 	  else if (id == ovl_op_identifier (false, TRUTH_ANDIF_EXPR))
32711 	    code = TRUTH_ANDIF_EXPR;
32712 	  else if (id == ovl_op_identifier (false, TRUTH_ORIF_EXPR))
32713 	    code = TRUTH_ORIF_EXPR;
32714 	  id = omp_reduction_id (code, id, NULL_TREE);
32715 	  tree scope = parser->scope;
32716 	  if (scope)
32717 	    id = build_qualified_name (NULL_TREE, scope, id, false);
32718 	  parser->scope = NULL_TREE;
32719 	  parser->qualifying_scope = NULL_TREE;
32720 	  parser->object_scope = NULL_TREE;
32721 	}
32722       else
32723 	{
32724 	  error ("invalid reduction-identifier");
32725 	 resync_fail:
32726 	  cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32727 						 /*or_comma=*/false,
32728 						 /*consume_paren=*/true);
32729 	  return list;
32730 	}
32731     }
32732 
32733   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
32734     goto resync_fail;
32735 
32736   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list,
32737 					  NULL);
32738   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
32739     {
32740       OMP_CLAUSE_REDUCTION_CODE (c) = code;
32741       OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = id;
32742     }
32743 
32744   return nlist;
32745 }
32746 
32747 /* OpenMP 2.5:
32748    schedule ( schedule-kind )
32749    schedule ( schedule-kind , expression )
32750 
32751    schedule-kind:
32752      static | dynamic | guided | runtime | auto
32753 
32754    OpenMP 4.5:
32755    schedule ( schedule-modifier : schedule-kind )
32756    schedule ( schedule-modifier [ , schedule-modifier ] : schedule-kind , expression )
32757 
32758    schedule-modifier:
32759      simd
32760      monotonic
32761      nonmonotonic  */
32762 
32763 static tree
32764 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
32765 {
32766   tree c, t;
32767   int modifiers = 0, nmodifiers = 0;
32768 
32769   matching_parens parens;
32770   if (!parens.require_open (parser))
32771     return list;
32772 
32773   c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
32774 
32775   while (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32776     {
32777       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32778       const char *p = IDENTIFIER_POINTER (id);
32779       if (strcmp ("simd", p) == 0)
32780 	OMP_CLAUSE_SCHEDULE_SIMD (c) = 1;
32781       else if (strcmp ("monotonic", p) == 0)
32782 	modifiers |= OMP_CLAUSE_SCHEDULE_MONOTONIC;
32783       else if (strcmp ("nonmonotonic", p) == 0)
32784 	modifiers |= OMP_CLAUSE_SCHEDULE_NONMONOTONIC;
32785       else
32786 	break;
32787       cp_lexer_consume_token (parser->lexer);
32788       if (nmodifiers++ == 0
32789 	  && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
32790 	cp_lexer_consume_token (parser->lexer);
32791       else
32792 	{
32793 	  cp_parser_require (parser, CPP_COLON, RT_COLON);
32794 	  break;
32795 	}
32796     }
32797 
32798   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
32799     {
32800       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
32801       const char *p = IDENTIFIER_POINTER (id);
32802 
32803       switch (p[0])
32804 	{
32805 	case 'd':
32806 	  if (strcmp ("dynamic", p) != 0)
32807 	    goto invalid_kind;
32808 	  OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
32809 	  break;
32810 
32811 	case 'g':
32812 	  if (strcmp ("guided", p) != 0)
32813 	    goto invalid_kind;
32814 	  OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
32815 	  break;
32816 
32817 	case 'r':
32818 	  if (strcmp ("runtime", p) != 0)
32819 	    goto invalid_kind;
32820 	  OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
32821 	  break;
32822 
32823 	default:
32824 	  goto invalid_kind;
32825 	}
32826     }
32827   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
32828     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
32829   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
32830     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
32831   else
32832     goto invalid_kind;
32833   cp_lexer_consume_token (parser->lexer);
32834 
32835   if ((modifiers & (OMP_CLAUSE_SCHEDULE_MONOTONIC
32836 		    | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
32837       == (OMP_CLAUSE_SCHEDULE_MONOTONIC
32838 	  | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
32839     {
32840       error_at (location, "both %<monotonic%> and %<nonmonotonic%> modifiers "
32841 			  "specified");
32842       modifiers = 0;
32843     }
32844 
32845   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
32846     {
32847       cp_token *token;
32848       cp_lexer_consume_token (parser->lexer);
32849 
32850       token = cp_lexer_peek_token (parser->lexer);
32851       t = cp_parser_assignment_expression (parser);
32852 
32853       if (t == error_mark_node)
32854 	goto resync_fail;
32855       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
32856 	error_at (token->location, "schedule %<runtime%> does not take "
32857 		  "a %<chunk_size%> parameter");
32858       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
32859 	error_at (token->location, "schedule %<auto%> does not take "
32860 		  "a %<chunk_size%> parameter");
32861       else
32862 	OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
32863 
32864       if (!parens.require_close (parser))
32865 	goto resync_fail;
32866     }
32867   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
32868     goto resync_fail;
32869 
32870   OMP_CLAUSE_SCHEDULE_KIND (c)
32871     = (enum omp_clause_schedule_kind)
32872       (OMP_CLAUSE_SCHEDULE_KIND (c) | modifiers);
32873 
32874   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
32875   OMP_CLAUSE_CHAIN (c) = list;
32876   return c;
32877 
32878  invalid_kind:
32879   cp_parser_error (parser, "invalid schedule kind");
32880  resync_fail:
32881   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32882 					 /*or_comma=*/false,
32883 					 /*consume_paren=*/true);
32884   return list;
32885 }
32886 
32887 /* OpenMP 3.0:
32888    untied */
32889 
32890 static tree
32891 cp_parser_omp_clause_untied (cp_parser * /*parser*/,
32892 			     tree list, location_t location)
32893 {
32894   tree c;
32895 
32896   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
32897 
32898   c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
32899   OMP_CLAUSE_CHAIN (c) = list;
32900   return c;
32901 }
32902 
32903 /* OpenMP 4.0:
32904    inbranch
32905    notinbranch */
32906 
32907 static tree
32908 cp_parser_omp_clause_branch (cp_parser * /*parser*/, enum omp_clause_code code,
32909 			     tree list, location_t location)
32910 {
32911   check_no_duplicate_clause (list, code, omp_clause_code_name[code], location);
32912   tree c = build_omp_clause (location, code);
32913   OMP_CLAUSE_CHAIN (c) = list;
32914   return c;
32915 }
32916 
32917 /* OpenMP 4.0:
32918    parallel
32919    for
32920    sections
32921    taskgroup */
32922 
32923 static tree
32924 cp_parser_omp_clause_cancelkind (cp_parser * /*parser*/,
32925 				 enum omp_clause_code code,
32926 				 tree list, location_t location)
32927 {
32928   tree c = build_omp_clause (location, code);
32929   OMP_CLAUSE_CHAIN (c) = list;
32930   return c;
32931 }
32932 
32933 /* OpenMP 4.5:
32934    nogroup */
32935 
32936 static tree
32937 cp_parser_omp_clause_nogroup (cp_parser * /*parser*/,
32938 			      tree list, location_t location)
32939 {
32940   check_no_duplicate_clause (list, OMP_CLAUSE_NOGROUP, "nogroup", location);
32941   tree c = build_omp_clause (location, OMP_CLAUSE_NOGROUP);
32942   OMP_CLAUSE_CHAIN (c) = list;
32943   return c;
32944 }
32945 
32946 /* OpenMP 4.5:
32947    simd
32948    threads */
32949 
32950 static tree
32951 cp_parser_omp_clause_orderedkind (cp_parser * /*parser*/,
32952 				  enum omp_clause_code code,
32953 				  tree list, location_t location)
32954 {
32955   check_no_duplicate_clause (list, code, omp_clause_code_name[code], location);
32956   tree c = build_omp_clause (location, code);
32957   OMP_CLAUSE_CHAIN (c) = list;
32958   return c;
32959 }
32960 
32961 /* OpenMP 4.0:
32962    num_teams ( expression ) */
32963 
32964 static tree
32965 cp_parser_omp_clause_num_teams (cp_parser *parser, tree list,
32966 				location_t location)
32967 {
32968   tree t, c;
32969 
32970   matching_parens parens;
32971   if (!parens.require_open (parser))
32972     return list;
32973 
32974   t = cp_parser_expression (parser);
32975 
32976   if (t == error_mark_node
32977       || !parens.require_close (parser))
32978     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
32979 					   /*or_comma=*/false,
32980 					   /*consume_paren=*/true);
32981 
32982   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_TEAMS,
32983 			     "num_teams", location);
32984 
32985   c = build_omp_clause (location, OMP_CLAUSE_NUM_TEAMS);
32986   OMP_CLAUSE_NUM_TEAMS_EXPR (c) = t;
32987   OMP_CLAUSE_CHAIN (c) = list;
32988 
32989   return c;
32990 }
32991 
32992 /* OpenMP 4.0:
32993    thread_limit ( expression ) */
32994 
32995 static tree
32996 cp_parser_omp_clause_thread_limit (cp_parser *parser, tree list,
32997 				   location_t location)
32998 {
32999   tree t, c;
33000 
33001   matching_parens parens;
33002   if (!parens.require_open (parser))
33003     return list;
33004 
33005   t = cp_parser_expression (parser);
33006 
33007   if (t == error_mark_node
33008       || !parens.require_close (parser))
33009     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33010 					   /*or_comma=*/false,
33011 					   /*consume_paren=*/true);
33012 
33013   check_no_duplicate_clause (list, OMP_CLAUSE_THREAD_LIMIT,
33014 			     "thread_limit", location);
33015 
33016   c = build_omp_clause (location, OMP_CLAUSE_THREAD_LIMIT);
33017   OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = t;
33018   OMP_CLAUSE_CHAIN (c) = list;
33019 
33020   return c;
33021 }
33022 
33023 /* OpenMP 4.0:
33024    aligned ( variable-list )
33025    aligned ( variable-list : constant-expression )  */
33026 
33027 static tree
33028 cp_parser_omp_clause_aligned (cp_parser *parser, tree list)
33029 {
33030   tree nlist, c, alignment = NULL_TREE;
33031   bool colon;
33032 
33033   matching_parens parens;
33034   if (!parens.require_open (parser))
33035     return list;
33036 
33037   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_ALIGNED, list,
33038 					  &colon);
33039 
33040   if (colon)
33041     {
33042       alignment = cp_parser_constant_expression (parser);
33043 
33044       if (!parens.require_close (parser))
33045 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33046 					       /*or_comma=*/false,
33047 					       /*consume_paren=*/true);
33048 
33049       if (alignment == error_mark_node)
33050 	alignment = NULL_TREE;
33051     }
33052 
33053   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
33054     OMP_CLAUSE_ALIGNED_ALIGNMENT (c) = alignment;
33055 
33056   return nlist;
33057 }
33058 
33059 /* OpenMP 4.0:
33060    linear ( variable-list )
33061    linear ( variable-list : expression )
33062 
33063    OpenMP 4.5:
33064    linear ( modifier ( variable-list ) )
33065    linear ( modifier ( variable-list ) : expression ) */
33066 
33067 static tree
33068 cp_parser_omp_clause_linear (cp_parser *parser, tree list,
33069 			     bool declare_simd)
33070 {
33071   tree nlist, c, step = integer_one_node;
33072   bool colon;
33073   enum omp_clause_linear_kind kind = OMP_CLAUSE_LINEAR_DEFAULT;
33074 
33075   matching_parens parens;
33076   if (!parens.require_open (parser))
33077     return list;
33078 
33079   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
33080     {
33081       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
33082       const char *p = IDENTIFIER_POINTER (id);
33083 
33084       if (strcmp ("ref", p) == 0)
33085 	kind = OMP_CLAUSE_LINEAR_REF;
33086       else if (strcmp ("val", p) == 0)
33087 	kind = OMP_CLAUSE_LINEAR_VAL;
33088       else if (strcmp ("uval", p) == 0)
33089 	kind = OMP_CLAUSE_LINEAR_UVAL;
33090       if (cp_lexer_nth_token_is (parser->lexer, 2, CPP_OPEN_PAREN))
33091 	cp_lexer_consume_token (parser->lexer);
33092       else
33093 	kind = OMP_CLAUSE_LINEAR_DEFAULT;
33094     }
33095 
33096   if (kind == OMP_CLAUSE_LINEAR_DEFAULT)
33097     nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_LINEAR, list,
33098 					    &colon);
33099   else
33100     {
33101       nlist = cp_parser_omp_var_list (parser, OMP_CLAUSE_LINEAR, list);
33102       colon = cp_lexer_next_token_is (parser->lexer, CPP_COLON);
33103       if (colon)
33104 	cp_parser_require (parser, CPP_COLON, RT_COLON);
33105       else if (!parens.require_close (parser))
33106 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33107 					       /*or_comma=*/false,
33108 					       /*consume_paren=*/true);
33109     }
33110 
33111   if (colon)
33112     {
33113       step = NULL_TREE;
33114       if (declare_simd
33115 	  && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
33116 	  && cp_lexer_nth_token_is (parser->lexer, 2, CPP_CLOSE_PAREN))
33117 	{
33118 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
33119 	  cp_parser_parse_tentatively (parser);
33120 	  step = cp_parser_id_expression (parser, /*template_p=*/false,
33121 					  /*check_dependency_p=*/true,
33122 					  /*template_p=*/NULL,
33123 					  /*declarator_p=*/false,
33124 					  /*optional_p=*/false);
33125 	  if (step != error_mark_node)
33126 	    step = cp_parser_lookup_name_simple (parser, step, token->location);
33127 	  if (step == error_mark_node)
33128 	    {
33129 	      step = NULL_TREE;
33130 	      cp_parser_abort_tentative_parse (parser);
33131 	    }
33132 	  else if (!cp_parser_parse_definitely (parser))
33133 	    step = NULL_TREE;
33134 	}
33135       if (!step)
33136 	step = cp_parser_expression (parser);
33137 
33138       if (!parens.require_close (parser))
33139 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33140 					       /*or_comma=*/false,
33141 					       /*consume_paren=*/true);
33142 
33143       if (step == error_mark_node)
33144 	return list;
33145     }
33146 
33147   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
33148     {
33149       OMP_CLAUSE_LINEAR_STEP (c) = step;
33150       OMP_CLAUSE_LINEAR_KIND (c) = kind;
33151     }
33152 
33153   return nlist;
33154 }
33155 
33156 /* OpenMP 4.0:
33157    safelen ( constant-expression )  */
33158 
33159 static tree
33160 cp_parser_omp_clause_safelen (cp_parser *parser, tree list,
33161 			      location_t location)
33162 {
33163   tree t, c;
33164 
33165   matching_parens parens;
33166   if (!parens.require_open (parser))
33167     return list;
33168 
33169   t = cp_parser_constant_expression (parser);
33170 
33171   if (t == error_mark_node
33172       || !parens.require_close (parser))
33173     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33174 					   /*or_comma=*/false,
33175 					   /*consume_paren=*/true);
33176 
33177   check_no_duplicate_clause (list, OMP_CLAUSE_SAFELEN, "safelen", location);
33178 
33179   c = build_omp_clause (location, OMP_CLAUSE_SAFELEN);
33180   OMP_CLAUSE_SAFELEN_EXPR (c) = t;
33181   OMP_CLAUSE_CHAIN (c) = list;
33182 
33183   return c;
33184 }
33185 
33186 /* OpenMP 4.0:
33187    simdlen ( constant-expression )  */
33188 
33189 static tree
33190 cp_parser_omp_clause_simdlen (cp_parser *parser, tree list,
33191 			      location_t location)
33192 {
33193   tree t, c;
33194 
33195   matching_parens parens;
33196   if (!parens.require_open (parser))
33197     return list;
33198 
33199   t = cp_parser_constant_expression (parser);
33200 
33201   if (t == error_mark_node
33202       || !parens.require_close (parser))
33203     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33204 					   /*or_comma=*/false,
33205 					   /*consume_paren=*/true);
33206 
33207   check_no_duplicate_clause (list, OMP_CLAUSE_SIMDLEN, "simdlen", location);
33208 
33209   c = build_omp_clause (location, OMP_CLAUSE_SIMDLEN);
33210   OMP_CLAUSE_SIMDLEN_EXPR (c) = t;
33211   OMP_CLAUSE_CHAIN (c) = list;
33212 
33213   return c;
33214 }
33215 
33216 /* OpenMP 4.5:
33217    vec:
33218      identifier [+/- integer]
33219      vec , identifier [+/- integer]
33220 */
33221 
33222 static tree
33223 cp_parser_omp_clause_depend_sink (cp_parser *parser, location_t clause_loc,
33224 				  tree list)
33225 {
33226   tree vec = NULL;
33227 
33228   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
33229     {
33230       cp_parser_error (parser, "expected identifier");
33231       return list;
33232     }
33233 
33234   while (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
33235     {
33236       location_t id_loc = cp_lexer_peek_token (parser->lexer)->location;
33237       tree t, identifier = cp_parser_identifier (parser);
33238       tree addend = NULL;
33239 
33240       if (identifier == error_mark_node)
33241 	t = error_mark_node;
33242       else
33243 	{
33244 	  t = cp_parser_lookup_name_simple
33245 		(parser, identifier,
33246 		 cp_lexer_peek_token (parser->lexer)->location);
33247 	  if (t == error_mark_node)
33248 	    cp_parser_name_lookup_error (parser, identifier, t, NLE_NULL,
33249 					 id_loc);
33250 	}
33251 
33252       bool neg = false;
33253       if (cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
33254 	neg = true;
33255       else if (!cp_lexer_next_token_is (parser->lexer, CPP_PLUS))
33256 	{
33257 	  addend = integer_zero_node;
33258 	  goto add_to_vector;
33259 	}
33260       cp_lexer_consume_token (parser->lexer);
33261 
33262       if (cp_lexer_next_token_is_not (parser->lexer, CPP_NUMBER))
33263 	{
33264 	  cp_parser_error (parser, "expected integer");
33265 	  return list;
33266 	}
33267 
33268       addend = cp_lexer_peek_token (parser->lexer)->u.value;
33269       if (TREE_CODE (addend) != INTEGER_CST)
33270 	{
33271 	  cp_parser_error (parser, "expected integer");
33272 	  return list;
33273 	}
33274       cp_lexer_consume_token (parser->lexer);
33275 
33276     add_to_vector:
33277       if (t != error_mark_node)
33278 	{
33279 	  vec = tree_cons (addend, t, vec);
33280 	  if (neg)
33281 	    OMP_CLAUSE_DEPEND_SINK_NEGATIVE (vec) = 1;
33282 	}
33283 
33284       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
33285 	break;
33286 
33287       cp_lexer_consume_token (parser->lexer);
33288     }
33289 
33290   if (cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN) && vec)
33291     {
33292       tree u = build_omp_clause (clause_loc, OMP_CLAUSE_DEPEND);
33293       OMP_CLAUSE_DEPEND_KIND (u) = OMP_CLAUSE_DEPEND_SINK;
33294       OMP_CLAUSE_DECL (u) = nreverse (vec);
33295       OMP_CLAUSE_CHAIN (u) = list;
33296       return u;
33297     }
33298   return list;
33299 }
33300 
33301 /* OpenMP 4.0:
33302    depend ( depend-kind : variable-list )
33303 
33304    depend-kind:
33305      in | out | inout
33306 
33307    OpenMP 4.5:
33308    depend ( source )
33309 
33310    depend ( sink : vec ) */
33311 
33312 static tree
33313 cp_parser_omp_clause_depend (cp_parser *parser, tree list, location_t loc)
33314 {
33315   tree nlist, c;
33316   enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_INOUT;
33317 
33318   matching_parens parens;
33319   if (!parens.require_open (parser))
33320     return list;
33321 
33322   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
33323     {
33324       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
33325       const char *p = IDENTIFIER_POINTER (id);
33326 
33327       if (strcmp ("in", p) == 0)
33328 	kind = OMP_CLAUSE_DEPEND_IN;
33329       else if (strcmp ("inout", p) == 0)
33330 	kind = OMP_CLAUSE_DEPEND_INOUT;
33331       else if (strcmp ("out", p) == 0)
33332 	kind = OMP_CLAUSE_DEPEND_OUT;
33333       else if (strcmp ("source", p) == 0)
33334 	kind = OMP_CLAUSE_DEPEND_SOURCE;
33335       else if (strcmp ("sink", p) == 0)
33336 	kind = OMP_CLAUSE_DEPEND_SINK;
33337       else
33338 	goto invalid_kind;
33339     }
33340   else
33341     goto invalid_kind;
33342 
33343   cp_lexer_consume_token (parser->lexer);
33344 
33345   if (kind == OMP_CLAUSE_DEPEND_SOURCE)
33346     {
33347       c = build_omp_clause (loc, OMP_CLAUSE_DEPEND);
33348       OMP_CLAUSE_DEPEND_KIND (c) = kind;
33349       OMP_CLAUSE_DECL (c) = NULL_TREE;
33350       OMP_CLAUSE_CHAIN (c) = list;
33351       if (!parens.require_close (parser))
33352 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33353 					       /*or_comma=*/false,
33354 					       /*consume_paren=*/true);
33355       return c;
33356     }
33357 
33358   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
33359     goto resync_fail;
33360 
33361   if (kind == OMP_CLAUSE_DEPEND_SINK)
33362     nlist = cp_parser_omp_clause_depend_sink (parser, loc, list);
33363   else
33364     {
33365       nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_DEPEND,
33366 					      list, NULL);
33367 
33368       for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
33369 	OMP_CLAUSE_DEPEND_KIND (c) = kind;
33370     }
33371   return nlist;
33372 
33373  invalid_kind:
33374   cp_parser_error (parser, "invalid depend kind");
33375  resync_fail:
33376   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33377 					 /*or_comma=*/false,
33378 					 /*consume_paren=*/true);
33379   return list;
33380 }
33381 
33382 /* OpenMP 4.0:
33383    map ( map-kind : variable-list )
33384    map ( variable-list )
33385 
33386    map-kind:
33387      alloc | to | from | tofrom
33388 
33389    OpenMP 4.5:
33390    map-kind:
33391      alloc | to | from | tofrom | release | delete
33392 
33393    map ( always [,] map-kind: variable-list ) */
33394 
33395 static tree
33396 cp_parser_omp_clause_map (cp_parser *parser, tree list)
33397 {
33398   tree nlist, c;
33399   enum gomp_map_kind kind = GOMP_MAP_TOFROM;
33400   bool always = false;
33401 
33402   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
33403     return list;
33404 
33405   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
33406     {
33407       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
33408       const char *p = IDENTIFIER_POINTER (id);
33409 
33410       if (strcmp ("always", p) == 0)
33411 	{
33412 	  int nth = 2;
33413 	  if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COMMA)
33414 	    nth++;
33415 	  if ((cp_lexer_peek_nth_token (parser->lexer, nth)->type == CPP_NAME
33416 	       || (cp_lexer_peek_nth_token (parser->lexer, nth)->keyword
33417 		   == RID_DELETE))
33418 	      && (cp_lexer_peek_nth_token (parser->lexer, nth + 1)->type
33419 		  == CPP_COLON))
33420 	    {
33421 	      always = true;
33422 	      cp_lexer_consume_token (parser->lexer);
33423 	      if (nth == 3)
33424 		cp_lexer_consume_token (parser->lexer);
33425 	    }
33426 	}
33427     }
33428 
33429   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
33430       && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
33431     {
33432       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
33433       const char *p = IDENTIFIER_POINTER (id);
33434 
33435       if (strcmp ("alloc", p) == 0)
33436 	kind = GOMP_MAP_ALLOC;
33437       else if (strcmp ("to", p) == 0)
33438 	kind = always ? GOMP_MAP_ALWAYS_TO : GOMP_MAP_TO;
33439       else if (strcmp ("from", p) == 0)
33440 	kind = always ? GOMP_MAP_ALWAYS_FROM : GOMP_MAP_FROM;
33441       else if (strcmp ("tofrom", p) == 0)
33442 	kind = always ? GOMP_MAP_ALWAYS_TOFROM : GOMP_MAP_TOFROM;
33443       else if (strcmp ("release", p) == 0)
33444 	kind = GOMP_MAP_RELEASE;
33445       else
33446 	{
33447 	  cp_parser_error (parser, "invalid map kind");
33448 	  cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33449 						 /*or_comma=*/false,
33450 						 /*consume_paren=*/true);
33451 	  return list;
33452 	}
33453       cp_lexer_consume_token (parser->lexer);
33454       cp_lexer_consume_token (parser->lexer);
33455     }
33456   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DELETE)
33457 	   && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
33458     {
33459       kind = GOMP_MAP_DELETE;
33460       cp_lexer_consume_token (parser->lexer);
33461       cp_lexer_consume_token (parser->lexer);
33462     }
33463 
33464   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_MAP, list,
33465 					  NULL);
33466 
33467   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
33468     OMP_CLAUSE_SET_MAP_KIND (c, kind);
33469 
33470   return nlist;
33471 }
33472 
33473 /* OpenMP 4.0:
33474    device ( expression ) */
33475 
33476 static tree
33477 cp_parser_omp_clause_device (cp_parser *parser, tree list,
33478 			     location_t location)
33479 {
33480   tree t, c;
33481 
33482   matching_parens parens;
33483   if (!parens.require_open (parser))
33484     return list;
33485 
33486   t = cp_parser_expression (parser);
33487 
33488   if (t == error_mark_node
33489       || !parens.require_close (parser))
33490     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33491 					   /*or_comma=*/false,
33492 					   /*consume_paren=*/true);
33493 
33494   check_no_duplicate_clause (list, OMP_CLAUSE_DEVICE,
33495 			     "device", location);
33496 
33497   c = build_omp_clause (location, OMP_CLAUSE_DEVICE);
33498   OMP_CLAUSE_DEVICE_ID (c) = t;
33499   OMP_CLAUSE_CHAIN (c) = list;
33500 
33501   return c;
33502 }
33503 
33504 /* OpenMP 4.0:
33505    dist_schedule ( static )
33506    dist_schedule ( static , expression )  */
33507 
33508 static tree
33509 cp_parser_omp_clause_dist_schedule (cp_parser *parser, tree list,
33510 				    location_t location)
33511 {
33512   tree c, t;
33513 
33514   matching_parens parens;
33515   if (!parens.require_open (parser))
33516     return list;
33517 
33518   c = build_omp_clause (location, OMP_CLAUSE_DIST_SCHEDULE);
33519 
33520   if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
33521     goto invalid_kind;
33522   cp_lexer_consume_token (parser->lexer);
33523 
33524   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
33525     {
33526       cp_lexer_consume_token (parser->lexer);
33527 
33528       t = cp_parser_assignment_expression (parser);
33529 
33530       if (t == error_mark_node)
33531 	goto resync_fail;
33532       OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = t;
33533 
33534       if (!parens.require_close (parser))
33535 	goto resync_fail;
33536     }
33537   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
33538     goto resync_fail;
33539 
33540   check_no_duplicate_clause (list, OMP_CLAUSE_DIST_SCHEDULE, "dist_schedule",
33541 			     location);
33542   OMP_CLAUSE_CHAIN (c) = list;
33543   return c;
33544 
33545  invalid_kind:
33546   cp_parser_error (parser, "invalid dist_schedule kind");
33547  resync_fail:
33548   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33549 					 /*or_comma=*/false,
33550 					 /*consume_paren=*/true);
33551   return list;
33552 }
33553 
33554 /* OpenMP 4.0:
33555    proc_bind ( proc-bind-kind )
33556 
33557    proc-bind-kind:
33558      master | close | spread  */
33559 
33560 static tree
33561 cp_parser_omp_clause_proc_bind (cp_parser *parser, tree list,
33562 				location_t location)
33563 {
33564   tree c;
33565   enum omp_clause_proc_bind_kind kind;
33566 
33567   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
33568     return list;
33569 
33570   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
33571     {
33572       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
33573       const char *p = IDENTIFIER_POINTER (id);
33574 
33575       if (strcmp ("master", p) == 0)
33576 	kind = OMP_CLAUSE_PROC_BIND_MASTER;
33577       else if (strcmp ("close", p) == 0)
33578 	kind = OMP_CLAUSE_PROC_BIND_CLOSE;
33579       else if (strcmp ("spread", p) == 0)
33580 	kind = OMP_CLAUSE_PROC_BIND_SPREAD;
33581       else
33582 	goto invalid_kind;
33583     }
33584   else
33585     goto invalid_kind;
33586 
33587   cp_lexer_consume_token (parser->lexer);
33588   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
33589     goto resync_fail;
33590 
33591   c = build_omp_clause (location, OMP_CLAUSE_PROC_BIND);
33592   check_no_duplicate_clause (list, OMP_CLAUSE_PROC_BIND, "proc_bind",
33593 			     location);
33594   OMP_CLAUSE_PROC_BIND_KIND (c) = kind;
33595   OMP_CLAUSE_CHAIN (c) = list;
33596   return c;
33597 
33598  invalid_kind:
33599   cp_parser_error (parser, "invalid depend kind");
33600  resync_fail:
33601   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33602 					 /*or_comma=*/false,
33603 					 /*consume_paren=*/true);
33604   return list;
33605 }
33606 
33607 /* OpenACC:
33608    async [( int-expr )] */
33609 
33610 static tree
33611 cp_parser_oacc_clause_async (cp_parser *parser, tree list)
33612 {
33613   tree c, t;
33614   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
33615 
33616   t = build_int_cst (integer_type_node, GOMP_ASYNC_NOVAL);
33617 
33618   if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
33619     {
33620       matching_parens parens;
33621       parens.consume_open (parser);
33622 
33623       t = cp_parser_expression (parser);
33624       if (t == error_mark_node
33625 	  || !parens.require_close (parser))
33626 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
33627 						/*or_comma=*/false,
33628 						/*consume_paren=*/true);
33629     }
33630 
33631   check_no_duplicate_clause (list, OMP_CLAUSE_ASYNC, "async", loc);
33632 
33633   c = build_omp_clause (loc, OMP_CLAUSE_ASYNC);
33634   OMP_CLAUSE_ASYNC_EXPR (c) = t;
33635   OMP_CLAUSE_CHAIN (c) = list;
33636   list = c;
33637 
33638   return list;
33639 }
33640 
33641 /* Parse all OpenACC clauses.  The set clauses allowed by the directive
33642    is a bitmask in MASK.  Return the list of clauses found.  */
33643 
33644 static tree
33645 cp_parser_oacc_all_clauses (cp_parser *parser, omp_clause_mask mask,
33646 			   const char *where, cp_token *pragma_tok,
33647 			   bool finish_p = true)
33648 {
33649   tree clauses = NULL;
33650   bool first = true;
33651 
33652   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
33653     {
33654       location_t here;
33655       pragma_omp_clause c_kind;
33656       omp_clause_code code;
33657       const char *c_name;
33658       tree prev = clauses;
33659 
33660       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
33661 	cp_lexer_consume_token (parser->lexer);
33662 
33663       here = cp_lexer_peek_token (parser->lexer)->location;
33664       c_kind = cp_parser_omp_clause_name (parser);
33665 
33666       switch (c_kind)
33667 	{
33668 	case PRAGMA_OACC_CLAUSE_ASYNC:
33669 	  clauses = cp_parser_oacc_clause_async (parser, clauses);
33670 	  c_name = "async";
33671 	  break;
33672 	case PRAGMA_OACC_CLAUSE_AUTO:
33673 	  clauses = cp_parser_oacc_simple_clause (parser, OMP_CLAUSE_AUTO,
33674 						 clauses, here);
33675 	  c_name = "auto";
33676 	  break;
33677 	case PRAGMA_OACC_CLAUSE_COLLAPSE:
33678 	  clauses = cp_parser_omp_clause_collapse (parser, clauses, here);
33679 	  c_name = "collapse";
33680 	  break;
33681 	case PRAGMA_OACC_CLAUSE_COPY:
33682 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33683 	  c_name = "copy";
33684 	  break;
33685 	case PRAGMA_OACC_CLAUSE_COPYIN:
33686 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33687 	  c_name = "copyin";
33688 	  break;
33689 	case PRAGMA_OACC_CLAUSE_COPYOUT:
33690 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33691 	  c_name = "copyout";
33692 	  break;
33693 	case PRAGMA_OACC_CLAUSE_CREATE:
33694 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33695 	  c_name = "create";
33696 	  break;
33697 	case PRAGMA_OACC_CLAUSE_DELETE:
33698 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33699 	  c_name = "delete";
33700 	  break;
33701 	case PRAGMA_OMP_CLAUSE_DEFAULT:
33702 	  clauses = cp_parser_omp_clause_default (parser, clauses, here, true);
33703 	  c_name = "default";
33704 	  break;
33705 	case PRAGMA_OACC_CLAUSE_DEVICE:
33706 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33707 	  c_name = "device";
33708 	  break;
33709 	case PRAGMA_OACC_CLAUSE_DEVICEPTR:
33710 	  clauses = cp_parser_oacc_data_clause_deviceptr (parser, clauses);
33711 	  c_name = "deviceptr";
33712 	  break;
33713 	case PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT:
33714 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33715 	  c_name = "device_resident";
33716 	  break;
33717 	case PRAGMA_OACC_CLAUSE_FIRSTPRIVATE:
33718 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
33719 					    clauses);
33720 	  c_name = "firstprivate";
33721 	  break;
33722 	case PRAGMA_OACC_CLAUSE_GANG:
33723 	  c_name = "gang";
33724 	  clauses = cp_parser_oacc_shape_clause (parser, OMP_CLAUSE_GANG,
33725 						 c_name, clauses);
33726 	  break;
33727 	case PRAGMA_OACC_CLAUSE_HOST:
33728 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33729 	  c_name = "host";
33730 	  break;
33731 	case PRAGMA_OACC_CLAUSE_IF:
33732 	  clauses = cp_parser_omp_clause_if (parser, clauses, here, false);
33733 	  c_name = "if";
33734 	  break;
33735 	case PRAGMA_OACC_CLAUSE_INDEPENDENT:
33736 	  clauses = cp_parser_oacc_simple_clause (parser,
33737 						  OMP_CLAUSE_INDEPENDENT,
33738 						  clauses, here);
33739 	  c_name = "independent";
33740 	  break;
33741 	case PRAGMA_OACC_CLAUSE_LINK:
33742 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33743 	  c_name = "link";
33744 	  break;
33745 	case PRAGMA_OACC_CLAUSE_NUM_GANGS:
33746 	  code = OMP_CLAUSE_NUM_GANGS;
33747 	  c_name = "num_gangs";
33748 	  clauses = cp_parser_oacc_single_int_clause (parser, code, c_name,
33749 						      clauses);
33750 	  break;
33751 	case PRAGMA_OACC_CLAUSE_NUM_WORKERS:
33752 	  c_name = "num_workers";
33753 	  code = OMP_CLAUSE_NUM_WORKERS;
33754 	  clauses = cp_parser_oacc_single_int_clause (parser, code, c_name,
33755 						      clauses);
33756 	  break;
33757 	case PRAGMA_OACC_CLAUSE_PRESENT:
33758 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33759 	  c_name = "present";
33760 	  break;
33761 	case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY:
33762 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33763 	  c_name = "present_or_copy";
33764 	  break;
33765 	case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN:
33766 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33767 	  c_name = "present_or_copyin";
33768 	  break;
33769 	case PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT:
33770 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33771 	  c_name = "present_or_copyout";
33772 	  break;
33773 	case PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE:
33774 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33775 	  c_name = "present_or_create";
33776 	  break;
33777 	case PRAGMA_OACC_CLAUSE_PRIVATE:
33778 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
33779 					    clauses);
33780 	  c_name = "private";
33781 	  break;
33782 	case PRAGMA_OACC_CLAUSE_REDUCTION:
33783 	  clauses = cp_parser_omp_clause_reduction (parser, clauses);
33784 	  c_name = "reduction";
33785 	  break;
33786 	case PRAGMA_OACC_CLAUSE_SELF:
33787 	  clauses = cp_parser_oacc_data_clause (parser, c_kind, clauses);
33788 	  c_name = "self";
33789 	  break;
33790 	case PRAGMA_OACC_CLAUSE_SEQ:
33791 	  clauses = cp_parser_oacc_simple_clause (parser, OMP_CLAUSE_SEQ,
33792 						 clauses, here);
33793 	  c_name = "seq";
33794 	  break;
33795 	case PRAGMA_OACC_CLAUSE_TILE:
33796 	  clauses = cp_parser_oacc_clause_tile (parser, here, clauses);
33797 	  c_name = "tile";
33798 	  break;
33799 	case PRAGMA_OACC_CLAUSE_USE_DEVICE:
33800 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_USE_DEVICE_PTR,
33801 					    clauses);
33802 	  c_name = "use_device";
33803 	  break;
33804 	case PRAGMA_OACC_CLAUSE_VECTOR:
33805 	  c_name = "vector";
33806 	  clauses = cp_parser_oacc_shape_clause (parser, OMP_CLAUSE_VECTOR,
33807 						 c_name, clauses);
33808 	  break;
33809 	case PRAGMA_OACC_CLAUSE_VECTOR_LENGTH:
33810 	  c_name = "vector_length";
33811 	  code = OMP_CLAUSE_VECTOR_LENGTH;
33812 	  clauses = cp_parser_oacc_single_int_clause (parser, code, c_name,
33813 						      clauses);
33814 	  break;
33815 	case PRAGMA_OACC_CLAUSE_WAIT:
33816 	  clauses = cp_parser_oacc_clause_wait (parser, clauses);
33817 	  c_name = "wait";
33818 	  break;
33819 	case PRAGMA_OACC_CLAUSE_WORKER:
33820 	  c_name = "worker";
33821 	  clauses = cp_parser_oacc_shape_clause (parser, OMP_CLAUSE_WORKER,
33822 						 c_name, clauses);
33823 	  break;
33824 	default:
33825 	  cp_parser_error (parser, "expected %<#pragma acc%> clause");
33826 	  goto saw_error;
33827 	}
33828 
33829       first = false;
33830 
33831       if (((mask >> c_kind) & 1) == 0)
33832 	{
33833 	  /* Remove the invalid clause(s) from the list to avoid
33834 	     confusing the rest of the compiler.  */
33835 	  clauses = prev;
33836 	  error_at (here, "%qs is not valid for %qs", c_name, where);
33837 	}
33838     }
33839 
33840  saw_error:
33841   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
33842 
33843   if (finish_p)
33844     return finish_omp_clauses (clauses, C_ORT_ACC);
33845 
33846   return clauses;
33847 }
33848 
33849 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
33850    is a bitmask in MASK.  Return the list of clauses found; the result
33851    of clause default goes in *pdefault.  */
33852 
33853 static tree
33854 cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask,
33855 			   const char *where, cp_token *pragma_tok,
33856 			   bool finish_p = true)
33857 {
33858   tree clauses = NULL;
33859   bool first = true;
33860   cp_token *token = NULL;
33861 
33862   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
33863     {
33864       pragma_omp_clause c_kind;
33865       const char *c_name;
33866       tree prev = clauses;
33867 
33868       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
33869 	cp_lexer_consume_token (parser->lexer);
33870 
33871       token = cp_lexer_peek_token (parser->lexer);
33872       c_kind = cp_parser_omp_clause_name (parser);
33873 
33874       switch (c_kind)
33875 	{
33876 	case PRAGMA_OMP_CLAUSE_COLLAPSE:
33877 	  clauses = cp_parser_omp_clause_collapse (parser, clauses,
33878 						   token->location);
33879 	  c_name = "collapse";
33880 	  break;
33881 	case PRAGMA_OMP_CLAUSE_COPYIN:
33882 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
33883 	  c_name = "copyin";
33884 	  break;
33885 	case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
33886 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
33887 					    clauses);
33888 	  c_name = "copyprivate";
33889 	  break;
33890 	case PRAGMA_OMP_CLAUSE_DEFAULT:
33891 	  clauses = cp_parser_omp_clause_default (parser, clauses,
33892 						  token->location, false);
33893 	  c_name = "default";
33894 	  break;
33895 	case PRAGMA_OMP_CLAUSE_FINAL:
33896 	  clauses = cp_parser_omp_clause_final (parser, clauses, token->location);
33897 	  c_name = "final";
33898 	  break;
33899 	case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
33900 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
33901 					    clauses);
33902 	  c_name = "firstprivate";
33903 	  break;
33904 	case PRAGMA_OMP_CLAUSE_GRAINSIZE:
33905 	  clauses = cp_parser_omp_clause_grainsize (parser, clauses,
33906 						    token->location);
33907 	  c_name = "grainsize";
33908 	  break;
33909 	case PRAGMA_OMP_CLAUSE_HINT:
33910 	  clauses = cp_parser_omp_clause_hint (parser, clauses,
33911 					       token->location);
33912 	  c_name = "hint";
33913 	  break;
33914 	case PRAGMA_OMP_CLAUSE_DEFAULTMAP:
33915 	  clauses = cp_parser_omp_clause_defaultmap (parser, clauses,
33916 						     token->location);
33917 	  c_name = "defaultmap";
33918 	  break;
33919 	case PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR:
33920 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_USE_DEVICE_PTR,
33921 					    clauses);
33922 	  c_name = "use_device_ptr";
33923 	  break;
33924 	case PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR:
33925 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_IS_DEVICE_PTR,
33926 					    clauses);
33927 	  c_name = "is_device_ptr";
33928 	  break;
33929 	case PRAGMA_OMP_CLAUSE_IF:
33930 	  clauses = cp_parser_omp_clause_if (parser, clauses, token->location,
33931 					     true);
33932 	  c_name = "if";
33933 	  break;
33934 	case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
33935 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
33936 					    clauses);
33937 	  c_name = "lastprivate";
33938 	  break;
33939 	case PRAGMA_OMP_CLAUSE_MERGEABLE:
33940 	  clauses = cp_parser_omp_clause_mergeable (parser, clauses,
33941 						    token->location);
33942 	  c_name = "mergeable";
33943 	  break;
33944 	case PRAGMA_OMP_CLAUSE_NOWAIT:
33945 	  clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
33946 	  c_name = "nowait";
33947 	  break;
33948 	case PRAGMA_OMP_CLAUSE_NUM_TASKS:
33949 	  clauses = cp_parser_omp_clause_num_tasks (parser, clauses,
33950 						    token->location);
33951 	  c_name = "num_tasks";
33952 	  break;
33953 	case PRAGMA_OMP_CLAUSE_NUM_THREADS:
33954 	  clauses = cp_parser_omp_clause_num_threads (parser, clauses,
33955 						      token->location);
33956 	  c_name = "num_threads";
33957 	  break;
33958 	case PRAGMA_OMP_CLAUSE_ORDERED:
33959 	  clauses = cp_parser_omp_clause_ordered (parser, clauses,
33960 						  token->location);
33961 	  c_name = "ordered";
33962 	  break;
33963 	case PRAGMA_OMP_CLAUSE_PRIORITY:
33964 	  clauses = cp_parser_omp_clause_priority (parser, clauses,
33965 						   token->location);
33966 	  c_name = "priority";
33967 	  break;
33968 	case PRAGMA_OMP_CLAUSE_PRIVATE:
33969 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
33970 					    clauses);
33971 	  c_name = "private";
33972 	  break;
33973 	case PRAGMA_OMP_CLAUSE_REDUCTION:
33974 	  clauses = cp_parser_omp_clause_reduction (parser, clauses);
33975 	  c_name = "reduction";
33976 	  break;
33977 	case PRAGMA_OMP_CLAUSE_SCHEDULE:
33978 	  clauses = cp_parser_omp_clause_schedule (parser, clauses,
33979 						   token->location);
33980 	  c_name = "schedule";
33981 	  break;
33982 	case PRAGMA_OMP_CLAUSE_SHARED:
33983 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
33984 					    clauses);
33985 	  c_name = "shared";
33986 	  break;
33987 	case PRAGMA_OMP_CLAUSE_UNTIED:
33988 	  clauses = cp_parser_omp_clause_untied (parser, clauses,
33989 						 token->location);
33990 	  c_name = "untied";
33991 	  break;
33992 	case PRAGMA_OMP_CLAUSE_INBRANCH:
33993 	  clauses = cp_parser_omp_clause_branch (parser, OMP_CLAUSE_INBRANCH,
33994 						 clauses, token->location);
33995 	  c_name = "inbranch";
33996 	  break;
33997 	case PRAGMA_OMP_CLAUSE_NOTINBRANCH:
33998 	  clauses = cp_parser_omp_clause_branch (parser,
33999 						 OMP_CLAUSE_NOTINBRANCH,
34000 						 clauses, token->location);
34001 	  c_name = "notinbranch";
34002 	  break;
34003 	case PRAGMA_OMP_CLAUSE_PARALLEL:
34004 	  clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_PARALLEL,
34005 						     clauses, token->location);
34006 	  c_name = "parallel";
34007 	  if (!first)
34008 	    {
34009 	     clause_not_first:
34010 	      error_at (token->location, "%qs must be the first clause of %qs",
34011 			c_name, where);
34012 	      clauses = prev;
34013 	    }
34014 	  break;
34015 	case PRAGMA_OMP_CLAUSE_FOR:
34016 	  clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_FOR,
34017 						     clauses, token->location);
34018 	  c_name = "for";
34019 	  if (!first)
34020 	    goto clause_not_first;
34021 	  break;
34022 	case PRAGMA_OMP_CLAUSE_SECTIONS:
34023 	  clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_SECTIONS,
34024 						     clauses, token->location);
34025 	  c_name = "sections";
34026 	  if (!first)
34027 	    goto clause_not_first;
34028 	  break;
34029 	case PRAGMA_OMP_CLAUSE_TASKGROUP:
34030 	  clauses = cp_parser_omp_clause_cancelkind (parser, OMP_CLAUSE_TASKGROUP,
34031 						     clauses, token->location);
34032 	  c_name = "taskgroup";
34033 	  if (!first)
34034 	    goto clause_not_first;
34035 	  break;
34036 	case PRAGMA_OMP_CLAUSE_LINK:
34037 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LINK, clauses);
34038 	  c_name = "to";
34039 	  break;
34040 	case PRAGMA_OMP_CLAUSE_TO:
34041 	  if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) != 0)
34042 	    clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO_DECLARE,
34043 					      clauses);
34044 	  else
34045 	    clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO, clauses);
34046 	  c_name = "to";
34047 	  break;
34048 	case PRAGMA_OMP_CLAUSE_FROM:
34049 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FROM, clauses);
34050 	  c_name = "from";
34051 	  break;
34052 	case PRAGMA_OMP_CLAUSE_UNIFORM:
34053 	  clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_UNIFORM,
34054 					    clauses);
34055 	  c_name = "uniform";
34056 	  break;
34057 	case PRAGMA_OMP_CLAUSE_NUM_TEAMS:
34058 	  clauses = cp_parser_omp_clause_num_teams (parser, clauses,
34059 						    token->location);
34060 	  c_name = "num_teams";
34061 	  break;
34062 	case PRAGMA_OMP_CLAUSE_THREAD_LIMIT:
34063 	  clauses = cp_parser_omp_clause_thread_limit (parser, clauses,
34064 						       token->location);
34065 	  c_name = "thread_limit";
34066 	  break;
34067 	case PRAGMA_OMP_CLAUSE_ALIGNED:
34068 	  clauses = cp_parser_omp_clause_aligned (parser, clauses);
34069 	  c_name = "aligned";
34070 	  break;
34071 	case PRAGMA_OMP_CLAUSE_LINEAR:
34072 	  {
34073 	    bool declare_simd = false;
34074 	    if (((mask >> PRAGMA_OMP_CLAUSE_UNIFORM) & 1) != 0)
34075 	      declare_simd = true;
34076 	    clauses = cp_parser_omp_clause_linear (parser, clauses, declare_simd);
34077 	  }
34078 	  c_name = "linear";
34079 	  break;
34080 	case PRAGMA_OMP_CLAUSE_DEPEND:
34081 	  clauses = cp_parser_omp_clause_depend (parser, clauses,
34082 						 token->location);
34083 	  c_name = "depend";
34084 	  break;
34085 	case PRAGMA_OMP_CLAUSE_MAP:
34086 	  clauses = cp_parser_omp_clause_map (parser, clauses);
34087 	  c_name = "map";
34088 	  break;
34089 	case PRAGMA_OMP_CLAUSE_DEVICE:
34090 	  clauses = cp_parser_omp_clause_device (parser, clauses,
34091 						 token->location);
34092 	  c_name = "device";
34093 	  break;
34094 	case PRAGMA_OMP_CLAUSE_DIST_SCHEDULE:
34095 	  clauses = cp_parser_omp_clause_dist_schedule (parser, clauses,
34096 							token->location);
34097 	  c_name = "dist_schedule";
34098 	  break;
34099 	case PRAGMA_OMP_CLAUSE_PROC_BIND:
34100 	  clauses = cp_parser_omp_clause_proc_bind (parser, clauses,
34101 						    token->location);
34102 	  c_name = "proc_bind";
34103 	  break;
34104 	case PRAGMA_OMP_CLAUSE_SAFELEN:
34105 	  clauses = cp_parser_omp_clause_safelen (parser, clauses,
34106 						  token->location);
34107 	  c_name = "safelen";
34108 	  break;
34109 	case PRAGMA_OMP_CLAUSE_SIMDLEN:
34110 	  clauses = cp_parser_omp_clause_simdlen (parser, clauses,
34111 						  token->location);
34112 	  c_name = "simdlen";
34113 	  break;
34114 	case PRAGMA_OMP_CLAUSE_NOGROUP:
34115 	  clauses = cp_parser_omp_clause_nogroup (parser, clauses,
34116 						  token->location);
34117 	  c_name = "nogroup";
34118 	  break;
34119 	case PRAGMA_OMP_CLAUSE_THREADS:
34120 	  clauses
34121 	    = cp_parser_omp_clause_orderedkind (parser, OMP_CLAUSE_THREADS,
34122 						clauses, token->location);
34123 	  c_name = "threads";
34124 	  break;
34125 	case PRAGMA_OMP_CLAUSE_SIMD:
34126 	  clauses
34127 	    = cp_parser_omp_clause_orderedkind (parser, OMP_CLAUSE_SIMD,
34128 						clauses, token->location);
34129 	  c_name = "simd";
34130 	  break;
34131 	default:
34132 	  cp_parser_error (parser, "expected %<#pragma omp%> clause");
34133 	  goto saw_error;
34134 	}
34135 
34136       first = false;
34137 
34138       if (((mask >> c_kind) & 1) == 0)
34139 	{
34140 	  /* Remove the invalid clause(s) from the list to avoid
34141 	     confusing the rest of the compiler.  */
34142 	  clauses = prev;
34143 	  error_at (token->location, "%qs is not valid for %qs", c_name, where);
34144 	}
34145     }
34146  saw_error:
34147   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
34148   if (finish_p)
34149     {
34150       if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM)) != 0)
34151 	return finish_omp_clauses (clauses, C_ORT_OMP_DECLARE_SIMD);
34152       else
34153 	return finish_omp_clauses (clauses, C_ORT_OMP);
34154     }
34155   return clauses;
34156 }
34157 
34158 /* OpenMP 2.5:
34159    structured-block:
34160      statement
34161 
34162    In practice, we're also interested in adding the statement to an
34163    outer node.  So it is convenient if we work around the fact that
34164    cp_parser_statement calls add_stmt.  */
34165 
34166 static unsigned
34167 cp_parser_begin_omp_structured_block (cp_parser *parser)
34168 {
34169   unsigned save = parser->in_statement;
34170 
34171   /* Only move the values to IN_OMP_BLOCK if they weren't false.
34172      This preserves the "not within loop or switch" style error messages
34173      for nonsense cases like
34174 	void foo() {
34175 	#pragma omp single
34176 	  break;
34177 	}
34178   */
34179   if (parser->in_statement)
34180     parser->in_statement = IN_OMP_BLOCK;
34181 
34182   return save;
34183 }
34184 
34185 static void
34186 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
34187 {
34188   parser->in_statement = save;
34189 }
34190 
34191 static tree
34192 cp_parser_omp_structured_block (cp_parser *parser, bool *if_p)
34193 {
34194   tree stmt = begin_omp_structured_block ();
34195   unsigned int save = cp_parser_begin_omp_structured_block (parser);
34196 
34197   cp_parser_statement (parser, NULL_TREE, false, if_p);
34198 
34199   cp_parser_end_omp_structured_block (parser, save);
34200   return finish_omp_structured_block (stmt);
34201 }
34202 
34203 /* OpenMP 2.5:
34204    # pragma omp atomic new-line
34205      expression-stmt
34206 
34207    expression-stmt:
34208      x binop= expr | x++ | ++x | x-- | --x
34209    binop:
34210      +, *, -, /, &, ^, |, <<, >>
34211 
34212   where x is an lvalue expression with scalar type.
34213 
34214    OpenMP 3.1:
34215    # pragma omp atomic new-line
34216      update-stmt
34217 
34218    # pragma omp atomic read new-line
34219      read-stmt
34220 
34221    # pragma omp atomic write new-line
34222      write-stmt
34223 
34224    # pragma omp atomic update new-line
34225      update-stmt
34226 
34227    # pragma omp atomic capture new-line
34228      capture-stmt
34229 
34230    # pragma omp atomic capture new-line
34231      capture-block
34232 
34233    read-stmt:
34234      v = x
34235    write-stmt:
34236      x = expr
34237    update-stmt:
34238      expression-stmt | x = x binop expr
34239    capture-stmt:
34240      v = expression-stmt
34241    capture-block:
34242      { v = x; update-stmt; } | { update-stmt; v = x; }
34243 
34244    OpenMP 4.0:
34245    update-stmt:
34246      expression-stmt | x = x binop expr | x = expr binop x
34247    capture-stmt:
34248      v = update-stmt
34249    capture-block:
34250      { v = x; update-stmt; } | { update-stmt; v = x; } | { v = x; x = expr; }
34251 
34252   where x and v are lvalue expressions with scalar type.  */
34253 
34254 static void
34255 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
34256 {
34257   tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE, lhs1 = NULL_TREE;
34258   tree rhs1 = NULL_TREE, orig_lhs;
34259   enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
34260   bool structured_block = false;
34261   bool seq_cst = false;
34262 
34263   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
34264     {
34265       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
34266       const char *p = IDENTIFIER_POINTER (id);
34267 
34268       if (!strcmp (p, "seq_cst"))
34269 	{
34270 	  seq_cst = true;
34271 	  cp_lexer_consume_token (parser->lexer);
34272 	  if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
34273 	      && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
34274 	    cp_lexer_consume_token (parser->lexer);
34275 	}
34276     }
34277   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
34278     {
34279       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
34280       const char *p = IDENTIFIER_POINTER (id);
34281 
34282       if (!strcmp (p, "read"))
34283 	code = OMP_ATOMIC_READ;
34284       else if (!strcmp (p, "write"))
34285 	code = NOP_EXPR;
34286       else if (!strcmp (p, "update"))
34287 	code = OMP_ATOMIC;
34288       else if (!strcmp (p, "capture"))
34289 	code = OMP_ATOMIC_CAPTURE_NEW;
34290       else
34291 	p = NULL;
34292       if (p)
34293 	cp_lexer_consume_token (parser->lexer);
34294     }
34295   if (!seq_cst)
34296     {
34297       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
34298 	  && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME)
34299 	cp_lexer_consume_token (parser->lexer);
34300 
34301       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
34302 	{
34303 	  tree id = cp_lexer_peek_token (parser->lexer)->u.value;
34304 	  const char *p = IDENTIFIER_POINTER (id);
34305 
34306 	  if (!strcmp (p, "seq_cst"))
34307 	    {
34308 	      seq_cst = true;
34309 	      cp_lexer_consume_token (parser->lexer);
34310 	    }
34311 	}
34312     }
34313   cp_parser_require_pragma_eol (parser, pragma_tok);
34314 
34315   switch (code)
34316     {
34317     case OMP_ATOMIC_READ:
34318     case NOP_EXPR: /* atomic write */
34319       v = cp_parser_unary_expression (parser);
34320       if (v == error_mark_node)
34321 	goto saw_error;
34322       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
34323 	goto saw_error;
34324       if (code == NOP_EXPR)
34325 	lhs = cp_parser_expression (parser);
34326       else
34327 	lhs = cp_parser_unary_expression (parser);
34328       if (lhs == error_mark_node)
34329 	goto saw_error;
34330       if (code == NOP_EXPR)
34331 	{
34332 	  /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
34333 	     opcode.  */
34334 	  code = OMP_ATOMIC;
34335 	  rhs = lhs;
34336 	  lhs = v;
34337 	  v = NULL_TREE;
34338 	}
34339       goto done;
34340     case OMP_ATOMIC_CAPTURE_NEW:
34341       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
34342 	{
34343 	  cp_lexer_consume_token (parser->lexer);
34344 	  structured_block = true;
34345 	}
34346       else
34347 	{
34348 	  v = cp_parser_unary_expression (parser);
34349 	  if (v == error_mark_node)
34350 	    goto saw_error;
34351 	  if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
34352 	    goto saw_error;
34353 	}
34354     default:
34355       break;
34356     }
34357 
34358 restart:
34359   lhs = cp_parser_unary_expression (parser);
34360   orig_lhs = lhs;
34361   switch (TREE_CODE (lhs))
34362     {
34363     case ERROR_MARK:
34364       goto saw_error;
34365 
34366     case POSTINCREMENT_EXPR:
34367       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
34368 	code = OMP_ATOMIC_CAPTURE_OLD;
34369       /* FALLTHROUGH */
34370     case PREINCREMENT_EXPR:
34371       lhs = TREE_OPERAND (lhs, 0);
34372       opcode = PLUS_EXPR;
34373       rhs = integer_one_node;
34374       break;
34375 
34376     case POSTDECREMENT_EXPR:
34377       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
34378 	code = OMP_ATOMIC_CAPTURE_OLD;
34379       /* FALLTHROUGH */
34380     case PREDECREMENT_EXPR:
34381       lhs = TREE_OPERAND (lhs, 0);
34382       opcode = MINUS_EXPR;
34383       rhs = integer_one_node;
34384       break;
34385 
34386     case COMPOUND_EXPR:
34387       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
34388 	 && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
34389 	 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
34390 	 && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
34391 	 && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
34392 					     (TREE_OPERAND (lhs, 1), 0), 0)))
34393 	    == BOOLEAN_TYPE)
34394        /* Undo effects of boolean_increment for post {in,de}crement.  */
34395        lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
34396       /* FALLTHRU */
34397     case MODIFY_EXPR:
34398       if (TREE_CODE (lhs) == MODIFY_EXPR
34399 	 && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
34400 	{
34401 	  /* Undo effects of boolean_increment.  */
34402 	  if (integer_onep (TREE_OPERAND (lhs, 1)))
34403 	    {
34404 	      /* This is pre or post increment.  */
34405 	      rhs = TREE_OPERAND (lhs, 1);
34406 	      lhs = TREE_OPERAND (lhs, 0);
34407 	      opcode = NOP_EXPR;
34408 	      if (code == OMP_ATOMIC_CAPTURE_NEW
34409 		  && !structured_block
34410 		  && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
34411 		code = OMP_ATOMIC_CAPTURE_OLD;
34412 	      break;
34413 	    }
34414 	}
34415       /* FALLTHRU */
34416     default:
34417       switch (cp_lexer_peek_token (parser->lexer)->type)
34418 	{
34419 	case CPP_MULT_EQ:
34420 	  opcode = MULT_EXPR;
34421 	  break;
34422 	case CPP_DIV_EQ:
34423 	  opcode = TRUNC_DIV_EXPR;
34424 	  break;
34425 	case CPP_PLUS_EQ:
34426 	  opcode = PLUS_EXPR;
34427 	  break;
34428 	case CPP_MINUS_EQ:
34429 	  opcode = MINUS_EXPR;
34430 	  break;
34431 	case CPP_LSHIFT_EQ:
34432 	  opcode = LSHIFT_EXPR;
34433 	  break;
34434 	case CPP_RSHIFT_EQ:
34435 	  opcode = RSHIFT_EXPR;
34436 	  break;
34437 	case CPP_AND_EQ:
34438 	  opcode = BIT_AND_EXPR;
34439 	  break;
34440 	case CPP_OR_EQ:
34441 	  opcode = BIT_IOR_EXPR;
34442 	  break;
34443 	case CPP_XOR_EQ:
34444 	  opcode = BIT_XOR_EXPR;
34445 	  break;
34446 	case CPP_EQ:
34447 	  enum cp_parser_prec oprec;
34448 	  cp_token *token;
34449 	  cp_lexer_consume_token (parser->lexer);
34450 	  cp_parser_parse_tentatively (parser);
34451 	  rhs1 = cp_parser_simple_cast_expression (parser);
34452 	  if (rhs1 == error_mark_node)
34453 	    {
34454 	      cp_parser_abort_tentative_parse (parser);
34455 	      cp_parser_simple_cast_expression (parser);
34456 	      goto saw_error;
34457 	    }
34458 	  token = cp_lexer_peek_token (parser->lexer);
34459 	  if (token->type != CPP_SEMICOLON && !cp_tree_equal (lhs, rhs1))
34460 	    {
34461 	      cp_parser_abort_tentative_parse (parser);
34462 	      cp_parser_parse_tentatively (parser);
34463 	      rhs = cp_parser_binary_expression (parser, false, true,
34464 						 PREC_NOT_OPERATOR, NULL);
34465 	      if (rhs == error_mark_node)
34466 		{
34467 		  cp_parser_abort_tentative_parse (parser);
34468 		  cp_parser_binary_expression (parser, false, true,
34469 					       PREC_NOT_OPERATOR, NULL);
34470 		  goto saw_error;
34471 		}
34472 	      switch (TREE_CODE (rhs))
34473 		{
34474 		case MULT_EXPR:
34475 		case TRUNC_DIV_EXPR:
34476 		case RDIV_EXPR:
34477 		case PLUS_EXPR:
34478 		case MINUS_EXPR:
34479 		case LSHIFT_EXPR:
34480 		case RSHIFT_EXPR:
34481 		case BIT_AND_EXPR:
34482 		case BIT_IOR_EXPR:
34483 		case BIT_XOR_EXPR:
34484 		  if (cp_tree_equal (lhs, TREE_OPERAND (rhs, 1)))
34485 		    {
34486 		      if (cp_parser_parse_definitely (parser))
34487 			{
34488 			  opcode = TREE_CODE (rhs);
34489 			  rhs1 = TREE_OPERAND (rhs, 0);
34490 			  rhs = TREE_OPERAND (rhs, 1);
34491 			  goto stmt_done;
34492 			}
34493 		      else
34494 			goto saw_error;
34495 		    }
34496 		  break;
34497 		default:
34498 		  break;
34499 		}
34500 	      cp_parser_abort_tentative_parse (parser);
34501 	      if (structured_block && code == OMP_ATOMIC_CAPTURE_OLD)
34502 		{
34503 		  rhs = cp_parser_expression (parser);
34504 		  if (rhs == error_mark_node)
34505 		    goto saw_error;
34506 		  opcode = NOP_EXPR;
34507 		  rhs1 = NULL_TREE;
34508 		  goto stmt_done;
34509 		}
34510 	      cp_parser_error (parser,
34511 			       "invalid form of %<#pragma omp atomic%>");
34512 	      goto saw_error;
34513 	    }
34514 	  if (!cp_parser_parse_definitely (parser))
34515 	    goto saw_error;
34516 	  switch (token->type)
34517 	    {
34518 	    case CPP_SEMICOLON:
34519 	      if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
34520 		{
34521 		  code = OMP_ATOMIC_CAPTURE_OLD;
34522 		  v = lhs;
34523 		  lhs = NULL_TREE;
34524 		  lhs1 = rhs1;
34525 		  rhs1 = NULL_TREE;
34526 		  cp_lexer_consume_token (parser->lexer);
34527 		  goto restart;
34528 		}
34529 	      else if (structured_block)
34530 		{
34531 		  opcode = NOP_EXPR;
34532 		  rhs = rhs1;
34533 		  rhs1 = NULL_TREE;
34534 		  goto stmt_done;
34535 		}
34536 	      cp_parser_error (parser,
34537 			       "invalid form of %<#pragma omp atomic%>");
34538 	      goto saw_error;
34539 	    case CPP_MULT:
34540 	      opcode = MULT_EXPR;
34541 	      break;
34542 	    case CPP_DIV:
34543 	      opcode = TRUNC_DIV_EXPR;
34544 	      break;
34545 	    case CPP_PLUS:
34546 	      opcode = PLUS_EXPR;
34547 	      break;
34548 	    case CPP_MINUS:
34549 	      opcode = MINUS_EXPR;
34550 	      break;
34551 	    case CPP_LSHIFT:
34552 	      opcode = LSHIFT_EXPR;
34553 	      break;
34554 	    case CPP_RSHIFT:
34555 	      opcode = RSHIFT_EXPR;
34556 	      break;
34557 	    case CPP_AND:
34558 	      opcode = BIT_AND_EXPR;
34559 	      break;
34560 	    case CPP_OR:
34561 	      opcode = BIT_IOR_EXPR;
34562 	      break;
34563 	    case CPP_XOR:
34564 	      opcode = BIT_XOR_EXPR;
34565 	      break;
34566 	    default:
34567 	      cp_parser_error (parser,
34568 			       "invalid operator for %<#pragma omp atomic%>");
34569 	      goto saw_error;
34570 	    }
34571 	  oprec = TOKEN_PRECEDENCE (token);
34572 	  gcc_assert (oprec != PREC_NOT_OPERATOR);
34573 	  if (commutative_tree_code (opcode))
34574 	    oprec = (enum cp_parser_prec) (oprec - 1);
34575 	  cp_lexer_consume_token (parser->lexer);
34576 	  rhs = cp_parser_binary_expression (parser, false, false,
34577 					     oprec, NULL);
34578 	  if (rhs == error_mark_node)
34579 	    goto saw_error;
34580 	  goto stmt_done;
34581 	  /* FALLTHROUGH */
34582 	default:
34583 	  cp_parser_error (parser,
34584 			   "invalid operator for %<#pragma omp atomic%>");
34585 	  goto saw_error;
34586 	}
34587       cp_lexer_consume_token (parser->lexer);
34588 
34589       rhs = cp_parser_expression (parser);
34590       if (rhs == error_mark_node)
34591 	goto saw_error;
34592       break;
34593     }
34594 stmt_done:
34595   if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
34596     {
34597       if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
34598 	goto saw_error;
34599       v = cp_parser_unary_expression (parser);
34600       if (v == error_mark_node)
34601 	goto saw_error;
34602       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
34603 	goto saw_error;
34604       lhs1 = cp_parser_unary_expression (parser);
34605       if (lhs1 == error_mark_node)
34606 	goto saw_error;
34607     }
34608   if (structured_block)
34609     {
34610       cp_parser_consume_semicolon_at_end_of_statement (parser);
34611       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
34612     }
34613 done:
34614   finish_omp_atomic (code, opcode, lhs, rhs, v, lhs1, rhs1, seq_cst);
34615   if (!structured_block)
34616     cp_parser_consume_semicolon_at_end_of_statement (parser);
34617   return;
34618 
34619  saw_error:
34620   cp_parser_skip_to_end_of_block_or_statement (parser);
34621   if (structured_block)
34622     {
34623       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
34624         cp_lexer_consume_token (parser->lexer);
34625       else if (code == OMP_ATOMIC_CAPTURE_NEW)
34626 	{
34627 	  cp_parser_skip_to_end_of_block_or_statement (parser);
34628 	  if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
34629 	    cp_lexer_consume_token (parser->lexer);
34630 	}
34631     }
34632 }
34633 
34634 
34635 /* OpenMP 2.5:
34636    # pragma omp barrier new-line  */
34637 
34638 static void
34639 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
34640 {
34641   cp_parser_require_pragma_eol (parser, pragma_tok);
34642   finish_omp_barrier ();
34643 }
34644 
34645 /* OpenMP 2.5:
34646    # pragma omp critical [(name)] new-line
34647      structured-block
34648 
34649    OpenMP 4.5:
34650    # pragma omp critical [(name) [hint(expression)]] new-line
34651      structured-block  */
34652 
34653 #define OMP_CRITICAL_CLAUSE_MASK		\
34654 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_HINT) )
34655 
34656 static tree
34657 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
34658 {
34659   tree stmt, name = NULL_TREE, clauses = NULL_TREE;
34660 
34661   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
34662     {
34663       matching_parens parens;
34664       parens.consume_open (parser);
34665 
34666       name = cp_parser_identifier (parser);
34667 
34668       if (name == error_mark_node
34669 	  || !parens.require_close (parser))
34670 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
34671 					       /*or_comma=*/false,
34672 					       /*consume_paren=*/true);
34673       if (name == error_mark_node)
34674 	name = NULL;
34675 
34676       clauses = cp_parser_omp_all_clauses (parser,
34677 					   OMP_CRITICAL_CLAUSE_MASK,
34678 					   "#pragma omp critical", pragma_tok);
34679     }
34680   else
34681     cp_parser_require_pragma_eol (parser, pragma_tok);
34682 
34683   stmt = cp_parser_omp_structured_block (parser, if_p);
34684   return c_finish_omp_critical (input_location, stmt, name, clauses);
34685 }
34686 
34687 /* OpenMP 2.5:
34688    # pragma omp flush flush-vars[opt] new-line
34689 
34690    flush-vars:
34691      ( variable-list ) */
34692 
34693 static void
34694 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
34695 {
34696   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
34697     (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
34698   cp_parser_require_pragma_eol (parser, pragma_tok);
34699 
34700   finish_omp_flush ();
34701 }
34702 
34703 /* Helper function, to parse omp for increment expression.  */
34704 
34705 static tree
34706 cp_parser_omp_for_cond (cp_parser *parser, tree decl)
34707 {
34708   tree cond = cp_parser_binary_expression (parser, false, true,
34709 					   PREC_NOT_OPERATOR, NULL);
34710   if (cond == error_mark_node
34711       || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
34712     {
34713       cp_parser_skip_to_end_of_statement (parser);
34714       return error_mark_node;
34715     }
34716 
34717   switch (TREE_CODE (cond))
34718     {
34719     case GT_EXPR:
34720     case GE_EXPR:
34721     case LT_EXPR:
34722     case LE_EXPR:
34723       break;
34724     case NE_EXPR:
34725       /* Fall through: OpenMP disallows NE_EXPR.  */
34726       gcc_fallthrough ();
34727     default:
34728       return error_mark_node;
34729     }
34730 
34731   /* If decl is an iterator, preserve LHS and RHS of the relational
34732      expr until finish_omp_for.  */
34733   if (decl
34734       && (type_dependent_expression_p (decl)
34735 	  || CLASS_TYPE_P (TREE_TYPE (decl))))
34736     return cond;
34737 
34738   return build_x_binary_op (EXPR_LOC_OR_LOC (cond, input_location),
34739 			    TREE_CODE (cond),
34740 			    TREE_OPERAND (cond, 0), ERROR_MARK,
34741 			    TREE_OPERAND (cond, 1), ERROR_MARK,
34742 			    /*overload=*/NULL, tf_warning_or_error);
34743 }
34744 
34745 /* Helper function, to parse omp for increment expression.  */
34746 
34747 static tree
34748 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
34749 {
34750   cp_token *token = cp_lexer_peek_token (parser->lexer);
34751   enum tree_code op;
34752   tree lhs, rhs;
34753   cp_id_kind idk;
34754   bool decl_first;
34755 
34756   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
34757     {
34758       op = (token->type == CPP_PLUS_PLUS
34759 	    ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
34760       cp_lexer_consume_token (parser->lexer);
34761       lhs = cp_parser_simple_cast_expression (parser);
34762       if (lhs != decl
34763 	  && (!processing_template_decl || !cp_tree_equal (lhs, decl)))
34764 	return error_mark_node;
34765       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
34766     }
34767 
34768   lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
34769   if (lhs != decl
34770       && (!processing_template_decl || !cp_tree_equal (lhs, decl)))
34771     return error_mark_node;
34772 
34773   token = cp_lexer_peek_token (parser->lexer);
34774   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
34775     {
34776       op = (token->type == CPP_PLUS_PLUS
34777 	    ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
34778       cp_lexer_consume_token (parser->lexer);
34779       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
34780     }
34781 
34782   op = cp_parser_assignment_operator_opt (parser);
34783   if (op == ERROR_MARK)
34784     return error_mark_node;
34785 
34786   if (op != NOP_EXPR)
34787     {
34788       rhs = cp_parser_assignment_expression (parser);
34789       rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
34790       return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
34791     }
34792 
34793   lhs = cp_parser_binary_expression (parser, false, false,
34794 				     PREC_ADDITIVE_EXPRESSION, NULL);
34795   token = cp_lexer_peek_token (parser->lexer);
34796   decl_first = (lhs == decl
34797 		|| (processing_template_decl && cp_tree_equal (lhs, decl)));
34798   if (decl_first)
34799     lhs = NULL_TREE;
34800   if (token->type != CPP_PLUS
34801       && token->type != CPP_MINUS)
34802     return error_mark_node;
34803 
34804   do
34805     {
34806       op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
34807       cp_lexer_consume_token (parser->lexer);
34808       rhs = cp_parser_binary_expression (parser, false, false,
34809 					 PREC_ADDITIVE_EXPRESSION, NULL);
34810       token = cp_lexer_peek_token (parser->lexer);
34811       if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
34812 	{
34813 	  if (lhs == NULL_TREE)
34814 	    {
34815 	      if (op == PLUS_EXPR)
34816 		lhs = rhs;
34817 	      else
34818 		lhs = build_x_unary_op (input_location, NEGATE_EXPR, rhs,
34819 					tf_warning_or_error);
34820 	    }
34821 	  else
34822 	    lhs = build_x_binary_op (input_location, op, lhs, ERROR_MARK, rhs,
34823 				     ERROR_MARK, NULL, tf_warning_or_error);
34824 	}
34825     }
34826   while (token->type == CPP_PLUS || token->type == CPP_MINUS);
34827 
34828   if (!decl_first)
34829     {
34830       if ((rhs != decl
34831 	   && (!processing_template_decl || !cp_tree_equal (rhs, decl)))
34832 	  || op == MINUS_EXPR)
34833 	return error_mark_node;
34834       rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
34835     }
34836   else
34837     rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
34838 
34839   return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
34840 }
34841 
34842 /* Parse the initialization statement of an OpenMP for loop.
34843 
34844    Return true if the resulting construct should have an
34845    OMP_CLAUSE_PRIVATE added to it.  */
34846 
34847 static tree
34848 cp_parser_omp_for_loop_init (cp_parser *parser,
34849 			     tree &this_pre_body,
34850 			     vec<tree, va_gc> *for_block,
34851 			     tree &init,
34852 			     tree &orig_init,
34853 			     tree &decl,
34854 			     tree &real_decl)
34855 {
34856   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
34857     return NULL_TREE;
34858 
34859   tree add_private_clause = NULL_TREE;
34860 
34861   /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
34862 
34863      init-expr:
34864      var = lb
34865      integer-type var = lb
34866      random-access-iterator-type var = lb
34867      pointer-type var = lb
34868   */
34869   cp_decl_specifier_seq type_specifiers;
34870 
34871   /* First, try to parse as an initialized declaration.  See
34872      cp_parser_condition, from whence the bulk of this is copied.  */
34873 
34874   cp_parser_parse_tentatively (parser);
34875   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
34876 				/*is_trailing_return=*/false,
34877 				&type_specifiers);
34878   if (cp_parser_parse_definitely (parser))
34879     {
34880       /* If parsing a type specifier seq succeeded, then this
34881 	 MUST be a initialized declaration.  */
34882       tree asm_specification, attributes;
34883       cp_declarator *declarator;
34884 
34885       declarator = cp_parser_declarator (parser,
34886 					 CP_PARSER_DECLARATOR_NAMED,
34887 					 /*ctor_dtor_or_conv_p=*/NULL,
34888 					 /*parenthesized_p=*/NULL,
34889 					 /*member_p=*/false,
34890 					 /*friend_p=*/false);
34891       attributes = cp_parser_attributes_opt (parser);
34892       asm_specification = cp_parser_asm_specification_opt (parser);
34893 
34894       if (declarator == cp_error_declarator)
34895 	cp_parser_skip_to_end_of_statement (parser);
34896 
34897       else
34898 	{
34899 	  tree pushed_scope, auto_node;
34900 
34901 	  decl = start_decl (declarator, &type_specifiers,
34902 			     SD_INITIALIZED, attributes,
34903 			     /*prefix_attributes=*/NULL_TREE,
34904 			     &pushed_scope);
34905 
34906 	  auto_node = type_uses_auto (TREE_TYPE (decl));
34907 	  if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
34908 	    {
34909 	      if (cp_lexer_next_token_is (parser->lexer,
34910 					  CPP_OPEN_PAREN))
34911 	        error ("parenthesized initialization is not allowed in "
34912 		       "OpenMP %<for%> loop");
34913 	      else
34914 		/* Trigger an error.  */
34915 		cp_parser_require (parser, CPP_EQ, RT_EQ);
34916 
34917 	      init = error_mark_node;
34918 	      cp_parser_skip_to_end_of_statement (parser);
34919 	    }
34920 	  else if (CLASS_TYPE_P (TREE_TYPE (decl))
34921 		   || type_dependent_expression_p (decl)
34922 		   || auto_node)
34923 	    {
34924 	      bool is_direct_init, is_non_constant_init;
34925 
34926 	      init = cp_parser_initializer (parser,
34927 					    &is_direct_init,
34928 					    &is_non_constant_init);
34929 
34930 	      if (auto_node)
34931 		{
34932 		  TREE_TYPE (decl)
34933 		    = do_auto_deduction (TREE_TYPE (decl), init,
34934 					 auto_node);
34935 
34936 		  if (!CLASS_TYPE_P (TREE_TYPE (decl))
34937 		      && !type_dependent_expression_p (decl))
34938 		    goto non_class;
34939 		}
34940 
34941 	      cp_finish_decl (decl, init, !is_non_constant_init,
34942 			      asm_specification,
34943 			      LOOKUP_ONLYCONVERTING);
34944 	      orig_init = init;
34945 	      if (CLASS_TYPE_P (TREE_TYPE (decl)))
34946 		{
34947 		  vec_safe_push (for_block, this_pre_body);
34948 		  init = NULL_TREE;
34949 		}
34950 	      else
34951 		{
34952 		  init = pop_stmt_list (this_pre_body);
34953 		  if (init && TREE_CODE (init) == STATEMENT_LIST)
34954 		    {
34955 		      tree_stmt_iterator i = tsi_start (init);
34956 		      /* Move lambda DECL_EXPRs to FOR_BLOCK.  */
34957 		      while (!tsi_end_p (i))
34958 			{
34959 			  tree t = tsi_stmt (i);
34960 			  if (TREE_CODE (t) == DECL_EXPR
34961 			      && TREE_CODE (DECL_EXPR_DECL (t)) == TYPE_DECL)
34962 			    {
34963 			      tsi_delink (&i);
34964 			      vec_safe_push (for_block, t);
34965 			      continue;
34966 			    }
34967 			  break;
34968 			}
34969 		      if (tsi_one_before_end_p (i))
34970 			{
34971 			  tree t = tsi_stmt (i);
34972 			  tsi_delink (&i);
34973 			  free_stmt_list (init);
34974 			  init = t;
34975 			}
34976 		    }
34977 		}
34978 	      this_pre_body = NULL_TREE;
34979 	    }
34980 	  else
34981 	    {
34982 	      /* Consume '='.  */
34983 	      cp_lexer_consume_token (parser->lexer);
34984 	      init = cp_parser_assignment_expression (parser);
34985 
34986 	    non_class:
34987 	      if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
34988 		init = error_mark_node;
34989 	      else
34990 		cp_finish_decl (decl, NULL_TREE,
34991 				/*init_const_expr_p=*/false,
34992 				asm_specification,
34993 				LOOKUP_ONLYCONVERTING);
34994 	    }
34995 
34996 	  if (pushed_scope)
34997 	    pop_scope (pushed_scope);
34998 	}
34999     }
35000   else
35001     {
35002       cp_id_kind idk;
35003       /* If parsing a type specifier sequence failed, then
35004 	 this MUST be a simple expression.  */
35005       cp_parser_parse_tentatively (parser);
35006       decl = cp_parser_primary_expression (parser, false, false,
35007 					   false, &idk);
35008       cp_token *last_tok = cp_lexer_peek_token (parser->lexer);
35009       if (!cp_parser_error_occurred (parser)
35010 	  && decl
35011 	  && (TREE_CODE (decl) == COMPONENT_REF
35012 	      || (TREE_CODE (decl) == SCOPE_REF && TREE_TYPE (decl))))
35013 	{
35014 	  cp_parser_abort_tentative_parse (parser);
35015 	  cp_parser_parse_tentatively (parser);
35016 	  cp_token *token = cp_lexer_peek_token (parser->lexer);
35017 	  tree name = cp_parser_id_expression (parser, /*template_p=*/false,
35018 					       /*check_dependency_p=*/true,
35019 					       /*template_p=*/NULL,
35020 					       /*declarator_p=*/false,
35021 					       /*optional_p=*/false);
35022 	  if (name != error_mark_node
35023 	      && last_tok == cp_lexer_peek_token (parser->lexer))
35024 	    {
35025 	      decl = cp_parser_lookup_name_simple (parser, name,
35026 						   token->location);
35027 	      if (TREE_CODE (decl) == FIELD_DECL)
35028 		add_private_clause = omp_privatize_field (decl, false);
35029 	    }
35030 	  cp_parser_abort_tentative_parse (parser);
35031 	  cp_parser_parse_tentatively (parser);
35032 	  decl = cp_parser_primary_expression (parser, false, false,
35033 					       false, &idk);
35034 	}
35035       if (!cp_parser_error_occurred (parser)
35036 	  && decl
35037 	  && DECL_P (decl)
35038 	  && CLASS_TYPE_P (TREE_TYPE (decl)))
35039 	{
35040 	  tree rhs;
35041 
35042 	  cp_parser_parse_definitely (parser);
35043 	  cp_parser_require (parser, CPP_EQ, RT_EQ);
35044 	  rhs = cp_parser_assignment_expression (parser);
35045 	  orig_init = rhs;
35046 	  finish_expr_stmt (build_x_modify_expr (EXPR_LOCATION (rhs),
35047 						 decl, NOP_EXPR,
35048 						 rhs,
35049 						 tf_warning_or_error));
35050 	  if (!add_private_clause)
35051 	    add_private_clause = decl;
35052 	}
35053       else
35054 	{
35055 	  decl = NULL;
35056 	  cp_parser_abort_tentative_parse (parser);
35057 	  init = cp_parser_expression (parser);
35058 	  if (init)
35059 	    {
35060 	      if (TREE_CODE (init) == MODIFY_EXPR
35061 		  || TREE_CODE (init) == MODOP_EXPR)
35062 		real_decl = TREE_OPERAND (init, 0);
35063 	    }
35064 	}
35065     }
35066   return add_private_clause;
35067 }
35068 
35069 /* Parse the restricted form of the for statement allowed by OpenMP.  */
35070 
35071 static tree
35072 cp_parser_omp_for_loop (cp_parser *parser, enum tree_code code, tree clauses,
35073 			tree *cclauses, bool *if_p)
35074 {
35075   tree init, orig_init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
35076   tree real_decl, initv, condv, incrv, declv;
35077   tree this_pre_body, cl, ordered_cl = NULL_TREE;
35078   location_t loc_first;
35079   bool collapse_err = false;
35080   int i, collapse = 1, ordered = 0, count, nbraces = 0;
35081   vec<tree, va_gc> *for_block = make_tree_vector ();
35082   auto_vec<tree, 4> orig_inits;
35083   bool tiling = false;
35084 
35085   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
35086     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
35087       collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (cl));
35088     else if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_TILE)
35089       {
35090 	tiling = true;
35091 	collapse = list_length (OMP_CLAUSE_TILE_LIST (cl));
35092       }
35093     else if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_ORDERED
35094 	     && OMP_CLAUSE_ORDERED_EXPR (cl))
35095       {
35096 	ordered_cl = cl;
35097 	ordered = tree_to_shwi (OMP_CLAUSE_ORDERED_EXPR (cl));
35098       }
35099 
35100   if (ordered && ordered < collapse)
35101     {
35102       error_at (OMP_CLAUSE_LOCATION (ordered_cl),
35103 		"%<ordered%> clause parameter is less than %<collapse%>");
35104       OMP_CLAUSE_ORDERED_EXPR (ordered_cl)
35105 	= build_int_cst (NULL_TREE, collapse);
35106       ordered = collapse;
35107     }
35108   if (ordered)
35109     {
35110       for (tree *pc = &clauses; *pc; )
35111 	if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_LINEAR)
35112 	  {
35113 	    error_at (OMP_CLAUSE_LOCATION (*pc),
35114 		      "%<linear%> clause may not be specified together "
35115 		      "with %<ordered%> clause with a parameter");
35116 	    *pc = OMP_CLAUSE_CHAIN (*pc);
35117 	  }
35118 	else
35119 	  pc = &OMP_CLAUSE_CHAIN (*pc);
35120     }
35121 
35122   gcc_assert (tiling || (collapse >= 1 && ordered >= 0));
35123   count = ordered ? ordered : collapse;
35124 
35125   declv = make_tree_vec (count);
35126   initv = make_tree_vec (count);
35127   condv = make_tree_vec (count);
35128   incrv = make_tree_vec (count);
35129 
35130   loc_first = cp_lexer_peek_token (parser->lexer)->location;
35131 
35132   for (i = 0; i < count; i++)
35133     {
35134       int bracecount = 0;
35135       tree add_private_clause = NULL_TREE;
35136       location_t loc;
35137 
35138       if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
35139 	{
35140 	  if (!collapse_err)
35141 	    cp_parser_error (parser, "for statement expected");
35142 	  return NULL;
35143 	}
35144       loc = cp_lexer_consume_token (parser->lexer)->location;
35145 
35146       matching_parens parens;
35147       if (!parens.require_open (parser))
35148 	return NULL;
35149 
35150       init = orig_init = decl = real_decl = NULL;
35151       this_pre_body = push_stmt_list ();
35152 
35153       add_private_clause
35154 	= cp_parser_omp_for_loop_init (parser, this_pre_body, for_block,
35155 				       init, orig_init, decl, real_decl);
35156 
35157       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
35158       if (this_pre_body)
35159 	{
35160 	  this_pre_body = pop_stmt_list (this_pre_body);
35161 	  if (pre_body)
35162 	    {
35163 	      tree t = pre_body;
35164 	      pre_body = push_stmt_list ();
35165 	      add_stmt (t);
35166 	      add_stmt (this_pre_body);
35167 	      pre_body = pop_stmt_list (pre_body);
35168 	    }
35169 	  else
35170 	    pre_body = this_pre_body;
35171 	}
35172 
35173       if (decl)
35174 	real_decl = decl;
35175       if (cclauses != NULL
35176 	  && cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL] != NULL
35177 	  && real_decl != NULL_TREE)
35178 	{
35179 	  tree *c;
35180 	  for (c = &cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL]; *c ; )
35181 	    if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
35182 		&& OMP_CLAUSE_DECL (*c) == real_decl)
35183 	      {
35184 		error_at (loc, "iteration variable %qD"
35185 			  " should not be firstprivate", real_decl);
35186 		*c = OMP_CLAUSE_CHAIN (*c);
35187 	      }
35188 	    else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
35189 		     && OMP_CLAUSE_DECL (*c) == real_decl)
35190 	      {
35191 		/* Move lastprivate (decl) clause to OMP_FOR_CLAUSES.  */
35192 		tree l = *c;
35193 		*c = OMP_CLAUSE_CHAIN (*c);
35194 		if (code == OMP_SIMD)
35195 		  {
35196 		    OMP_CLAUSE_CHAIN (l) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
35197 		    cclauses[C_OMP_CLAUSE_SPLIT_FOR] = l;
35198 		  }
35199 		else
35200 		  {
35201 		    OMP_CLAUSE_CHAIN (l) = clauses;
35202 		    clauses = l;
35203 		  }
35204 		add_private_clause = NULL_TREE;
35205 	      }
35206 	    else
35207 	      {
35208 		if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
35209 		    && OMP_CLAUSE_DECL (*c) == real_decl)
35210 		  add_private_clause = NULL_TREE;
35211 		c = &OMP_CLAUSE_CHAIN (*c);
35212 	      }
35213 	}
35214 
35215       if (add_private_clause)
35216 	{
35217 	  tree c;
35218 	  for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
35219 	    {
35220 	      if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
35221 		   || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
35222 		  && OMP_CLAUSE_DECL (c) == decl)
35223 		break;
35224 	      else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
35225 		       && OMP_CLAUSE_DECL (c) == decl)
35226 		error_at (loc, "iteration variable %qD "
35227 			  "should not be firstprivate",
35228 			  decl);
35229 	      else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
35230 		       && OMP_CLAUSE_DECL (c) == decl)
35231 		error_at (loc, "iteration variable %qD should not be reduction",
35232 			  decl);
35233 	    }
35234 	  if (c == NULL)
35235 	    {
35236 	      if (code != OMP_SIMD)
35237 		c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
35238 	      else if (collapse == 1)
35239 		c = build_omp_clause (loc, OMP_CLAUSE_LINEAR);
35240 	      else
35241 		c = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
35242 	      OMP_CLAUSE_DECL (c) = add_private_clause;
35243 	      c = finish_omp_clauses (c, C_ORT_OMP);
35244 	      if (c)
35245 		{
35246 		  OMP_CLAUSE_CHAIN (c) = clauses;
35247 		  clauses = c;
35248 		  /* For linear, signal that we need to fill up
35249 		     the so far unknown linear step.  */
35250 		  if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR)
35251 		    OMP_CLAUSE_LINEAR_STEP (c) = NULL_TREE;
35252 		}
35253 	    }
35254 	}
35255 
35256       cond = NULL;
35257       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
35258 	cond = cp_parser_omp_for_cond (parser, decl);
35259       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
35260 
35261       incr = NULL;
35262       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
35263 	{
35264 	  /* If decl is an iterator, preserve the operator on decl
35265 	     until finish_omp_for.  */
35266 	  if (real_decl
35267 	      && ((processing_template_decl
35268 		   && (TREE_TYPE (real_decl) == NULL_TREE
35269 		       || !POINTER_TYPE_P (TREE_TYPE (real_decl))))
35270 		  || CLASS_TYPE_P (TREE_TYPE (real_decl))))
35271 	    incr = cp_parser_omp_for_incr (parser, real_decl);
35272 	  else
35273 	    incr = cp_parser_expression (parser);
35274 	  if (!EXPR_HAS_LOCATION (incr))
35275 	    protected_set_expr_location (incr, input_location);
35276 	}
35277 
35278       if (!parens.require_close (parser))
35279 	cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
35280 					       /*or_comma=*/false,
35281 					       /*consume_paren=*/true);
35282 
35283       TREE_VEC_ELT (declv, i) = decl;
35284       TREE_VEC_ELT (initv, i) = init;
35285       TREE_VEC_ELT (condv, i) = cond;
35286       TREE_VEC_ELT (incrv, i) = incr;
35287       if (orig_init)
35288 	{
35289 	  orig_inits.safe_grow_cleared (i + 1);
35290 	  orig_inits[i] = orig_init;
35291 	}
35292 
35293       if (i == count - 1)
35294 	break;
35295 
35296       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
35297 	 in between the collapsed for loops to be still considered perfectly
35298 	 nested.  Hopefully the final version clarifies this.
35299 	 For now handle (multiple) {'s and empty statements.  */
35300       cp_parser_parse_tentatively (parser);
35301       for (;;)
35302 	{
35303 	  if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
35304 	    break;
35305 	  else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
35306 	    {
35307 	      cp_lexer_consume_token (parser->lexer);
35308 	      bracecount++;
35309 	    }
35310 	  else if (bracecount
35311 		   && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
35312 	    cp_lexer_consume_token (parser->lexer);
35313 	  else
35314 	    {
35315 	      loc = cp_lexer_peek_token (parser->lexer)->location;
35316 	      error_at (loc, "not enough for loops to collapse");
35317 	      collapse_err = true;
35318 	      cp_parser_abort_tentative_parse (parser);
35319 	      declv = NULL_TREE;
35320 	      break;
35321 	    }
35322 	}
35323 
35324       if (declv)
35325 	{
35326 	  cp_parser_parse_definitely (parser);
35327 	  nbraces += bracecount;
35328 	}
35329     }
35330 
35331   if (nbraces)
35332     if_p = NULL;
35333 
35334   /* Note that we saved the original contents of this flag when we entered
35335      the structured block, and so we don't need to re-save it here.  */
35336   parser->in_statement = IN_OMP_FOR;
35337 
35338   /* Note that the grammar doesn't call for a structured block here,
35339      though the loop as a whole is a structured block.  */
35340   body = push_stmt_list ();
35341   cp_parser_statement (parser, NULL_TREE, false, if_p);
35342   body = pop_stmt_list (body);
35343 
35344   if (declv == NULL_TREE)
35345     ret = NULL_TREE;
35346   else
35347     ret = finish_omp_for (loc_first, code, declv, NULL, initv, condv, incrv,
35348 			  body, pre_body, &orig_inits, clauses);
35349 
35350   while (nbraces)
35351     {
35352       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
35353 	{
35354 	  cp_lexer_consume_token (parser->lexer);
35355 	  nbraces--;
35356 	}
35357       else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
35358 	cp_lexer_consume_token (parser->lexer);
35359       else
35360 	{
35361 	  if (!collapse_err)
35362 	    {
35363 	      error_at (cp_lexer_peek_token (parser->lexer)->location,
35364 			"collapsed loops not perfectly nested");
35365 	    }
35366 	  collapse_err = true;
35367 	  cp_parser_statement_seq_opt (parser, NULL);
35368 	  if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
35369 	    break;
35370 	}
35371     }
35372 
35373   while (!for_block->is_empty ())
35374     {
35375       tree t = for_block->pop ();
35376       if (TREE_CODE (t) == STATEMENT_LIST)
35377 	add_stmt (pop_stmt_list (t));
35378       else
35379 	add_stmt (t);
35380     }
35381   release_tree_vector (for_block);
35382 
35383   return ret;
35384 }
35385 
35386 /* Helper function for OpenMP parsing, split clauses and call
35387    finish_omp_clauses on each of the set of clauses afterwards.  */
35388 
35389 static void
35390 cp_omp_split_clauses (location_t loc, enum tree_code code,
35391 		      omp_clause_mask mask, tree clauses, tree *cclauses)
35392 {
35393   int i;
35394   c_omp_split_clauses (loc, code, mask, clauses, cclauses);
35395   for (i = 0; i < C_OMP_CLAUSE_SPLIT_COUNT; i++)
35396     if (cclauses[i])
35397       cclauses[i] = finish_omp_clauses (cclauses[i], C_ORT_OMP);
35398 }
35399 
35400 /* OpenMP 4.0:
35401    #pragma omp simd simd-clause[optseq] new-line
35402      for-loop  */
35403 
35404 #define OMP_SIMD_CLAUSE_MASK					\
35405 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SAFELEN)	\
35406 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN)	\
35407 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR)	\
35408 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED)	\
35409 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35410 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE)	\
35411 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION)	\
35412 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
35413 
35414 static tree
35415 cp_parser_omp_simd (cp_parser *parser, cp_token *pragma_tok,
35416 		    char *p_name, omp_clause_mask mask, tree *cclauses,
35417 		    bool *if_p)
35418 {
35419   tree clauses, sb, ret;
35420   unsigned int save;
35421   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
35422 
35423   strcat (p_name, " simd");
35424   mask |= OMP_SIMD_CLAUSE_MASK;
35425 
35426   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
35427 				       cclauses == NULL);
35428   if (cclauses)
35429     {
35430       cp_omp_split_clauses (loc, OMP_SIMD, mask, clauses, cclauses);
35431       clauses = cclauses[C_OMP_CLAUSE_SPLIT_SIMD];
35432       tree c = omp_find_clause (cclauses[C_OMP_CLAUSE_SPLIT_FOR],
35433 				OMP_CLAUSE_ORDERED);
35434       if (c && OMP_CLAUSE_ORDERED_EXPR (c))
35435 	{
35436 	  error_at (OMP_CLAUSE_LOCATION (c),
35437 		    "%<ordered%> clause with parameter may not be specified "
35438 		    "on %qs construct", p_name);
35439 	  OMP_CLAUSE_ORDERED_EXPR (c) = NULL_TREE;
35440 	}
35441     }
35442 
35443   sb = begin_omp_structured_block ();
35444   save = cp_parser_begin_omp_structured_block (parser);
35445 
35446   ret = cp_parser_omp_for_loop (parser, OMP_SIMD, clauses, cclauses, if_p);
35447 
35448   cp_parser_end_omp_structured_block (parser, save);
35449   add_stmt (finish_omp_structured_block (sb));
35450 
35451   return ret;
35452 }
35453 
35454 /* OpenMP 2.5:
35455    #pragma omp for for-clause[optseq] new-line
35456      for-loop
35457 
35458    OpenMP 4.0:
35459    #pragma omp for simd for-simd-clause[optseq] new-line
35460      for-loop  */
35461 
35462 #define OMP_FOR_CLAUSE_MASK					\
35463 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35464 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
35465 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE)	\
35466 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR)	\
35467 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION)	\
35468 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED)	\
35469 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SCHEDULE)	\
35470 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)	\
35471 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
35472 
35473 static tree
35474 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok,
35475 		   char *p_name, omp_clause_mask mask, tree *cclauses,
35476 		   bool *if_p)
35477 {
35478   tree clauses, sb, ret;
35479   unsigned int save;
35480   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
35481 
35482   strcat (p_name, " for");
35483   mask |= OMP_FOR_CLAUSE_MASK;
35484   /* parallel for{, simd} disallows nowait clause, but for
35485      target {teams distribute ,}parallel for{, simd} it should be accepted.  */
35486   if (cclauses && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) == 0)
35487     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
35488   /* Composite distribute parallel for{, simd} disallows ordered clause.  */
35489   if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
35490     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ORDERED);
35491 
35492   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
35493     {
35494       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
35495       const char *p = IDENTIFIER_POINTER (id);
35496 
35497       if (strcmp (p, "simd") == 0)
35498 	{
35499 	  tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
35500 	  if (cclauses == NULL)
35501 	    cclauses = cclauses_buf;
35502 
35503 	  cp_lexer_consume_token (parser->lexer);
35504 	  if (!flag_openmp)  /* flag_openmp_simd  */
35505 	    return cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
35506 				       cclauses, if_p);
35507 	  sb = begin_omp_structured_block ();
35508 	  save = cp_parser_begin_omp_structured_block (parser);
35509 	  ret = cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
35510 				    cclauses, if_p);
35511 	  cp_parser_end_omp_structured_block (parser, save);
35512 	  tree body = finish_omp_structured_block (sb);
35513 	  if (ret == NULL)
35514 	    return ret;
35515 	  ret = make_node (OMP_FOR);
35516 	  TREE_TYPE (ret) = void_type_node;
35517 	  OMP_FOR_BODY (ret) = body;
35518 	  OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
35519 	  SET_EXPR_LOCATION (ret, loc);
35520 	  add_stmt (ret);
35521 	  return ret;
35522 	}
35523     }
35524   if (!flag_openmp)  /* flag_openmp_simd  */
35525     {
35526       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35527       return NULL_TREE;
35528     }
35529 
35530   /* Composite distribute parallel for disallows linear clause.  */
35531   if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
35532     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR);
35533 
35534   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
35535 				       cclauses == NULL);
35536   if (cclauses)
35537     {
35538       cp_omp_split_clauses (loc, OMP_FOR, mask, clauses, cclauses);
35539       clauses = cclauses[C_OMP_CLAUSE_SPLIT_FOR];
35540     }
35541 
35542   sb = begin_omp_structured_block ();
35543   save = cp_parser_begin_omp_structured_block (parser);
35544 
35545   ret = cp_parser_omp_for_loop (parser, OMP_FOR, clauses, cclauses, if_p);
35546 
35547   cp_parser_end_omp_structured_block (parser, save);
35548   add_stmt (finish_omp_structured_block (sb));
35549 
35550   return ret;
35551 }
35552 
35553 /* OpenMP 2.5:
35554    # pragma omp master new-line
35555      structured-block  */
35556 
35557 static tree
35558 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
35559 {
35560   cp_parser_require_pragma_eol (parser, pragma_tok);
35561   return c_finish_omp_master (input_location,
35562 			      cp_parser_omp_structured_block (parser, if_p));
35563 }
35564 
35565 /* OpenMP 2.5:
35566    # pragma omp ordered new-line
35567      structured-block
35568 
35569    OpenMP 4.5:
35570    # pragma omp ordered ordered-clauses new-line
35571      structured-block  */
35572 
35573 #define OMP_ORDERED_CLAUSE_MASK					\
35574 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREADS)	\
35575 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMD))
35576 
35577 #define OMP_ORDERED_DEPEND_CLAUSE_MASK				\
35578 	(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)
35579 
35580 static bool
35581 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok,
35582 		       enum pragma_context context, bool *if_p)
35583 {
35584   location_t loc = pragma_tok->location;
35585 
35586   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
35587     {
35588       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
35589       const char *p = IDENTIFIER_POINTER (id);
35590 
35591       if (strcmp (p, "depend") == 0)
35592 	{
35593 	  if (!flag_openmp)	/* flag_openmp_simd */
35594 	    {
35595 	      cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35596 	      return false;
35597 	    }
35598 	  if (context == pragma_stmt)
35599 	    {
35600 	      error_at (pragma_tok->location, "%<#pragma omp ordered%> with "
35601 			"%<depend%> clause may only be used in compound "
35602 			"statements");
35603 	      cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35604 	      return false;
35605 	    }
35606 	  tree clauses
35607 	    = cp_parser_omp_all_clauses (parser,
35608 					 OMP_ORDERED_DEPEND_CLAUSE_MASK,
35609 					 "#pragma omp ordered", pragma_tok);
35610 	  c_finish_omp_ordered (loc, clauses, NULL_TREE);
35611 	  return false;
35612 	}
35613     }
35614 
35615   tree clauses
35616     = cp_parser_omp_all_clauses (parser, OMP_ORDERED_CLAUSE_MASK,
35617 				 "#pragma omp ordered", pragma_tok);
35618 
35619   if (!flag_openmp     /* flag_openmp_simd  */
35620       && omp_find_clause (clauses, OMP_CLAUSE_SIMD) == NULL_TREE)
35621     return false;
35622 
35623   c_finish_omp_ordered (loc, clauses,
35624 			cp_parser_omp_structured_block (parser, if_p));
35625   return true;
35626 }
35627 
35628 /* OpenMP 2.5:
35629 
35630    section-scope:
35631      { section-sequence }
35632 
35633    section-sequence:
35634      section-directive[opt] structured-block
35635      section-sequence section-directive structured-block  */
35636 
35637 static tree
35638 cp_parser_omp_sections_scope (cp_parser *parser)
35639 {
35640   tree stmt, substmt;
35641   bool error_suppress = false;
35642   cp_token *tok;
35643 
35644   matching_braces braces;
35645   if (!braces.require_open (parser))
35646     return NULL_TREE;
35647 
35648   stmt = push_stmt_list ();
35649 
35650   if (cp_parser_pragma_kind (cp_lexer_peek_token (parser->lexer))
35651       != PRAGMA_OMP_SECTION)
35652     {
35653       substmt = cp_parser_omp_structured_block (parser, NULL);
35654       substmt = build1 (OMP_SECTION, void_type_node, substmt);
35655       add_stmt (substmt);
35656     }
35657 
35658   while (1)
35659     {
35660       tok = cp_lexer_peek_token (parser->lexer);
35661       if (tok->type == CPP_CLOSE_BRACE)
35662 	break;
35663       if (tok->type == CPP_EOF)
35664 	break;
35665 
35666       if (cp_parser_pragma_kind (tok) == PRAGMA_OMP_SECTION)
35667 	{
35668 	  cp_lexer_consume_token (parser->lexer);
35669 	  cp_parser_require_pragma_eol (parser, tok);
35670 	  error_suppress = false;
35671 	}
35672       else if (!error_suppress)
35673 	{
35674 	  cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
35675 	  error_suppress = true;
35676 	}
35677 
35678       substmt = cp_parser_omp_structured_block (parser, NULL);
35679       substmt = build1 (OMP_SECTION, void_type_node, substmt);
35680       add_stmt (substmt);
35681     }
35682   braces.require_close (parser);
35683 
35684   substmt = pop_stmt_list (stmt);
35685 
35686   stmt = make_node (OMP_SECTIONS);
35687   TREE_TYPE (stmt) = void_type_node;
35688   OMP_SECTIONS_BODY (stmt) = substmt;
35689 
35690   add_stmt (stmt);
35691   return stmt;
35692 }
35693 
35694 /* OpenMP 2.5:
35695    # pragma omp sections sections-clause[optseq] newline
35696      sections-scope  */
35697 
35698 #define OMP_SECTIONS_CLAUSE_MASK				\
35699 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35700 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
35701 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE)	\
35702 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION)	\
35703 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
35704 
35705 static tree
35706 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok,
35707 			char *p_name, omp_clause_mask mask, tree *cclauses)
35708 {
35709   tree clauses, ret;
35710   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
35711 
35712   strcat (p_name, " sections");
35713   mask |= OMP_SECTIONS_CLAUSE_MASK;
35714   if (cclauses)
35715     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT);
35716 
35717   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
35718 				       cclauses == NULL);
35719   if (cclauses)
35720     {
35721       cp_omp_split_clauses (loc, OMP_SECTIONS, mask, clauses, cclauses);
35722       clauses = cclauses[C_OMP_CLAUSE_SPLIT_SECTIONS];
35723     }
35724 
35725   ret = cp_parser_omp_sections_scope (parser);
35726   if (ret)
35727     OMP_SECTIONS_CLAUSES (ret) = clauses;
35728 
35729   return ret;
35730 }
35731 
35732 /* OpenMP 2.5:
35733    # pragma omp parallel parallel-clause[optseq] new-line
35734      structured-block
35735    # pragma omp parallel for parallel-for-clause[optseq] new-line
35736      structured-block
35737    # pragma omp parallel sections parallel-sections-clause[optseq] new-line
35738      structured-block
35739 
35740    OpenMP 4.0:
35741    # pragma omp parallel for simd parallel-for-simd-clause[optseq] new-line
35742      structured-block */
35743 
35744 #define OMP_PARALLEL_CLAUSE_MASK				\
35745 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
35746 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35747 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
35748 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT)	\
35749 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED)	\
35750 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN)	\
35751 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION)	\
35752 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_THREADS)	\
35753 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PROC_BIND))
35754 
35755 static tree
35756 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok,
35757 			char *p_name, omp_clause_mask mask, tree *cclauses,
35758 			bool *if_p)
35759 {
35760   tree stmt, clauses, block;
35761   unsigned int save;
35762   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
35763 
35764   strcat (p_name, " parallel");
35765   mask |= OMP_PARALLEL_CLAUSE_MASK;
35766   /* #pragma omp target parallel{, for, for simd} disallow copyin clause.  */
35767   if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)) != 0
35768       && (mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) == 0)
35769     mask &= ~(OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYIN);
35770 
35771   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
35772     {
35773       tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
35774       if (cclauses == NULL)
35775 	cclauses = cclauses_buf;
35776 
35777       cp_lexer_consume_token (parser->lexer);
35778       if (!flag_openmp)  /* flag_openmp_simd  */
35779 	return cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses,
35780 				  if_p);
35781       block = begin_omp_parallel ();
35782       save = cp_parser_begin_omp_structured_block (parser);
35783       tree ret = cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses,
35784 				    if_p);
35785       cp_parser_end_omp_structured_block (parser, save);
35786       stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
35787 				  block);
35788       if (ret == NULL_TREE)
35789 	return ret;
35790       OMP_PARALLEL_COMBINED (stmt) = 1;
35791       return stmt;
35792     }
35793   /* When combined with distribute, parallel has to be followed by for.
35794      #pragma omp target parallel is allowed though.  */
35795   else if (cclauses
35796 	   && (mask & (OMP_CLAUSE_MASK_1
35797 		       << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)) != 0)
35798     {
35799       error_at (loc, "expected %<for%> after %qs", p_name);
35800       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35801       return NULL_TREE;
35802     }
35803   else if (!flag_openmp)  /* flag_openmp_simd  */
35804     {
35805       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35806       return NULL_TREE;
35807     }
35808   else if (cclauses == NULL && cp_lexer_next_token_is (parser->lexer, CPP_NAME))
35809     {
35810       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
35811       const char *p = IDENTIFIER_POINTER (id);
35812       if (strcmp (p, "sections") == 0)
35813 	{
35814 	  tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
35815 	  cclauses = cclauses_buf;
35816 
35817 	  cp_lexer_consume_token (parser->lexer);
35818 	  block = begin_omp_parallel ();
35819 	  save = cp_parser_begin_omp_structured_block (parser);
35820 	  cp_parser_omp_sections (parser, pragma_tok, p_name, mask, cclauses);
35821 	  cp_parser_end_omp_structured_block (parser, save);
35822 	  stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
35823 				      block);
35824 	  OMP_PARALLEL_COMBINED (stmt) = 1;
35825 	  return stmt;
35826 	}
35827     }
35828 
35829   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
35830 				       cclauses == NULL);
35831   if (cclauses)
35832     {
35833       cp_omp_split_clauses (loc, OMP_PARALLEL, mask, clauses, cclauses);
35834       clauses = cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL];
35835     }
35836 
35837   block = begin_omp_parallel ();
35838   save = cp_parser_begin_omp_structured_block (parser);
35839   cp_parser_statement (parser, NULL_TREE, false, if_p);
35840   cp_parser_end_omp_structured_block (parser, save);
35841   stmt = finish_omp_parallel (clauses, block);
35842   return stmt;
35843 }
35844 
35845 /* OpenMP 2.5:
35846    # pragma omp single single-clause[optseq] new-line
35847      structured-block  */
35848 
35849 #define OMP_SINGLE_CLAUSE_MASK					\
35850 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35851 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
35852 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYPRIVATE)	\
35853 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
35854 
35855 static tree
35856 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
35857 {
35858   tree stmt = make_node (OMP_SINGLE);
35859   TREE_TYPE (stmt) = void_type_node;
35860 
35861   OMP_SINGLE_CLAUSES (stmt)
35862     = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
35863 				 "#pragma omp single", pragma_tok);
35864   OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser, if_p);
35865 
35866   return add_stmt (stmt);
35867 }
35868 
35869 /* OpenMP 3.0:
35870    # pragma omp task task-clause[optseq] new-line
35871      structured-block  */
35872 
35873 #define OMP_TASK_CLAUSE_MASK					\
35874 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
35875 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED)	\
35876 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT)	\
35877 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
35878 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
35879 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED)	\
35880 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL)	\
35881 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE)	\
35882 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)	\
35883 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY))
35884 
35885 static tree
35886 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
35887 {
35888   tree clauses, block;
35889   unsigned int save;
35890 
35891   clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
35892 				       "#pragma omp task", pragma_tok);
35893   block = begin_omp_task ();
35894   save = cp_parser_begin_omp_structured_block (parser);
35895   cp_parser_statement (parser, NULL_TREE, false, if_p);
35896   cp_parser_end_omp_structured_block (parser, save);
35897   return finish_omp_task (clauses, block);
35898 }
35899 
35900 /* OpenMP 3.0:
35901    # pragma omp taskwait new-line  */
35902 
35903 static void
35904 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
35905 {
35906   cp_parser_require_pragma_eol (parser, pragma_tok);
35907   finish_omp_taskwait ();
35908 }
35909 
35910 /* OpenMP 3.1:
35911    # pragma omp taskyield new-line  */
35912 
35913 static void
35914 cp_parser_omp_taskyield (cp_parser *parser, cp_token *pragma_tok)
35915 {
35916   cp_parser_require_pragma_eol (parser, pragma_tok);
35917   finish_omp_taskyield ();
35918 }
35919 
35920 /* OpenMP 4.0:
35921    # pragma omp taskgroup new-line
35922      structured-block  */
35923 
35924 static tree
35925 cp_parser_omp_taskgroup (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
35926 {
35927   cp_parser_require_pragma_eol (parser, pragma_tok);
35928   return c_finish_omp_taskgroup (input_location,
35929 				 cp_parser_omp_structured_block (parser,
35930 								 if_p));
35931 }
35932 
35933 
35934 /* OpenMP 2.5:
35935    # pragma omp threadprivate (variable-list) */
35936 
35937 static void
35938 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
35939 {
35940   tree vars;
35941 
35942   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
35943   cp_parser_require_pragma_eol (parser, pragma_tok);
35944 
35945   finish_omp_threadprivate (vars);
35946 }
35947 
35948 /* OpenMP 4.0:
35949    # pragma omp cancel cancel-clause[optseq] new-line  */
35950 
35951 #define OMP_CANCEL_CLAUSE_MASK					\
35952 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL)	\
35953 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR)		\
35954 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS)	\
35955 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP)	\
35956 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF))
35957 
35958 static void
35959 cp_parser_omp_cancel (cp_parser *parser, cp_token *pragma_tok)
35960 {
35961   tree clauses = cp_parser_omp_all_clauses (parser, OMP_CANCEL_CLAUSE_MASK,
35962 					    "#pragma omp cancel", pragma_tok);
35963   finish_omp_cancel (clauses);
35964 }
35965 
35966 /* OpenMP 4.0:
35967    # pragma omp cancellation point cancelpt-clause[optseq] new-line  */
35968 
35969 #define OMP_CANCELLATION_POINT_CLAUSE_MASK			\
35970 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PARALLEL)	\
35971 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FOR)		\
35972 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SECTIONS)	\
35973 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP))
35974 
35975 static void
35976 cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok,
35977 				  enum pragma_context context)
35978 {
35979   tree clauses;
35980   bool point_seen = false;
35981 
35982   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
35983     {
35984       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
35985       const char *p = IDENTIFIER_POINTER (id);
35986 
35987       if (strcmp (p, "point") == 0)
35988 	{
35989 	  cp_lexer_consume_token (parser->lexer);
35990 	  point_seen = true;
35991 	}
35992     }
35993   if (!point_seen)
35994     {
35995       cp_parser_error (parser, "expected %<point%>");
35996       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
35997       return;
35998     }
35999 
36000   if (context != pragma_compound)
36001     {
36002       if (context == pragma_stmt)
36003 	error_at (pragma_tok->location,
36004 		  "%<#pragma %s%> may only be used in compound statements",
36005 		  "omp cancellation point");
36006       else
36007 	cp_parser_error (parser, "expected declaration specifiers");
36008       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36009       return;
36010     }
36011 
36012   clauses = cp_parser_omp_all_clauses (parser,
36013 				       OMP_CANCELLATION_POINT_CLAUSE_MASK,
36014 				       "#pragma omp cancellation point",
36015 				       pragma_tok);
36016   finish_omp_cancellation_point (clauses);
36017 }
36018 
36019 /* OpenMP 4.0:
36020    #pragma omp distribute distribute-clause[optseq] new-line
36021      for-loop  */
36022 
36023 #define OMP_DISTRIBUTE_CLAUSE_MASK				\
36024 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
36025 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
36026 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE)	\
36027 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DIST_SCHEDULE)\
36028 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE))
36029 
36030 static tree
36031 cp_parser_omp_distribute (cp_parser *parser, cp_token *pragma_tok,
36032 			  char *p_name, omp_clause_mask mask, tree *cclauses,
36033 			  bool *if_p)
36034 {
36035   tree clauses, sb, ret;
36036   unsigned int save;
36037   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
36038 
36039   strcat (p_name, " distribute");
36040   mask |= OMP_DISTRIBUTE_CLAUSE_MASK;
36041 
36042   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36043     {
36044       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
36045       const char *p = IDENTIFIER_POINTER (id);
36046       bool simd = false;
36047       bool parallel = false;
36048 
36049       if (strcmp (p, "simd") == 0)
36050 	simd = true;
36051       else
36052 	parallel = strcmp (p, "parallel") == 0;
36053       if (parallel || simd)
36054 	{
36055 	  tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
36056 	  if (cclauses == NULL)
36057 	    cclauses = cclauses_buf;
36058 	  cp_lexer_consume_token (parser->lexer);
36059 	  if (!flag_openmp)  /* flag_openmp_simd  */
36060 	    {
36061 	      if (simd)
36062 		return cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
36063 					   cclauses, if_p);
36064 	      else
36065 		return cp_parser_omp_parallel (parser, pragma_tok, p_name, mask,
36066 					       cclauses, if_p);
36067 	    }
36068 	  sb = begin_omp_structured_block ();
36069 	  save = cp_parser_begin_omp_structured_block (parser);
36070 	  if (simd)
36071 	    ret = cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
36072 				      cclauses, if_p);
36073 	  else
36074 	    ret = cp_parser_omp_parallel (parser, pragma_tok, p_name, mask,
36075 					  cclauses, if_p);
36076 	  cp_parser_end_omp_structured_block (parser, save);
36077 	  tree body = finish_omp_structured_block (sb);
36078 	  if (ret == NULL)
36079 	    return ret;
36080 	  ret = make_node (OMP_DISTRIBUTE);
36081 	  TREE_TYPE (ret) = void_type_node;
36082 	  OMP_FOR_BODY (ret) = body;
36083 	  OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
36084 	  SET_EXPR_LOCATION (ret, loc);
36085 	  add_stmt (ret);
36086 	  return ret;
36087 	}
36088     }
36089   if (!flag_openmp)  /* flag_openmp_simd  */
36090     {
36091       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36092       return NULL_TREE;
36093     }
36094 
36095   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
36096 				       cclauses == NULL);
36097   if (cclauses)
36098     {
36099       cp_omp_split_clauses (loc, OMP_DISTRIBUTE, mask, clauses, cclauses);
36100       clauses = cclauses[C_OMP_CLAUSE_SPLIT_DISTRIBUTE];
36101     }
36102 
36103   sb = begin_omp_structured_block ();
36104   save = cp_parser_begin_omp_structured_block (parser);
36105 
36106   ret = cp_parser_omp_for_loop (parser, OMP_DISTRIBUTE, clauses, NULL, if_p);
36107 
36108   cp_parser_end_omp_structured_block (parser, save);
36109   add_stmt (finish_omp_structured_block (sb));
36110 
36111   return ret;
36112 }
36113 
36114 /* OpenMP 4.0:
36115    # pragma omp teams teams-clause[optseq] new-line
36116      structured-block  */
36117 
36118 #define OMP_TEAMS_CLAUSE_MASK					\
36119 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
36120 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
36121 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED)	\
36122 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_REDUCTION)	\
36123 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TEAMS)	\
36124 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_THREAD_LIMIT)	\
36125 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT))
36126 
36127 static tree
36128 cp_parser_omp_teams (cp_parser *parser, cp_token *pragma_tok,
36129 		     char *p_name, omp_clause_mask mask, tree *cclauses,
36130 		     bool *if_p)
36131 {
36132   tree clauses, sb, ret;
36133   unsigned int save;
36134   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
36135 
36136   strcat (p_name, " teams");
36137   mask |= OMP_TEAMS_CLAUSE_MASK;
36138 
36139   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36140     {
36141       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
36142       const char *p = IDENTIFIER_POINTER (id);
36143       if (strcmp (p, "distribute") == 0)
36144 	{
36145 	  tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
36146 	  if (cclauses == NULL)
36147 	    cclauses = cclauses_buf;
36148 
36149 	  cp_lexer_consume_token (parser->lexer);
36150 	  if (!flag_openmp)  /* flag_openmp_simd  */
36151 	    return cp_parser_omp_distribute (parser, pragma_tok, p_name, mask,
36152 					     cclauses, if_p);
36153 	  sb = begin_omp_structured_block ();
36154 	  save = cp_parser_begin_omp_structured_block (parser);
36155 	  ret = cp_parser_omp_distribute (parser, pragma_tok, p_name, mask,
36156 					  cclauses, if_p);
36157 	  cp_parser_end_omp_structured_block (parser, save);
36158 	  tree body = finish_omp_structured_block (sb);
36159 	  if (ret == NULL)
36160 	    return ret;
36161 	  clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
36162 	  ret = make_node (OMP_TEAMS);
36163 	  TREE_TYPE (ret) = void_type_node;
36164 	  OMP_TEAMS_CLAUSES (ret) = clauses;
36165 	  OMP_TEAMS_BODY (ret) = body;
36166 	  OMP_TEAMS_COMBINED (ret) = 1;
36167 	  SET_EXPR_LOCATION (ret, loc);
36168 	  return add_stmt (ret);
36169 	}
36170     }
36171   if (!flag_openmp)  /* flag_openmp_simd  */
36172     {
36173       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36174       return NULL_TREE;
36175     }
36176 
36177   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
36178 				       cclauses == NULL);
36179   if (cclauses)
36180     {
36181       cp_omp_split_clauses (loc, OMP_TEAMS, mask, clauses, cclauses);
36182       clauses = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
36183     }
36184 
36185   tree stmt = make_node (OMP_TEAMS);
36186   TREE_TYPE (stmt) = void_type_node;
36187   OMP_TEAMS_CLAUSES (stmt) = clauses;
36188   OMP_TEAMS_BODY (stmt) = cp_parser_omp_structured_block (parser, if_p);
36189   SET_EXPR_LOCATION (stmt, loc);
36190 
36191   return add_stmt (stmt);
36192 }
36193 
36194 /* OpenMP 4.0:
36195    # pragma omp target data target-data-clause[optseq] new-line
36196      structured-block  */
36197 
36198 #define OMP_TARGET_DATA_CLAUSE_MASK				\
36199 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE)	\
36200 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)		\
36201 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
36202 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR))
36203 
36204 static tree
36205 cp_parser_omp_target_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
36206 {
36207   tree clauses
36208     = cp_parser_omp_all_clauses (parser, OMP_TARGET_DATA_CLAUSE_MASK,
36209 				 "#pragma omp target data", pragma_tok);
36210   int map_seen = 0;
36211   for (tree *pc = &clauses; *pc;)
36212     {
36213       if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP)
36214 	switch (OMP_CLAUSE_MAP_KIND (*pc))
36215 	  {
36216 	  case GOMP_MAP_TO:
36217 	  case GOMP_MAP_ALWAYS_TO:
36218 	  case GOMP_MAP_FROM:
36219 	  case GOMP_MAP_ALWAYS_FROM:
36220 	  case GOMP_MAP_TOFROM:
36221 	  case GOMP_MAP_ALWAYS_TOFROM:
36222 	  case GOMP_MAP_ALLOC:
36223 	    map_seen = 3;
36224 	    break;
36225 	  case GOMP_MAP_FIRSTPRIVATE_POINTER:
36226 	  case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
36227 	  case GOMP_MAP_ALWAYS_POINTER:
36228 	    break;
36229 	  default:
36230 	    map_seen |= 1;
36231 	    error_at (OMP_CLAUSE_LOCATION (*pc),
36232 		      "%<#pragma omp target data%> with map-type other "
36233 		      "than %<to%>, %<from%>, %<tofrom%> or %<alloc%> "
36234 		      "on %<map%> clause");
36235 	    *pc = OMP_CLAUSE_CHAIN (*pc);
36236 	    continue;
36237 	  }
36238       pc = &OMP_CLAUSE_CHAIN (*pc);
36239     }
36240 
36241   if (map_seen != 3)
36242     {
36243       if (map_seen == 0)
36244 	error_at (pragma_tok->location,
36245 		  "%<#pragma omp target data%> must contain at least "
36246 		  "one %<map%> clause");
36247       return NULL_TREE;
36248     }
36249 
36250   tree stmt = make_node (OMP_TARGET_DATA);
36251   TREE_TYPE (stmt) = void_type_node;
36252   OMP_TARGET_DATA_CLAUSES (stmt) = clauses;
36253 
36254   keep_next_level (true);
36255   OMP_TARGET_DATA_BODY (stmt) = cp_parser_omp_structured_block (parser, if_p);
36256 
36257   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36258   return add_stmt (stmt);
36259 }
36260 
36261 /* OpenMP 4.5:
36262    # pragma omp target enter data target-enter-data-clause[optseq] new-line
36263      structured-block  */
36264 
36265 #define OMP_TARGET_ENTER_DATA_CLAUSE_MASK			\
36266 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE)	\
36267 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)		\
36268 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
36269 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)	\
36270 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
36271 
36272 static tree
36273 cp_parser_omp_target_enter_data (cp_parser *parser, cp_token *pragma_tok,
36274 				 enum pragma_context context)
36275 {
36276   bool data_seen = false;
36277   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36278     {
36279       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
36280       const char *p = IDENTIFIER_POINTER (id);
36281 
36282       if (strcmp (p, "data") == 0)
36283 	{
36284 	  cp_lexer_consume_token (parser->lexer);
36285 	  data_seen = true;
36286 	}
36287     }
36288   if (!data_seen)
36289     {
36290       cp_parser_error (parser, "expected %<data%>");
36291       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36292       return NULL_TREE;
36293     }
36294 
36295   if (context == pragma_stmt)
36296     {
36297       error_at (pragma_tok->location,
36298 		"%<#pragma %s%> may only be used in compound statements",
36299 		"omp target enter data");
36300       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36301       return NULL_TREE;
36302     }
36303 
36304   tree clauses
36305     = cp_parser_omp_all_clauses (parser, OMP_TARGET_ENTER_DATA_CLAUSE_MASK,
36306 				 "#pragma omp target enter data", pragma_tok);
36307   int map_seen = 0;
36308   for (tree *pc = &clauses; *pc;)
36309     {
36310       if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP)
36311 	switch (OMP_CLAUSE_MAP_KIND (*pc))
36312 	  {
36313 	  case GOMP_MAP_TO:
36314 	  case GOMP_MAP_ALWAYS_TO:
36315 	  case GOMP_MAP_ALLOC:
36316 	    map_seen = 3;
36317 	    break;
36318 	  case GOMP_MAP_FIRSTPRIVATE_POINTER:
36319 	  case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
36320 	  case GOMP_MAP_ALWAYS_POINTER:
36321 	    break;
36322 	  default:
36323 	    map_seen |= 1;
36324 	    error_at (OMP_CLAUSE_LOCATION (*pc),
36325 		      "%<#pragma omp target enter data%> with map-type other "
36326 		      "than %<to%> or %<alloc%> on %<map%> clause");
36327 	    *pc = OMP_CLAUSE_CHAIN (*pc);
36328 	    continue;
36329 	  }
36330       pc = &OMP_CLAUSE_CHAIN (*pc);
36331     }
36332 
36333   if (map_seen != 3)
36334     {
36335       if (map_seen == 0)
36336 	error_at (pragma_tok->location,
36337 		  "%<#pragma omp target enter data%> must contain at least "
36338 		  "one %<map%> clause");
36339       return NULL_TREE;
36340     }
36341 
36342   tree stmt = make_node (OMP_TARGET_ENTER_DATA);
36343   TREE_TYPE (stmt) = void_type_node;
36344   OMP_TARGET_ENTER_DATA_CLAUSES (stmt) = clauses;
36345   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36346   return add_stmt (stmt);
36347 }
36348 
36349 /* OpenMP 4.5:
36350    # pragma omp target exit data target-enter-data-clause[optseq] new-line
36351      structured-block  */
36352 
36353 #define OMP_TARGET_EXIT_DATA_CLAUSE_MASK			\
36354 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE)	\
36355 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)		\
36356 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
36357 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)	\
36358 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
36359 
36360 static tree
36361 cp_parser_omp_target_exit_data (cp_parser *parser, cp_token *pragma_tok,
36362 				enum pragma_context context)
36363 {
36364   bool data_seen = false;
36365   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36366     {
36367       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
36368       const char *p = IDENTIFIER_POINTER (id);
36369 
36370       if (strcmp (p, "data") == 0)
36371 	{
36372 	  cp_lexer_consume_token (parser->lexer);
36373 	  data_seen = true;
36374 	}
36375     }
36376   if (!data_seen)
36377     {
36378       cp_parser_error (parser, "expected %<data%>");
36379       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36380       return NULL_TREE;
36381     }
36382 
36383   if (context == pragma_stmt)
36384     {
36385       error_at (pragma_tok->location,
36386 		"%<#pragma %s%> may only be used in compound statements",
36387 		"omp target exit data");
36388       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36389       return NULL_TREE;
36390     }
36391 
36392   tree clauses
36393     = cp_parser_omp_all_clauses (parser, OMP_TARGET_EXIT_DATA_CLAUSE_MASK,
36394 				 "#pragma omp target exit data", pragma_tok);
36395   int map_seen = 0;
36396   for (tree *pc = &clauses; *pc;)
36397     {
36398       if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP)
36399 	switch (OMP_CLAUSE_MAP_KIND (*pc))
36400 	  {
36401 	  case GOMP_MAP_FROM:
36402 	  case GOMP_MAP_ALWAYS_FROM:
36403 	  case GOMP_MAP_RELEASE:
36404 	  case GOMP_MAP_DELETE:
36405 	    map_seen = 3;
36406 	    break;
36407 	  case GOMP_MAP_FIRSTPRIVATE_POINTER:
36408 	  case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
36409 	  case GOMP_MAP_ALWAYS_POINTER:
36410 	    break;
36411 	  default:
36412 	    map_seen |= 1;
36413 	    error_at (OMP_CLAUSE_LOCATION (*pc),
36414 		      "%<#pragma omp target exit data%> with map-type other "
36415 		      "than %<from%>, %<release%> or %<delete%> on %<map%>"
36416 		      " clause");
36417 	    *pc = OMP_CLAUSE_CHAIN (*pc);
36418 	    continue;
36419 	  }
36420       pc = &OMP_CLAUSE_CHAIN (*pc);
36421     }
36422 
36423   if (map_seen != 3)
36424     {
36425       if (map_seen == 0)
36426 	error_at (pragma_tok->location,
36427 		  "%<#pragma omp target exit data%> must contain at least "
36428 		  "one %<map%> clause");
36429       return NULL_TREE;
36430     }
36431 
36432   tree stmt = make_node (OMP_TARGET_EXIT_DATA);
36433   TREE_TYPE (stmt) = void_type_node;
36434   OMP_TARGET_EXIT_DATA_CLAUSES (stmt) = clauses;
36435   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36436   return add_stmt (stmt);
36437 }
36438 
36439 /* OpenMP 4.0:
36440    # pragma omp target update target-update-clause[optseq] new-line */
36441 
36442 #define OMP_TARGET_UPDATE_CLAUSE_MASK				\
36443 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FROM)		\
36444 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO)		\
36445 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE)	\
36446 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
36447 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)	\
36448 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT))
36449 
36450 static bool
36451 cp_parser_omp_target_update (cp_parser *parser, cp_token *pragma_tok,
36452 			     enum pragma_context context)
36453 {
36454   if (context == pragma_stmt)
36455     {
36456       error_at (pragma_tok->location,
36457 		"%<#pragma %s%> may only be used in compound statements",
36458 		"omp target update");
36459       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36460       return false;
36461     }
36462 
36463   tree clauses
36464     = cp_parser_omp_all_clauses (parser, OMP_TARGET_UPDATE_CLAUSE_MASK,
36465 				 "#pragma omp target update", pragma_tok);
36466   if (omp_find_clause (clauses, OMP_CLAUSE_TO) == NULL_TREE
36467       && omp_find_clause (clauses, OMP_CLAUSE_FROM) == NULL_TREE)
36468     {
36469       error_at (pragma_tok->location,
36470 		"%<#pragma omp target update%> must contain at least one "
36471 		"%<from%> or %<to%> clauses");
36472       return false;
36473     }
36474 
36475   tree stmt = make_node (OMP_TARGET_UPDATE);
36476   TREE_TYPE (stmt) = void_type_node;
36477   OMP_TARGET_UPDATE_CLAUSES (stmt) = clauses;
36478   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36479   add_stmt (stmt);
36480   return false;
36481 }
36482 
36483 /* OpenMP 4.0:
36484    # pragma omp target target-clause[optseq] new-line
36485      structured-block  */
36486 
36487 #define OMP_TARGET_CLAUSE_MASK					\
36488 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE)	\
36489 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MAP)		\
36490 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
36491 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEPEND)	\
36492 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOWAIT)	\
36493 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
36494 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
36495 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULTMAP)	\
36496 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR))
36497 
36498 static bool
36499 cp_parser_omp_target (cp_parser *parser, cp_token *pragma_tok,
36500 		      enum pragma_context context, bool *if_p)
36501 {
36502   tree *pc = NULL, stmt;
36503 
36504   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36505     {
36506       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
36507       const char *p = IDENTIFIER_POINTER (id);
36508       enum tree_code ccode = ERROR_MARK;
36509 
36510       if (strcmp (p, "teams") == 0)
36511 	ccode = OMP_TEAMS;
36512       else if (strcmp (p, "parallel") == 0)
36513 	ccode = OMP_PARALLEL;
36514       else if (strcmp (p, "simd") == 0)
36515 	ccode = OMP_SIMD;
36516       if (ccode != ERROR_MARK)
36517 	{
36518 	  tree cclauses[C_OMP_CLAUSE_SPLIT_COUNT];
36519 	  char p_name[sizeof ("#pragma omp target teams distribute "
36520 			      "parallel for simd")];
36521 
36522 	  cp_lexer_consume_token (parser->lexer);
36523 	  strcpy (p_name, "#pragma omp target");
36524 	  if (!flag_openmp)  /* flag_openmp_simd  */
36525 	    {
36526 	      tree stmt;
36527 	      switch (ccode)
36528 		{
36529 		case OMP_TEAMS:
36530 		  stmt = cp_parser_omp_teams (parser, pragma_tok, p_name,
36531 					      OMP_TARGET_CLAUSE_MASK,
36532 					      cclauses, if_p);
36533 		  break;
36534 		case OMP_PARALLEL:
36535 		  stmt = cp_parser_omp_parallel (parser, pragma_tok, p_name,
36536 						 OMP_TARGET_CLAUSE_MASK,
36537 						 cclauses, if_p);
36538 		  break;
36539 		case OMP_SIMD:
36540 		  stmt = cp_parser_omp_simd (parser, pragma_tok, p_name,
36541 					     OMP_TARGET_CLAUSE_MASK,
36542 					     cclauses, if_p);
36543 		  break;
36544 		default:
36545 		  gcc_unreachable ();
36546 		}
36547 	      return stmt != NULL_TREE;
36548 	    }
36549 	  keep_next_level (true);
36550 	  tree sb = begin_omp_structured_block (), ret;
36551 	  unsigned save = cp_parser_begin_omp_structured_block (parser);
36552 	  switch (ccode)
36553 	    {
36554 	    case OMP_TEAMS:
36555 	      ret = cp_parser_omp_teams (parser, pragma_tok, p_name,
36556 					 OMP_TARGET_CLAUSE_MASK, cclauses,
36557 					 if_p);
36558 	      break;
36559 	    case OMP_PARALLEL:
36560 	      ret = cp_parser_omp_parallel (parser, pragma_tok, p_name,
36561 					    OMP_TARGET_CLAUSE_MASK, cclauses,
36562 					    if_p);
36563 	      break;
36564 	    case OMP_SIMD:
36565 	      ret = cp_parser_omp_simd (parser, pragma_tok, p_name,
36566 					OMP_TARGET_CLAUSE_MASK, cclauses,
36567 					if_p);
36568 	      break;
36569 	    default:
36570 	      gcc_unreachable ();
36571 	    }
36572 	  cp_parser_end_omp_structured_block (parser, save);
36573 	  tree body = finish_omp_structured_block (sb);
36574 	  if (ret == NULL_TREE)
36575 	    return false;
36576 	  if (ccode == OMP_TEAMS && !processing_template_decl)
36577 	    {
36578 	      /* For combined target teams, ensure the num_teams and
36579 		 thread_limit clause expressions are evaluated on the host,
36580 		 before entering the target construct.  */
36581 	      tree c;
36582 	      for (c = cclauses[C_OMP_CLAUSE_SPLIT_TEAMS];
36583 		   c; c = OMP_CLAUSE_CHAIN (c))
36584 		if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_NUM_TEAMS
36585 		     || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_THREAD_LIMIT)
36586 		    && TREE_CODE (OMP_CLAUSE_OPERAND (c, 0)) != INTEGER_CST)
36587 		  {
36588 		    tree expr = OMP_CLAUSE_OPERAND (c, 0);
36589 		    expr = force_target_expr (TREE_TYPE (expr), expr, tf_none);
36590 		    if (expr == error_mark_node)
36591 		      continue;
36592 		    tree tmp = TARGET_EXPR_SLOT (expr);
36593 		    add_stmt (expr);
36594 		    OMP_CLAUSE_OPERAND (c, 0) = expr;
36595 		    tree tc = build_omp_clause (OMP_CLAUSE_LOCATION (c),
36596 						OMP_CLAUSE_FIRSTPRIVATE);
36597 		    OMP_CLAUSE_DECL (tc) = tmp;
36598 		    OMP_CLAUSE_CHAIN (tc)
36599 		      = cclauses[C_OMP_CLAUSE_SPLIT_TARGET];
36600 		    cclauses[C_OMP_CLAUSE_SPLIT_TARGET] = tc;
36601 		  }
36602 	    }
36603 	  tree stmt = make_node (OMP_TARGET);
36604 	  TREE_TYPE (stmt) = void_type_node;
36605 	  OMP_TARGET_CLAUSES (stmt) = cclauses[C_OMP_CLAUSE_SPLIT_TARGET];
36606 	  OMP_TARGET_BODY (stmt) = body;
36607 	  OMP_TARGET_COMBINED (stmt) = 1;
36608 	  SET_EXPR_LOCATION (stmt, pragma_tok->location);
36609 	  add_stmt (stmt);
36610 	  pc = &OMP_TARGET_CLAUSES (stmt);
36611 	  goto check_clauses;
36612 	}
36613       else if (!flag_openmp)  /* flag_openmp_simd  */
36614 	{
36615 	  cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36616 	  return false;
36617 	}
36618       else if (strcmp (p, "data") == 0)
36619 	{
36620 	  cp_lexer_consume_token (parser->lexer);
36621 	  cp_parser_omp_target_data (parser, pragma_tok, if_p);
36622 	  return true;
36623 	}
36624       else if (strcmp (p, "enter") == 0)
36625 	{
36626 	  cp_lexer_consume_token (parser->lexer);
36627 	  cp_parser_omp_target_enter_data (parser, pragma_tok, context);
36628 	  return false;
36629 	}
36630       else if (strcmp (p, "exit") == 0)
36631 	{
36632 	  cp_lexer_consume_token (parser->lexer);
36633 	  cp_parser_omp_target_exit_data (parser, pragma_tok, context);
36634 	  return false;
36635 	}
36636       else if (strcmp (p, "update") == 0)
36637 	{
36638 	  cp_lexer_consume_token (parser->lexer);
36639 	  return cp_parser_omp_target_update (parser, pragma_tok, context);
36640 	}
36641     }
36642   if (!flag_openmp)  /* flag_openmp_simd  */
36643     {
36644       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36645       return false;
36646     }
36647 
36648   stmt = make_node (OMP_TARGET);
36649   TREE_TYPE (stmt) = void_type_node;
36650 
36651   OMP_TARGET_CLAUSES (stmt)
36652     = cp_parser_omp_all_clauses (parser, OMP_TARGET_CLAUSE_MASK,
36653 				 "#pragma omp target", pragma_tok);
36654   pc = &OMP_TARGET_CLAUSES (stmt);
36655   keep_next_level (true);
36656   OMP_TARGET_BODY (stmt) = cp_parser_omp_structured_block (parser, if_p);
36657 
36658   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36659   add_stmt (stmt);
36660 
36661 check_clauses:
36662   while (*pc)
36663     {
36664       if (OMP_CLAUSE_CODE (*pc) == OMP_CLAUSE_MAP)
36665 	switch (OMP_CLAUSE_MAP_KIND (*pc))
36666 	  {
36667 	  case GOMP_MAP_TO:
36668 	  case GOMP_MAP_ALWAYS_TO:
36669 	  case GOMP_MAP_FROM:
36670 	  case GOMP_MAP_ALWAYS_FROM:
36671 	  case GOMP_MAP_TOFROM:
36672 	  case GOMP_MAP_ALWAYS_TOFROM:
36673 	  case GOMP_MAP_ALLOC:
36674 	  case GOMP_MAP_FIRSTPRIVATE_POINTER:
36675 	  case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
36676 	  case GOMP_MAP_ALWAYS_POINTER:
36677 	    break;
36678 	  default:
36679 	    error_at (OMP_CLAUSE_LOCATION (*pc),
36680 		      "%<#pragma omp target%> with map-type other "
36681 		      "than %<to%>, %<from%>, %<tofrom%> or %<alloc%> "
36682 		      "on %<map%> clause");
36683 	    *pc = OMP_CLAUSE_CHAIN (*pc);
36684 	    continue;
36685 	  }
36686       pc = &OMP_CLAUSE_CHAIN (*pc);
36687     }
36688   return true;
36689 }
36690 
36691 /* OpenACC 2.0:
36692    # pragma acc cache (variable-list) new-line
36693 */
36694 
36695 static tree
36696 cp_parser_oacc_cache (cp_parser *parser, cp_token *pragma_tok)
36697 {
36698   tree stmt, clauses;
36699 
36700   clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE__CACHE_, NULL_TREE);
36701   clauses = finish_omp_clauses (clauses, C_ORT_ACC);
36702 
36703   cp_parser_require_pragma_eol (parser, cp_lexer_peek_token (parser->lexer));
36704 
36705   stmt = make_node (OACC_CACHE);
36706   TREE_TYPE (stmt) = void_type_node;
36707   OACC_CACHE_CLAUSES (stmt) = clauses;
36708   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36709   add_stmt (stmt);
36710 
36711   return stmt;
36712 }
36713 
36714 /* OpenACC 2.0:
36715    # pragma acc data oacc-data-clause[optseq] new-line
36716      structured-block  */
36717 
36718 #define OACC_DATA_CLAUSE_MASK						\
36719 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY)		\
36720 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN)		\
36721 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT)		\
36722 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE)		\
36723 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)		\
36724 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
36725 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)		\
36726 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)	\
36727 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)	\
36728 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)	\
36729 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE))
36730 
36731 static tree
36732 cp_parser_oacc_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
36733 {
36734   tree stmt, clauses, block;
36735   unsigned int save;
36736 
36737   clauses = cp_parser_oacc_all_clauses (parser, OACC_DATA_CLAUSE_MASK,
36738 					"#pragma acc data", pragma_tok);
36739 
36740   block = begin_omp_parallel ();
36741   save = cp_parser_begin_omp_structured_block (parser);
36742   cp_parser_statement (parser, NULL_TREE, false, if_p);
36743   cp_parser_end_omp_structured_block (parser, save);
36744   stmt = finish_oacc_data (clauses, block);
36745   return stmt;
36746 }
36747 
36748 /* OpenACC 2.0:
36749   # pragma acc host_data <clauses> new-line
36750   structured-block  */
36751 
36752 #define OACC_HOST_DATA_CLAUSE_MASK					\
36753   ( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_USE_DEVICE) )
36754 
36755 static tree
36756 cp_parser_oacc_host_data (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
36757 {
36758   tree stmt, clauses, block;
36759   unsigned int save;
36760 
36761   clauses = cp_parser_oacc_all_clauses (parser, OACC_HOST_DATA_CLAUSE_MASK,
36762 					"#pragma acc host_data", pragma_tok);
36763 
36764   block = begin_omp_parallel ();
36765   save = cp_parser_begin_omp_structured_block (parser);
36766   cp_parser_statement (parser, NULL_TREE, false, if_p);
36767   cp_parser_end_omp_structured_block (parser, save);
36768   stmt = finish_oacc_host_data (clauses, block);
36769   return stmt;
36770 }
36771 
36772 /* OpenACC 2.0:
36773    # pragma acc declare oacc-data-clause[optseq] new-line
36774 */
36775 
36776 #define OACC_DECLARE_CLAUSE_MASK					\
36777 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY)		\
36778 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN)		\
36779 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT)		\
36780 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE)		\
36781 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)		\
36782 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT)	\
36783 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_LINK)		\
36784 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)		\
36785 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)	\
36786 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)	\
36787 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)	\
36788 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE))
36789 
36790 static tree
36791 cp_parser_oacc_declare (cp_parser *parser, cp_token *pragma_tok)
36792 {
36793   tree clauses, stmt;
36794   bool error = false;
36795 
36796   clauses = cp_parser_oacc_all_clauses (parser, OACC_DECLARE_CLAUSE_MASK,
36797 					"#pragma acc declare", pragma_tok, true);
36798 
36799 
36800   if (omp_find_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
36801     {
36802       error_at (pragma_tok->location,
36803 		"no valid clauses specified in %<#pragma acc declare%>");
36804       return NULL_TREE;
36805     }
36806 
36807   for (tree t = clauses; t; t = OMP_CLAUSE_CHAIN (t))
36808     {
36809       location_t loc = OMP_CLAUSE_LOCATION (t);
36810       tree decl = OMP_CLAUSE_DECL (t);
36811       if (!DECL_P (decl))
36812 	{
36813 	  error_at (loc, "array section in %<#pragma acc declare%>");
36814 	  error = true;
36815 	  continue;
36816 	}
36817       gcc_assert (OMP_CLAUSE_CODE (t) == OMP_CLAUSE_MAP);
36818       switch (OMP_CLAUSE_MAP_KIND (t))
36819 	{
36820 	case GOMP_MAP_FIRSTPRIVATE_POINTER:
36821 	case GOMP_MAP_FORCE_ALLOC:
36822 	case GOMP_MAP_FORCE_TO:
36823 	case GOMP_MAP_FORCE_DEVICEPTR:
36824 	case GOMP_MAP_DEVICE_RESIDENT:
36825 	  break;
36826 
36827 	case GOMP_MAP_LINK:
36828 	  if (!global_bindings_p ()
36829 	      && (TREE_STATIC (decl)
36830 	       || !DECL_EXTERNAL (decl)))
36831 	    {
36832 	      error_at (loc,
36833 			"%qD must be a global variable in "
36834 			"%<#pragma acc declare link%>",
36835 			decl);
36836 	      error = true;
36837 	      continue;
36838 	    }
36839 	  break;
36840 
36841 	default:
36842 	  if (global_bindings_p ())
36843 	    {
36844 	      error_at (loc, "invalid OpenACC clause at file scope");
36845 	      error = true;
36846 	      continue;
36847 	    }
36848 	  if (DECL_EXTERNAL (decl))
36849 	    {
36850 	      error_at (loc,
36851 			"invalid use of %<extern%> variable %qD "
36852 			"in %<#pragma acc declare%>", decl);
36853 	      error = true;
36854 	      continue;
36855 	    }
36856 	  else if (TREE_PUBLIC (decl))
36857 	    {
36858 	      error_at (loc,
36859 			"invalid use of %<global%> variable %qD "
36860 			"in %<#pragma acc declare%>", decl);
36861 	      error = true;
36862 	      continue;
36863 	    }
36864 	  break;
36865 	}
36866 
36867       if (lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl))
36868 	  || lookup_attribute ("omp declare target link",
36869 			       DECL_ATTRIBUTES (decl)))
36870 	{
36871 	  error_at (loc, "variable %qD used more than once with "
36872 		    "%<#pragma acc declare%>", decl);
36873 	  error = true;
36874 	  continue;
36875 	}
36876 
36877       if (!error)
36878 	{
36879 	  tree id;
36880 
36881 	  if (OMP_CLAUSE_MAP_KIND (t) == GOMP_MAP_LINK)
36882 	    id = get_identifier ("omp declare target link");
36883 	  else
36884 	    id = get_identifier ("omp declare target");
36885 
36886 	  DECL_ATTRIBUTES (decl)
36887 	    = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (decl));
36888 	  if (global_bindings_p ())
36889 	    {
36890 	      symtab_node *node = symtab_node::get (decl);
36891 	      if (node != NULL)
36892 		{
36893 		  node->offloadable = 1;
36894 		  if (ENABLE_OFFLOADING)
36895 		    {
36896 		      g->have_offload = true;
36897 		      if (is_a <varpool_node *> (node))
36898 			vec_safe_push (offload_vars, decl);
36899 		    }
36900 		}
36901 	    }
36902 	}
36903     }
36904 
36905   if (error || global_bindings_p ())
36906     return NULL_TREE;
36907 
36908   stmt = make_node (OACC_DECLARE);
36909   TREE_TYPE (stmt) = void_type_node;
36910   OACC_DECLARE_CLAUSES (stmt) = clauses;
36911   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36912 
36913   add_stmt (stmt);
36914 
36915   return NULL_TREE;
36916 }
36917 
36918 /* OpenACC 2.0:
36919    # pragma acc enter data oacc-enter-data-clause[optseq] new-line
36920 
36921    or
36922 
36923    # pragma acc exit data oacc-exit-data-clause[optseq] new-line
36924 
36925    LOC is the location of the #pragma token.
36926 */
36927 
36928 #define OACC_ENTER_DATA_CLAUSE_MASK					\
36929 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
36930 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
36931 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN)		\
36932 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE)		\
36933 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)	\
36934 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE)	\
36935 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
36936 
36937 #define OACC_EXIT_DATA_CLAUSE_MASK					\
36938 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
36939 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
36940 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT)		\
36941 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DELETE) 		\
36942 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
36943 
36944 static tree
36945 cp_parser_oacc_enter_exit_data (cp_parser *parser, cp_token *pragma_tok,
36946 				bool enter)
36947 {
36948   location_t loc = pragma_tok->location;
36949   tree stmt, clauses;
36950   const char *p = "";
36951 
36952   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
36953     p = IDENTIFIER_POINTER (cp_lexer_peek_token (parser->lexer)->u.value);
36954 
36955   if (strcmp (p, "data") != 0)
36956     {
36957       error_at (loc, "expected %<data%> after %<#pragma acc %s%>",
36958 		enter ? "enter" : "exit");
36959       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
36960       return NULL_TREE;
36961     }
36962 
36963   cp_lexer_consume_token (parser->lexer);
36964 
36965   if (enter)
36966     clauses = cp_parser_oacc_all_clauses (parser, OACC_ENTER_DATA_CLAUSE_MASK,
36967 					 "#pragma acc enter data", pragma_tok);
36968   else
36969     clauses = cp_parser_oacc_all_clauses (parser, OACC_EXIT_DATA_CLAUSE_MASK,
36970 					 "#pragma acc exit data", pragma_tok);
36971 
36972   if (omp_find_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
36973     {
36974       error_at (loc, "%<#pragma acc %s data%> has no data movement clause",
36975 		enter ? "enter" : "exit");
36976       return NULL_TREE;
36977     }
36978 
36979   stmt = enter ? make_node (OACC_ENTER_DATA) : make_node (OACC_EXIT_DATA);
36980   TREE_TYPE (stmt) = void_type_node;
36981   OMP_STANDALONE_CLAUSES (stmt) = clauses;
36982   SET_EXPR_LOCATION (stmt, pragma_tok->location);
36983   add_stmt (stmt);
36984   return stmt;
36985 }
36986 
36987 /* OpenACC 2.0:
36988    # pragma acc loop oacc-loop-clause[optseq] new-line
36989      structured-block  */
36990 
36991 #define OACC_LOOP_CLAUSE_MASK						\
36992 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COLLAPSE)		\
36993 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRIVATE)		\
36994 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION)		\
36995 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_GANG)		\
36996 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR)		\
36997 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WORKER)		\
36998 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_AUTO)		\
36999 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_INDEPENDENT)		\
37000 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SEQ)			\
37001 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_TILE))
37002 
37003 static tree
37004 cp_parser_oacc_loop (cp_parser *parser, cp_token *pragma_tok, char *p_name,
37005 		     omp_clause_mask mask, tree *cclauses, bool *if_p)
37006 {
37007   bool is_parallel = ((mask >> PRAGMA_OACC_CLAUSE_REDUCTION) & 1) == 1;
37008 
37009   strcat (p_name, " loop");
37010   mask |= OACC_LOOP_CLAUSE_MASK;
37011 
37012   tree clauses = cp_parser_oacc_all_clauses (parser, mask, p_name, pragma_tok,
37013 					     cclauses == NULL);
37014   if (cclauses)
37015     {
37016       clauses = c_oacc_split_loop_clauses (clauses, cclauses, is_parallel);
37017       if (*cclauses)
37018 	*cclauses = finish_omp_clauses (*cclauses, C_ORT_ACC);
37019       if (clauses)
37020 	clauses = finish_omp_clauses (clauses, C_ORT_ACC);
37021     }
37022 
37023   tree block = begin_omp_structured_block ();
37024   int save = cp_parser_begin_omp_structured_block (parser);
37025   tree stmt = cp_parser_omp_for_loop (parser, OACC_LOOP, clauses, NULL, if_p);
37026   cp_parser_end_omp_structured_block (parser, save);
37027   add_stmt (finish_omp_structured_block (block));
37028 
37029   return stmt;
37030 }
37031 
37032 /* OpenACC 2.0:
37033    # pragma acc kernels oacc-kernels-clause[optseq] new-line
37034      structured-block
37035 
37036    or
37037 
37038    # pragma acc parallel oacc-parallel-clause[optseq] new-line
37039      structured-block
37040 */
37041 
37042 #define OACC_KERNELS_CLAUSE_MASK					\
37043 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
37044 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY)		\
37045 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN)		\
37046 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT)		\
37047 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE)		\
37048 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT)		\
37049 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)		\
37050 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
37051 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS)		\
37052 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS)		\
37053 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)		\
37054 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)	\
37055 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)	\
37056 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)	\
37057 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE)	\
37058 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH)	\
37059 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
37060 
37061 #define OACC_PARALLEL_CLAUSE_MASK					\
37062 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
37063 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPY)		\
37064 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYIN)		\
37065 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_COPYOUT)		\
37066 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_CREATE)		\
37067 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEFAULT)		\
37068 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICEPTR)		\
37069 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_FIRSTPRIVATE)       	\
37070 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
37071 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_GANGS)		\
37072 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_NUM_WORKERS)		\
37073 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT)		\
37074 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY)	\
37075 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN)	\
37076 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT)	\
37077 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE)   \
37078 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_PRIVATE)		\
37079 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_REDUCTION)		\
37080 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR_LENGTH)       \
37081 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT) )
37082 
37083 static tree
37084 cp_parser_oacc_kernels_parallel (cp_parser *parser, cp_token *pragma_tok,
37085 				 char *p_name, bool *if_p)
37086 {
37087   omp_clause_mask mask;
37088   enum tree_code code;
37089   switch (cp_parser_pragma_kind (pragma_tok))
37090     {
37091     case PRAGMA_OACC_KERNELS:
37092       strcat (p_name, " kernels");
37093       mask = OACC_KERNELS_CLAUSE_MASK;
37094       code = OACC_KERNELS;
37095       break;
37096     case PRAGMA_OACC_PARALLEL:
37097       strcat (p_name, " parallel");
37098       mask = OACC_PARALLEL_CLAUSE_MASK;
37099       code = OACC_PARALLEL;
37100       break;
37101     default:
37102       gcc_unreachable ();
37103     }
37104 
37105   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37106     {
37107       const char *p
37108 	= IDENTIFIER_POINTER (cp_lexer_peek_token (parser->lexer)->u.value);
37109       if (strcmp (p, "loop") == 0)
37110 	{
37111 	  cp_lexer_consume_token (parser->lexer);
37112 	  tree block = begin_omp_parallel ();
37113 	  tree clauses;
37114 	  cp_parser_oacc_loop (parser, pragma_tok, p_name, mask, &clauses,
37115 			       if_p);
37116 	  return finish_omp_construct (code, block, clauses);
37117 	}
37118     }
37119 
37120   tree clauses = cp_parser_oacc_all_clauses (parser, mask, p_name, pragma_tok);
37121 
37122   tree block = begin_omp_parallel ();
37123   unsigned int save = cp_parser_begin_omp_structured_block (parser);
37124   cp_parser_statement (parser, NULL_TREE, false, if_p);
37125   cp_parser_end_omp_structured_block (parser, save);
37126   return finish_omp_construct (code, block, clauses);
37127 }
37128 
37129 /* OpenACC 2.0:
37130    # pragma acc update oacc-update-clause[optseq] new-line
37131 */
37132 
37133 #define OACC_UPDATE_CLAUSE_MASK						\
37134 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC)		\
37135 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_DEVICE)		\
37136 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_HOST)		\
37137 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_IF)			\
37138 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SELF)		\
37139 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WAIT))
37140 
37141 static tree
37142 cp_parser_oacc_update (cp_parser *parser, cp_token *pragma_tok)
37143 {
37144   tree stmt, clauses;
37145 
37146   clauses = cp_parser_oacc_all_clauses (parser, OACC_UPDATE_CLAUSE_MASK,
37147 					 "#pragma acc update", pragma_tok);
37148 
37149   if (omp_find_clause (clauses, OMP_CLAUSE_MAP) == NULL_TREE)
37150     {
37151       error_at (pragma_tok->location,
37152 		"%<#pragma acc update%> must contain at least one "
37153 		"%<device%> or %<host%> or %<self%> clause");
37154       return NULL_TREE;
37155     }
37156 
37157   stmt = make_node (OACC_UPDATE);
37158   TREE_TYPE (stmt) = void_type_node;
37159   OACC_UPDATE_CLAUSES (stmt) = clauses;
37160   SET_EXPR_LOCATION (stmt, pragma_tok->location);
37161   add_stmt (stmt);
37162   return stmt;
37163 }
37164 
37165 /* OpenACC 2.0:
37166    # pragma acc wait [(intseq)] oacc-wait-clause[optseq] new-line
37167 
37168    LOC is the location of the #pragma token.
37169 */
37170 
37171 #define OACC_WAIT_CLAUSE_MASK					\
37172 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_ASYNC))
37173 
37174 static tree
37175 cp_parser_oacc_wait (cp_parser *parser, cp_token *pragma_tok)
37176 {
37177   tree clauses, list = NULL_TREE, stmt = NULL_TREE;
37178   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
37179 
37180   if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
37181     list = cp_parser_oacc_wait_list (parser, loc, list);
37182 
37183   clauses = cp_parser_oacc_all_clauses (parser, OACC_WAIT_CLAUSE_MASK,
37184 					"#pragma acc wait", pragma_tok);
37185 
37186   stmt = c_finish_oacc_wait (loc, list, clauses);
37187   stmt = finish_expr_stmt (stmt);
37188 
37189   return stmt;
37190 }
37191 
37192 /* OpenMP 4.0:
37193    # pragma omp declare simd declare-simd-clauses[optseq] new-line  */
37194 
37195 #define OMP_DECLARE_SIMD_CLAUSE_MASK				\
37196 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SIMDLEN)	\
37197 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINEAR)	\
37198 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ALIGNED)	\
37199 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNIFORM)	\
37200 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_INBRANCH)	\
37201 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOTINBRANCH))
37202 
37203 static void
37204 cp_parser_omp_declare_simd (cp_parser *parser, cp_token *pragma_tok,
37205 			    enum pragma_context context)
37206 {
37207   bool first_p = parser->omp_declare_simd == NULL;
37208   cp_omp_declare_simd_data data;
37209   if (first_p)
37210     {
37211       data.error_seen = false;
37212       data.fndecl_seen = false;
37213       data.tokens = vNULL;
37214       data.clauses = NULL_TREE;
37215       /* It is safe to take the address of a local variable; it will only be
37216 	 used while this scope is live.  */
37217       parser->omp_declare_simd = &data;
37218     }
37219 
37220   /* Store away all pragma tokens.  */
37221   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
37222 	 && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
37223     cp_lexer_consume_token (parser->lexer);
37224   if (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
37225     parser->omp_declare_simd->error_seen = true;
37226   cp_parser_require_pragma_eol (parser, pragma_tok);
37227   struct cp_token_cache *cp
37228     = cp_token_cache_new (pragma_tok, cp_lexer_peek_token (parser->lexer));
37229   parser->omp_declare_simd->tokens.safe_push (cp);
37230 
37231   if (first_p)
37232     {
37233       while (cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA))
37234 	cp_parser_pragma (parser, context, NULL);
37235       switch (context)
37236 	{
37237 	case pragma_external:
37238 	  cp_parser_declaration (parser);
37239 	  break;
37240 	case pragma_member:
37241 	  cp_parser_member_declaration (parser);
37242 	  break;
37243 	case pragma_objc_icode:
37244 	  cp_parser_block_declaration (parser, /*statement_p=*/false);
37245 	  break;
37246 	default:
37247 	  cp_parser_declaration_statement (parser);
37248 	  break;
37249 	}
37250       if (parser->omp_declare_simd
37251 	  && !parser->omp_declare_simd->error_seen
37252 	  && !parser->omp_declare_simd->fndecl_seen)
37253 	error_at (pragma_tok->location,
37254 		  "%<#pragma omp declare simd%> not immediately followed by "
37255 		  "function declaration or definition");
37256       data.tokens.release ();
37257       parser->omp_declare_simd = NULL;
37258     }
37259 }
37260 
37261 /* Finalize #pragma omp declare simd clauses after direct declarator has
37262    been parsed, and put that into "omp declare simd" attribute.  */
37263 
37264 static tree
37265 cp_parser_late_parsing_omp_declare_simd (cp_parser *parser, tree attrs)
37266 {
37267   struct cp_token_cache *ce;
37268   cp_omp_declare_simd_data *data = parser->omp_declare_simd;
37269   int i;
37270 
37271   if (!data->error_seen && data->fndecl_seen)
37272     {
37273       error ("%<#pragma omp declare simd%> not immediately followed by "
37274 	     "a single function declaration or definition");
37275       data->error_seen = true;
37276     }
37277   if (data->error_seen)
37278     return attrs;
37279 
37280   FOR_EACH_VEC_ELT (data->tokens, i, ce)
37281     {
37282       tree c, cl;
37283 
37284       cp_parser_push_lexer_for_tokens (parser, ce);
37285       parser->lexer->in_pragma = true;
37286       gcc_assert (cp_lexer_peek_token (parser->lexer)->type == CPP_PRAGMA);
37287       cp_token *pragma_tok = cp_lexer_consume_token (parser->lexer);
37288       cp_lexer_consume_token (parser->lexer);
37289       cl = cp_parser_omp_all_clauses (parser, OMP_DECLARE_SIMD_CLAUSE_MASK,
37290 				      "#pragma omp declare simd", pragma_tok);
37291       cp_parser_pop_lexer (parser);
37292       if (cl)
37293 	cl = tree_cons (NULL_TREE, cl, NULL_TREE);
37294       c = build_tree_list (get_identifier ("omp declare simd"), cl);
37295       TREE_CHAIN (c) = attrs;
37296       if (processing_template_decl)
37297 	ATTR_IS_DEPENDENT (c) = 1;
37298       attrs = c;
37299     }
37300 
37301   data->fndecl_seen = true;
37302   return attrs;
37303 }
37304 
37305 
37306 /* OpenMP 4.0:
37307    # pragma omp declare target new-line
37308    declarations and definitions
37309    # pragma omp end declare target new-line
37310 
37311    OpenMP 4.5:
37312    # pragma omp declare target ( extended-list ) new-line
37313 
37314    # pragma omp declare target declare-target-clauses[seq] new-line  */
37315 
37316 #define OMP_DECLARE_TARGET_CLAUSE_MASK				\
37317 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO)		\
37318 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK))
37319 
37320 static void
37321 cp_parser_omp_declare_target (cp_parser *parser, cp_token *pragma_tok)
37322 {
37323   tree clauses = NULL_TREE;
37324   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37325     clauses
37326       = cp_parser_omp_all_clauses (parser, OMP_DECLARE_TARGET_CLAUSE_MASK,
37327 				   "#pragma omp declare target", pragma_tok);
37328   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
37329     {
37330       clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO_DECLARE,
37331 					clauses);
37332       clauses = finish_omp_clauses (clauses, C_ORT_OMP);
37333       cp_parser_require_pragma_eol (parser, pragma_tok);
37334     }
37335   else
37336     {
37337       cp_parser_require_pragma_eol (parser, pragma_tok);
37338       scope_chain->omp_declare_target_attribute++;
37339       return;
37340     }
37341   if (scope_chain->omp_declare_target_attribute)
37342     error_at (pragma_tok->location,
37343 	      "%<#pragma omp declare target%> with clauses in between "
37344 	      "%<#pragma omp declare target%> without clauses and "
37345 	      "%<#pragma omp end declare target%>");
37346   for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
37347     {
37348       tree t = OMP_CLAUSE_DECL (c), id;
37349       tree at1 = lookup_attribute ("omp declare target", DECL_ATTRIBUTES (t));
37350       tree at2 = lookup_attribute ("omp declare target link",
37351 				   DECL_ATTRIBUTES (t));
37352       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINK)
37353 	{
37354 	  id = get_identifier ("omp declare target link");
37355 	  std::swap (at1, at2);
37356 	}
37357       else
37358 	id = get_identifier ("omp declare target");
37359       if (at2)
37360 	{
37361 	  error_at (OMP_CLAUSE_LOCATION (c),
37362 		    "%qD specified both in declare target %<link%> and %<to%>"
37363 		    " clauses", t);
37364 	  continue;
37365 	}
37366       if (!at1)
37367 	{
37368 	  DECL_ATTRIBUTES (t) = tree_cons (id, NULL_TREE, DECL_ATTRIBUTES (t));
37369 	  if (TREE_CODE (t) != FUNCTION_DECL && !is_global_var (t))
37370 	    continue;
37371 
37372 	  symtab_node *node = symtab_node::get (t);
37373 	  if (node != NULL)
37374 	    {
37375 	      node->offloadable = 1;
37376 	      if (ENABLE_OFFLOADING)
37377 		{
37378 		  g->have_offload = true;
37379 		  if (is_a <varpool_node *> (node))
37380 		    vec_safe_push (offload_vars, t);
37381 		}
37382 	    }
37383 	}
37384     }
37385 }
37386 
37387 static void
37388 cp_parser_omp_end_declare_target (cp_parser *parser, cp_token *pragma_tok)
37389 {
37390   const char *p = "";
37391   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37392     {
37393       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37394       p = IDENTIFIER_POINTER (id);
37395     }
37396   if (strcmp (p, "declare") == 0)
37397     {
37398       cp_lexer_consume_token (parser->lexer);
37399       p = "";
37400       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37401 	{
37402 	  tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37403 	  p = IDENTIFIER_POINTER (id);
37404 	}
37405       if (strcmp (p, "target") == 0)
37406 	cp_lexer_consume_token (parser->lexer);
37407       else
37408 	{
37409 	  cp_parser_error (parser, "expected %<target%>");
37410 	  cp_parser_skip_to_pragma_eol (parser, pragma_tok);
37411 	  return;
37412 	}
37413     }
37414   else
37415     {
37416       cp_parser_error (parser, "expected %<declare%>");
37417       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
37418       return;
37419     }
37420   cp_parser_require_pragma_eol (parser, pragma_tok);
37421   if (!scope_chain->omp_declare_target_attribute)
37422     error_at (pragma_tok->location,
37423 	      "%<#pragma omp end declare target%> without corresponding "
37424 	      "%<#pragma omp declare target%>");
37425   else
37426     scope_chain->omp_declare_target_attribute--;
37427 }
37428 
37429 /* Helper function of cp_parser_omp_declare_reduction.  Parse the combiner
37430    expression and optional initializer clause of
37431    #pragma omp declare reduction.  We store the expression(s) as
37432    either 3, 6 or 7 special statements inside of the artificial function's
37433    body.  The first two statements are DECL_EXPRs for the artificial
37434    OMP_OUT resp. OMP_IN variables, followed by a statement with the combiner
37435    expression that uses those variables.
37436    If there was any INITIALIZER clause, this is followed by further statements,
37437    the fourth and fifth statements are DECL_EXPRs for the artificial
37438    OMP_PRIV resp. OMP_ORIG variables.  If the INITIALIZER clause wasn't the
37439    constructor variant (first token after open paren is not omp_priv),
37440    then the sixth statement is a statement with the function call expression
37441    that uses the OMP_PRIV and optionally OMP_ORIG variable.
37442    Otherwise, the sixth statement is whatever statement cp_finish_decl emits
37443    to initialize the OMP_PRIV artificial variable and there is seventh
37444    statement, a DECL_EXPR of the OMP_PRIV statement again.  */
37445 
37446 static bool
37447 cp_parser_omp_declare_reduction_exprs (tree fndecl, cp_parser *parser)
37448 {
37449   tree type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
37450   gcc_assert (TREE_CODE (type) == REFERENCE_TYPE);
37451   type = TREE_TYPE (type);
37452   tree omp_out = build_lang_decl (VAR_DECL, get_identifier ("omp_out"), type);
37453   DECL_ARTIFICIAL (omp_out) = 1;
37454   pushdecl (omp_out);
37455   add_decl_expr (omp_out);
37456   tree omp_in = build_lang_decl (VAR_DECL, get_identifier ("omp_in"), type);
37457   DECL_ARTIFICIAL (omp_in) = 1;
37458   pushdecl (omp_in);
37459   add_decl_expr (omp_in);
37460   tree combiner;
37461   tree omp_priv = NULL_TREE, omp_orig = NULL_TREE, initializer = NULL_TREE;
37462 
37463   keep_next_level (true);
37464   tree block = begin_omp_structured_block ();
37465   combiner = cp_parser_expression (parser);
37466   finish_expr_stmt (combiner);
37467   block = finish_omp_structured_block (block);
37468   add_stmt (block);
37469 
37470   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
37471     return false;
37472 
37473   const char *p = "";
37474   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37475     {
37476       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37477       p = IDENTIFIER_POINTER (id);
37478     }
37479 
37480   if (strcmp (p, "initializer") == 0)
37481     {
37482       cp_lexer_consume_token (parser->lexer);
37483       matching_parens parens;
37484       if (!parens.require_open (parser))
37485 	return false;
37486 
37487       p = "";
37488       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37489 	{
37490 	  tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37491 	  p = IDENTIFIER_POINTER (id);
37492 	}
37493 
37494       omp_priv = build_lang_decl (VAR_DECL, get_identifier ("omp_priv"), type);
37495       DECL_ARTIFICIAL (omp_priv) = 1;
37496       pushdecl (omp_priv);
37497       add_decl_expr (omp_priv);
37498       omp_orig = build_lang_decl (VAR_DECL, get_identifier ("omp_orig"), type);
37499       DECL_ARTIFICIAL (omp_orig) = 1;
37500       pushdecl (omp_orig);
37501       add_decl_expr (omp_orig);
37502 
37503       keep_next_level (true);
37504       block = begin_omp_structured_block ();
37505 
37506       bool ctor = false;
37507       if (strcmp (p, "omp_priv") == 0)
37508 	{
37509 	  bool is_direct_init, is_non_constant_init;
37510 	  ctor = true;
37511 	  cp_lexer_consume_token (parser->lexer);
37512 	  /* Reject initializer (omp_priv) and initializer (omp_priv ()).  */
37513 	  if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
37514 	      || (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
37515 		  && cp_lexer_peek_nth_token (parser->lexer, 2)->type
37516 		     == CPP_CLOSE_PAREN
37517 		  && cp_lexer_peek_nth_token (parser->lexer, 3)->type
37518 		     == CPP_CLOSE_PAREN))
37519 	    {
37520 	      finish_omp_structured_block (block);
37521 	      error ("invalid initializer clause");
37522 	      return false;
37523 	    }
37524 	  initializer = cp_parser_initializer (parser, &is_direct_init,
37525 					       &is_non_constant_init);
37526 	  cp_finish_decl (omp_priv, initializer, !is_non_constant_init,
37527 			  NULL_TREE, LOOKUP_ONLYCONVERTING);
37528 	}
37529       else
37530 	{
37531 	  cp_parser_parse_tentatively (parser);
37532 	  tree fn_name = cp_parser_id_expression (parser, /*template_p=*/false,
37533 						  /*check_dependency_p=*/true,
37534 						  /*template_p=*/NULL,
37535 						  /*declarator_p=*/false,
37536 						  /*optional_p=*/false);
37537 	  vec<tree, va_gc> *args;
37538 	  if (fn_name == error_mark_node
37539 	      || cp_parser_error_occurred (parser)
37540 	      || !cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
37541 	      || ((args = cp_parser_parenthesized_expression_list
37542 				(parser, non_attr, /*cast_p=*/false,
37543 				 /*allow_expansion_p=*/true,
37544 				 /*non_constant_p=*/NULL)),
37545 		  cp_parser_error_occurred (parser)))
37546 	    {
37547 	      finish_omp_structured_block (block);
37548 	      cp_parser_abort_tentative_parse (parser);
37549 	      cp_parser_error (parser, "expected id-expression (arguments)");
37550 	      return false;
37551 	    }
37552 	  unsigned int i;
37553 	  tree arg;
37554 	  FOR_EACH_VEC_SAFE_ELT (args, i, arg)
37555 	    if (arg == omp_priv
37556 		|| (TREE_CODE (arg) == ADDR_EXPR
37557 		    && TREE_OPERAND (arg, 0) == omp_priv))
37558 	      break;
37559 	  cp_parser_abort_tentative_parse (parser);
37560 	  if (arg == NULL_TREE)
37561 	    error ("one of the initializer call arguments should be %<omp_priv%>"
37562 		   " or %<&omp_priv%>");
37563 	  initializer = cp_parser_postfix_expression (parser, false, false, false,
37564 						      false, NULL);
37565 	  finish_expr_stmt (initializer);
37566 	}
37567 
37568       block = finish_omp_structured_block (block);
37569       cp_walk_tree (&block, cp_remove_omp_priv_cleanup_stmt, omp_priv, NULL);
37570       add_stmt (block);
37571 
37572       if (ctor)
37573 	add_decl_expr (omp_orig);
37574 
37575       if (!parens.require_close (parser))
37576 	return false;
37577     }
37578 
37579   if (!cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA_EOL))
37580     cp_parser_required_error (parser, RT_PRAGMA_EOL, /*keyword=*/false,
37581                               UNKNOWN_LOCATION);
37582 
37583   return true;
37584 }
37585 
37586 /* OpenMP 4.0
37587    #pragma omp declare reduction (reduction-id : typename-list : expression) \
37588       initializer-clause[opt] new-line
37589 
37590    initializer-clause:
37591       initializer (omp_priv initializer)
37592       initializer (function-name (argument-list))  */
37593 
37594 static void
37595 cp_parser_omp_declare_reduction (cp_parser *parser, cp_token *pragma_tok,
37596 				 enum pragma_context)
37597 {
37598   auto_vec<tree> types;
37599   enum tree_code reduc_code = ERROR_MARK;
37600   tree reduc_id = NULL_TREE, orig_reduc_id = NULL_TREE, type;
37601   unsigned int i;
37602   cp_token *first_token;
37603   cp_token_cache *cp;
37604   int errs;
37605   void *p;
37606 
37607   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
37608   p = obstack_alloc (&declarator_obstack, 0);
37609 
37610   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
37611     goto fail;
37612 
37613   switch (cp_lexer_peek_token (parser->lexer)->type)
37614     {
37615     case CPP_PLUS:
37616       reduc_code = PLUS_EXPR;
37617       break;
37618     case CPP_MULT:
37619       reduc_code = MULT_EXPR;
37620       break;
37621     case CPP_MINUS:
37622       reduc_code = MINUS_EXPR;
37623       break;
37624     case CPP_AND:
37625       reduc_code = BIT_AND_EXPR;
37626       break;
37627     case CPP_XOR:
37628       reduc_code = BIT_XOR_EXPR;
37629       break;
37630     case CPP_OR:
37631       reduc_code = BIT_IOR_EXPR;
37632       break;
37633     case CPP_AND_AND:
37634       reduc_code = TRUTH_ANDIF_EXPR;
37635       break;
37636     case CPP_OR_OR:
37637       reduc_code = TRUTH_ORIF_EXPR;
37638       break;
37639     case CPP_NAME:
37640       reduc_id = orig_reduc_id = cp_parser_identifier (parser);
37641       break;
37642     default:
37643       cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
37644 			       "%<|%>, %<&&%>, %<||%> or identifier");
37645       goto fail;
37646     }
37647 
37648   if (reduc_code != ERROR_MARK)
37649     cp_lexer_consume_token (parser->lexer);
37650 
37651   reduc_id = omp_reduction_id (reduc_code, reduc_id, NULL_TREE);
37652   if (reduc_id == error_mark_node)
37653     goto fail;
37654 
37655   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
37656     goto fail;
37657 
37658   /* Types may not be defined in declare reduction type list.  */
37659   const char *saved_message;
37660   saved_message = parser->type_definition_forbidden_message;
37661   parser->type_definition_forbidden_message
37662     = G_("types may not be defined in declare reduction type list");
37663   bool saved_colon_corrects_to_scope_p;
37664   saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
37665   parser->colon_corrects_to_scope_p = false;
37666   bool saved_colon_doesnt_start_class_def_p;
37667   saved_colon_doesnt_start_class_def_p
37668     = parser->colon_doesnt_start_class_def_p;
37669   parser->colon_doesnt_start_class_def_p = true;
37670 
37671   while (true)
37672     {
37673       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
37674       type = cp_parser_type_id (parser);
37675       if (type == error_mark_node)
37676 	;
37677       else if (ARITHMETIC_TYPE_P (type)
37678 	       && (orig_reduc_id == NULL_TREE
37679 		   || (TREE_CODE (type) != COMPLEX_TYPE
37680 		       && (id_equal (orig_reduc_id, "min")
37681 			   || id_equal (orig_reduc_id, "max")))))
37682 	error_at (loc, "predeclared arithmetic type %qT in "
37683 		       "%<#pragma omp declare reduction%>", type);
37684       else if (TREE_CODE (type) == FUNCTION_TYPE
37685 	       || TREE_CODE (type) == METHOD_TYPE
37686 	       || TREE_CODE (type) == ARRAY_TYPE)
37687 	error_at (loc, "function or array type %qT in "
37688 		       "%<#pragma omp declare reduction%>", type);
37689       else if (TREE_CODE (type) == REFERENCE_TYPE)
37690 	error_at (loc, "reference type %qT in "
37691 		       "%<#pragma omp declare reduction%>", type);
37692       else if (TYPE_QUALS_NO_ADDR_SPACE (type))
37693 	error_at (loc, "const, volatile or __restrict qualified type %qT in "
37694 		       "%<#pragma omp declare reduction%>", type);
37695       else
37696 	types.safe_push (type);
37697 
37698       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
37699 	cp_lexer_consume_token (parser->lexer);
37700       else
37701 	break;
37702     }
37703 
37704   /* Restore the saved message.  */
37705   parser->type_definition_forbidden_message = saved_message;
37706   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
37707   parser->colon_doesnt_start_class_def_p
37708     = saved_colon_doesnt_start_class_def_p;
37709 
37710   if (!cp_parser_require (parser, CPP_COLON, RT_COLON)
37711       || types.is_empty ())
37712     {
37713      fail:
37714       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
37715       goto done;
37716     }
37717 
37718   first_token = cp_lexer_peek_token (parser->lexer);
37719   cp = NULL;
37720   errs = errorcount;
37721   FOR_EACH_VEC_ELT (types, i, type)
37722     {
37723       tree fntype
37724 	= build_function_type_list (void_type_node,
37725 				    cp_build_reference_type (type, false),
37726 				    NULL_TREE);
37727       tree this_reduc_id = reduc_id;
37728       if (!dependent_type_p (type))
37729 	this_reduc_id = omp_reduction_id (ERROR_MARK, reduc_id, type);
37730       tree fndecl = build_lang_decl (FUNCTION_DECL, this_reduc_id, fntype);
37731       DECL_SOURCE_LOCATION (fndecl) = pragma_tok->location;
37732       DECL_ARTIFICIAL (fndecl) = 1;
37733       DECL_EXTERNAL (fndecl) = 1;
37734       DECL_DECLARED_INLINE_P (fndecl) = 1;
37735       DECL_IGNORED_P (fndecl) = 1;
37736       DECL_OMP_DECLARE_REDUCTION_P (fndecl) = 1;
37737       SET_DECL_ASSEMBLER_NAME (fndecl, get_identifier ("<udr>"));
37738       DECL_ATTRIBUTES (fndecl)
37739 	= tree_cons (get_identifier ("gnu_inline"), NULL_TREE,
37740 		     DECL_ATTRIBUTES (fndecl));
37741       if (processing_template_decl)
37742 	fndecl = push_template_decl (fndecl);
37743       bool block_scope = false;
37744       tree block = NULL_TREE;
37745       if (current_function_decl)
37746 	{
37747 	  block_scope = true;
37748 	  DECL_CONTEXT (fndecl) = global_namespace;
37749 	  if (!processing_template_decl)
37750 	    pushdecl (fndecl);
37751 	}
37752       else if (current_class_type)
37753 	{
37754 	  if (cp == NULL)
37755 	    {
37756 	      while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
37757 		     && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
37758 		cp_lexer_consume_token (parser->lexer);
37759 	      if (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
37760 		goto fail;
37761 	      cp = cp_token_cache_new (first_token,
37762 				       cp_lexer_peek_nth_token (parser->lexer,
37763 								2));
37764 	    }
37765 	  DECL_STATIC_FUNCTION_P (fndecl) = 1;
37766 	  finish_member_declaration (fndecl);
37767 	  DECL_PENDING_INLINE_INFO (fndecl) = cp;
37768 	  DECL_PENDING_INLINE_P (fndecl) = 1;
37769 	  vec_safe_push (unparsed_funs_with_definitions, fndecl);
37770 	  continue;
37771 	}
37772       else
37773 	{
37774 	  DECL_CONTEXT (fndecl) = current_namespace;
37775 	  pushdecl (fndecl);
37776 	}
37777       if (!block_scope)
37778 	start_preparsed_function (fndecl, NULL_TREE, SF_PRE_PARSED);
37779       else
37780 	block = begin_omp_structured_block ();
37781       if (cp)
37782 	{
37783 	  cp_parser_push_lexer_for_tokens (parser, cp);
37784 	  parser->lexer->in_pragma = true;
37785 	}
37786       if (!cp_parser_omp_declare_reduction_exprs (fndecl, parser))
37787 	{
37788 	  if (!block_scope)
37789 	    finish_function (/*inline_p=*/false);
37790 	  else
37791 	    DECL_CONTEXT (fndecl) = current_function_decl;
37792 	  if (cp)
37793 	    cp_parser_pop_lexer (parser);
37794 	  goto fail;
37795 	}
37796       if (cp)
37797 	cp_parser_pop_lexer (parser);
37798       if (!block_scope)
37799 	finish_function (/*inline_p=*/false);
37800       else
37801 	{
37802 	  DECL_CONTEXT (fndecl) = current_function_decl;
37803 	  block = finish_omp_structured_block (block);
37804 	  if (TREE_CODE (block) == BIND_EXPR)
37805 	    DECL_SAVED_TREE (fndecl) = BIND_EXPR_BODY (block);
37806 	  else if (TREE_CODE (block) == STATEMENT_LIST)
37807 	    DECL_SAVED_TREE (fndecl) = block;
37808 	  if (processing_template_decl)
37809 	    add_decl_expr (fndecl);
37810 	}
37811       cp_check_omp_declare_reduction (fndecl);
37812       if (cp == NULL && types.length () > 1)
37813 	cp = cp_token_cache_new (first_token,
37814 				 cp_lexer_peek_nth_token (parser->lexer, 2));
37815       if (errs != errorcount)
37816 	break;
37817     }
37818 
37819   cp_parser_require_pragma_eol (parser, pragma_tok);
37820 
37821  done:
37822   /* Free any declarators allocated.  */
37823   obstack_free (&declarator_obstack, p);
37824 }
37825 
37826 /* OpenMP 4.0
37827    #pragma omp declare simd declare-simd-clauses[optseq] new-line
37828    #pragma omp declare reduction (reduction-id : typename-list : expression) \
37829       initializer-clause[opt] new-line
37830    #pragma omp declare target new-line  */
37831 
37832 static bool
37833 cp_parser_omp_declare (cp_parser *parser, cp_token *pragma_tok,
37834 		       enum pragma_context context)
37835 {
37836   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37837     {
37838       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37839       const char *p = IDENTIFIER_POINTER (id);
37840 
37841       if (strcmp (p, "simd") == 0)
37842 	{
37843 	  cp_lexer_consume_token (parser->lexer);
37844 	  cp_parser_omp_declare_simd (parser, pragma_tok,
37845 				      context);
37846 	  return true;
37847 	}
37848       cp_ensure_no_omp_declare_simd (parser);
37849       if (strcmp (p, "reduction") == 0)
37850 	{
37851 	  cp_lexer_consume_token (parser->lexer);
37852 	  cp_parser_omp_declare_reduction (parser, pragma_tok,
37853 					   context);
37854 	  return false;
37855 	}
37856       if (!flag_openmp)  /* flag_openmp_simd  */
37857 	{
37858 	  cp_parser_skip_to_pragma_eol (parser, pragma_tok);
37859 	  return false;
37860 	}
37861       if (strcmp (p, "target") == 0)
37862 	{
37863 	  cp_lexer_consume_token (parser->lexer);
37864 	  cp_parser_omp_declare_target (parser, pragma_tok);
37865 	  return false;
37866 	}
37867     }
37868   cp_parser_error (parser, "expected %<simd%> or %<reduction%> "
37869 			   "or %<target%>");
37870   cp_parser_require_pragma_eol (parser, pragma_tok);
37871   return false;
37872 }
37873 
37874 /* OpenMP 4.5:
37875    #pragma omp taskloop taskloop-clause[optseq] new-line
37876      for-loop
37877 
37878    #pragma omp taskloop simd taskloop-simd-clause[optseq] new-line
37879      for-loop  */
37880 
37881 #define OMP_TASKLOOP_CLAUSE_MASK				\
37882 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_SHARED)	\
37883 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIVATE)	\
37884 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)	\
37885 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LASTPRIVATE)	\
37886 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEFAULT)	\
37887 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_GRAINSIZE)	\
37888 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_TASKS)	\
37889 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COLLAPSE)	\
37890 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_UNTIED)	\
37891 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_IF)		\
37892 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_FINAL)	\
37893 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_MERGEABLE)	\
37894 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NOGROUP)	\
37895 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRIORITY))
37896 
37897 static tree
37898 cp_parser_omp_taskloop (cp_parser *parser, cp_token *pragma_tok,
37899 			char *p_name, omp_clause_mask mask, tree *cclauses,
37900 			bool *if_p)
37901 {
37902   tree clauses, sb, ret;
37903   unsigned int save;
37904   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
37905 
37906   strcat (p_name, " taskloop");
37907   mask |= OMP_TASKLOOP_CLAUSE_MASK;
37908 
37909   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
37910     {
37911       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
37912       const char *p = IDENTIFIER_POINTER (id);
37913 
37914       if (strcmp (p, "simd") == 0)
37915 	{
37916 	  tree cclauses_buf[C_OMP_CLAUSE_SPLIT_COUNT];
37917 	  if (cclauses == NULL)
37918 	    cclauses = cclauses_buf;
37919 
37920 	  cp_lexer_consume_token (parser->lexer);
37921 	  if (!flag_openmp)  /* flag_openmp_simd  */
37922 	    return cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
37923 				       cclauses, if_p);
37924 	  sb = begin_omp_structured_block ();
37925 	  save = cp_parser_begin_omp_structured_block (parser);
37926 	  ret = cp_parser_omp_simd (parser, pragma_tok, p_name, mask,
37927 				    cclauses, if_p);
37928 	  cp_parser_end_omp_structured_block (parser, save);
37929 	  tree body = finish_omp_structured_block (sb);
37930 	  if (ret == NULL)
37931 	    return ret;
37932 	  ret = make_node (OMP_TASKLOOP);
37933 	  TREE_TYPE (ret) = void_type_node;
37934 	  OMP_FOR_BODY (ret) = body;
37935 	  OMP_FOR_CLAUSES (ret) = cclauses[C_OMP_CLAUSE_SPLIT_TASKLOOP];
37936 	  SET_EXPR_LOCATION (ret, loc);
37937 	  add_stmt (ret);
37938 	  return ret;
37939 	}
37940     }
37941   if (!flag_openmp)  /* flag_openmp_simd  */
37942     {
37943       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
37944       return NULL_TREE;
37945     }
37946 
37947   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok,
37948 				       cclauses == NULL);
37949   if (cclauses)
37950     {
37951       cp_omp_split_clauses (loc, OMP_TASKLOOP, mask, clauses, cclauses);
37952       clauses = cclauses[C_OMP_CLAUSE_SPLIT_TASKLOOP];
37953     }
37954 
37955   sb = begin_omp_structured_block ();
37956   save = cp_parser_begin_omp_structured_block (parser);
37957 
37958   ret = cp_parser_omp_for_loop (parser, OMP_TASKLOOP, clauses, cclauses,
37959 				if_p);
37960 
37961   cp_parser_end_omp_structured_block (parser, save);
37962   add_stmt (finish_omp_structured_block (sb));
37963 
37964   return ret;
37965 }
37966 
37967 
37968 /* OpenACC 2.0:
37969    # pragma acc routine oacc-routine-clause[optseq] new-line
37970      function-definition
37971 
37972    # pragma acc routine ( name ) oacc-routine-clause[optseq] new-line
37973 */
37974 
37975 #define OACC_ROUTINE_CLAUSE_MASK					\
37976 	( (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_GANG)		\
37977 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_WORKER)		\
37978 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_VECTOR)		\
37979 	| (OMP_CLAUSE_MASK_1 << PRAGMA_OACC_CLAUSE_SEQ))
37980 
37981 
37982 /* Parse the OpenACC routine pragma.  This has an optional '( name )'
37983    component, which must resolve to a declared namespace-scope
37984    function.  The clauses are either processed directly (for a named
37985    function), or defered until the immediatley following declaration
37986    is parsed.  */
37987 
37988 static void
37989 cp_parser_oacc_routine (cp_parser *parser, cp_token *pragma_tok,
37990 			enum pragma_context context)
37991 {
37992   gcc_checking_assert (context == pragma_external);
37993   /* The checking for "another pragma following this one" in the "no optional
37994      '( name )'" case makes sure that we dont re-enter.  */
37995   gcc_checking_assert (parser->oacc_routine == NULL);
37996 
37997   cp_oacc_routine_data data;
37998   data.error_seen = false;
37999   data.fndecl_seen = false;
38000   data.tokens = vNULL;
38001   data.clauses = NULL_TREE;
38002   data.loc = pragma_tok->location;
38003   /* It is safe to take the address of a local variable; it will only be
38004      used while this scope is live.  */
38005   parser->oacc_routine = &data;
38006 
38007   /* Look for optional '( name )'.  */
38008   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
38009     {
38010       matching_parens parens;
38011       parens.consume_open (parser); /* '(' */
38012 
38013       /* We parse the name as an id-expression.  If it resolves to
38014 	 anything other than a non-overloaded function at namespace
38015 	 scope, it's an error.  */
38016       location_t name_loc = cp_lexer_peek_token (parser->lexer)->location;
38017       tree name = cp_parser_id_expression (parser,
38018 					   /*template_keyword_p=*/false,
38019 					   /*check_dependency_p=*/false,
38020 					   /*template_p=*/NULL,
38021 					   /*declarator_p=*/false,
38022 					   /*optional_p=*/false);
38023       tree decl = (identifier_p (name)
38024 		   ? cp_parser_lookup_name_simple (parser, name, name_loc)
38025 		   : name);
38026       if (name != error_mark_node && decl == error_mark_node)
38027 	cp_parser_name_lookup_error (parser, name, decl, NLE_NULL, name_loc);
38028 
38029       if (decl == error_mark_node
38030 	  || !parens.require_close (parser))
38031 	{
38032 	  cp_parser_skip_to_pragma_eol (parser, pragma_tok);
38033 	  parser->oacc_routine = NULL;
38034 	  return;
38035 	}
38036 
38037       data.clauses
38038 	= cp_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
38039 				      "#pragma acc routine",
38040 				      cp_lexer_peek_token (parser->lexer));
38041 
38042       if (decl && is_overloaded_fn (decl)
38043 	  && (TREE_CODE (decl) != FUNCTION_DECL
38044 	      || DECL_FUNCTION_TEMPLATE_P  (decl)))
38045 	{
38046 	  error_at (name_loc,
38047 		    "%<#pragma acc routine%> names a set of overloads");
38048 	  parser->oacc_routine = NULL;
38049 	  return;
38050 	}
38051 
38052       /* Perhaps we should use the same rule as declarations in different
38053 	 namespaces?  */
38054       if (!DECL_NAMESPACE_SCOPE_P (decl))
38055 	{
38056 	  error_at (name_loc,
38057 		    "%qD does not refer to a namespace scope function", decl);
38058 	  parser->oacc_routine = NULL;
38059 	  return;
38060 	}
38061 
38062       if (TREE_CODE (decl) != FUNCTION_DECL)
38063 	{
38064 	  error_at (name_loc, "%qD does not refer to a function", decl);
38065 	  parser->oacc_routine = NULL;
38066 	  return;
38067 	}
38068 
38069       cp_finalize_oacc_routine (parser, decl, false);
38070       parser->oacc_routine = NULL;
38071     }
38072   else /* No optional '( name )'.  */
38073     {
38074       /* Store away all pragma tokens.  */
38075       while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)
38076 	     && cp_lexer_next_token_is_not (parser->lexer, CPP_EOF))
38077 	cp_lexer_consume_token (parser->lexer);
38078       if (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
38079 	parser->oacc_routine->error_seen = true;
38080       cp_parser_require_pragma_eol (parser, pragma_tok);
38081       struct cp_token_cache *cp
38082 	= cp_token_cache_new (pragma_tok, cp_lexer_peek_token (parser->lexer));
38083       parser->oacc_routine->tokens.safe_push (cp);
38084 
38085       /* Emit a helpful diagnostic if there's another pragma following this
38086 	 one.  */
38087       if (cp_lexer_next_token_is (parser->lexer, CPP_PRAGMA))
38088 	{
38089 	  cp_ensure_no_oacc_routine (parser);
38090 	  data.tokens.release ();
38091 	  /* ..., and then just keep going.  */
38092 	  return;
38093 	}
38094 
38095       /* We only have to consider the pragma_external case here.  */
38096       cp_parser_declaration (parser);
38097       if (parser->oacc_routine
38098 	  && !parser->oacc_routine->fndecl_seen)
38099 	cp_ensure_no_oacc_routine (parser);
38100       else
38101 	parser->oacc_routine = NULL;
38102       data.tokens.release ();
38103     }
38104 }
38105 
38106 /* Finalize #pragma acc routine clauses after direct declarator has
38107    been parsed.  */
38108 
38109 static tree
38110 cp_parser_late_parsing_oacc_routine (cp_parser *parser, tree attrs)
38111 {
38112   struct cp_token_cache *ce;
38113   cp_oacc_routine_data *data = parser->oacc_routine;
38114 
38115   if (!data->error_seen && data->fndecl_seen)
38116     {
38117       error_at (data->loc,
38118 		"%<#pragma acc routine%> not immediately followed by "
38119 		"a single function declaration or definition");
38120       data->error_seen = true;
38121     }
38122   if (data->error_seen)
38123     return attrs;
38124 
38125   gcc_checking_assert (data->tokens.length () == 1);
38126   ce = data->tokens[0];
38127 
38128   cp_parser_push_lexer_for_tokens (parser, ce);
38129   parser->lexer->in_pragma = true;
38130   gcc_assert (cp_lexer_peek_token (parser->lexer)->type == CPP_PRAGMA);
38131 
38132   cp_token *pragma_tok = cp_lexer_consume_token (parser->lexer);
38133   gcc_checking_assert (parser->oacc_routine->clauses == NULL_TREE);
38134   parser->oacc_routine->clauses
38135     = cp_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
38136 				  "#pragma acc routine", pragma_tok);
38137   cp_parser_pop_lexer (parser);
38138   /* Later, cp_finalize_oacc_routine will process the clauses, and then set
38139      fndecl_seen.  */
38140 
38141   return attrs;
38142 }
38143 
38144 /* Apply any saved OpenACC routine clauses to a just-parsed
38145    declaration.  */
38146 
38147 static void
38148 cp_finalize_oacc_routine (cp_parser *parser, tree fndecl, bool is_defn)
38149 {
38150   if (__builtin_expect (parser->oacc_routine != NULL, 0))
38151     {
38152       /* Keep going if we're in error reporting mode.  */
38153       if (parser->oacc_routine->error_seen
38154 	  || fndecl == error_mark_node)
38155 	return;
38156 
38157       if (parser->oacc_routine->fndecl_seen)
38158 	{
38159 	  error_at (parser->oacc_routine->loc,
38160 		    "%<#pragma acc routine%> not immediately followed by"
38161 		    " a single function declaration or definition");
38162 	  parser->oacc_routine = NULL;
38163 	  return;
38164 	}
38165       if (TREE_CODE (fndecl) != FUNCTION_DECL)
38166 	{
38167 	  cp_ensure_no_oacc_routine (parser);
38168 	  return;
38169 	}
38170 
38171       if (oacc_get_fn_attrib (fndecl))
38172 	{
38173 	  error_at (parser->oacc_routine->loc,
38174 		    "%<#pragma acc routine%> already applied to %qD", fndecl);
38175 	  parser->oacc_routine = NULL;
38176 	  return;
38177 	}
38178 
38179       if (TREE_USED (fndecl) || (!is_defn && DECL_SAVED_TREE (fndecl)))
38180 	{
38181 	  error_at (parser->oacc_routine->loc,
38182 		    TREE_USED (fndecl)
38183 		    ? G_("%<#pragma acc routine%> must be applied before use")
38184 		    : G_("%<#pragma acc routine%> must be applied before "
38185 			 "definition"));
38186 	  parser->oacc_routine = NULL;
38187 	  return;
38188 	}
38189 
38190       /* Process the routine's dimension clauses.  */
38191       tree dims = oacc_build_routine_dims (parser->oacc_routine->clauses);
38192       oacc_replace_fn_attrib (fndecl, dims);
38193 
38194       /* Add an "omp declare target" attribute.  */
38195       DECL_ATTRIBUTES (fndecl)
38196 	= tree_cons (get_identifier ("omp declare target"),
38197 		     NULL_TREE, DECL_ATTRIBUTES (fndecl));
38198 
38199       /* Don't unset parser->oacc_routine here: we may still need it to
38200 	 diagnose wrong usage.  But, remember that we've used this "#pragma acc
38201 	 routine".  */
38202       parser->oacc_routine->fndecl_seen = true;
38203     }
38204 }
38205 
38206 /* Main entry point to OpenMP statement pragmas.  */
38207 
38208 static void
38209 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
38210 {
38211   tree stmt;
38212   char p_name[sizeof "#pragma omp teams distribute parallel for simd"];
38213   omp_clause_mask mask (0);
38214 
38215   switch (cp_parser_pragma_kind (pragma_tok))
38216     {
38217     case PRAGMA_OACC_ATOMIC:
38218       cp_parser_omp_atomic (parser, pragma_tok);
38219       return;
38220     case PRAGMA_OACC_CACHE:
38221       stmt = cp_parser_oacc_cache (parser, pragma_tok);
38222       break;
38223     case PRAGMA_OACC_DATA:
38224       stmt = cp_parser_oacc_data (parser, pragma_tok, if_p);
38225       break;
38226     case PRAGMA_OACC_ENTER_DATA:
38227       stmt = cp_parser_oacc_enter_exit_data (parser, pragma_tok, true);
38228       break;
38229     case PRAGMA_OACC_EXIT_DATA:
38230       stmt = cp_parser_oacc_enter_exit_data (parser, pragma_tok, false);
38231       break;
38232     case PRAGMA_OACC_HOST_DATA:
38233       stmt = cp_parser_oacc_host_data (parser, pragma_tok, if_p);
38234       break;
38235     case PRAGMA_OACC_KERNELS:
38236     case PRAGMA_OACC_PARALLEL:
38237       strcpy (p_name, "#pragma acc");
38238       stmt = cp_parser_oacc_kernels_parallel (parser, pragma_tok, p_name,
38239 					      if_p);
38240       break;
38241     case PRAGMA_OACC_LOOP:
38242       strcpy (p_name, "#pragma acc");
38243       stmt = cp_parser_oacc_loop (parser, pragma_tok, p_name, mask, NULL,
38244 				  if_p);
38245       break;
38246     case PRAGMA_OACC_UPDATE:
38247       stmt = cp_parser_oacc_update (parser, pragma_tok);
38248       break;
38249     case PRAGMA_OACC_WAIT:
38250       stmt = cp_parser_oacc_wait (parser, pragma_tok);
38251       break;
38252     case PRAGMA_OMP_ATOMIC:
38253       cp_parser_omp_atomic (parser, pragma_tok);
38254       return;
38255     case PRAGMA_OMP_CRITICAL:
38256       stmt = cp_parser_omp_critical (parser, pragma_tok, if_p);
38257       break;
38258     case PRAGMA_OMP_DISTRIBUTE:
38259       strcpy (p_name, "#pragma omp");
38260       stmt = cp_parser_omp_distribute (parser, pragma_tok, p_name, mask, NULL,
38261 				       if_p);
38262       break;
38263     case PRAGMA_OMP_FOR:
38264       strcpy (p_name, "#pragma omp");
38265       stmt = cp_parser_omp_for (parser, pragma_tok, p_name, mask, NULL,
38266 				if_p);
38267       break;
38268     case PRAGMA_OMP_MASTER:
38269       stmt = cp_parser_omp_master (parser, pragma_tok, if_p);
38270       break;
38271     case PRAGMA_OMP_PARALLEL:
38272       strcpy (p_name, "#pragma omp");
38273       stmt = cp_parser_omp_parallel (parser, pragma_tok, p_name, mask, NULL,
38274 				     if_p);
38275       break;
38276     case PRAGMA_OMP_SECTIONS:
38277       strcpy (p_name, "#pragma omp");
38278       stmt = cp_parser_omp_sections (parser, pragma_tok, p_name, mask, NULL);
38279       break;
38280     case PRAGMA_OMP_SIMD:
38281       strcpy (p_name, "#pragma omp");
38282       stmt = cp_parser_omp_simd (parser, pragma_tok, p_name, mask, NULL,
38283 				 if_p);
38284       break;
38285     case PRAGMA_OMP_SINGLE:
38286       stmt = cp_parser_omp_single (parser, pragma_tok, if_p);
38287       break;
38288     case PRAGMA_OMP_TASK:
38289       stmt = cp_parser_omp_task (parser, pragma_tok, if_p);
38290       break;
38291     case PRAGMA_OMP_TASKGROUP:
38292       stmt = cp_parser_omp_taskgroup (parser, pragma_tok, if_p);
38293       break;
38294     case PRAGMA_OMP_TASKLOOP:
38295       strcpy (p_name, "#pragma omp");
38296       stmt = cp_parser_omp_taskloop (parser, pragma_tok, p_name, mask, NULL,
38297 				     if_p);
38298       break;
38299     case PRAGMA_OMP_TEAMS:
38300       strcpy (p_name, "#pragma omp");
38301       stmt = cp_parser_omp_teams (parser, pragma_tok, p_name, mask, NULL,
38302 				  if_p);
38303       break;
38304     default:
38305       gcc_unreachable ();
38306     }
38307 
38308   protected_set_expr_location (stmt, pragma_tok->location);
38309 }
38310 
38311 /* Transactional Memory parsing routines.  */
38312 
38313 /* Parse a transaction attribute.
38314 
38315    txn-attribute:
38316 	attribute
38317 	[ [ identifier ] ]
38318 
38319    We use this instead of cp_parser_attributes_opt for transactions to avoid
38320    the pedwarn in C++98 mode.  */
38321 
38322 static tree
38323 cp_parser_txn_attribute_opt (cp_parser *parser)
38324 {
38325   cp_token *token;
38326   tree attr_name, attr = NULL;
38327 
38328   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
38329     return cp_parser_attributes_opt (parser);
38330 
38331   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
38332     return NULL_TREE;
38333   cp_lexer_consume_token (parser->lexer);
38334   if (!cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE))
38335     goto error1;
38336 
38337   token = cp_lexer_peek_token (parser->lexer);
38338   if (token->type == CPP_NAME || token->type == CPP_KEYWORD)
38339     {
38340       token = cp_lexer_consume_token (parser->lexer);
38341 
38342       attr_name = (token->type == CPP_KEYWORD
38343 		   /* For keywords, use the canonical spelling,
38344 		      not the parsed identifier.  */
38345 		   ? ridpointers[(int) token->keyword]
38346 		   : token->u.value);
38347       attr = build_tree_list (attr_name, NULL_TREE);
38348     }
38349   else
38350     cp_parser_error (parser, "expected identifier");
38351 
38352   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
38353  error1:
38354   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
38355   return attr;
38356 }
38357 
38358 /* Parse a __transaction_atomic or __transaction_relaxed statement.
38359 
38360    transaction-statement:
38361      __transaction_atomic txn-attribute[opt] txn-noexcept-spec[opt]
38362        compound-statement
38363      __transaction_relaxed txn-noexcept-spec[opt] compound-statement
38364 */
38365 
38366 static tree
38367 cp_parser_transaction (cp_parser *parser, cp_token *token)
38368 {
38369   unsigned char old_in = parser->in_transaction;
38370   unsigned char this_in = 1, new_in;
38371   enum rid keyword = token->keyword;
38372   tree stmt, attrs, noex;
38373 
38374   cp_lexer_consume_token (parser->lexer);
38375 
38376   if (keyword == RID_TRANSACTION_RELAXED
38377       || keyword == RID_SYNCHRONIZED)
38378     this_in |= TM_STMT_ATTR_RELAXED;
38379   else
38380     {
38381       attrs = cp_parser_txn_attribute_opt (parser);
38382       if (attrs)
38383 	this_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
38384     }
38385 
38386   /* Parse a noexcept specification.  */
38387   if (keyword == RID_ATOMIC_NOEXCEPT)
38388     noex = boolean_true_node;
38389   else if (keyword == RID_ATOMIC_CANCEL)
38390     {
38391       /* cancel-and-throw is unimplemented.  */
38392       sorry ("atomic_cancel");
38393       noex = NULL_TREE;
38394     }
38395   else
38396     noex = cp_parser_noexcept_specification_opt (parser, true, NULL, true);
38397 
38398   /* Keep track if we're in the lexical scope of an outer transaction.  */
38399   new_in = this_in | (old_in & TM_STMT_ATTR_OUTER);
38400 
38401   stmt = begin_transaction_stmt (token->location, NULL, this_in);
38402 
38403   parser->in_transaction = new_in;
38404   cp_parser_compound_statement (parser, NULL, BCS_TRANSACTION, false);
38405   parser->in_transaction = old_in;
38406 
38407   finish_transaction_stmt (stmt, NULL, this_in, noex);
38408 
38409   return stmt;
38410 }
38411 
38412 /* Parse a __transaction_atomic or __transaction_relaxed expression.
38413 
38414    transaction-expression:
38415      __transaction_atomic txn-noexcept-spec[opt] ( expression )
38416      __transaction_relaxed txn-noexcept-spec[opt] ( expression )
38417 */
38418 
38419 static tree
38420 cp_parser_transaction_expression (cp_parser *parser, enum rid keyword)
38421 {
38422   unsigned char old_in = parser->in_transaction;
38423   unsigned char this_in = 1;
38424   cp_token *token;
38425   tree expr, noex;
38426   bool noex_expr;
38427   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
38428 
38429   gcc_assert (keyword == RID_TRANSACTION_ATOMIC
38430       || keyword == RID_TRANSACTION_RELAXED);
38431 
38432   if (!flag_tm)
38433     error_at (loc,
38434 	      keyword == RID_TRANSACTION_RELAXED
38435 	      ? G_("%<__transaction_relaxed%> without transactional memory "
38436 		  "support enabled")
38437 	      : G_("%<__transaction_atomic%> without transactional memory "
38438 		   "support enabled"));
38439 
38440   token = cp_parser_require_keyword (parser, keyword,
38441       (keyword == RID_TRANSACTION_ATOMIC ? RT_TRANSACTION_ATOMIC
38442 	  : RT_TRANSACTION_RELAXED));
38443   gcc_assert (token != NULL);
38444 
38445   if (keyword == RID_TRANSACTION_RELAXED)
38446     this_in |= TM_STMT_ATTR_RELAXED;
38447 
38448   /* Set this early.  This might mean that we allow transaction_cancel in
38449      an expression that we find out later actually has to be a constexpr.
38450      However, we expect that cxx_constant_value will be able to deal with
38451      this; also, if the noexcept has no constexpr, then what we parse next
38452      really is a transaction's body.  */
38453   parser->in_transaction = this_in;
38454 
38455   /* Parse a noexcept specification.  */
38456   noex = cp_parser_noexcept_specification_opt (parser, false, &noex_expr,
38457 					       true);
38458 
38459   if (!noex || !noex_expr
38460       || cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
38461     {
38462       matching_parens parens;
38463       parens.require_open (parser);
38464 
38465       expr = cp_parser_expression (parser);
38466       expr = finish_parenthesized_expr (expr);
38467 
38468       parens.require_close (parser);
38469     }
38470   else
38471     {
38472       /* The only expression that is available got parsed for the noexcept
38473          already.  noexcept is true then.  */
38474       expr = noex;
38475       noex = boolean_true_node;
38476     }
38477 
38478   expr = build_transaction_expr (token->location, expr, this_in, noex);
38479   parser->in_transaction = old_in;
38480 
38481   if (cp_parser_non_integral_constant_expression (parser, NIC_TRANSACTION))
38482     return error_mark_node;
38483 
38484   return (flag_tm ? expr : error_mark_node);
38485 }
38486 
38487 /* Parse a function-transaction-block.
38488 
38489    function-transaction-block:
38490      __transaction_atomic txn-attribute[opt] ctor-initializer[opt]
38491 	 function-body
38492      __transaction_atomic txn-attribute[opt] function-try-block
38493      __transaction_relaxed ctor-initializer[opt] function-body
38494      __transaction_relaxed function-try-block
38495 */
38496 
38497 static void
38498 cp_parser_function_transaction (cp_parser *parser, enum rid keyword)
38499 {
38500   unsigned char old_in = parser->in_transaction;
38501   unsigned char new_in = 1;
38502   tree compound_stmt, stmt, attrs;
38503   cp_token *token;
38504 
38505   gcc_assert (keyword == RID_TRANSACTION_ATOMIC
38506       || keyword == RID_TRANSACTION_RELAXED);
38507   token = cp_parser_require_keyword (parser, keyword,
38508       (keyword == RID_TRANSACTION_ATOMIC ? RT_TRANSACTION_ATOMIC
38509 	  : RT_TRANSACTION_RELAXED));
38510   gcc_assert (token != NULL);
38511 
38512   if (keyword == RID_TRANSACTION_RELAXED)
38513     new_in |= TM_STMT_ATTR_RELAXED;
38514   else
38515     {
38516       attrs = cp_parser_txn_attribute_opt (parser);
38517       if (attrs)
38518 	new_in |= parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER);
38519     }
38520 
38521   stmt = begin_transaction_stmt (token->location, &compound_stmt, new_in);
38522 
38523   parser->in_transaction = new_in;
38524 
38525   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
38526     cp_parser_function_try_block (parser);
38527   else
38528     cp_parser_ctor_initializer_opt_and_function_body
38529       (parser, /*in_function_try_block=*/false);
38530 
38531   parser->in_transaction = old_in;
38532 
38533   finish_transaction_stmt (stmt, compound_stmt, new_in, NULL_TREE);
38534 }
38535 
38536 /* Parse a __transaction_cancel statement.
38537 
38538    cancel-statement:
38539      __transaction_cancel txn-attribute[opt] ;
38540      __transaction_cancel txn-attribute[opt] throw-expression ;
38541 
38542    ??? Cancel and throw is not yet implemented.  */
38543 
38544 static tree
38545 cp_parser_transaction_cancel (cp_parser *parser)
38546 {
38547   cp_token *token;
38548   bool is_outer = false;
38549   tree stmt, attrs;
38550 
38551   token = cp_parser_require_keyword (parser, RID_TRANSACTION_CANCEL,
38552 				     RT_TRANSACTION_CANCEL);
38553   gcc_assert (token != NULL);
38554 
38555   attrs = cp_parser_txn_attribute_opt (parser);
38556   if (attrs)
38557     is_outer = (parse_tm_stmt_attr (attrs, TM_STMT_ATTR_OUTER) != 0);
38558 
38559   /* ??? Parse cancel-and-throw here.  */
38560 
38561   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
38562 
38563   if (!flag_tm)
38564     {
38565       error_at (token->location, "%<__transaction_cancel%> without "
38566 		"transactional memory support enabled");
38567       return error_mark_node;
38568     }
38569   else if (parser->in_transaction & TM_STMT_ATTR_RELAXED)
38570     {
38571       error_at (token->location, "%<__transaction_cancel%> within a "
38572 		"%<__transaction_relaxed%>");
38573       return error_mark_node;
38574     }
38575   else if (is_outer)
38576     {
38577       if ((parser->in_transaction & TM_STMT_ATTR_OUTER) == 0
38578 	  && !is_tm_may_cancel_outer (current_function_decl))
38579 	{
38580 	  error_at (token->location, "outer %<__transaction_cancel%> not "
38581 		    "within outer %<__transaction_atomic%>");
38582 	  error_at (token->location,
38583 		    "  or a %<transaction_may_cancel_outer%> function");
38584 	  return error_mark_node;
38585 	}
38586     }
38587   else if (parser->in_transaction == 0)
38588     {
38589       error_at (token->location, "%<__transaction_cancel%> not within "
38590 		"%<__transaction_atomic%>");
38591       return error_mark_node;
38592     }
38593 
38594   stmt = build_tm_abort_call (token->location, is_outer);
38595   add_stmt (stmt);
38596 
38597   return stmt;
38598 }
38599 
38600 /* The parser.  */
38601 
38602 static GTY (()) cp_parser *the_parser;
38603 
38604 
38605 /* Special handling for the first token or line in the file.  The first
38606    thing in the file might be #pragma GCC pch_preprocess, which loads a
38607    PCH file, which is a GC collection point.  So we need to handle this
38608    first pragma without benefit of an existing lexer structure.
38609 
38610    Always returns one token to the caller in *FIRST_TOKEN.  This is
38611    either the true first token of the file, or the first token after
38612    the initial pragma.  */
38613 
38614 static void
38615 cp_parser_initial_pragma (cp_token *first_token)
38616 {
38617   tree name = NULL;
38618 
38619   cp_lexer_get_preprocessor_token (NULL, first_token);
38620   if (cp_parser_pragma_kind (first_token) != PRAGMA_GCC_PCH_PREPROCESS)
38621     return;
38622 
38623   cp_lexer_get_preprocessor_token (NULL, first_token);
38624   if (first_token->type == CPP_STRING)
38625     {
38626       name = first_token->u.value;
38627 
38628       cp_lexer_get_preprocessor_token (NULL, first_token);
38629       if (first_token->type != CPP_PRAGMA_EOL)
38630 	error_at (first_token->location,
38631 		  "junk at end of %<#pragma GCC pch_preprocess%>");
38632     }
38633   else
38634     error_at (first_token->location, "expected string literal");
38635 
38636   /* Skip to the end of the pragma.  */
38637   while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
38638     cp_lexer_get_preprocessor_token (NULL, first_token);
38639 
38640   /* Now actually load the PCH file.  */
38641   if (name)
38642     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
38643 
38644   /* Read one more token to return to our caller.  We have to do this
38645      after reading the PCH file in, since its pointers have to be
38646      live.  */
38647   cp_lexer_get_preprocessor_token (NULL, first_token);
38648 }
38649 
38650 /* Parse a pragma GCC ivdep.  */
38651 
38652 static bool
38653 cp_parser_pragma_ivdep (cp_parser *parser, cp_token *pragma_tok)
38654 {
38655   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
38656   return true;
38657 }
38658 
38659 /* Parse a pragma GCC unroll.  */
38660 
38661 static unsigned short
38662 cp_parser_pragma_unroll (cp_parser *parser, cp_token *pragma_tok)
38663 {
38664   location_t location = cp_lexer_peek_token (parser->lexer)->location;
38665   tree expr = cp_parser_constant_expression (parser);
38666   unsigned short unroll;
38667   expr = maybe_constant_value (expr);
38668   HOST_WIDE_INT lunroll = 0;
38669   if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))
38670       || TREE_CODE (expr) != INTEGER_CST
38671       || (lunroll = tree_to_shwi (expr)) < 0
38672       || lunroll >= USHRT_MAX)
38673     {
38674       error_at (location, "%<#pragma GCC unroll%> requires an"
38675 		" assignment-expression that evaluates to a non-negative"
38676 		" integral constant less than %u", USHRT_MAX);
38677       unroll = 0;
38678     }
38679   else
38680     {
38681       unroll = (unsigned short)lunroll;
38682       if (unroll == 0)
38683 	unroll = 1;
38684     }
38685   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
38686   return unroll;
38687 }
38688 
38689 /* Normal parsing of a pragma token.  Here we can (and must) use the
38690    regular lexer.  */
38691 
38692 static bool
38693 cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p)
38694 {
38695   cp_token *pragma_tok;
38696   unsigned int id;
38697   tree stmt;
38698   bool ret;
38699 
38700   pragma_tok = cp_lexer_consume_token (parser->lexer);
38701   gcc_assert (pragma_tok->type == CPP_PRAGMA);
38702   parser->lexer->in_pragma = true;
38703 
38704   id = cp_parser_pragma_kind (pragma_tok);
38705   if (id != PRAGMA_OMP_DECLARE && id != PRAGMA_OACC_ROUTINE)
38706     cp_ensure_no_omp_declare_simd (parser);
38707   switch (id)
38708     {
38709     case PRAGMA_GCC_PCH_PREPROCESS:
38710       error_at (pragma_tok->location,
38711 		"%<#pragma GCC pch_preprocess%> must be first");
38712       break;
38713 
38714     case PRAGMA_OMP_BARRIER:
38715       switch (context)
38716 	{
38717 	case pragma_compound:
38718 	  cp_parser_omp_barrier (parser, pragma_tok);
38719 	  return false;
38720 	case pragma_stmt:
38721 	  error_at (pragma_tok->location, "%<#pragma %s%> may only be "
38722 		    "used in compound statements", "omp barrier");
38723 	  break;
38724 	default:
38725 	  goto bad_stmt;
38726 	}
38727       break;
38728 
38729     case PRAGMA_OMP_FLUSH:
38730       switch (context)
38731 	{
38732 	case pragma_compound:
38733 	  cp_parser_omp_flush (parser, pragma_tok);
38734 	  return false;
38735 	case pragma_stmt:
38736 	  error_at (pragma_tok->location, "%<#pragma %s%> may only be "
38737 		    "used in compound statements", "omp flush");
38738 	  break;
38739 	default:
38740 	  goto bad_stmt;
38741 	}
38742       break;
38743 
38744     case PRAGMA_OMP_TASKWAIT:
38745       switch (context)
38746 	{
38747 	case pragma_compound:
38748 	  cp_parser_omp_taskwait (parser, pragma_tok);
38749 	  return false;
38750 	case pragma_stmt:
38751 	  error_at (pragma_tok->location,
38752 		    "%<#pragma %s%> may only be used in compound statements",
38753 		    "omp taskwait");
38754 	  break;
38755 	default:
38756 	  goto bad_stmt;
38757 	}
38758       break;
38759 
38760     case PRAGMA_OMP_TASKYIELD:
38761       switch (context)
38762 	{
38763 	case pragma_compound:
38764 	  cp_parser_omp_taskyield (parser, pragma_tok);
38765 	  return false;
38766 	case pragma_stmt:
38767 	  error_at (pragma_tok->location,
38768 		    "%<#pragma %s%> may only be used in compound statements",
38769 		    "omp taskyield");
38770 	  break;
38771 	default:
38772 	  goto bad_stmt;
38773 	}
38774       break;
38775 
38776     case PRAGMA_OMP_CANCEL:
38777       switch (context)
38778 	{
38779 	case pragma_compound:
38780 	  cp_parser_omp_cancel (parser, pragma_tok);
38781 	  return false;
38782 	case pragma_stmt:
38783 	  error_at (pragma_tok->location,
38784 		    "%<#pragma %s%> may only be used in compound statements",
38785 		    "omp cancel");
38786 	  break;
38787 	default:
38788 	  goto bad_stmt;
38789 	}
38790       break;
38791 
38792     case PRAGMA_OMP_CANCELLATION_POINT:
38793       cp_parser_omp_cancellation_point (parser, pragma_tok, context);
38794       return false;
38795 
38796     case PRAGMA_OMP_THREADPRIVATE:
38797       cp_parser_omp_threadprivate (parser, pragma_tok);
38798       return false;
38799 
38800     case PRAGMA_OMP_DECLARE:
38801       return cp_parser_omp_declare (parser, pragma_tok, context);
38802 
38803     case PRAGMA_OACC_DECLARE:
38804       cp_parser_oacc_declare (parser, pragma_tok);
38805       return false;
38806 
38807     case PRAGMA_OACC_ENTER_DATA:
38808       if (context == pragma_stmt)
38809 	{
38810 	  error_at (pragma_tok->location,
38811 		    "%<#pragma %s%> may only be used in compound statements",
38812 		    "acc enter data");
38813 	  break;
38814 	}
38815       else if (context != pragma_compound)
38816 	goto bad_stmt;
38817       cp_parser_omp_construct (parser, pragma_tok, if_p);
38818       return true;
38819 
38820     case PRAGMA_OACC_EXIT_DATA:
38821       if (context == pragma_stmt)
38822 	{
38823 	  error_at (pragma_tok->location,
38824 		    "%<#pragma %s%> may only be used in compound statements",
38825 		    "acc exit data");
38826 	  break;
38827 	}
38828       else if (context != pragma_compound)
38829 	goto bad_stmt;
38830       cp_parser_omp_construct (parser, pragma_tok, if_p);
38831       return true;
38832 
38833     case PRAGMA_OACC_ROUTINE:
38834       if (context != pragma_external)
38835 	{
38836 	  error_at (pragma_tok->location,
38837 		    "%<#pragma acc routine%> must be at file scope");
38838 	  break;
38839 	}
38840       cp_parser_oacc_routine (parser, pragma_tok, context);
38841       return false;
38842 
38843     case PRAGMA_OACC_UPDATE:
38844       if (context == pragma_stmt)
38845 	{
38846 	  error_at (pragma_tok->location,
38847 		    "%<#pragma %s%> may only be used in compound statements",
38848 		    "acc update");
38849 	  break;
38850 	}
38851       else if (context != pragma_compound)
38852 	goto bad_stmt;
38853       cp_parser_omp_construct (parser, pragma_tok, if_p);
38854       return true;
38855 
38856     case PRAGMA_OACC_WAIT:
38857       if (context == pragma_stmt)
38858 	{
38859 	  error_at (pragma_tok->location,
38860 		    "%<#pragma %s%> may only be used in compound statements",
38861 		    "acc wait");
38862 	  break;
38863 	}
38864       else if (context != pragma_compound)
38865 	goto bad_stmt;
38866       cp_parser_omp_construct (parser, pragma_tok, if_p);
38867       return true;
38868 
38869     case PRAGMA_OACC_ATOMIC:
38870     case PRAGMA_OACC_CACHE:
38871     case PRAGMA_OACC_DATA:
38872     case PRAGMA_OACC_HOST_DATA:
38873     case PRAGMA_OACC_KERNELS:
38874     case PRAGMA_OACC_PARALLEL:
38875     case PRAGMA_OACC_LOOP:
38876     case PRAGMA_OMP_ATOMIC:
38877     case PRAGMA_OMP_CRITICAL:
38878     case PRAGMA_OMP_DISTRIBUTE:
38879     case PRAGMA_OMP_FOR:
38880     case PRAGMA_OMP_MASTER:
38881     case PRAGMA_OMP_PARALLEL:
38882     case PRAGMA_OMP_SECTIONS:
38883     case PRAGMA_OMP_SIMD:
38884     case PRAGMA_OMP_SINGLE:
38885     case PRAGMA_OMP_TASK:
38886     case PRAGMA_OMP_TASKGROUP:
38887     case PRAGMA_OMP_TASKLOOP:
38888     case PRAGMA_OMP_TEAMS:
38889       if (context != pragma_stmt && context != pragma_compound)
38890 	goto bad_stmt;
38891       stmt = push_omp_privatization_clauses (false);
38892       cp_parser_omp_construct (parser, pragma_tok, if_p);
38893       pop_omp_privatization_clauses (stmt);
38894       return true;
38895 
38896     case PRAGMA_OMP_ORDERED:
38897       if (context != pragma_stmt && context != pragma_compound)
38898 	goto bad_stmt;
38899       stmt = push_omp_privatization_clauses (false);
38900       ret = cp_parser_omp_ordered (parser, pragma_tok, context, if_p);
38901       pop_omp_privatization_clauses (stmt);
38902       return ret;
38903 
38904     case PRAGMA_OMP_TARGET:
38905       if (context != pragma_stmt && context != pragma_compound)
38906 	goto bad_stmt;
38907       stmt = push_omp_privatization_clauses (false);
38908       ret = cp_parser_omp_target (parser, pragma_tok, context, if_p);
38909       pop_omp_privatization_clauses (stmt);
38910       return ret;
38911 
38912     case PRAGMA_OMP_END_DECLARE_TARGET:
38913       cp_parser_omp_end_declare_target (parser, pragma_tok);
38914       return false;
38915 
38916     case PRAGMA_OMP_SECTION:
38917       error_at (pragma_tok->location,
38918 		"%<#pragma omp section%> may only be used in "
38919 		"%<#pragma omp sections%> construct");
38920       break;
38921 
38922     case PRAGMA_IVDEP:
38923       {
38924 	if (context == pragma_external)
38925 	  {
38926 	    error_at (pragma_tok->location,
38927 		      "%<#pragma GCC ivdep%> must be inside a function");
38928 	    break;
38929 	  }
38930 	const bool ivdep = cp_parser_pragma_ivdep (parser, pragma_tok);
38931 	unsigned short unroll;
38932 	cp_token *tok = cp_lexer_peek_token (the_parser->lexer);
38933 	if (tok->type == CPP_PRAGMA
38934 	    && cp_parser_pragma_kind (tok) == PRAGMA_UNROLL)
38935 	  {
38936 	    tok = cp_lexer_consume_token (parser->lexer);
38937 	    unroll = cp_parser_pragma_unroll (parser, tok);
38938 	    tok = cp_lexer_peek_token (the_parser->lexer);
38939 	  }
38940 	else
38941 	  unroll = 0;
38942 	if (tok->type != CPP_KEYWORD
38943 	    || (tok->keyword != RID_FOR
38944 		&& tok->keyword != RID_WHILE
38945 		&& tok->keyword != RID_DO))
38946 	  {
38947 	    cp_parser_error (parser, "for, while or do statement expected");
38948 	    return false;
38949 	  }
38950 	cp_parser_iteration_statement (parser, if_p, ivdep, unroll);
38951 	return true;
38952       }
38953 
38954     case PRAGMA_UNROLL:
38955       {
38956 	if (context == pragma_external)
38957 	  {
38958 	    error_at (pragma_tok->location,
38959 		      "%<#pragma GCC unroll%> must be inside a function");
38960 	    break;
38961 	  }
38962 	const unsigned short unroll
38963 	  = cp_parser_pragma_unroll (parser, pragma_tok);
38964 	bool ivdep;
38965 	cp_token *tok = cp_lexer_peek_token (the_parser->lexer);
38966 	if (tok->type == CPP_PRAGMA
38967 	    && cp_parser_pragma_kind (tok) == PRAGMA_IVDEP)
38968 	  {
38969 	    tok = cp_lexer_consume_token (parser->lexer);
38970 	    ivdep = cp_parser_pragma_ivdep (parser, tok);
38971 	    tok = cp_lexer_peek_token (the_parser->lexer);
38972 	  }
38973 	else
38974 	  ivdep = false;
38975 	if (tok->type != CPP_KEYWORD
38976 	    || (tok->keyword != RID_FOR
38977 		&& tok->keyword != RID_WHILE
38978 		&& tok->keyword != RID_DO))
38979 	  {
38980 	    cp_parser_error (parser, "for, while or do statement expected");
38981 	    return false;
38982 	  }
38983 	cp_parser_iteration_statement (parser, if_p, ivdep, unroll);
38984 	return true;
38985       }
38986 
38987     default:
38988       gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
38989       c_invoke_pragma_handler (id);
38990       break;
38991 
38992     bad_stmt:
38993       cp_parser_error (parser, "expected declaration specifiers");
38994       break;
38995     }
38996 
38997   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
38998   return false;
38999 }
39000 
39001 /* The interface the pragma parsers have to the lexer.  */
39002 
39003 enum cpp_ttype
39004 pragma_lex (tree *value, location_t *loc)
39005 {
39006   cp_token *tok = cp_lexer_peek_token (the_parser->lexer);
39007   enum cpp_ttype ret = tok->type;
39008 
39009   *value = tok->u.value;
39010   if (loc)
39011     *loc = tok->location;
39012 
39013   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
39014     ret = CPP_EOF;
39015   else if (ret == CPP_STRING)
39016     *value = cp_parser_string_literal (the_parser, false, false);
39017   else
39018     {
39019       if (ret == CPP_KEYWORD)
39020 	ret = CPP_NAME;
39021       cp_lexer_consume_token (the_parser->lexer);
39022     }
39023 
39024   return ret;
39025 }
39026 
39027 
39028 /* External interface.  */
39029 
39030 /* Parse one entire translation unit.  */
39031 
39032 void
39033 c_parse_file (void)
39034 {
39035   static bool already_called = false;
39036 
39037   if (already_called)
39038     fatal_error (input_location,
39039 		 "inter-module optimizations not implemented for C++");
39040   already_called = true;
39041 
39042   the_parser = cp_parser_new ();
39043   push_deferring_access_checks (flag_access_control
39044 				? dk_no_deferred : dk_no_check);
39045   cp_parser_translation_unit (the_parser);
39046   the_parser = NULL;
39047 }
39048 
39049 /* Create an identifier for a generic parameter type (a synthesized
39050    template parameter implied by `auto' or a concept identifier). */
39051 
39052 static GTY(()) int generic_parm_count;
39053 static tree
39054 make_generic_type_name ()
39055 {
39056   char buf[32];
39057   sprintf (buf, "auto:%d", ++generic_parm_count);
39058   return get_identifier (buf);
39059 }
39060 
39061 /* Add an implicit template type parameter to the CURRENT_TEMPLATE_PARMS
39062    (creating a new template parameter list if necessary).  Returns the newly
39063    created template type parm.  */
39064 
39065 static tree
39066 synthesize_implicit_template_parm  (cp_parser *parser, tree constr)
39067 {
39068   gcc_assert (current_binding_level->kind == sk_function_parms);
39069 
39070    /* Before committing to modifying any scope, if we're in an
39071       implicit template scope, and we're trying to synthesize a
39072       constrained parameter, try to find a previous parameter with
39073       the same name.  This is the same-type rule for abbreviated
39074       function templates.
39075 
39076       NOTE: We can generate implicit parameters when tentatively
39077       parsing a nested name specifier, only to reject that parse
39078       later. However, matching the same template-id as part of a
39079       direct-declarator should generate an identical template
39080       parameter, so this rule will merge them. */
39081   if (parser->implicit_template_scope && constr)
39082     {
39083       tree t = parser->implicit_template_parms;
39084       while (t)
39085         {
39086           if (equivalent_placeholder_constraints (TREE_TYPE (t), constr))
39087 	    {
39088 	      tree d = TREE_VALUE (t);
39089 	      if (TREE_CODE (d) == PARM_DECL)
39090 		/* Return the TEMPLATE_PARM_INDEX.  */
39091 		d = DECL_INITIAL (d);
39092 	      return d;
39093 	    }
39094           t = TREE_CHAIN (t);
39095         }
39096     }
39097 
39098   /* We are either continuing a function template that already contains implicit
39099      template parameters, creating a new fully-implicit function template, or
39100      extending an existing explicit function template with implicit template
39101      parameters.  */
39102 
39103   cp_binding_level *const entry_scope = current_binding_level;
39104 
39105   bool become_template = false;
39106   cp_binding_level *parent_scope = 0;
39107 
39108   if (parser->implicit_template_scope)
39109     {
39110       gcc_assert (parser->implicit_template_parms);
39111 
39112       current_binding_level = parser->implicit_template_scope;
39113     }
39114   else
39115     {
39116       /* Roll back to the existing template parameter scope (in the case of
39117 	 extending an explicit function template) or introduce a new template
39118 	 parameter scope ahead of the function parameter scope (or class scope
39119 	 in the case of out-of-line member definitions).  The function scope is
39120 	 added back after template parameter synthesis below.  */
39121 
39122       cp_binding_level *scope = entry_scope;
39123 
39124       while (scope->kind == sk_function_parms)
39125 	{
39126 	  parent_scope = scope;
39127 	  scope = scope->level_chain;
39128 	}
39129       if (current_class_type && !LAMBDA_TYPE_P (current_class_type))
39130 	{
39131 	  /* If not defining a class, then any class scope is a scope level in
39132 	     an out-of-line member definition.  In this case simply wind back
39133 	     beyond the first such scope to inject the template parameter list.
39134 	     Otherwise wind back to the class being defined.  The latter can
39135 	     occur in class member friend declarations such as:
39136 
39137 	       class A {
39138 		 void foo (auto);
39139 	       };
39140 	       class B {
39141 		 friend void A::foo (auto);
39142 	       };
39143 
39144 	    The template parameter list synthesized for the friend declaration
39145 	    must be injected in the scope of 'B'.  This can also occur in
39146 	    erroneous cases such as:
39147 
39148 	       struct A {
39149 	         struct B {
39150 		   void foo (auto);
39151 		 };
39152 		 void B::foo (auto) {}
39153 	       };
39154 
39155 	    Here the attempted definition of 'B::foo' within 'A' is ill-formed
39156 	    but, nevertheless, the template parameter list synthesized for the
39157 	    declarator should be injected into the scope of 'A' as if the
39158 	    ill-formed template was specified explicitly.  */
39159 
39160 	  while (scope->kind == sk_class && !scope->defining_class_p)
39161 	    {
39162 	      parent_scope = scope;
39163 	      scope = scope->level_chain;
39164 	    }
39165 	}
39166 
39167       current_binding_level = scope;
39168 
39169       if (scope->kind != sk_template_parms
39170 	  || !function_being_declared_is_template_p (parser))
39171 	{
39172 	  /* Introduce a new template parameter list for implicit template
39173 	     parameters.  */
39174 
39175 	  become_template = true;
39176 
39177 	  parser->implicit_template_scope
39178 	      = begin_scope (sk_template_parms, NULL);
39179 
39180 	  ++processing_template_decl;
39181 
39182 	  parser->fully_implicit_function_template_p = true;
39183 	  ++parser->num_template_parameter_lists;
39184 	}
39185       else
39186 	{
39187 	  /* Synthesize implicit template parameters at the end of the explicit
39188 	     template parameter list.  */
39189 
39190 	  gcc_assert (current_template_parms);
39191 
39192 	  parser->implicit_template_scope = scope;
39193 
39194 	  tree v = INNERMOST_TEMPLATE_PARMS (current_template_parms);
39195 	  parser->implicit_template_parms
39196 	    = TREE_VEC_ELT (v, TREE_VEC_LENGTH (v) - 1);
39197 	}
39198     }
39199 
39200   /* Synthesize a new template parameter and track the current template
39201      parameter chain with implicit_template_parms.  */
39202 
39203   tree proto = constr ? DECL_INITIAL (constr) : NULL_TREE;
39204   tree synth_id = make_generic_type_name ();
39205   tree synth_tmpl_parm;
39206   bool non_type = false;
39207 
39208   if (proto == NULL_TREE || TREE_CODE (proto) == TYPE_DECL)
39209     synth_tmpl_parm
39210       = finish_template_type_parm (class_type_node, synth_id);
39211   else if (TREE_CODE (proto) == TEMPLATE_DECL)
39212     synth_tmpl_parm
39213       = finish_constrained_template_template_parm (proto, synth_id);
39214   else
39215     {
39216       synth_tmpl_parm = copy_decl (proto);
39217       DECL_NAME (synth_tmpl_parm) = synth_id;
39218       non_type = true;
39219     }
39220 
39221   // Attach the constraint to the parm before processing.
39222   tree node = build_tree_list (NULL_TREE, synth_tmpl_parm);
39223   TREE_TYPE (node) = constr;
39224   tree new_parm
39225     = process_template_parm (parser->implicit_template_parms,
39226 			     input_location,
39227 			     node,
39228 			     /*non_type=*/non_type,
39229 			     /*param_pack=*/false);
39230 
39231   // Chain the new parameter to the list of implicit parameters.
39232   if (parser->implicit_template_parms)
39233     parser->implicit_template_parms
39234       = TREE_CHAIN (parser->implicit_template_parms);
39235   else
39236     parser->implicit_template_parms = new_parm;
39237 
39238   tree new_decl = get_local_decls ();
39239   if (non_type)
39240     /* Return the TEMPLATE_PARM_INDEX, not the PARM_DECL.  */
39241     new_decl = DECL_INITIAL (new_decl);
39242 
39243   /* If creating a fully implicit function template, start the new implicit
39244      template parameter list with this synthesized type, otherwise grow the
39245      current template parameter list.  */
39246 
39247   if (become_template)
39248     {
39249       parent_scope->level_chain = current_binding_level;
39250 
39251       tree new_parms = make_tree_vec (1);
39252       TREE_VEC_ELT (new_parms, 0) = parser->implicit_template_parms;
39253       current_template_parms = tree_cons (size_int (processing_template_decl),
39254 					  new_parms, current_template_parms);
39255     }
39256   else
39257     {
39258       tree& new_parms = INNERMOST_TEMPLATE_PARMS (current_template_parms);
39259       int new_parm_idx = TREE_VEC_LENGTH (new_parms);
39260       new_parms = grow_tree_vec (new_parms, new_parm_idx + 1);
39261       TREE_VEC_ELT (new_parms, new_parm_idx) = parser->implicit_template_parms;
39262     }
39263 
39264   // If the new parameter was constrained, we need to add that to the
39265   // constraints in the template parameter list.
39266   if (tree req = TEMPLATE_PARM_CONSTRAINTS (tree_last (new_parm)))
39267     {
39268       tree reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
39269       reqs = conjoin_constraints (reqs, req);
39270       TEMPLATE_PARMS_CONSTRAINTS (current_template_parms) = reqs;
39271     }
39272 
39273   current_binding_level = entry_scope;
39274 
39275   return new_decl;
39276 }
39277 
39278 /* Finish the declaration of a fully implicit function template.  Such a
39279    template has no explicit template parameter list so has not been through the
39280    normal template head and tail processing.  synthesize_implicit_template_parm
39281    tries to do the head; this tries to do the tail.  MEMBER_DECL_OPT should be
39282    provided if the declaration is a class member such that its template
39283    declaration can be completed.  If MEMBER_DECL_OPT is provided the finished
39284    form is returned.  Otherwise NULL_TREE is returned. */
39285 
39286 static tree
39287 finish_fully_implicit_template (cp_parser *parser, tree member_decl_opt)
39288 {
39289   gcc_assert (parser->fully_implicit_function_template_p);
39290 
39291   if (member_decl_opt && member_decl_opt != error_mark_node
39292       && DECL_VIRTUAL_P (member_decl_opt))
39293     {
39294       error_at (DECL_SOURCE_LOCATION (member_decl_opt),
39295 		"implicit templates may not be %<virtual%>");
39296       DECL_VIRTUAL_P (member_decl_opt) = false;
39297     }
39298 
39299   if (member_decl_opt)
39300     member_decl_opt = finish_member_template_decl (member_decl_opt);
39301   end_template_decl ();
39302 
39303   parser->fully_implicit_function_template_p = false;
39304   parser->implicit_template_parms = 0;
39305   parser->implicit_template_scope = 0;
39306   --parser->num_template_parameter_lists;
39307 
39308   return member_decl_opt;
39309 }
39310 
39311 /* Like finish_fully_implicit_template, but to be used in error
39312    recovery, rearranging scopes so that we restore the state we had
39313    before synthesize_implicit_template_parm inserted the implement
39314    template parms scope.  */
39315 
39316 static void
39317 abort_fully_implicit_template (cp_parser *parser)
39318 {
39319   cp_binding_level *return_to_scope = current_binding_level;
39320 
39321   if (parser->implicit_template_scope
39322       && return_to_scope != parser->implicit_template_scope)
39323     {
39324       cp_binding_level *child = return_to_scope;
39325       for (cp_binding_level *scope = child->level_chain;
39326 	   scope != parser->implicit_template_scope;
39327 	   scope = child->level_chain)
39328 	child = scope;
39329       child->level_chain = parser->implicit_template_scope->level_chain;
39330       parser->implicit_template_scope->level_chain = return_to_scope;
39331       current_binding_level = parser->implicit_template_scope;
39332     }
39333   else
39334     return_to_scope = return_to_scope->level_chain;
39335 
39336   finish_fully_implicit_template (parser, NULL);
39337 
39338   gcc_assert (current_binding_level == return_to_scope);
39339 }
39340 
39341 /* Helper function for diagnostics that have complained about things
39342    being used with 'extern "C"' linkage.
39343 
39344    Attempt to issue a note showing where the 'extern "C"' linkage began.  */
39345 
39346 void
39347 maybe_show_extern_c_location (void)
39348 {
39349   if (the_parser->innermost_linkage_specification_location != UNKNOWN_LOCATION)
39350     inform (the_parser->innermost_linkage_specification_location,
39351 	    "%<extern \"C\"%> linkage started here");
39352 }
39353 
39354 #include "gt-cp-parser.h"
39355