OSDN Git Service

PR c++/50365
[pf3gnuchains/gcc-fork.git] / gcc / cp / parser.c
1 /* C++ Parser.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004,
3    2005, 2007, 2008, 2009, 2010, 2011  Free Software Foundation, Inc.
4    Written by Mark Mitchell <mark@codesourcery.com>.
5
6    This file is part of GCC.
7
8    GCC is free software; you can redistribute it and/or modify it
9    under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GCC is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "timevar.h"
27 #include "cpplib.h"
28 #include "tree.h"
29 #include "cp-tree.h"
30 #include "intl.h"
31 #include "c-family/c-pragma.h"
32 #include "decl.h"
33 #include "flags.h"
34 #include "diagnostic-core.h"
35 #include "output.h"
36 #include "target.h"
37 #include "cgraph.h"
38 #include "c-family/c-common.h"
39 #include "c-family/c-objc.h"
40 #include "plugin.h"
41 #include "tree-pretty-print.h"
42 #include "parser.h"
43
44 \f
45 /* The lexer.  */
46
47 /* The cp_lexer_* routines mediate between the lexer proper (in libcpp
48    and c-lex.c) and the C++ parser.  */
49
50 static cp_token eof_token =
51 {
52   CPP_EOF, RID_MAX, 0, PRAGMA_NONE, false, false, false, 0, { NULL }
53 };
54
55 /* The various kinds of non integral constant we encounter. */
56 typedef enum non_integral_constant {
57   NIC_NONE,
58   /* floating-point literal */
59   NIC_FLOAT,
60   /* %<this%> */
61   NIC_THIS,
62   /* %<__FUNCTION__%> */
63   NIC_FUNC_NAME,
64   /* %<__PRETTY_FUNCTION__%> */
65   NIC_PRETTY_FUNC,
66   /* %<__func__%> */
67   NIC_C99_FUNC,
68   /* "%<va_arg%> */
69   NIC_VA_ARG,
70   /* a cast */
71   NIC_CAST,
72   /* %<typeid%> operator */
73   NIC_TYPEID,
74   /* non-constant compound literals */
75   NIC_NCC,
76   /* a function call */
77   NIC_FUNC_CALL,
78   /* an increment */
79   NIC_INC,
80   /* an decrement */
81   NIC_DEC,
82   /* an array reference */
83   NIC_ARRAY_REF,
84   /* %<->%> */
85   NIC_ARROW,
86   /* %<.%> */
87   NIC_POINT,
88   /* the address of a label */
89   NIC_ADDR_LABEL,
90   /* %<*%> */
91   NIC_STAR,
92   /* %<&%> */
93   NIC_ADDR,
94   /* %<++%> */
95   NIC_PREINCREMENT,
96   /* %<--%> */
97   NIC_PREDECREMENT,
98   /* %<new%> */
99   NIC_NEW,
100   /* %<delete%> */
101   NIC_DEL,
102   /* calls to overloaded operators */
103   NIC_OVERLOADED,
104   /* an assignment */
105   NIC_ASSIGNMENT,
106   /* a comma operator */
107   NIC_COMMA,
108   /* a call to a constructor */
109   NIC_CONSTRUCTOR
110 } non_integral_constant;
111
112 /* The various kinds of errors about name-lookup failing. */
113 typedef enum name_lookup_error {
114   /* NULL */
115   NLE_NULL,
116   /* is not a type */
117   NLE_TYPE,
118   /* is not a class or namespace */
119   NLE_CXX98,
120   /* is not a class, namespace, or enumeration */
121   NLE_NOT_CXX98
122 } name_lookup_error;
123
124 /* The various kinds of required token */
125 typedef enum required_token {
126   RT_NONE,
127   RT_SEMICOLON,  /* ';' */
128   RT_OPEN_PAREN, /* '(' */
129   RT_CLOSE_BRACE, /* '}' */
130   RT_OPEN_BRACE,  /* '{' */
131   RT_CLOSE_SQUARE, /* ']' */
132   RT_OPEN_SQUARE,  /* '[' */
133   RT_COMMA, /* ',' */
134   RT_SCOPE, /* '::' */
135   RT_LESS, /* '<' */
136   RT_GREATER, /* '>' */
137   RT_EQ, /* '=' */
138   RT_ELLIPSIS, /* '...' */
139   RT_MULT, /* '*' */
140   RT_COMPL, /* '~' */
141   RT_COLON, /* ':' */
142   RT_COLON_SCOPE, /* ':' or '::' */
143   RT_CLOSE_PAREN, /* ')' */
144   RT_COMMA_CLOSE_PAREN, /* ',' or ')' */
145   RT_PRAGMA_EOL, /* end of line */
146   RT_NAME, /* identifier */
147
148   /* The type is CPP_KEYWORD */
149   RT_NEW, /* new */
150   RT_DELETE, /* delete */
151   RT_RETURN, /* return */
152   RT_WHILE, /* while */
153   RT_EXTERN, /* extern */
154   RT_STATIC_ASSERT, /* static_assert */
155   RT_DECLTYPE, /* decltype */
156   RT_OPERATOR, /* operator */
157   RT_CLASS, /* class */
158   RT_TEMPLATE, /* template */
159   RT_NAMESPACE, /* namespace */
160   RT_USING, /* using */
161   RT_ASM, /* asm */
162   RT_TRY, /* try */
163   RT_CATCH, /* catch */
164   RT_THROW, /* throw */
165   RT_LABEL, /* __label__ */
166   RT_AT_TRY, /* @try */
167   RT_AT_SYNCHRONIZED, /* @synchronized */
168   RT_AT_THROW, /* @throw */
169
170   RT_SELECT,  /* selection-statement */
171   RT_INTERATION, /* iteration-statement */
172   RT_JUMP, /* jump-statement */
173   RT_CLASS_KEY, /* class-key */
174   RT_CLASS_TYPENAME_TEMPLATE /* class, typename, or template */
175 } required_token;
176
177 /* Prototypes.  */
178
179 static cp_lexer *cp_lexer_new_main
180   (void);
181 static cp_lexer *cp_lexer_new_from_tokens
182   (cp_token_cache *tokens);
183 static void cp_lexer_destroy
184   (cp_lexer *);
185 static int cp_lexer_saving_tokens
186   (const cp_lexer *);
187 static cp_token *cp_lexer_token_at
188   (cp_lexer *, cp_token_position);
189 static void cp_lexer_get_preprocessor_token
190   (cp_lexer *, cp_token *);
191 static inline cp_token *cp_lexer_peek_token
192   (cp_lexer *);
193 static cp_token *cp_lexer_peek_nth_token
194   (cp_lexer *, size_t);
195 static inline bool cp_lexer_next_token_is
196   (cp_lexer *, enum cpp_ttype);
197 static bool cp_lexer_next_token_is_not
198   (cp_lexer *, enum cpp_ttype);
199 static bool cp_lexer_next_token_is_keyword
200   (cp_lexer *, enum rid);
201 static cp_token *cp_lexer_consume_token
202   (cp_lexer *);
203 static void cp_lexer_purge_token
204   (cp_lexer *);
205 static void cp_lexer_purge_tokens_after
206   (cp_lexer *, cp_token_position);
207 static void cp_lexer_save_tokens
208   (cp_lexer *);
209 static void cp_lexer_commit_tokens
210   (cp_lexer *);
211 static void cp_lexer_rollback_tokens
212   (cp_lexer *);
213 #ifdef ENABLE_CHECKING
214 static void cp_lexer_print_token
215   (FILE *, cp_token *);
216 static inline bool cp_lexer_debugging_p
217   (cp_lexer *);
218 static void cp_lexer_start_debugging
219   (cp_lexer *) ATTRIBUTE_UNUSED;
220 static void cp_lexer_stop_debugging
221   (cp_lexer *) ATTRIBUTE_UNUSED;
222 #else
223 /* If we define cp_lexer_debug_stream to NULL it will provoke warnings
224    about passing NULL to functions that require non-NULL arguments
225    (fputs, fprintf).  It will never be used, so all we need is a value
226    of the right type that's guaranteed not to be NULL.  */
227 #define cp_lexer_debug_stream stdout
228 #define cp_lexer_print_token(str, tok) (void) 0
229 #define cp_lexer_debugging_p(lexer) 0
230 #endif /* ENABLE_CHECKING */
231
232 static cp_token_cache *cp_token_cache_new
233   (cp_token *, cp_token *);
234
235 static void cp_parser_initial_pragma
236   (cp_token *);
237
238 /* Manifest constants.  */
239 #define CP_LEXER_BUFFER_SIZE ((256 * 1024) / sizeof (cp_token))
240 #define CP_SAVED_TOKEN_STACK 5
241
242 /* Variables.  */
243
244 #ifdef ENABLE_CHECKING
245 /* The stream to which debugging output should be written.  */
246 static FILE *cp_lexer_debug_stream;
247 #endif /* ENABLE_CHECKING */
248
249 /* Nonzero if we are parsing an unevaluated operand: an operand to
250    sizeof, typeof, or alignof.  */
251 int cp_unevaluated_operand;
252
253 #ifdef ENABLE_CHECKING
254 /* Dump up to NUM tokens in BUFFER to FILE.  If NUM is 0, dump all the
255    tokens.  */
256
257 void
258 cp_lexer_dump_tokens (FILE *file, VEC(cp_token,gc) *buffer, unsigned num)
259 {
260   unsigned i;
261   cp_token *token;
262
263   fprintf (file, "%u tokens\n", VEC_length (cp_token, buffer));
264
265   if (num == 0)
266     num = VEC_length (cp_token, buffer);
267
268   for (i = 0; VEC_iterate (cp_token, buffer, i, token) && i < num; i++)
269     {
270       cp_lexer_print_token (file, token);
271       switch (token->type)
272         {
273           case CPP_SEMICOLON:
274           case CPP_OPEN_BRACE:
275           case CPP_CLOSE_BRACE:
276           case CPP_EOF:
277             fputc ('\n', file);
278             break;
279
280           default:
281             fputc (' ', file);
282         }
283     }
284
285   if (i == num && i < VEC_length (cp_token, buffer))
286     {
287       fprintf (file, " ... ");
288       cp_lexer_print_token (file, VEC_index (cp_token, buffer,
289                             VEC_length (cp_token, buffer) - 1));
290     }
291
292   fprintf (file, "\n");
293 }
294
295
296 /* Dump all tokens in BUFFER to stderr.  */
297
298 void
299 cp_lexer_debug_tokens (VEC(cp_token,gc) *buffer)
300 {
301   cp_lexer_dump_tokens (stderr, buffer, 0);
302 }
303 #endif
304
305
306 /* Allocate memory for a new lexer object and return it.  */
307
308 static cp_lexer *
309 cp_lexer_alloc (void)
310 {
311   cp_lexer *lexer;
312
313   c_common_no_more_pch ();
314
315   /* Allocate the memory.  */
316   lexer = ggc_alloc_cleared_cp_lexer ();
317
318 #ifdef ENABLE_CHECKING
319   /* Initially we are not debugging.  */
320   lexer->debugging_p = false;
321 #endif /* ENABLE_CHECKING */
322   lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
323                                    CP_SAVED_TOKEN_STACK);
324
325   /* Create the buffer.  */
326   lexer->buffer = VEC_alloc (cp_token, gc, CP_LEXER_BUFFER_SIZE);
327
328   return lexer;
329 }
330
331
332 /* Create a new main C++ lexer, the lexer that gets tokens from the
333    preprocessor.  */
334
335 static cp_lexer *
336 cp_lexer_new_main (void)
337 {
338   cp_lexer *lexer;
339   cp_token token;
340
341   /* It's possible that parsing the first pragma will load a PCH file,
342      which is a GC collection point.  So we have to do that before
343      allocating any memory.  */
344   cp_parser_initial_pragma (&token);
345
346   lexer = cp_lexer_alloc ();
347
348   /* Put the first token in the buffer.  */
349   VEC_quick_push (cp_token, lexer->buffer, &token);
350
351   /* Get the remaining tokens from the preprocessor.  */
352   while (token.type != CPP_EOF)
353     {
354       cp_lexer_get_preprocessor_token (lexer, &token);
355       VEC_safe_push (cp_token, gc, lexer->buffer, &token);
356     }
357
358   lexer->last_token = VEC_address (cp_token, lexer->buffer)
359                       + VEC_length (cp_token, lexer->buffer)
360                       - 1;
361   lexer->next_token = VEC_length (cp_token, lexer->buffer)
362                       ? VEC_address (cp_token, lexer->buffer)
363                       : &eof_token;
364
365   /* Subsequent preprocessor diagnostics should use compiler
366      diagnostic functions to get the compiler source location.  */
367   done_lexing = true;
368
369   gcc_assert (!lexer->next_token->purged_p);
370   return lexer;
371 }
372
373 /* Create a new lexer whose token stream is primed with the tokens in
374    CACHE.  When these tokens are exhausted, no new tokens will be read.  */
375
376 static cp_lexer *
377 cp_lexer_new_from_tokens (cp_token_cache *cache)
378 {
379   cp_token *first = cache->first;
380   cp_token *last = cache->last;
381   cp_lexer *lexer = ggc_alloc_cleared_cp_lexer ();
382
383   /* We do not own the buffer.  */
384   lexer->buffer = NULL;
385   lexer->next_token = first == last ? &eof_token : first;
386   lexer->last_token = last;
387
388   lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
389                                    CP_SAVED_TOKEN_STACK);
390
391 #ifdef ENABLE_CHECKING
392   /* Initially we are not debugging.  */
393   lexer->debugging_p = false;
394 #endif
395
396   gcc_assert (!lexer->next_token->purged_p);
397   return lexer;
398 }
399
400 /* Frees all resources associated with LEXER.  */
401
402 static void
403 cp_lexer_destroy (cp_lexer *lexer)
404 {
405   VEC_free (cp_token, gc, lexer->buffer);
406   VEC_free (cp_token_position, heap, lexer->saved_tokens);
407   ggc_free (lexer);
408 }
409
410 /* Returns nonzero if debugging information should be output.  */
411
412 #ifdef ENABLE_CHECKING
413
414 static inline bool
415 cp_lexer_debugging_p (cp_lexer *lexer)
416 {
417   return lexer->debugging_p;
418 }
419
420 #endif /* ENABLE_CHECKING */
421
422 static inline cp_token_position
423 cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
424 {
425   gcc_assert (!previous_p || lexer->next_token != &eof_token);
426
427   return lexer->next_token - previous_p;
428 }
429
430 static inline cp_token *
431 cp_lexer_token_at (cp_lexer *lexer ATTRIBUTE_UNUSED, cp_token_position pos)
432 {
433   return pos;
434 }
435
436 static inline void
437 cp_lexer_set_token_position (cp_lexer *lexer, cp_token_position pos)
438 {
439   lexer->next_token = cp_lexer_token_at (lexer, pos);
440 }
441
442 static inline cp_token_position
443 cp_lexer_previous_token_position (cp_lexer *lexer)
444 {
445   if (lexer->next_token == &eof_token)
446     return lexer->last_token - 1;
447   else
448     return cp_lexer_token_position (lexer, true);
449 }
450
451 static inline cp_token *
452 cp_lexer_previous_token (cp_lexer *lexer)
453 {
454   cp_token_position tp = cp_lexer_previous_token_position (lexer);
455
456   return cp_lexer_token_at (lexer, tp);
457 }
458
459 /* nonzero if we are presently saving tokens.  */
460
461 static inline int
462 cp_lexer_saving_tokens (const cp_lexer* lexer)
463 {
464   return VEC_length (cp_token_position, lexer->saved_tokens) != 0;
465 }
466
467 /* Store the next token from the preprocessor in *TOKEN.  Return true
468    if we reach EOF.  If LEXER is NULL, assume we are handling an
469    initial #pragma pch_preprocess, and thus want the lexer to return
470    processed strings.  */
471
472 static void
473 cp_lexer_get_preprocessor_token (cp_lexer *lexer, cp_token *token)
474 {
475   static int is_extern_c = 0;
476
477    /* Get a new token from the preprocessor.  */
478   token->type
479     = c_lex_with_flags (&token->u.value, &token->location, &token->flags,
480                         lexer == NULL ? 0 : C_LEX_STRING_NO_JOIN);
481   token->keyword = RID_MAX;
482   token->pragma_kind = PRAGMA_NONE;
483   token->purged_p = false;
484
485   /* On some systems, some header files are surrounded by an
486      implicit extern "C" block.  Set a flag in the token if it
487      comes from such a header.  */
488   is_extern_c += pending_lang_change;
489   pending_lang_change = 0;
490   token->implicit_extern_c = is_extern_c > 0;
491
492   /* Check to see if this token is a keyword.  */
493   if (token->type == CPP_NAME)
494     {
495       if (C_IS_RESERVED_WORD (token->u.value))
496         {
497           /* Mark this token as a keyword.  */
498           token->type = CPP_KEYWORD;
499           /* Record which keyword.  */
500           token->keyword = C_RID_CODE (token->u.value);
501         }
502       else
503         {
504           if (warn_cxx0x_compat
505               && C_RID_CODE (token->u.value) >= RID_FIRST_CXX0X
506               && C_RID_CODE (token->u.value) <= RID_LAST_CXX0X)
507             {
508               /* Warn about the C++0x keyword (but still treat it as
509                  an identifier).  */
510               warning (OPT_Wc__0x_compat, 
511                        "identifier %qE will become a keyword in C++0x",
512                        token->u.value);
513
514               /* Clear out the C_RID_CODE so we don't warn about this
515                  particular identifier-turned-keyword again.  */
516               C_SET_RID_CODE (token->u.value, RID_MAX);
517             }
518
519           token->ambiguous_p = false;
520           token->keyword = RID_MAX;
521         }
522     }
523   else if (token->type == CPP_AT_NAME)
524     {
525       /* This only happens in Objective-C++; it must be a keyword.  */
526       token->type = CPP_KEYWORD;
527       switch (C_RID_CODE (token->u.value))
528         {
529           /* Replace 'class' with '@class', 'private' with '@private',
530              etc.  This prevents confusion with the C++ keyword
531              'class', and makes the tokens consistent with other
532              Objective-C 'AT' keywords.  For example '@class' is
533              reported as RID_AT_CLASS which is consistent with
534              '@synchronized', which is reported as
535              RID_AT_SYNCHRONIZED.
536           */
537         case RID_CLASS:     token->keyword = RID_AT_CLASS; break;
538         case RID_PRIVATE:   token->keyword = RID_AT_PRIVATE; break;
539         case RID_PROTECTED: token->keyword = RID_AT_PROTECTED; break;
540         case RID_PUBLIC:    token->keyword = RID_AT_PUBLIC; break;
541         case RID_THROW:     token->keyword = RID_AT_THROW; break;
542         case RID_TRY:       token->keyword = RID_AT_TRY; break;
543         case RID_CATCH:     token->keyword = RID_AT_CATCH; break;
544         default:            token->keyword = C_RID_CODE (token->u.value);
545         }
546     }
547   else if (token->type == CPP_PRAGMA)
548     {
549       /* We smuggled the cpp_token->u.pragma value in an INTEGER_CST.  */
550       token->pragma_kind = ((enum pragma_kind)
551                             TREE_INT_CST_LOW (token->u.value));
552       token->u.value = NULL_TREE;
553     }
554 }
555
556 /* Update the globals input_location and the input file stack from TOKEN.  */
557 static inline void
558 cp_lexer_set_source_position_from_token (cp_token *token)
559 {
560   if (token->type != CPP_EOF)
561     {
562       input_location = token->location;
563     }
564 }
565
566 /* Return a pointer to the next token in the token stream, but do not
567    consume it.  */
568
569 static inline cp_token *
570 cp_lexer_peek_token (cp_lexer *lexer)
571 {
572   if (cp_lexer_debugging_p (lexer))
573     {
574       fputs ("cp_lexer: peeking at token: ", cp_lexer_debug_stream);
575       cp_lexer_print_token (cp_lexer_debug_stream, lexer->next_token);
576       putc ('\n', cp_lexer_debug_stream);
577     }
578   return lexer->next_token;
579 }
580
581 /* Return true if the next token has the indicated TYPE.  */
582
583 static inline bool
584 cp_lexer_next_token_is (cp_lexer* lexer, enum cpp_ttype type)
585 {
586   return cp_lexer_peek_token (lexer)->type == type;
587 }
588
589 /* Return true if the next token does not have the indicated TYPE.  */
590
591 static inline bool
592 cp_lexer_next_token_is_not (cp_lexer* lexer, enum cpp_ttype type)
593 {
594   return !cp_lexer_next_token_is (lexer, type);
595 }
596
597 /* Return true if the next token is the indicated KEYWORD.  */
598
599 static inline bool
600 cp_lexer_next_token_is_keyword (cp_lexer* lexer, enum rid keyword)
601 {
602   return cp_lexer_peek_token (lexer)->keyword == keyword;
603 }
604
605 /* Return true if the next token is not the indicated KEYWORD.  */
606
607 static inline bool
608 cp_lexer_next_token_is_not_keyword (cp_lexer* lexer, enum rid keyword)
609 {
610   return cp_lexer_peek_token (lexer)->keyword != keyword;
611 }
612
613 /* Return true if the next token is a keyword for a decl-specifier.  */
614
615 static bool
616 cp_lexer_next_token_is_decl_specifier_keyword (cp_lexer *lexer)
617 {
618   cp_token *token;
619
620   token = cp_lexer_peek_token (lexer);
621   switch (token->keyword) 
622     {
623       /* auto specifier: storage-class-specifier in C++,
624          simple-type-specifier in C++0x.  */
625     case RID_AUTO:
626       /* Storage classes.  */
627     case RID_REGISTER:
628     case RID_STATIC:
629     case RID_EXTERN:
630     case RID_MUTABLE:
631     case RID_THREAD:
632       /* Elaborated type specifiers.  */
633     case RID_ENUM:
634     case RID_CLASS:
635     case RID_STRUCT:
636     case RID_UNION:
637     case RID_TYPENAME:
638       /* Simple type specifiers.  */
639     case RID_CHAR:
640     case RID_CHAR16:
641     case RID_CHAR32:
642     case RID_WCHAR:
643     case RID_BOOL:
644     case RID_SHORT:
645     case RID_INT:
646     case RID_LONG:
647     case RID_INT128:
648     case RID_SIGNED:
649     case RID_UNSIGNED:
650     case RID_FLOAT:
651     case RID_DOUBLE:
652     case RID_VOID:
653       /* GNU extensions.  */ 
654     case RID_ATTRIBUTE:
655     case RID_TYPEOF:
656       /* C++0x extensions.  */
657     case RID_DECLTYPE:
658     case RID_UNDERLYING_TYPE:
659       return true;
660
661     default:
662       return false;
663     }
664 }
665
666 /* Returns TRUE iff the token T begins a decltype type.  */
667
668 static bool
669 token_is_decltype (cp_token *t)
670 {
671   return (t->keyword == RID_DECLTYPE
672           || t->type == CPP_DECLTYPE);
673 }
674
675 /* Returns TRUE iff the next token begins a decltype type.  */
676
677 static bool
678 cp_lexer_next_token_is_decltype (cp_lexer *lexer)
679 {
680   cp_token *t = cp_lexer_peek_token (lexer);
681   return token_is_decltype (t);
682 }
683
684 /* Return a pointer to the Nth token in the token stream.  If N is 1,
685    then this is precisely equivalent to cp_lexer_peek_token (except
686    that it is not inline).  One would like to disallow that case, but
687    there is one case (cp_parser_nth_token_starts_template_id) where
688    the caller passes a variable for N and it might be 1.  */
689
690 static cp_token *
691 cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
692 {
693   cp_token *token;
694
695   /* N is 1-based, not zero-based.  */
696   gcc_assert (n > 0);
697
698   if (cp_lexer_debugging_p (lexer))
699     fprintf (cp_lexer_debug_stream,
700              "cp_lexer: peeking ahead %ld at token: ", (long)n);
701
702   --n;
703   token = lexer->next_token;
704   gcc_assert (!n || token != &eof_token);
705   while (n != 0)
706     {
707       ++token;
708       if (token == lexer->last_token)
709         {
710           token = &eof_token;
711           break;
712         }
713
714       if (!token->purged_p)
715         --n;
716     }
717
718   if (cp_lexer_debugging_p (lexer))
719     {
720       cp_lexer_print_token (cp_lexer_debug_stream, token);
721       putc ('\n', cp_lexer_debug_stream);
722     }
723
724   return token;
725 }
726
727 /* Return the next token, and advance the lexer's next_token pointer
728    to point to the next non-purged token.  */
729
730 static cp_token *
731 cp_lexer_consume_token (cp_lexer* lexer)
732 {
733   cp_token *token = lexer->next_token;
734
735   gcc_assert (token != &eof_token);
736   gcc_assert (!lexer->in_pragma || token->type != CPP_PRAGMA_EOL);
737
738   do
739     {
740       lexer->next_token++;
741       if (lexer->next_token == lexer->last_token)
742         {
743           lexer->next_token = &eof_token;
744           break;
745         }
746
747     }
748   while (lexer->next_token->purged_p);
749
750   cp_lexer_set_source_position_from_token (token);
751
752   /* Provide debugging output.  */
753   if (cp_lexer_debugging_p (lexer))
754     {
755       fputs ("cp_lexer: consuming token: ", cp_lexer_debug_stream);
756       cp_lexer_print_token (cp_lexer_debug_stream, token);
757       putc ('\n', cp_lexer_debug_stream);
758     }
759
760   return token;
761 }
762
763 /* Permanently remove the next token from the token stream, and
764    advance the next_token pointer to refer to the next non-purged
765    token.  */
766
767 static void
768 cp_lexer_purge_token (cp_lexer *lexer)
769 {
770   cp_token *tok = lexer->next_token;
771
772   gcc_assert (tok != &eof_token);
773   tok->purged_p = true;
774   tok->location = UNKNOWN_LOCATION;
775   tok->u.value = NULL_TREE;
776   tok->keyword = RID_MAX;
777
778   do
779     {
780       tok++;
781       if (tok == lexer->last_token)
782         {
783           tok = &eof_token;
784           break;
785         }
786     }
787   while (tok->purged_p);
788   lexer->next_token = tok;
789 }
790
791 /* Permanently remove all tokens after TOK, up to, but not
792    including, the token that will be returned next by
793    cp_lexer_peek_token.  */
794
795 static void
796 cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
797 {
798   cp_token *peek = lexer->next_token;
799
800   if (peek == &eof_token)
801     peek = lexer->last_token;
802
803   gcc_assert (tok < peek);
804
805   for ( tok += 1; tok != peek; tok += 1)
806     {
807       tok->purged_p = true;
808       tok->location = UNKNOWN_LOCATION;
809       tok->u.value = NULL_TREE;
810       tok->keyword = RID_MAX;
811     }
812 }
813
814 /* Begin saving tokens.  All tokens consumed after this point will be
815    preserved.  */
816
817 static void
818 cp_lexer_save_tokens (cp_lexer* lexer)
819 {
820   /* Provide debugging output.  */
821   if (cp_lexer_debugging_p (lexer))
822     fprintf (cp_lexer_debug_stream, "cp_lexer: saving tokens\n");
823
824   VEC_safe_push (cp_token_position, heap,
825                  lexer->saved_tokens, lexer->next_token);
826 }
827
828 /* Commit to the portion of the token stream most recently saved.  */
829
830 static void
831 cp_lexer_commit_tokens (cp_lexer* lexer)
832 {
833   /* Provide debugging output.  */
834   if (cp_lexer_debugging_p (lexer))
835     fprintf (cp_lexer_debug_stream, "cp_lexer: committing tokens\n");
836
837   VEC_pop (cp_token_position, lexer->saved_tokens);
838 }
839
840 /* Return all tokens saved since the last call to cp_lexer_save_tokens
841    to the token stream.  Stop saving tokens.  */
842
843 static void
844 cp_lexer_rollback_tokens (cp_lexer* lexer)
845 {
846   /* Provide debugging output.  */
847   if (cp_lexer_debugging_p (lexer))
848     fprintf (cp_lexer_debug_stream, "cp_lexer: restoring tokens\n");
849
850   lexer->next_token = VEC_pop (cp_token_position, lexer->saved_tokens);
851 }
852
853 /* Print a representation of the TOKEN on the STREAM.  */
854
855 #ifdef ENABLE_CHECKING
856
857 static void
858 cp_lexer_print_token (FILE * stream, cp_token *token)
859 {
860   /* We don't use cpp_type2name here because the parser defines
861      a few tokens of its own.  */
862   static const char *const token_names[] = {
863     /* cpplib-defined token types */
864 #define OP(e, s) #e,
865 #define TK(e, s) #e,
866     TTYPE_TABLE
867 #undef OP
868 #undef TK
869     /* C++ parser token types - see "Manifest constants", above.  */
870     "KEYWORD",
871     "TEMPLATE_ID",
872     "NESTED_NAME_SPECIFIER",
873   };
874
875   /* For some tokens, print the associated data.  */
876   switch (token->type)
877     {
878     case CPP_KEYWORD:
879       /* Some keywords have a value that is not an IDENTIFIER_NODE.
880          For example, `struct' is mapped to an INTEGER_CST.  */
881       if (TREE_CODE (token->u.value) != IDENTIFIER_NODE)
882         break;
883       /* else fall through */
884     case CPP_NAME:
885       fputs (IDENTIFIER_POINTER (token->u.value), stream);
886       break;
887
888     case CPP_STRING:
889     case CPP_STRING16:
890     case CPP_STRING32:
891     case CPP_WSTRING:
892     case CPP_UTF8STRING:
893       fprintf (stream, " \"%s\"", TREE_STRING_POINTER (token->u.value));
894       break;
895
896     case CPP_NUMBER:
897       print_generic_expr (stream, token->u.value, 0);
898       break;
899
900     default:
901       /* If we have a name for the token, print it out.  Otherwise, we
902          simply give the numeric code.  */
903       if (token->type < ARRAY_SIZE(token_names))
904         fputs (token_names[token->type], stream);
905       else
906         fprintf (stream, "[%d]", token->type);
907       break;
908     }
909 }
910
911 /* Start emitting debugging information.  */
912
913 static void
914 cp_lexer_start_debugging (cp_lexer* lexer)
915 {
916   lexer->debugging_p = true;
917 }
918
919 /* Stop emitting debugging information.  */
920
921 static void
922 cp_lexer_stop_debugging (cp_lexer* lexer)
923 {
924   lexer->debugging_p = false;
925 }
926
927 #endif /* ENABLE_CHECKING */
928
929 /* Create a new cp_token_cache, representing a range of tokens.  */
930
931 static cp_token_cache *
932 cp_token_cache_new (cp_token *first, cp_token *last)
933 {
934   cp_token_cache *cache = ggc_alloc_cp_token_cache ();
935   cache->first = first;
936   cache->last = last;
937   return cache;
938 }
939
940 \f
941 /* Decl-specifiers.  */
942
943 /* Set *DECL_SPECS to represent an empty decl-specifier-seq.  */
944
945 static void
946 clear_decl_specs (cp_decl_specifier_seq *decl_specs)
947 {
948   memset (decl_specs, 0, sizeof (cp_decl_specifier_seq));
949 }
950
951 /* Declarators.  */
952
953 /* Nothing other than the parser should be creating declarators;
954    declarators are a semi-syntactic representation of C++ entities.
955    Other parts of the front end that need to create entities (like
956    VAR_DECLs or FUNCTION_DECLs) should do that directly.  */
957
958 static cp_declarator *make_call_declarator
959   (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, tree, tree);
960 static cp_declarator *make_array_declarator
961   (cp_declarator *, tree);
962 static cp_declarator *make_pointer_declarator
963   (cp_cv_quals, cp_declarator *);
964 static cp_declarator *make_reference_declarator
965   (cp_cv_quals, cp_declarator *, bool);
966 static cp_parameter_declarator *make_parameter_declarator
967   (cp_decl_specifier_seq *, cp_declarator *, tree);
968 static cp_declarator *make_ptrmem_declarator
969   (cp_cv_quals, tree, cp_declarator *);
970
971 /* An erroneous declarator.  */
972 static cp_declarator *cp_error_declarator;
973
974 /* The obstack on which declarators and related data structures are
975    allocated.  */
976 static struct obstack declarator_obstack;
977
978 /* Alloc BYTES from the declarator memory pool.  */
979
980 static inline void *
981 alloc_declarator (size_t bytes)
982 {
983   return obstack_alloc (&declarator_obstack, bytes);
984 }
985
986 /* Allocate a declarator of the indicated KIND.  Clear fields that are
987    common to all declarators.  */
988
989 static cp_declarator *
990 make_declarator (cp_declarator_kind kind)
991 {
992   cp_declarator *declarator;
993
994   declarator = (cp_declarator *) alloc_declarator (sizeof (cp_declarator));
995   declarator->kind = kind;
996   declarator->attributes = NULL_TREE;
997   declarator->declarator = NULL;
998   declarator->parameter_pack_p = false;
999   declarator->id_loc = UNKNOWN_LOCATION;
1000
1001   return declarator;
1002 }
1003
1004 /* Make a declarator for a generalized identifier.  If
1005    QUALIFYING_SCOPE is non-NULL, the identifier is
1006    QUALIFYING_SCOPE::UNQUALIFIED_NAME; otherwise, it is just
1007    UNQUALIFIED_NAME.  SFK indicates the kind of special function this
1008    is, if any.   */
1009
1010 static cp_declarator *
1011 make_id_declarator (tree qualifying_scope, tree unqualified_name,
1012                     special_function_kind sfk)
1013 {
1014   cp_declarator *declarator;
1015
1016   /* It is valid to write:
1017
1018        class C { void f(); };
1019        typedef C D;
1020        void D::f();
1021
1022      The standard is not clear about whether `typedef const C D' is
1023      legal; as of 2002-09-15 the committee is considering that
1024      question.  EDG 3.0 allows that syntax.  Therefore, we do as
1025      well.  */
1026   if (qualifying_scope && TYPE_P (qualifying_scope))
1027     qualifying_scope = TYPE_MAIN_VARIANT (qualifying_scope);
1028
1029   gcc_assert (TREE_CODE (unqualified_name) == IDENTIFIER_NODE
1030               || TREE_CODE (unqualified_name) == BIT_NOT_EXPR
1031               || TREE_CODE (unqualified_name) == TEMPLATE_ID_EXPR);
1032
1033   declarator = make_declarator (cdk_id);
1034   declarator->u.id.qualifying_scope = qualifying_scope;
1035   declarator->u.id.unqualified_name = unqualified_name;
1036   declarator->u.id.sfk = sfk;
1037   
1038   return declarator;
1039 }
1040
1041 /* Make a declarator for a pointer to TARGET.  CV_QUALIFIERS is a list
1042    of modifiers such as const or volatile to apply to the pointer
1043    type, represented as identifiers.  */
1044
1045 cp_declarator *
1046 make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target)
1047 {
1048   cp_declarator *declarator;
1049
1050   declarator = make_declarator (cdk_pointer);
1051   declarator->declarator = target;
1052   declarator->u.pointer.qualifiers = cv_qualifiers;
1053   declarator->u.pointer.class_type = NULL_TREE;
1054   if (target)
1055     {
1056       declarator->id_loc = target->id_loc;
1057       declarator->parameter_pack_p = target->parameter_pack_p;
1058       target->parameter_pack_p = false;
1059     }
1060   else
1061     declarator->parameter_pack_p = false;
1062
1063   return declarator;
1064 }
1065
1066 /* Like make_pointer_declarator -- but for references.  */
1067
1068 cp_declarator *
1069 make_reference_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1070                            bool rvalue_ref)
1071 {
1072   cp_declarator *declarator;
1073
1074   declarator = make_declarator (cdk_reference);
1075   declarator->declarator = target;
1076   declarator->u.reference.qualifiers = cv_qualifiers;
1077   declarator->u.reference.rvalue_ref = rvalue_ref;
1078   if (target)
1079     {
1080       declarator->id_loc = target->id_loc;
1081       declarator->parameter_pack_p = target->parameter_pack_p;
1082       target->parameter_pack_p = false;
1083     }
1084   else
1085     declarator->parameter_pack_p = false;
1086
1087   return declarator;
1088 }
1089
1090 /* Like make_pointer_declarator -- but for a pointer to a non-static
1091    member of CLASS_TYPE.  */
1092
1093 cp_declarator *
1094 make_ptrmem_declarator (cp_cv_quals cv_qualifiers, tree class_type,
1095                         cp_declarator *pointee)
1096 {
1097   cp_declarator *declarator;
1098
1099   declarator = make_declarator (cdk_ptrmem);
1100   declarator->declarator = pointee;
1101   declarator->u.pointer.qualifiers = cv_qualifiers;
1102   declarator->u.pointer.class_type = class_type;
1103
1104   if (pointee)
1105     {
1106       declarator->parameter_pack_p = pointee->parameter_pack_p;
1107       pointee->parameter_pack_p = false;
1108     }
1109   else
1110     declarator->parameter_pack_p = false;
1111
1112   return declarator;
1113 }
1114
1115 /* Make a declarator for the function given by TARGET, with the
1116    indicated PARMS.  The CV_QUALIFIERS aply to the function, as in
1117    "const"-qualified member function.  The EXCEPTION_SPECIFICATION
1118    indicates what exceptions can be thrown.  */
1119
1120 cp_declarator *
1121 make_call_declarator (cp_declarator *target,
1122                       tree parms,
1123                       cp_cv_quals cv_qualifiers,
1124                       cp_virt_specifiers virt_specifiers,
1125                       tree exception_specification,
1126                       tree late_return_type)
1127 {
1128   cp_declarator *declarator;
1129
1130   declarator = make_declarator (cdk_function);
1131   declarator->declarator = target;
1132   declarator->u.function.parameters = parms;
1133   declarator->u.function.qualifiers = cv_qualifiers;
1134   declarator->u.function.virt_specifiers = virt_specifiers;
1135   declarator->u.function.exception_specification = exception_specification;
1136   declarator->u.function.late_return_type = late_return_type;
1137   if (target)
1138     {
1139       declarator->id_loc = target->id_loc;
1140       declarator->parameter_pack_p = target->parameter_pack_p;
1141       target->parameter_pack_p = false;
1142     }
1143   else
1144     declarator->parameter_pack_p = false;
1145
1146   return declarator;
1147 }
1148
1149 /* Make a declarator for an array of BOUNDS elements, each of which is
1150    defined by ELEMENT.  */
1151
1152 cp_declarator *
1153 make_array_declarator (cp_declarator *element, tree bounds)
1154 {
1155   cp_declarator *declarator;
1156
1157   declarator = make_declarator (cdk_array);
1158   declarator->declarator = element;
1159   declarator->u.array.bounds = bounds;
1160   if (element)
1161     {
1162       declarator->id_loc = element->id_loc;
1163       declarator->parameter_pack_p = element->parameter_pack_p;
1164       element->parameter_pack_p = false;
1165     }
1166   else
1167     declarator->parameter_pack_p = false;
1168
1169   return declarator;
1170 }
1171
1172 /* Determine whether the declarator we've seen so far can be a
1173    parameter pack, when followed by an ellipsis.  */
1174 static bool 
1175 declarator_can_be_parameter_pack (cp_declarator *declarator)
1176 {
1177   /* Search for a declarator name, or any other declarator that goes
1178      after the point where the ellipsis could appear in a parameter
1179      pack. If we find any of these, then this declarator can not be
1180      made into a parameter pack.  */
1181   bool found = false;
1182   while (declarator && !found)
1183     {
1184       switch ((int)declarator->kind)
1185         {
1186         case cdk_id:
1187         case cdk_array:
1188           found = true;
1189           break;
1190
1191         case cdk_error:
1192           return true;
1193
1194         default:
1195           declarator = declarator->declarator;
1196           break;
1197         }
1198     }
1199
1200   return !found;
1201 }
1202
1203 cp_parameter_declarator *no_parameters;
1204
1205 /* Create a parameter declarator with the indicated DECL_SPECIFIERS,
1206    DECLARATOR and DEFAULT_ARGUMENT.  */
1207
1208 cp_parameter_declarator *
1209 make_parameter_declarator (cp_decl_specifier_seq *decl_specifiers,
1210                            cp_declarator *declarator,
1211                            tree default_argument)
1212 {
1213   cp_parameter_declarator *parameter;
1214
1215   parameter = ((cp_parameter_declarator *)
1216                alloc_declarator (sizeof (cp_parameter_declarator)));
1217   parameter->next = NULL;
1218   if (decl_specifiers)
1219     parameter->decl_specifiers = *decl_specifiers;
1220   else
1221     clear_decl_specs (&parameter->decl_specifiers);
1222   parameter->declarator = declarator;
1223   parameter->default_argument = default_argument;
1224   parameter->ellipsis_p = false;
1225
1226   return parameter;
1227 }
1228
1229 /* Returns true iff DECLARATOR  is a declaration for a function.  */
1230
1231 static bool
1232 function_declarator_p (const cp_declarator *declarator)
1233 {
1234   while (declarator)
1235     {
1236       if (declarator->kind == cdk_function
1237           && declarator->declarator->kind == cdk_id)
1238         return true;
1239       if (declarator->kind == cdk_id
1240           || declarator->kind == cdk_error)
1241         return false;
1242       declarator = declarator->declarator;
1243     }
1244   return false;
1245 }
1246  
1247 /* The parser.  */
1248
1249 /* Overview
1250    --------
1251
1252    A cp_parser parses the token stream as specified by the C++
1253    grammar.  Its job is purely parsing, not semantic analysis.  For
1254    example, the parser breaks the token stream into declarators,
1255    expressions, statements, and other similar syntactic constructs.
1256    It does not check that the types of the expressions on either side
1257    of an assignment-statement are compatible, or that a function is
1258    not declared with a parameter of type `void'.
1259
1260    The parser invokes routines elsewhere in the compiler to perform
1261    semantic analysis and to build up the abstract syntax tree for the
1262    code processed.
1263
1264    The parser (and the template instantiation code, which is, in a
1265    way, a close relative of parsing) are the only parts of the
1266    compiler that should be calling push_scope and pop_scope, or
1267    related functions.  The parser (and template instantiation code)
1268    keeps track of what scope is presently active; everything else
1269    should simply honor that.  (The code that generates static
1270    initializers may also need to set the scope, in order to check
1271    access control correctly when emitting the initializers.)
1272
1273    Methodology
1274    -----------
1275
1276    The parser is of the standard recursive-descent variety.  Upcoming
1277    tokens in the token stream are examined in order to determine which
1278    production to use when parsing a non-terminal.  Some C++ constructs
1279    require arbitrary look ahead to disambiguate.  For example, it is
1280    impossible, in the general case, to tell whether a statement is an
1281    expression or declaration without scanning the entire statement.
1282    Therefore, the parser is capable of "parsing tentatively."  When the
1283    parser is not sure what construct comes next, it enters this mode.
1284    Then, while we attempt to parse the construct, the parser queues up
1285    error messages, rather than issuing them immediately, and saves the
1286    tokens it consumes.  If the construct is parsed successfully, the
1287    parser "commits", i.e., it issues any queued error messages and
1288    the tokens that were being preserved are permanently discarded.
1289    If, however, the construct is not parsed successfully, the parser
1290    rolls back its state completely so that it can resume parsing using
1291    a different alternative.
1292
1293    Future Improvements
1294    -------------------
1295
1296    The performance of the parser could probably be improved substantially.
1297    We could often eliminate the need to parse tentatively by looking ahead
1298    a little bit.  In some places, this approach might not entirely eliminate
1299    the need to parse tentatively, but it might still speed up the average
1300    case.  */
1301
1302 /* Flags that are passed to some parsing functions.  These values can
1303    be bitwise-ored together.  */
1304
1305 enum
1306 {
1307   /* No flags.  */
1308   CP_PARSER_FLAGS_NONE = 0x0,
1309   /* The construct is optional.  If it is not present, then no error
1310      should be issued.  */
1311   CP_PARSER_FLAGS_OPTIONAL = 0x1,
1312   /* When parsing a type-specifier, treat user-defined type-names
1313      as non-type identifiers.  */
1314   CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES = 0x2,
1315   /* When parsing a type-specifier, do not try to parse a class-specifier
1316      or enum-specifier.  */
1317   CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS = 0x4,
1318   /* When parsing a decl-specifier-seq, only allow type-specifier or
1319      constexpr.  */
1320   CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR = 0x8
1321 };
1322
1323 /* This type is used for parameters and variables which hold
1324    combinations of the above flags.  */
1325 typedef int cp_parser_flags;
1326
1327 /* The different kinds of declarators we want to parse.  */
1328
1329 typedef enum cp_parser_declarator_kind
1330 {
1331   /* We want an abstract declarator.  */
1332   CP_PARSER_DECLARATOR_ABSTRACT,
1333   /* We want a named declarator.  */
1334   CP_PARSER_DECLARATOR_NAMED,
1335   /* We don't mind, but the name must be an unqualified-id.  */
1336   CP_PARSER_DECLARATOR_EITHER
1337 } cp_parser_declarator_kind;
1338
1339 /* The precedence values used to parse binary expressions.  The minimum value
1340    of PREC must be 1, because zero is reserved to quickly discriminate
1341    binary operators from other tokens.  */
1342
1343 enum cp_parser_prec
1344 {
1345   PREC_NOT_OPERATOR,
1346   PREC_LOGICAL_OR_EXPRESSION,
1347   PREC_LOGICAL_AND_EXPRESSION,
1348   PREC_INCLUSIVE_OR_EXPRESSION,
1349   PREC_EXCLUSIVE_OR_EXPRESSION,
1350   PREC_AND_EXPRESSION,
1351   PREC_EQUALITY_EXPRESSION,
1352   PREC_RELATIONAL_EXPRESSION,
1353   PREC_SHIFT_EXPRESSION,
1354   PREC_ADDITIVE_EXPRESSION,
1355   PREC_MULTIPLICATIVE_EXPRESSION,
1356   PREC_PM_EXPRESSION,
1357   NUM_PREC_VALUES = PREC_PM_EXPRESSION
1358 };
1359
1360 /* A mapping from a token type to a corresponding tree node type, with a
1361    precedence value.  */
1362
1363 typedef struct cp_parser_binary_operations_map_node
1364 {
1365   /* The token type.  */
1366   enum cpp_ttype token_type;
1367   /* The corresponding tree code.  */
1368   enum tree_code tree_type;
1369   /* The precedence of this operator.  */
1370   enum cp_parser_prec prec;
1371 } cp_parser_binary_operations_map_node;
1372
1373 typedef struct cp_parser_expression_stack_entry
1374 {
1375   /* Left hand side of the binary operation we are currently
1376      parsing.  */
1377   tree lhs;
1378   /* Original tree code for left hand side, if it was a binary
1379      expression itself (used for -Wparentheses).  */
1380   enum tree_code lhs_type;
1381   /* Tree code for the binary operation we are parsing.  */
1382   enum tree_code tree_type;
1383   /* Precedence of the binary operation we are parsing.  */
1384   enum cp_parser_prec prec;
1385 } cp_parser_expression_stack_entry;
1386
1387 /* The stack for storing partial expressions.  We only need NUM_PREC_VALUES
1388    entries because precedence levels on the stack are monotonically
1389    increasing.  */
1390 typedef struct cp_parser_expression_stack_entry
1391   cp_parser_expression_stack[NUM_PREC_VALUES];
1392
1393 /* Prototypes.  */
1394
1395 /* Constructors and destructors.  */
1396
1397 static cp_parser_context *cp_parser_context_new
1398   (cp_parser_context *);
1399
1400 /* Class variables.  */
1401
1402 static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
1403
1404 /* The operator-precedence table used by cp_parser_binary_expression.
1405    Transformed into an associative array (binops_by_token) by
1406    cp_parser_new.  */
1407
1408 static const cp_parser_binary_operations_map_node binops[] = {
1409   { CPP_DEREF_STAR, MEMBER_REF, PREC_PM_EXPRESSION },
1410   { CPP_DOT_STAR, DOTSTAR_EXPR, PREC_PM_EXPRESSION },
1411
1412   { CPP_MULT, MULT_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1413   { CPP_DIV, TRUNC_DIV_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1414   { CPP_MOD, TRUNC_MOD_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1415
1416   { CPP_PLUS, PLUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1417   { CPP_MINUS, MINUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1418
1419   { CPP_LSHIFT, LSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1420   { CPP_RSHIFT, RSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1421
1422   { CPP_LESS, LT_EXPR, PREC_RELATIONAL_EXPRESSION },
1423   { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION },
1424   { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION },
1425   { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION },
1426
1427   { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION },
1428   { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION },
1429
1430   { CPP_AND, BIT_AND_EXPR, PREC_AND_EXPRESSION },
1431
1432   { CPP_XOR, BIT_XOR_EXPR, PREC_EXCLUSIVE_OR_EXPRESSION },
1433
1434   { CPP_OR, BIT_IOR_EXPR, PREC_INCLUSIVE_OR_EXPRESSION },
1435
1436   { CPP_AND_AND, TRUTH_ANDIF_EXPR, PREC_LOGICAL_AND_EXPRESSION },
1437
1438   { CPP_OR_OR, TRUTH_ORIF_EXPR, PREC_LOGICAL_OR_EXPRESSION }
1439 };
1440
1441 /* The same as binops, but initialized by cp_parser_new so that
1442    binops_by_token[N].token_type == N.  Used in cp_parser_binary_expression
1443    for speed.  */
1444 static cp_parser_binary_operations_map_node binops_by_token[N_CP_TTYPES];
1445
1446 /* Constructors and destructors.  */
1447
1448 /* Construct a new context.  The context below this one on the stack
1449    is given by NEXT.  */
1450
1451 static cp_parser_context *
1452 cp_parser_context_new (cp_parser_context* next)
1453 {
1454   cp_parser_context *context;
1455
1456   /* Allocate the storage.  */
1457   if (cp_parser_context_free_list != NULL)
1458     {
1459       /* Pull the first entry from the free list.  */
1460       context = cp_parser_context_free_list;
1461       cp_parser_context_free_list = context->next;
1462       memset (context, 0, sizeof (*context));
1463     }
1464   else
1465     context = ggc_alloc_cleared_cp_parser_context ();
1466
1467   /* No errors have occurred yet in this context.  */
1468   context->status = CP_PARSER_STATUS_KIND_NO_ERROR;
1469   /* If this is not the bottommost context, copy information that we
1470      need from the previous context.  */
1471   if (next)
1472     {
1473       /* If, in the NEXT context, we are parsing an `x->' or `x.'
1474          expression, then we are parsing one in this context, too.  */
1475       context->object_type = next->object_type;
1476       /* Thread the stack.  */
1477       context->next = next;
1478     }
1479
1480   return context;
1481 }
1482
1483 /* Managing the unparsed function queues.  */
1484
1485 #define unparsed_funs_with_default_args \
1486   VEC_last (cp_unparsed_functions_entry, parser->unparsed_queues)->funs_with_default_args
1487 #define unparsed_funs_with_definitions \
1488   VEC_last (cp_unparsed_functions_entry, parser->unparsed_queues)->funs_with_definitions
1489
1490 static void
1491 push_unparsed_function_queues (cp_parser *parser)
1492 {
1493   VEC_safe_push (cp_unparsed_functions_entry, gc,
1494                  parser->unparsed_queues, NULL);
1495   unparsed_funs_with_default_args = NULL;
1496   unparsed_funs_with_definitions = make_tree_vector ();
1497 }
1498
1499 static void
1500 pop_unparsed_function_queues (cp_parser *parser)
1501 {
1502   release_tree_vector (unparsed_funs_with_definitions);
1503   VEC_pop (cp_unparsed_functions_entry, parser->unparsed_queues);
1504 }
1505
1506 /* Prototypes.  */
1507
1508 /* Constructors and destructors.  */
1509
1510 static cp_parser *cp_parser_new
1511   (void);
1512
1513 /* Routines to parse various constructs.
1514
1515    Those that return `tree' will return the error_mark_node (rather
1516    than NULL_TREE) if a parse error occurs, unless otherwise noted.
1517    Sometimes, they will return an ordinary node if error-recovery was
1518    attempted, even though a parse error occurred.  So, to check
1519    whether or not a parse error occurred, you should always use
1520    cp_parser_error_occurred.  If the construct is optional (indicated
1521    either by an `_opt' in the name of the function that does the
1522    parsing or via a FLAGS parameter), then NULL_TREE is returned if
1523    the construct is not present.  */
1524
1525 /* Lexical conventions [gram.lex]  */
1526
1527 static tree cp_parser_identifier
1528   (cp_parser *);
1529 static tree cp_parser_string_literal
1530   (cp_parser *, bool, bool);
1531
1532 /* Basic concepts [gram.basic]  */
1533
1534 static bool cp_parser_translation_unit
1535   (cp_parser *);
1536
1537 /* Expressions [gram.expr]  */
1538
1539 static tree cp_parser_primary_expression
1540   (cp_parser *, bool, bool, bool, cp_id_kind *);
1541 static tree cp_parser_id_expression
1542   (cp_parser *, bool, bool, bool *, bool, bool);
1543 static tree cp_parser_unqualified_id
1544   (cp_parser *, bool, bool, bool, bool);
1545 static tree cp_parser_nested_name_specifier_opt
1546   (cp_parser *, bool, bool, bool, bool);
1547 static tree cp_parser_nested_name_specifier
1548   (cp_parser *, bool, bool, bool, bool);
1549 static tree cp_parser_qualifying_entity
1550   (cp_parser *, bool, bool, bool, bool, bool);
1551 static tree cp_parser_postfix_expression
1552   (cp_parser *, bool, bool, bool, cp_id_kind *);
1553 static tree cp_parser_postfix_open_square_expression
1554   (cp_parser *, tree, bool);
1555 static tree cp_parser_postfix_dot_deref_expression
1556   (cp_parser *, enum cpp_ttype, tree, bool, cp_id_kind *, location_t);
1557 static VEC(tree,gc) *cp_parser_parenthesized_expression_list
1558   (cp_parser *, int, bool, bool, bool *);
1559 /* Values for the second parameter of cp_parser_parenthesized_expression_list.  */
1560 enum { non_attr = 0, normal_attr = 1, id_attr = 2 };
1561 static void cp_parser_pseudo_destructor_name
1562   (cp_parser *, tree *, tree *);
1563 static tree cp_parser_unary_expression
1564   (cp_parser *, bool, bool, cp_id_kind *);
1565 static enum tree_code cp_parser_unary_operator
1566   (cp_token *);
1567 static tree cp_parser_new_expression
1568   (cp_parser *);
1569 static VEC(tree,gc) *cp_parser_new_placement
1570   (cp_parser *);
1571 static tree cp_parser_new_type_id
1572   (cp_parser *, tree *);
1573 static cp_declarator *cp_parser_new_declarator_opt
1574   (cp_parser *);
1575 static cp_declarator *cp_parser_direct_new_declarator
1576   (cp_parser *);
1577 static VEC(tree,gc) *cp_parser_new_initializer
1578   (cp_parser *);
1579 static tree cp_parser_delete_expression
1580   (cp_parser *);
1581 static tree cp_parser_cast_expression
1582   (cp_parser *, bool, bool, cp_id_kind *);
1583 static tree cp_parser_binary_expression
1584   (cp_parser *, bool, bool, enum cp_parser_prec, cp_id_kind *);
1585 static tree cp_parser_question_colon_clause
1586   (cp_parser *, tree);
1587 static tree cp_parser_assignment_expression
1588   (cp_parser *, bool, cp_id_kind *);
1589 static enum tree_code cp_parser_assignment_operator_opt
1590   (cp_parser *);
1591 static tree cp_parser_expression
1592   (cp_parser *, bool, cp_id_kind *);
1593 static tree cp_parser_constant_expression
1594   (cp_parser *, bool, bool *);
1595 static tree cp_parser_builtin_offsetof
1596   (cp_parser *);
1597 static tree cp_parser_lambda_expression
1598   (cp_parser *);
1599 static void cp_parser_lambda_introducer
1600   (cp_parser *, tree);
1601 static bool cp_parser_lambda_declarator_opt
1602   (cp_parser *, tree);
1603 static void cp_parser_lambda_body
1604   (cp_parser *, tree);
1605
1606 /* Statements [gram.stmt.stmt]  */
1607
1608 static void cp_parser_statement
1609   (cp_parser *, tree, bool, bool *);
1610 static void cp_parser_label_for_labeled_statement
1611   (cp_parser *);
1612 static tree cp_parser_expression_statement
1613   (cp_parser *, tree);
1614 static tree cp_parser_compound_statement
1615   (cp_parser *, tree, bool, bool);
1616 static void cp_parser_statement_seq_opt
1617   (cp_parser *, tree);
1618 static tree cp_parser_selection_statement
1619   (cp_parser *, bool *);
1620 static tree cp_parser_condition
1621   (cp_parser *);
1622 static tree cp_parser_iteration_statement
1623   (cp_parser *);
1624 static bool cp_parser_for_init_statement
1625   (cp_parser *, tree *decl);
1626 static tree cp_parser_for
1627   (cp_parser *);
1628 static tree cp_parser_c_for
1629   (cp_parser *, tree, tree);
1630 static tree cp_parser_range_for
1631   (cp_parser *, tree, tree, tree);
1632 static void do_range_for_auto_deduction
1633   (tree, tree);
1634 static tree cp_parser_perform_range_for_lookup
1635   (tree, tree *, tree *);
1636 static tree cp_parser_range_for_member_function
1637   (tree, tree);
1638 static tree cp_parser_jump_statement
1639   (cp_parser *);
1640 static void cp_parser_declaration_statement
1641   (cp_parser *);
1642
1643 static tree cp_parser_implicitly_scoped_statement
1644   (cp_parser *, bool *);
1645 static void cp_parser_already_scoped_statement
1646   (cp_parser *);
1647
1648 /* Declarations [gram.dcl.dcl] */
1649
1650 static void cp_parser_declaration_seq_opt
1651   (cp_parser *);
1652 static void cp_parser_declaration
1653   (cp_parser *);
1654 static void cp_parser_block_declaration
1655   (cp_parser *, bool);
1656 static void cp_parser_simple_declaration
1657   (cp_parser *, bool, tree *);
1658 static void cp_parser_decl_specifier_seq
1659   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, int *);
1660 static tree cp_parser_storage_class_specifier_opt
1661   (cp_parser *);
1662 static tree cp_parser_function_specifier_opt
1663   (cp_parser *, cp_decl_specifier_seq *);
1664 static tree cp_parser_type_specifier
1665   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, bool,
1666    int *, bool *);
1667 static tree cp_parser_simple_type_specifier
1668   (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
1669 static tree cp_parser_type_name
1670   (cp_parser *);
1671 static tree cp_parser_nonclass_name 
1672   (cp_parser* parser);
1673 static tree cp_parser_elaborated_type_specifier
1674   (cp_parser *, bool, bool);
1675 static tree cp_parser_enum_specifier
1676   (cp_parser *);
1677 static void cp_parser_enumerator_list
1678   (cp_parser *, tree);
1679 static void cp_parser_enumerator_definition
1680   (cp_parser *, tree);
1681 static tree cp_parser_namespace_name
1682   (cp_parser *);
1683 static void cp_parser_namespace_definition
1684   (cp_parser *);
1685 static void cp_parser_namespace_body
1686   (cp_parser *);
1687 static tree cp_parser_qualified_namespace_specifier
1688   (cp_parser *);
1689 static void cp_parser_namespace_alias_definition
1690   (cp_parser *);
1691 static bool cp_parser_using_declaration
1692   (cp_parser *, bool);
1693 static void cp_parser_using_directive
1694   (cp_parser *);
1695 static void cp_parser_asm_definition
1696   (cp_parser *);
1697 static void cp_parser_linkage_specification
1698   (cp_parser *);
1699 static void cp_parser_static_assert
1700   (cp_parser *, bool);
1701 static tree cp_parser_decltype
1702   (cp_parser *);
1703
1704 /* Declarators [gram.dcl.decl] */
1705
1706 static tree cp_parser_init_declarator
1707   (cp_parser *, cp_decl_specifier_seq *, VEC (deferred_access_check,gc)*, bool, bool, int, bool *, tree *);
1708 static cp_declarator *cp_parser_declarator
1709   (cp_parser *, cp_parser_declarator_kind, int *, bool *, bool);
1710 static cp_declarator *cp_parser_direct_declarator
1711   (cp_parser *, cp_parser_declarator_kind, int *, bool);
1712 static enum tree_code cp_parser_ptr_operator
1713   (cp_parser *, tree *, cp_cv_quals *);
1714 static cp_cv_quals cp_parser_cv_qualifier_seq_opt
1715   (cp_parser *);
1716 static cp_virt_specifiers cp_parser_virt_specifier_seq_opt
1717   (cp_parser *);
1718 static tree cp_parser_late_return_type_opt
1719   (cp_parser *, cp_cv_quals);
1720 static tree cp_parser_declarator_id
1721   (cp_parser *, bool);
1722 static tree cp_parser_type_id
1723   (cp_parser *);
1724 static tree cp_parser_template_type_arg
1725   (cp_parser *);
1726 static tree cp_parser_trailing_type_id (cp_parser *);
1727 static tree cp_parser_type_id_1
1728   (cp_parser *, bool, bool);
1729 static void cp_parser_type_specifier_seq
1730   (cp_parser *, bool, bool, cp_decl_specifier_seq *);
1731 static tree cp_parser_parameter_declaration_clause
1732   (cp_parser *);
1733 static tree cp_parser_parameter_declaration_list
1734   (cp_parser *, bool *);
1735 static cp_parameter_declarator *cp_parser_parameter_declaration
1736   (cp_parser *, bool, bool *);
1737 static tree cp_parser_default_argument 
1738   (cp_parser *, bool);
1739 static void cp_parser_function_body
1740   (cp_parser *);
1741 static tree cp_parser_initializer
1742   (cp_parser *, bool *, bool *);
1743 static tree cp_parser_initializer_clause
1744   (cp_parser *, bool *);
1745 static tree cp_parser_braced_list
1746   (cp_parser*, bool*);
1747 static VEC(constructor_elt,gc) *cp_parser_initializer_list
1748   (cp_parser *, bool *);
1749
1750 static bool cp_parser_ctor_initializer_opt_and_function_body
1751   (cp_parser *);
1752
1753 /* Classes [gram.class] */
1754
1755 static tree cp_parser_class_name
1756   (cp_parser *, bool, bool, enum tag_types, bool, bool, bool);
1757 static tree cp_parser_class_specifier
1758   (cp_parser *);
1759 static tree cp_parser_class_head
1760   (cp_parser *, bool *, tree *, tree *);
1761 static enum tag_types cp_parser_class_key
1762   (cp_parser *);
1763 static void cp_parser_member_specification_opt
1764   (cp_parser *);
1765 static void cp_parser_member_declaration
1766   (cp_parser *);
1767 static tree cp_parser_pure_specifier
1768   (cp_parser *);
1769 static tree cp_parser_constant_initializer
1770   (cp_parser *);
1771
1772 /* Derived classes [gram.class.derived] */
1773
1774 static tree cp_parser_base_clause
1775   (cp_parser *);
1776 static tree cp_parser_base_specifier
1777   (cp_parser *);
1778
1779 /* Special member functions [gram.special] */
1780
1781 static tree cp_parser_conversion_function_id
1782   (cp_parser *);
1783 static tree cp_parser_conversion_type_id
1784   (cp_parser *);
1785 static cp_declarator *cp_parser_conversion_declarator_opt
1786   (cp_parser *);
1787 static bool cp_parser_ctor_initializer_opt
1788   (cp_parser *);
1789 static void cp_parser_mem_initializer_list
1790   (cp_parser *);
1791 static tree cp_parser_mem_initializer
1792   (cp_parser *);
1793 static tree cp_parser_mem_initializer_id
1794   (cp_parser *);
1795
1796 /* Overloading [gram.over] */
1797
1798 static tree cp_parser_operator_function_id
1799   (cp_parser *);
1800 static tree cp_parser_operator
1801   (cp_parser *);
1802
1803 /* Templates [gram.temp] */
1804
1805 static void cp_parser_template_declaration
1806   (cp_parser *, bool);
1807 static tree cp_parser_template_parameter_list
1808   (cp_parser *);
1809 static tree cp_parser_template_parameter
1810   (cp_parser *, bool *, bool *);
1811 static tree cp_parser_type_parameter
1812   (cp_parser *, bool *);
1813 static tree cp_parser_template_id
1814   (cp_parser *, bool, bool, bool);
1815 static tree cp_parser_template_name
1816   (cp_parser *, bool, bool, bool, bool *);
1817 static tree cp_parser_template_argument_list
1818   (cp_parser *);
1819 static tree cp_parser_template_argument
1820   (cp_parser *);
1821 static void cp_parser_explicit_instantiation
1822   (cp_parser *);
1823 static void cp_parser_explicit_specialization
1824   (cp_parser *);
1825
1826 /* Exception handling [gram.exception] */
1827
1828 static tree cp_parser_try_block
1829   (cp_parser *);
1830 static bool cp_parser_function_try_block
1831   (cp_parser *);
1832 static void cp_parser_handler_seq
1833   (cp_parser *);
1834 static void cp_parser_handler
1835   (cp_parser *);
1836 static tree cp_parser_exception_declaration
1837   (cp_parser *);
1838 static tree cp_parser_throw_expression
1839   (cp_parser *);
1840 static tree cp_parser_exception_specification_opt
1841   (cp_parser *);
1842 static tree cp_parser_type_id_list
1843   (cp_parser *);
1844
1845 /* GNU Extensions */
1846
1847 static tree cp_parser_asm_specification_opt
1848   (cp_parser *);
1849 static tree cp_parser_asm_operand_list
1850   (cp_parser *);
1851 static tree cp_parser_asm_clobber_list
1852   (cp_parser *);
1853 static tree cp_parser_asm_label_list
1854   (cp_parser *);
1855 static tree cp_parser_attributes_opt
1856   (cp_parser *);
1857 static tree cp_parser_attribute_list
1858   (cp_parser *);
1859 static bool cp_parser_extension_opt
1860   (cp_parser *, int *);
1861 static void cp_parser_label_declaration
1862   (cp_parser *);
1863
1864 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1865 static bool cp_parser_pragma
1866   (cp_parser *, enum pragma_context);
1867
1868 /* Objective-C++ Productions */
1869
1870 static tree cp_parser_objc_message_receiver
1871   (cp_parser *);
1872 static tree cp_parser_objc_message_args
1873   (cp_parser *);
1874 static tree cp_parser_objc_message_expression
1875   (cp_parser *);
1876 static tree cp_parser_objc_encode_expression
1877   (cp_parser *);
1878 static tree cp_parser_objc_defs_expression
1879   (cp_parser *);
1880 static tree cp_parser_objc_protocol_expression
1881   (cp_parser *);
1882 static tree cp_parser_objc_selector_expression
1883   (cp_parser *);
1884 static tree cp_parser_objc_expression
1885   (cp_parser *);
1886 static bool cp_parser_objc_selector_p
1887   (enum cpp_ttype);
1888 static tree cp_parser_objc_selector
1889   (cp_parser *);
1890 static tree cp_parser_objc_protocol_refs_opt
1891   (cp_parser *);
1892 static void cp_parser_objc_declaration
1893   (cp_parser *, tree);
1894 static tree cp_parser_objc_statement
1895   (cp_parser *);
1896 static bool cp_parser_objc_valid_prefix_attributes
1897   (cp_parser *, tree *);
1898 static void cp_parser_objc_at_property_declaration 
1899   (cp_parser *) ;
1900 static void cp_parser_objc_at_synthesize_declaration 
1901   (cp_parser *) ;
1902 static void cp_parser_objc_at_dynamic_declaration
1903   (cp_parser *) ;
1904 static tree cp_parser_objc_struct_declaration
1905   (cp_parser *) ;
1906
1907 /* Utility Routines */
1908
1909 static tree cp_parser_lookup_name
1910   (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *, location_t);
1911 static tree cp_parser_lookup_name_simple
1912   (cp_parser *, tree, location_t);
1913 static tree cp_parser_maybe_treat_template_as_class
1914   (tree, bool);
1915 static bool cp_parser_check_declarator_template_parameters
1916   (cp_parser *, cp_declarator *, location_t);
1917 static bool cp_parser_check_template_parameters
1918   (cp_parser *, unsigned, location_t, cp_declarator *);
1919 static tree cp_parser_simple_cast_expression
1920   (cp_parser *);
1921 static tree cp_parser_global_scope_opt
1922   (cp_parser *, bool);
1923 static bool cp_parser_constructor_declarator_p
1924   (cp_parser *, bool);
1925 static tree cp_parser_function_definition_from_specifiers_and_declarator
1926   (cp_parser *, cp_decl_specifier_seq *, tree, const cp_declarator *);
1927 static tree cp_parser_function_definition_after_declarator
1928   (cp_parser *, bool);
1929 static void cp_parser_template_declaration_after_export
1930   (cp_parser *, bool);
1931 static void cp_parser_perform_template_parameter_access_checks
1932   (VEC (deferred_access_check,gc)*);
1933 static tree cp_parser_single_declaration
1934   (cp_parser *, VEC (deferred_access_check,gc)*, bool, bool, bool *);
1935 static tree cp_parser_functional_cast
1936   (cp_parser *, tree);
1937 static tree cp_parser_save_member_function_body
1938   (cp_parser *, cp_decl_specifier_seq *, cp_declarator *, tree);
1939 static tree cp_parser_enclosed_template_argument_list
1940   (cp_parser *);
1941 static void cp_parser_save_default_args
1942   (cp_parser *, tree);
1943 static void cp_parser_late_parsing_for_member
1944   (cp_parser *, tree);
1945 static void cp_parser_late_parsing_default_args
1946   (cp_parser *, tree);
1947 static tree cp_parser_sizeof_operand
1948   (cp_parser *, enum rid);
1949 static tree cp_parser_trait_expr
1950   (cp_parser *, enum rid);
1951 static bool cp_parser_declares_only_class_p
1952   (cp_parser *);
1953 static void cp_parser_set_storage_class
1954   (cp_parser *, cp_decl_specifier_seq *, enum rid, location_t);
1955 static void cp_parser_set_decl_spec_type
1956   (cp_decl_specifier_seq *, tree, location_t, bool);
1957 static bool cp_parser_friend_p
1958   (const cp_decl_specifier_seq *);
1959 static void cp_parser_required_error
1960   (cp_parser *, required_token, bool);
1961 static cp_token *cp_parser_require
1962   (cp_parser *, enum cpp_ttype, required_token);
1963 static cp_token *cp_parser_require_keyword
1964   (cp_parser *, enum rid, required_token);
1965 static bool cp_parser_token_starts_function_definition_p
1966   (cp_token *);
1967 static bool cp_parser_next_token_starts_class_definition_p
1968   (cp_parser *);
1969 static bool cp_parser_next_token_ends_template_argument_p
1970   (cp_parser *);
1971 static bool cp_parser_nth_token_starts_template_argument_list_p
1972   (cp_parser *, size_t);
1973 static enum tag_types cp_parser_token_is_class_key
1974   (cp_token *);
1975 static void cp_parser_check_class_key
1976   (enum tag_types, tree type);
1977 static void cp_parser_check_access_in_redeclaration
1978   (tree type, location_t location);
1979 static bool cp_parser_optional_template_keyword
1980   (cp_parser *);
1981 static void cp_parser_pre_parsed_nested_name_specifier
1982   (cp_parser *);
1983 static bool cp_parser_cache_group
1984   (cp_parser *, enum cpp_ttype, unsigned);
1985 static void cp_parser_parse_tentatively
1986   (cp_parser *);
1987 static void cp_parser_commit_to_tentative_parse
1988   (cp_parser *);
1989 static void cp_parser_abort_tentative_parse
1990   (cp_parser *);
1991 static bool cp_parser_parse_definitely
1992   (cp_parser *);
1993 static inline bool cp_parser_parsing_tentatively
1994   (cp_parser *);
1995 static bool cp_parser_uncommitted_to_tentative_parse_p
1996   (cp_parser *);
1997 static void cp_parser_error
1998   (cp_parser *, const char *);
1999 static void cp_parser_name_lookup_error
2000   (cp_parser *, tree, tree, name_lookup_error, location_t);
2001 static bool cp_parser_simulate_error
2002   (cp_parser *);
2003 static bool cp_parser_check_type_definition
2004   (cp_parser *);
2005 static void cp_parser_check_for_definition_in_return_type
2006   (cp_declarator *, tree, location_t type_location);
2007 static void cp_parser_check_for_invalid_template_id
2008   (cp_parser *, tree, location_t location);
2009 static bool cp_parser_non_integral_constant_expression
2010   (cp_parser *, non_integral_constant);
2011 static void cp_parser_diagnose_invalid_type_name
2012   (cp_parser *, tree, tree, location_t);
2013 static bool cp_parser_parse_and_diagnose_invalid_type_name
2014   (cp_parser *);
2015 static int cp_parser_skip_to_closing_parenthesis
2016   (cp_parser *, bool, bool, bool);
2017 static void cp_parser_skip_to_end_of_statement
2018   (cp_parser *);
2019 static void cp_parser_consume_semicolon_at_end_of_statement
2020   (cp_parser *);
2021 static void cp_parser_skip_to_end_of_block_or_statement
2022   (cp_parser *);
2023 static bool cp_parser_skip_to_closing_brace
2024   (cp_parser *);
2025 static void cp_parser_skip_to_end_of_template_parameter_list
2026   (cp_parser *);
2027 static void cp_parser_skip_to_pragma_eol
2028   (cp_parser*, cp_token *);
2029 static bool cp_parser_error_occurred
2030   (cp_parser *);
2031 static bool cp_parser_allow_gnu_extensions_p
2032   (cp_parser *);
2033 static bool cp_parser_is_string_literal
2034   (cp_token *);
2035 static bool cp_parser_is_keyword
2036   (cp_token *, enum rid);
2037 static tree cp_parser_make_typename_type
2038   (cp_parser *, tree, tree, location_t location);
2039 static cp_declarator * cp_parser_make_indirect_declarator
2040   (enum tree_code, tree, cp_cv_quals, cp_declarator *);
2041
2042 /* Returns nonzero if we are parsing tentatively.  */
2043
2044 static inline bool
2045 cp_parser_parsing_tentatively (cp_parser* parser)
2046 {
2047   return parser->context->next != NULL;
2048 }
2049
2050 /* Returns nonzero if TOKEN is a string literal.  */
2051
2052 static bool
2053 cp_parser_is_string_literal (cp_token* token)
2054 {
2055   return (token->type == CPP_STRING ||
2056           token->type == CPP_STRING16 ||
2057           token->type == CPP_STRING32 ||
2058           token->type == CPP_WSTRING ||
2059           token->type == CPP_UTF8STRING);
2060 }
2061
2062 /* Returns nonzero if TOKEN is the indicated KEYWORD.  */
2063
2064 static bool
2065 cp_parser_is_keyword (cp_token* token, enum rid keyword)
2066 {
2067   return token->keyword == keyword;
2068 }
2069
2070 /* If not parsing tentatively, issue a diagnostic of the form
2071       FILE:LINE: MESSAGE before TOKEN
2072    where TOKEN is the next token in the input stream.  MESSAGE
2073    (specified by the caller) is usually of the form "expected
2074    OTHER-TOKEN".  */
2075
2076 static void
2077 cp_parser_error (cp_parser* parser, const char* gmsgid)
2078 {
2079   if (!cp_parser_simulate_error (parser))
2080     {
2081       cp_token *token = cp_lexer_peek_token (parser->lexer);
2082       /* This diagnostic makes more sense if it is tagged to the line
2083          of the token we just peeked at.  */
2084       cp_lexer_set_source_position_from_token (token);
2085
2086       if (token->type == CPP_PRAGMA)
2087         {
2088           error_at (token->location,
2089                     "%<#pragma%> is not allowed here");
2090           cp_parser_skip_to_pragma_eol (parser, token);
2091           return;
2092         }
2093
2094       c_parse_error (gmsgid,
2095                      /* Because c_parser_error does not understand
2096                         CPP_KEYWORD, keywords are treated like
2097                         identifiers.  */
2098                      (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
2099                      token->u.value, token->flags);
2100     }
2101 }
2102
2103 /* Issue an error about name-lookup failing.  NAME is the
2104    IDENTIFIER_NODE DECL is the result of
2105    the lookup (as returned from cp_parser_lookup_name).  DESIRED is
2106    the thing that we hoped to find.  */
2107
2108 static void
2109 cp_parser_name_lookup_error (cp_parser* parser,
2110                              tree name,
2111                              tree decl,
2112                              name_lookup_error desired,
2113                              location_t location)
2114 {
2115   /* If name lookup completely failed, tell the user that NAME was not
2116      declared.  */
2117   if (decl == error_mark_node)
2118     {
2119       if (parser->scope && parser->scope != global_namespace)
2120         error_at (location, "%<%E::%E%> has not been declared",
2121                   parser->scope, name);
2122       else if (parser->scope == global_namespace)
2123         error_at (location, "%<::%E%> has not been declared", name);
2124       else if (parser->object_scope
2125                && !CLASS_TYPE_P (parser->object_scope))
2126         error_at (location, "request for member %qE in non-class type %qT",
2127                   name, parser->object_scope);
2128       else if (parser->object_scope)
2129         error_at (location, "%<%T::%E%> has not been declared",
2130                   parser->object_scope, name);
2131       else
2132         error_at (location, "%qE has not been declared", name);
2133     }
2134   else if (parser->scope && parser->scope != global_namespace)
2135     {
2136       switch (desired)
2137         {
2138           case NLE_TYPE:
2139             error_at (location, "%<%E::%E%> is not a type",
2140                                 parser->scope, name);
2141             break;
2142           case NLE_CXX98:
2143             error_at (location, "%<%E::%E%> is not a class or namespace",
2144                                 parser->scope, name);
2145             break;
2146           case NLE_NOT_CXX98:
2147             error_at (location,
2148                       "%<%E::%E%> is not a class, namespace, or enumeration",
2149                       parser->scope, name);
2150             break;
2151           default:
2152             gcc_unreachable ();
2153             
2154         }
2155     }
2156   else if (parser->scope == global_namespace)
2157     {
2158       switch (desired)
2159         {
2160           case NLE_TYPE:
2161             error_at (location, "%<::%E%> is not a type", name);
2162             break;
2163           case NLE_CXX98:
2164             error_at (location, "%<::%E%> is not a class or namespace", name);
2165             break;
2166           case NLE_NOT_CXX98:
2167             error_at (location,
2168                       "%<::%E%> is not a class, namespace, or enumeration",
2169                       name);
2170             break;
2171           default:
2172             gcc_unreachable ();
2173         }
2174     }
2175   else
2176     {
2177       switch (desired)
2178         {
2179           case NLE_TYPE:
2180             error_at (location, "%qE is not a type", name);
2181             break;
2182           case NLE_CXX98:
2183             error_at (location, "%qE is not a class or namespace", name);
2184             break;
2185           case NLE_NOT_CXX98:
2186             error_at (location,
2187                       "%qE is not a class, namespace, or enumeration", name);
2188             break;
2189           default:
2190             gcc_unreachable ();
2191         }
2192     }
2193 }
2194
2195 /* If we are parsing tentatively, remember that an error has occurred
2196    during this tentative parse.  Returns true if the error was
2197    simulated; false if a message should be issued by the caller.  */
2198
2199 static bool
2200 cp_parser_simulate_error (cp_parser* parser)
2201 {
2202   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2203     {
2204       parser->context->status = CP_PARSER_STATUS_KIND_ERROR;
2205       return true;
2206     }
2207   return false;
2208 }
2209
2210 /* Check for repeated decl-specifiers.  */
2211
2212 static void
2213 cp_parser_check_decl_spec (cp_decl_specifier_seq *decl_specs,
2214                            location_t location)
2215 {
2216   int ds;
2217
2218   for (ds = ds_first; ds != ds_last; ++ds)
2219     {
2220       unsigned count = decl_specs->specs[ds];
2221       if (count < 2)
2222         continue;
2223       /* The "long" specifier is a special case because of "long long".  */
2224       if (ds == ds_long)
2225         {
2226           if (count > 2)
2227             error_at (location, "%<long long long%> is too long for GCC");
2228           else 
2229             pedwarn_cxx98 (location, OPT_Wlong_long, 
2230                            "ISO C++ 1998 does not support %<long long%>");
2231         }
2232       else if (count > 1)
2233         {
2234           static const char *const decl_spec_names[] = {
2235             "signed",
2236             "unsigned",
2237             "short",
2238             "long",
2239             "const",
2240             "volatile",
2241             "restrict",
2242             "inline",
2243             "virtual",
2244             "explicit",
2245             "friend",
2246             "typedef",
2247             "constexpr",
2248             "__complex",
2249             "__thread"
2250           };
2251           error_at (location, "duplicate %qs", decl_spec_names[ds]);
2252         }
2253     }
2254 }
2255
2256 /* This function is called when a type is defined.  If type
2257    definitions are forbidden at this point, an error message is
2258    issued.  */
2259
2260 static bool
2261 cp_parser_check_type_definition (cp_parser* parser)
2262 {
2263   /* If types are forbidden here, issue a message.  */
2264   if (parser->type_definition_forbidden_message)
2265     {
2266       /* Don't use `%s' to print the string, because quotations (`%<', `%>')
2267          in the message need to be interpreted.  */
2268       error (parser->type_definition_forbidden_message);
2269       return false;
2270     }
2271   return true;
2272 }
2273
2274 /* This function is called when the DECLARATOR is processed.  The TYPE
2275    was a type defined in the decl-specifiers.  If it is invalid to
2276    define a type in the decl-specifiers for DECLARATOR, an error is
2277    issued. TYPE_LOCATION is the location of TYPE and is used
2278    for error reporting.  */
2279
2280 static void
2281 cp_parser_check_for_definition_in_return_type (cp_declarator *declarator,
2282                                                tree type, location_t type_location)
2283 {
2284   /* [dcl.fct] forbids type definitions in return types.
2285      Unfortunately, it's not easy to know whether or not we are
2286      processing a return type until after the fact.  */
2287   while (declarator
2288          && (declarator->kind == cdk_pointer
2289              || declarator->kind == cdk_reference
2290              || declarator->kind == cdk_ptrmem))
2291     declarator = declarator->declarator;
2292   if (declarator
2293       && declarator->kind == cdk_function)
2294     {
2295       error_at (type_location,
2296                 "new types may not be defined in a return type");
2297       inform (type_location, 
2298               "(perhaps a semicolon is missing after the definition of %qT)",
2299               type);
2300     }
2301 }
2302
2303 /* A type-specifier (TYPE) has been parsed which cannot be followed by
2304    "<" in any valid C++ program.  If the next token is indeed "<",
2305    issue a message warning the user about what appears to be an
2306    invalid attempt to form a template-id. LOCATION is the location
2307    of the type-specifier (TYPE) */
2308
2309 static void
2310 cp_parser_check_for_invalid_template_id (cp_parser* parser,
2311                                          tree type, location_t location)
2312 {
2313   cp_token_position start = 0;
2314
2315   if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
2316     {
2317       if (TYPE_P (type))
2318         error_at (location, "%qT is not a template", type);
2319       else if (TREE_CODE (type) == IDENTIFIER_NODE)
2320         error_at (location, "%qE is not a template", type);
2321       else
2322         error_at (location, "invalid template-id");
2323       /* Remember the location of the invalid "<".  */
2324       if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2325         start = cp_lexer_token_position (parser->lexer, true);
2326       /* Consume the "<".  */
2327       cp_lexer_consume_token (parser->lexer);
2328       /* Parse the template arguments.  */
2329       cp_parser_enclosed_template_argument_list (parser);
2330       /* Permanently remove the invalid template arguments so that
2331          this error message is not issued again.  */
2332       if (start)
2333         cp_lexer_purge_tokens_after (parser->lexer, start);
2334     }
2335 }
2336
2337 /* If parsing an integral constant-expression, issue an error message
2338    about the fact that THING appeared and return true.  Otherwise,
2339    return false.  In either case, set
2340    PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P.  */
2341
2342 static bool
2343 cp_parser_non_integral_constant_expression (cp_parser  *parser,
2344                                             non_integral_constant thing)
2345 {
2346   parser->non_integral_constant_expression_p = true;
2347   if (parser->integral_constant_expression_p)
2348     {
2349       if (!parser->allow_non_integral_constant_expression_p)
2350         {
2351           const char *msg = NULL;
2352           switch (thing)
2353             {
2354               case NIC_FLOAT:
2355                 error ("floating-point literal "
2356                        "cannot appear in a constant-expression");
2357                 return true;
2358               case NIC_CAST:
2359                 error ("a cast to a type other than an integral or "
2360                        "enumeration type cannot appear in a "
2361                        "constant-expression");
2362                 return true;
2363               case NIC_TYPEID:
2364                 error ("%<typeid%> operator "
2365                        "cannot appear in a constant-expression");
2366                 return true;
2367               case NIC_NCC:
2368                 error ("non-constant compound literals "
2369                        "cannot appear in a constant-expression");
2370                 return true;
2371               case NIC_FUNC_CALL:
2372                 error ("a function call "
2373                        "cannot appear in a constant-expression");
2374                 return true;
2375               case NIC_INC:
2376                 error ("an increment "
2377                        "cannot appear in a constant-expression");
2378                 return true;
2379               case NIC_DEC:
2380                 error ("an decrement "
2381                        "cannot appear in a constant-expression");
2382                 return true;
2383               case NIC_ARRAY_REF:
2384                 error ("an array reference "
2385                        "cannot appear in a constant-expression");
2386                 return true;
2387               case NIC_ADDR_LABEL:
2388                 error ("the address of a label "
2389                        "cannot appear in a constant-expression");
2390                 return true;
2391               case NIC_OVERLOADED:
2392                 error ("calls to overloaded operators "
2393                        "cannot appear in a constant-expression");
2394                 return true;
2395               case NIC_ASSIGNMENT:
2396                 error ("an assignment cannot appear in a constant-expression");
2397                 return true;
2398               case NIC_COMMA:
2399                 error ("a comma operator "
2400                        "cannot appear in a constant-expression");
2401                 return true;
2402               case NIC_CONSTRUCTOR:
2403                 error ("a call to a constructor "
2404                        "cannot appear in a constant-expression");
2405                 return true;
2406               case NIC_THIS:
2407                 msg = "this";
2408                 break;
2409               case NIC_FUNC_NAME:
2410                 msg = "__FUNCTION__";
2411                 break;
2412               case NIC_PRETTY_FUNC:
2413                 msg = "__PRETTY_FUNCTION__";
2414                 break;
2415               case NIC_C99_FUNC:
2416                 msg = "__func__";
2417                 break;
2418               case NIC_VA_ARG:
2419                 msg = "va_arg";
2420                 break;
2421               case NIC_ARROW:
2422                 msg = "->";
2423                 break;
2424               case NIC_POINT:
2425                 msg = ".";
2426                 break;
2427               case NIC_STAR:
2428                 msg = "*";
2429                 break;
2430               case NIC_ADDR:
2431                 msg = "&";
2432                 break;
2433               case NIC_PREINCREMENT:
2434                 msg = "++";
2435                 break;
2436               case NIC_PREDECREMENT:
2437                 msg = "--";
2438                 break;
2439               case NIC_NEW:
2440                 msg = "new";
2441                 break;
2442               case NIC_DEL:
2443                 msg = "delete";
2444                 break;
2445               default:
2446                 gcc_unreachable ();
2447             }
2448           if (msg)
2449             error ("%qs cannot appear in a constant-expression", msg);
2450           return true;
2451         }
2452     }
2453   return false;
2454 }
2455
2456 /* Emit a diagnostic for an invalid type name.  SCOPE is the
2457    qualifying scope (or NULL, if none) for ID.  This function commits
2458    to the current active tentative parse, if any.  (Otherwise, the
2459    problematic construct might be encountered again later, resulting
2460    in duplicate error messages.) LOCATION is the location of ID.  */
2461
2462 static void
2463 cp_parser_diagnose_invalid_type_name (cp_parser *parser,
2464                                       tree scope, tree id,
2465                                       location_t location)
2466 {
2467   tree decl, old_scope;
2468   cp_parser_commit_to_tentative_parse (parser);
2469   /* Try to lookup the identifier.  */
2470   old_scope = parser->scope;
2471   parser->scope = scope;
2472   decl = cp_parser_lookup_name_simple (parser, id, location);
2473   parser->scope = old_scope;
2474   /* If the lookup found a template-name, it means that the user forgot
2475   to specify an argument list. Emit a useful error message.  */
2476   if (TREE_CODE (decl) == TEMPLATE_DECL)
2477     error_at (location,
2478               "invalid use of template-name %qE without an argument list",
2479               decl);
2480   else if (TREE_CODE (id) == BIT_NOT_EXPR)
2481     error_at (location, "invalid use of destructor %qD as a type", id);
2482   else if (TREE_CODE (decl) == TYPE_DECL)
2483     /* Something like 'unsigned A a;'  */
2484     error_at (location, "invalid combination of multiple type-specifiers");
2485   else if (!parser->scope)
2486     {
2487       /* Issue an error message.  */
2488       error_at (location, "%qE does not name a type", id);
2489       /* If we're in a template class, it's possible that the user was
2490          referring to a type from a base class.  For example:
2491
2492            template <typename T> struct A { typedef T X; };
2493            template <typename T> struct B : public A<T> { X x; };
2494
2495          The user should have said "typename A<T>::X".  */
2496       if (cxx_dialect < cxx0x && id == ridpointers[(int)RID_CONSTEXPR])
2497         inform (location, "C++0x %<constexpr%> only available with "
2498                 "-std=c++0x or -std=gnu++0x");
2499       else if (processing_template_decl && current_class_type
2500                && TYPE_BINFO (current_class_type))
2501         {
2502           tree b;
2503
2504           for (b = TREE_CHAIN (TYPE_BINFO (current_class_type));
2505                b;
2506                b = TREE_CHAIN (b))
2507             {
2508               tree base_type = BINFO_TYPE (b);
2509               if (CLASS_TYPE_P (base_type)
2510                   && dependent_type_p (base_type))
2511                 {
2512                   tree field;
2513                   /* Go from a particular instantiation of the
2514                      template (which will have an empty TYPE_FIELDs),
2515                      to the main version.  */
2516                   base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
2517                   for (field = TYPE_FIELDS (base_type);
2518                        field;
2519                        field = DECL_CHAIN (field))
2520                     if (TREE_CODE (field) == TYPE_DECL
2521                         && DECL_NAME (field) == id)
2522                       {
2523                         inform (location, 
2524                                 "(perhaps %<typename %T::%E%> was intended)",
2525                                 BINFO_TYPE (b), id);
2526                         break;
2527                       }
2528                   if (field)
2529                     break;
2530                 }
2531             }
2532         }
2533     }
2534   /* Here we diagnose qualified-ids where the scope is actually correct,
2535      but the identifier does not resolve to a valid type name.  */
2536   else if (parser->scope != error_mark_node)
2537     {
2538       if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
2539         error_at (location, "%qE in namespace %qE does not name a type",
2540                   id, parser->scope);
2541       else if (CLASS_TYPE_P (parser->scope)
2542                && constructor_name_p (id, parser->scope))
2543         {
2544           /* A<T>::A<T>() */
2545           error_at (location, "%<%T::%E%> names the constructor, not"
2546                     " the type", parser->scope, id);
2547           if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
2548             error_at (location, "and %qT has no template constructors",
2549                       parser->scope);
2550         }
2551       else if (TYPE_P (parser->scope)
2552                && dependent_scope_p (parser->scope))
2553         error_at (location, "need %<typename%> before %<%T::%E%> because "
2554                   "%qT is a dependent scope",
2555                   parser->scope, id, parser->scope);
2556       else if (TYPE_P (parser->scope))
2557         error_at (location, "%qE in %q#T does not name a type",
2558                   id, parser->scope);
2559       else
2560         gcc_unreachable ();
2561     }
2562 }
2563
2564 /* Check for a common situation where a type-name should be present,
2565    but is not, and issue a sensible error message.  Returns true if an
2566    invalid type-name was detected.
2567
2568    The situation handled by this function are variable declarations of the
2569    form `ID a', where `ID' is an id-expression and `a' is a plain identifier.
2570    Usually, `ID' should name a type, but if we got here it means that it
2571    does not. We try to emit the best possible error message depending on
2572    how exactly the id-expression looks like.  */
2573
2574 static bool
2575 cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
2576 {
2577   tree id;
2578   cp_token *token = cp_lexer_peek_token (parser->lexer);
2579
2580   /* Avoid duplicate error about ambiguous lookup.  */
2581   if (token->type == CPP_NESTED_NAME_SPECIFIER)
2582     {
2583       cp_token *next = cp_lexer_peek_nth_token (parser->lexer, 2);
2584       if (next->type == CPP_NAME && next->ambiguous_p)
2585         goto out;
2586     }
2587
2588   cp_parser_parse_tentatively (parser);
2589   id = cp_parser_id_expression (parser,
2590                                 /*template_keyword_p=*/false,
2591                                 /*check_dependency_p=*/true,
2592                                 /*template_p=*/NULL,
2593                                 /*declarator_p=*/true,
2594                                 /*optional_p=*/false);
2595   /* If the next token is a (, this is a function with no explicit return
2596      type, i.e. constructor, destructor or conversion op.  */
2597   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
2598       || TREE_CODE (id) == TYPE_DECL)
2599     {
2600       cp_parser_abort_tentative_parse (parser);
2601       return false;
2602     }
2603   if (!cp_parser_parse_definitely (parser))
2604     return false;
2605
2606   /* Emit a diagnostic for the invalid type.  */
2607   cp_parser_diagnose_invalid_type_name (parser, parser->scope,
2608                                         id, token->location);
2609  out:
2610   /* If we aren't in the middle of a declarator (i.e. in a
2611      parameter-declaration-clause), skip to the end of the declaration;
2612      there's no point in trying to process it.  */
2613   if (!parser->in_declarator_p)
2614     cp_parser_skip_to_end_of_block_or_statement (parser);
2615   return true;
2616 }
2617
2618 /* Consume tokens up to, and including, the next non-nested closing `)'.
2619    Returns 1 iff we found a closing `)'.  RECOVERING is true, if we
2620    are doing error recovery. Returns -1 if OR_COMMA is true and we
2621    found an unnested comma.  */
2622
2623 static int
2624 cp_parser_skip_to_closing_parenthesis (cp_parser *parser,
2625                                        bool recovering,
2626                                        bool or_comma,
2627                                        bool consume_paren)
2628 {
2629   unsigned paren_depth = 0;
2630   unsigned brace_depth = 0;
2631   unsigned square_depth = 0;
2632
2633   if (recovering && !or_comma
2634       && cp_parser_uncommitted_to_tentative_parse_p (parser))
2635     return 0;
2636
2637   while (true)
2638     {
2639       cp_token * token = cp_lexer_peek_token (parser->lexer);
2640
2641       switch (token->type)
2642         {
2643         case CPP_EOF:
2644         case CPP_PRAGMA_EOL:
2645           /* If we've run out of tokens, then there is no closing `)'.  */
2646           return 0;
2647
2648         /* This is good for lambda expression capture-lists.  */
2649         case CPP_OPEN_SQUARE:
2650           ++square_depth;
2651           break;
2652         case CPP_CLOSE_SQUARE:
2653           if (!square_depth--)
2654             return 0;
2655           break;
2656
2657         case CPP_SEMICOLON:
2658           /* This matches the processing in skip_to_end_of_statement.  */
2659           if (!brace_depth)
2660             return 0;
2661           break;
2662
2663         case CPP_OPEN_BRACE:
2664           ++brace_depth;
2665           break;
2666         case CPP_CLOSE_BRACE:
2667           if (!brace_depth--)
2668             return 0;
2669           break;
2670
2671         case CPP_COMMA:
2672           if (recovering && or_comma && !brace_depth && !paren_depth
2673               && !square_depth)
2674             return -1;
2675           break;
2676
2677         case CPP_OPEN_PAREN:
2678           if (!brace_depth)
2679             ++paren_depth;
2680           break;
2681
2682         case CPP_CLOSE_PAREN:
2683           if (!brace_depth && !paren_depth--)
2684             {
2685               if (consume_paren)
2686                 cp_lexer_consume_token (parser->lexer);
2687               return 1;
2688             }
2689           break;
2690
2691         default:
2692           break;
2693         }
2694
2695       /* Consume the token.  */
2696       cp_lexer_consume_token (parser->lexer);
2697     }
2698 }
2699
2700 /* Consume tokens until we reach the end of the current statement.
2701    Normally, that will be just before consuming a `;'.  However, if a
2702    non-nested `}' comes first, then we stop before consuming that.  */
2703
2704 static void
2705 cp_parser_skip_to_end_of_statement (cp_parser* parser)
2706 {
2707   unsigned nesting_depth = 0;
2708
2709   while (true)
2710     {
2711       cp_token *token = cp_lexer_peek_token (parser->lexer);
2712
2713       switch (token->type)
2714         {
2715         case CPP_EOF:
2716         case CPP_PRAGMA_EOL:
2717           /* If we've run out of tokens, stop.  */
2718           return;
2719
2720         case CPP_SEMICOLON:
2721           /* If the next token is a `;', we have reached the end of the
2722              statement.  */
2723           if (!nesting_depth)
2724             return;
2725           break;
2726
2727         case CPP_CLOSE_BRACE:
2728           /* If this is a non-nested '}', stop before consuming it.
2729              That way, when confronted with something like:
2730
2731                { 3 + }
2732
2733              we stop before consuming the closing '}', even though we
2734              have not yet reached a `;'.  */
2735           if (nesting_depth == 0)
2736             return;
2737
2738           /* If it is the closing '}' for a block that we have
2739              scanned, stop -- but only after consuming the token.
2740              That way given:
2741
2742                 void f g () { ... }
2743                 typedef int I;
2744
2745              we will stop after the body of the erroneously declared
2746              function, but before consuming the following `typedef'
2747              declaration.  */
2748           if (--nesting_depth == 0)
2749             {
2750               cp_lexer_consume_token (parser->lexer);
2751               return;
2752             }
2753
2754         case CPP_OPEN_BRACE:
2755           ++nesting_depth;
2756           break;
2757
2758         default:
2759           break;
2760         }
2761
2762       /* Consume the token.  */
2763       cp_lexer_consume_token (parser->lexer);
2764     }
2765 }
2766
2767 /* This function is called at the end of a statement or declaration.
2768    If the next token is a semicolon, it is consumed; otherwise, error
2769    recovery is attempted.  */
2770
2771 static void
2772 cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
2773 {
2774   /* Look for the trailing `;'.  */
2775   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
2776     {
2777       /* If there is additional (erroneous) input, skip to the end of
2778          the statement.  */
2779       cp_parser_skip_to_end_of_statement (parser);
2780       /* If the next token is now a `;', consume it.  */
2781       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
2782         cp_lexer_consume_token (parser->lexer);
2783     }
2784 }
2785
2786 /* Skip tokens until we have consumed an entire block, or until we
2787    have consumed a non-nested `;'.  */
2788
2789 static void
2790 cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
2791 {
2792   int nesting_depth = 0;
2793
2794   while (nesting_depth >= 0)
2795     {
2796       cp_token *token = cp_lexer_peek_token (parser->lexer);
2797
2798       switch (token->type)
2799         {
2800         case CPP_EOF:
2801         case CPP_PRAGMA_EOL:
2802           /* If we've run out of tokens, stop.  */
2803           return;
2804
2805         case CPP_SEMICOLON:
2806           /* Stop if this is an unnested ';'. */
2807           if (!nesting_depth)
2808             nesting_depth = -1;
2809           break;
2810
2811         case CPP_CLOSE_BRACE:
2812           /* Stop if this is an unnested '}', or closes the outermost
2813              nesting level.  */
2814           nesting_depth--;
2815           if (nesting_depth < 0)
2816             return;
2817           if (!nesting_depth)
2818             nesting_depth = -1;
2819           break;
2820
2821         case CPP_OPEN_BRACE:
2822           /* Nest. */
2823           nesting_depth++;
2824           break;
2825
2826         default:
2827           break;
2828         }
2829
2830       /* Consume the token.  */
2831       cp_lexer_consume_token (parser->lexer);
2832     }
2833 }
2834
2835 /* Skip tokens until a non-nested closing curly brace is the next
2836    token, or there are no more tokens. Return true in the first case,
2837    false otherwise.  */
2838
2839 static bool
2840 cp_parser_skip_to_closing_brace (cp_parser *parser)
2841 {
2842   unsigned nesting_depth = 0;
2843
2844   while (true)
2845     {
2846       cp_token *token = cp_lexer_peek_token (parser->lexer);
2847
2848       switch (token->type)
2849         {
2850         case CPP_EOF:
2851         case CPP_PRAGMA_EOL:
2852           /* If we've run out of tokens, stop.  */
2853           return false;
2854
2855         case CPP_CLOSE_BRACE:
2856           /* If the next token is a non-nested `}', then we have reached
2857              the end of the current block.  */
2858           if (nesting_depth-- == 0)
2859             return true;
2860           break;
2861
2862         case CPP_OPEN_BRACE:
2863           /* If it the next token is a `{', then we are entering a new
2864              block.  Consume the entire block.  */
2865           ++nesting_depth;
2866           break;
2867
2868         default:
2869           break;
2870         }
2871
2872       /* Consume the token.  */
2873       cp_lexer_consume_token (parser->lexer);
2874     }
2875 }
2876
2877 /* Consume tokens until we reach the end of the pragma.  The PRAGMA_TOK
2878    parameter is the PRAGMA token, allowing us to purge the entire pragma
2879    sequence.  */
2880
2881 static void
2882 cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
2883 {
2884   cp_token *token;
2885
2886   parser->lexer->in_pragma = false;
2887
2888   do
2889     token = cp_lexer_consume_token (parser->lexer);
2890   while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
2891
2892   /* Ensure that the pragma is not parsed again.  */
2893   cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
2894 }
2895
2896 /* Require pragma end of line, resyncing with it as necessary.  The
2897    arguments are as for cp_parser_skip_to_pragma_eol.  */
2898
2899 static void
2900 cp_parser_require_pragma_eol (cp_parser *parser, cp_token *pragma_tok)
2901 {
2902   parser->lexer->in_pragma = false;
2903   if (!cp_parser_require (parser, CPP_PRAGMA_EOL, RT_PRAGMA_EOL))
2904     cp_parser_skip_to_pragma_eol (parser, pragma_tok);
2905 }
2906
2907 /* This is a simple wrapper around make_typename_type. When the id is
2908    an unresolved identifier node, we can provide a superior diagnostic
2909    using cp_parser_diagnose_invalid_type_name.  */
2910
2911 static tree
2912 cp_parser_make_typename_type (cp_parser *parser, tree scope,
2913                               tree id, location_t id_location)
2914 {
2915   tree result;
2916   if (TREE_CODE (id) == IDENTIFIER_NODE)
2917     {
2918       result = make_typename_type (scope, id, typename_type,
2919                                    /*complain=*/tf_none);
2920       if (result == error_mark_node)
2921         cp_parser_diagnose_invalid_type_name (parser, scope, id, id_location);
2922       return result;
2923     }
2924   return make_typename_type (scope, id, typename_type, tf_error);
2925 }
2926
2927 /* This is a wrapper around the
2928    make_{pointer,ptrmem,reference}_declarator functions that decides
2929    which one to call based on the CODE and CLASS_TYPE arguments. The
2930    CODE argument should be one of the values returned by
2931    cp_parser_ptr_operator. */
2932 static cp_declarator *
2933 cp_parser_make_indirect_declarator (enum tree_code code, tree class_type,
2934                                     cp_cv_quals cv_qualifiers,
2935                                     cp_declarator *target)
2936 {
2937   if (code == ERROR_MARK)
2938     return cp_error_declarator;
2939
2940   if (code == INDIRECT_REF)
2941     if (class_type == NULL_TREE)
2942       return make_pointer_declarator (cv_qualifiers, target);
2943     else
2944       return make_ptrmem_declarator (cv_qualifiers, class_type, target);
2945   else if (code == ADDR_EXPR && class_type == NULL_TREE)
2946     return make_reference_declarator (cv_qualifiers, target, false);
2947   else if (code == NON_LVALUE_EXPR && class_type == NULL_TREE)
2948     return make_reference_declarator (cv_qualifiers, target, true);
2949   gcc_unreachable ();
2950 }
2951
2952 /* Create a new C++ parser.  */
2953
2954 static cp_parser *
2955 cp_parser_new (void)
2956 {
2957   cp_parser *parser;
2958   cp_lexer *lexer;
2959   unsigned i;
2960
2961   /* cp_lexer_new_main is called before doing GC allocation because
2962      cp_lexer_new_main might load a PCH file.  */
2963   lexer = cp_lexer_new_main ();
2964
2965   /* Initialize the binops_by_token so that we can get the tree
2966      directly from the token.  */
2967   for (i = 0; i < sizeof (binops) / sizeof (binops[0]); i++)
2968     binops_by_token[binops[i].token_type] = binops[i];
2969
2970   parser = ggc_alloc_cleared_cp_parser ();
2971   parser->lexer = lexer;
2972   parser->context = cp_parser_context_new (NULL);
2973
2974   /* For now, we always accept GNU extensions.  */
2975   parser->allow_gnu_extensions_p = 1;
2976
2977   /* The `>' token is a greater-than operator, not the end of a
2978      template-id.  */
2979   parser->greater_than_is_operator_p = true;
2980
2981   parser->default_arg_ok_p = true;
2982
2983   /* We are not parsing a constant-expression.  */
2984   parser->integral_constant_expression_p = false;
2985   parser->allow_non_integral_constant_expression_p = false;
2986   parser->non_integral_constant_expression_p = false;
2987
2988   /* Local variable names are not forbidden.  */
2989   parser->local_variables_forbidden_p = false;
2990
2991   /* We are not processing an `extern "C"' declaration.  */
2992   parser->in_unbraced_linkage_specification_p = false;
2993
2994   /* We are not processing a declarator.  */
2995   parser->in_declarator_p = false;
2996
2997   /* We are not processing a template-argument-list.  */
2998   parser->in_template_argument_list_p = false;
2999
3000   /* We are not in an iteration statement.  */
3001   parser->in_statement = 0;
3002
3003   /* We are not in a switch statement.  */
3004   parser->in_switch_statement_p = false;
3005
3006   /* We are not parsing a type-id inside an expression.  */
3007   parser->in_type_id_in_expr_p = false;
3008
3009   /* Declarations aren't implicitly extern "C".  */
3010   parser->implicit_extern_c = false;
3011
3012   /* String literals should be translated to the execution character set.  */
3013   parser->translate_strings_p = true;
3014
3015   /* We are not parsing a function body.  */
3016   parser->in_function_body = false;
3017
3018   /* We can correct until told otherwise.  */
3019   parser->colon_corrects_to_scope_p = true;
3020
3021   /* The unparsed function queue is empty.  */
3022   push_unparsed_function_queues (parser);
3023
3024   /* There are no classes being defined.  */
3025   parser->num_classes_being_defined = 0;
3026
3027   /* No template parameters apply.  */
3028   parser->num_template_parameter_lists = 0;
3029
3030   return parser;
3031 }
3032
3033 /* Create a cp_lexer structure which will emit the tokens in CACHE
3034    and push it onto the parser's lexer stack.  This is used for delayed
3035    parsing of in-class method bodies and default arguments, and should
3036    not be confused with tentative parsing.  */
3037 static void
3038 cp_parser_push_lexer_for_tokens (cp_parser *parser, cp_token_cache *cache)
3039 {
3040   cp_lexer *lexer = cp_lexer_new_from_tokens (cache);
3041   lexer->next = parser->lexer;
3042   parser->lexer = lexer;
3043
3044   /* Move the current source position to that of the first token in the
3045      new lexer.  */
3046   cp_lexer_set_source_position_from_token (lexer->next_token);
3047 }
3048
3049 /* Pop the top lexer off the parser stack.  This is never used for the
3050    "main" lexer, only for those pushed by cp_parser_push_lexer_for_tokens.  */
3051 static void
3052 cp_parser_pop_lexer (cp_parser *parser)
3053 {
3054   cp_lexer *lexer = parser->lexer;
3055   parser->lexer = lexer->next;
3056   cp_lexer_destroy (lexer);
3057
3058   /* Put the current source position back where it was before this
3059      lexer was pushed.  */
3060   cp_lexer_set_source_position_from_token (parser->lexer->next_token);
3061 }
3062
3063 /* Lexical conventions [gram.lex]  */
3064
3065 /* Parse an identifier.  Returns an IDENTIFIER_NODE representing the
3066    identifier.  */
3067
3068 static tree
3069 cp_parser_identifier (cp_parser* parser)
3070 {
3071   cp_token *token;
3072
3073   /* Look for the identifier.  */
3074   token = cp_parser_require (parser, CPP_NAME, RT_NAME);
3075   /* Return the value.  */
3076   return token ? token->u.value : error_mark_node;
3077 }
3078
3079 /* Parse a sequence of adjacent string constants.  Returns a
3080    TREE_STRING representing the combined, nul-terminated string
3081    constant.  If TRANSLATE is true, translate the string to the
3082    execution character set.  If WIDE_OK is true, a wide string is
3083    invalid here.
3084
3085    C++98 [lex.string] says that if a narrow string literal token is
3086    adjacent to a wide string literal token, the behavior is undefined.
3087    However, C99 6.4.5p4 says that this results in a wide string literal.
3088    We follow C99 here, for consistency with the C front end.
3089
3090    This code is largely lifted from lex_string() in c-lex.c.
3091
3092    FUTURE: ObjC++ will need to handle @-strings here.  */
3093 static tree
3094 cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok)
3095 {
3096   tree value;
3097   size_t count;
3098   struct obstack str_ob;
3099   cpp_string str, istr, *strs;
3100   cp_token *tok;
3101   enum cpp_ttype type;
3102
3103   tok = cp_lexer_peek_token (parser->lexer);
3104   if (!cp_parser_is_string_literal (tok))
3105     {
3106       cp_parser_error (parser, "expected string-literal");
3107       return error_mark_node;
3108     }
3109
3110   type = tok->type;
3111
3112   /* Try to avoid the overhead of creating and destroying an obstack
3113      for the common case of just one string.  */
3114   if (!cp_parser_is_string_literal
3115       (cp_lexer_peek_nth_token (parser->lexer, 2)))
3116     {
3117       cp_lexer_consume_token (parser->lexer);
3118
3119       str.text = (const unsigned char *)TREE_STRING_POINTER (tok->u.value);
3120       str.len = TREE_STRING_LENGTH (tok->u.value);
3121       count = 1;
3122
3123       strs = &str;
3124     }
3125   else
3126     {
3127       gcc_obstack_init (&str_ob);
3128       count = 0;
3129
3130       do
3131         {
3132           cp_lexer_consume_token (parser->lexer);
3133           count++;
3134           str.text = (const unsigned char *)TREE_STRING_POINTER (tok->u.value);
3135           str.len = TREE_STRING_LENGTH (tok->u.value);
3136
3137           if (type != tok->type)
3138             {
3139               if (type == CPP_STRING)
3140                 type = tok->type;
3141               else if (tok->type != CPP_STRING)
3142                 error_at (tok->location,
3143                           "unsupported non-standard concatenation "
3144                           "of string literals");
3145             }
3146
3147           obstack_grow (&str_ob, &str, sizeof (cpp_string));
3148
3149           tok = cp_lexer_peek_token (parser->lexer);
3150         }
3151       while (cp_parser_is_string_literal (tok));
3152
3153       strs = (cpp_string *) obstack_finish (&str_ob);
3154     }
3155
3156   if (type != CPP_STRING && !wide_ok)
3157     {
3158       cp_parser_error (parser, "a wide string is invalid in this context");
3159       type = CPP_STRING;
3160     }
3161
3162   if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate)
3163       (parse_in, strs, count, &istr, type))
3164     {
3165       value = build_string (istr.len, (const char *)istr.text);
3166       free (CONST_CAST (unsigned char *, istr.text));
3167
3168       switch (type)
3169         {
3170         default:
3171         case CPP_STRING:
3172         case CPP_UTF8STRING:
3173           TREE_TYPE (value) = char_array_type_node;
3174           break;
3175         case CPP_STRING16:
3176           TREE_TYPE (value) = char16_array_type_node;
3177           break;
3178         case CPP_STRING32:
3179           TREE_TYPE (value) = char32_array_type_node;
3180           break;
3181         case CPP_WSTRING:
3182           TREE_TYPE (value) = wchar_array_type_node;
3183           break;
3184         }
3185
3186       value = fix_string_type (value);
3187     }
3188   else
3189     /* cpp_interpret_string has issued an error.  */
3190     value = error_mark_node;
3191
3192   if (count > 1)
3193     obstack_free (&str_ob, 0);
3194
3195   return value;
3196 }
3197
3198
3199 /* Basic concepts [gram.basic]  */
3200
3201 /* Parse a translation-unit.
3202
3203    translation-unit:
3204      declaration-seq [opt]
3205
3206    Returns TRUE if all went well.  */
3207
3208 static bool
3209 cp_parser_translation_unit (cp_parser* parser)
3210 {
3211   /* The address of the first non-permanent object on the declarator
3212      obstack.  */
3213   static void *declarator_obstack_base;
3214
3215   bool success;
3216
3217   /* Create the declarator obstack, if necessary.  */
3218   if (!cp_error_declarator)
3219     {
3220       gcc_obstack_init (&declarator_obstack);
3221       /* Create the error declarator.  */
3222       cp_error_declarator = make_declarator (cdk_error);
3223       /* Create the empty parameter list.  */
3224       no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE);
3225       /* Remember where the base of the declarator obstack lies.  */
3226       declarator_obstack_base = obstack_next_free (&declarator_obstack);
3227     }
3228
3229   cp_parser_declaration_seq_opt (parser);
3230
3231   /* If there are no tokens left then all went well.  */
3232   if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
3233     {
3234       /* Get rid of the token array; we don't need it any more.  */
3235       cp_lexer_destroy (parser->lexer);
3236       parser->lexer = NULL;
3237
3238       /* This file might have been a context that's implicitly extern
3239          "C".  If so, pop the lang context.  (Only relevant for PCH.) */
3240       if (parser->implicit_extern_c)
3241         {
3242           pop_lang_context ();
3243           parser->implicit_extern_c = false;
3244         }
3245
3246       /* Finish up.  */
3247       finish_translation_unit ();
3248
3249       success = true;
3250     }
3251   else
3252     {
3253       cp_parser_error (parser, "expected declaration");
3254       success = false;
3255     }
3256
3257   /* Make sure the declarator obstack was fully cleaned up.  */
3258   gcc_assert (obstack_next_free (&declarator_obstack)
3259               == declarator_obstack_base);
3260
3261   /* All went well.  */
3262   return success;
3263 }
3264
3265 /* Expressions [gram.expr] */
3266
3267 /* Parse a primary-expression.
3268
3269    primary-expression:
3270      literal
3271      this
3272      ( expression )
3273      id-expression
3274
3275    GNU Extensions:
3276
3277    primary-expression:
3278      ( compound-statement )
3279      __builtin_va_arg ( assignment-expression , type-id )
3280      __builtin_offsetof ( type-id , offsetof-expression )
3281
3282    C++ Extensions:
3283      __has_nothrow_assign ( type-id )   
3284      __has_nothrow_constructor ( type-id )
3285      __has_nothrow_copy ( type-id )
3286      __has_trivial_assign ( type-id )   
3287      __has_trivial_constructor ( type-id )
3288      __has_trivial_copy ( type-id )
3289      __has_trivial_destructor ( type-id )
3290      __has_virtual_destructor ( type-id )     
3291      __is_abstract ( type-id )
3292      __is_base_of ( type-id , type-id )
3293      __is_class ( type-id )
3294      __is_convertible_to ( type-id , type-id )     
3295      __is_empty ( type-id )
3296      __is_enum ( type-id )
3297      __is_literal_type ( type-id )
3298      __is_pod ( type-id )
3299      __is_polymorphic ( type-id )
3300      __is_std_layout ( type-id )
3301      __is_trivial ( type-id )
3302      __is_union ( type-id )
3303
3304    Objective-C++ Extension:
3305
3306    primary-expression:
3307      objc-expression
3308
3309    literal:
3310      __null
3311
3312    ADDRESS_P is true iff this expression was immediately preceded by
3313    "&" and therefore might denote a pointer-to-member.  CAST_P is true
3314    iff this expression is the target of a cast.  TEMPLATE_ARG_P is
3315    true iff this expression is a template argument.
3316
3317    Returns a representation of the expression.  Upon return, *IDK
3318    indicates what kind of id-expression (if any) was present.  */
3319
3320 static tree
3321 cp_parser_primary_expression (cp_parser *parser,
3322                               bool address_p,
3323                               bool cast_p,
3324                               bool template_arg_p,
3325                               cp_id_kind *idk)
3326 {
3327   cp_token *token = NULL;
3328
3329   /* Assume the primary expression is not an id-expression.  */
3330   *idk = CP_ID_KIND_NONE;
3331
3332   /* Peek at the next token.  */
3333   token = cp_lexer_peek_token (parser->lexer);
3334   switch (token->type)
3335     {
3336       /* literal:
3337            integer-literal
3338            character-literal
3339            floating-literal
3340            string-literal
3341            boolean-literal  */
3342     case CPP_CHAR:
3343     case CPP_CHAR16:
3344     case CPP_CHAR32:
3345     case CPP_WCHAR:
3346     case CPP_NUMBER:
3347       token = cp_lexer_consume_token (parser->lexer);
3348       if (TREE_CODE (token->u.value) == FIXED_CST)
3349         {
3350           error_at (token->location,
3351                     "fixed-point types not supported in C++");
3352           return error_mark_node;
3353         }
3354       /* Floating-point literals are only allowed in an integral
3355          constant expression if they are cast to an integral or
3356          enumeration type.  */
3357       if (TREE_CODE (token->u.value) == REAL_CST
3358           && parser->integral_constant_expression_p
3359           && pedantic)
3360         {
3361           /* CAST_P will be set even in invalid code like "int(2.7 +
3362              ...)".   Therefore, we have to check that the next token
3363              is sure to end the cast.  */
3364           if (cast_p)
3365             {
3366               cp_token *next_token;
3367
3368               next_token = cp_lexer_peek_token (parser->lexer);
3369               if (/* The comma at the end of an
3370                      enumerator-definition.  */
3371                   next_token->type != CPP_COMMA
3372                   /* The curly brace at the end of an enum-specifier.  */
3373                   && next_token->type != CPP_CLOSE_BRACE
3374                   /* The end of a statement.  */
3375                   && next_token->type != CPP_SEMICOLON
3376                   /* The end of the cast-expression.  */
3377                   && next_token->type != CPP_CLOSE_PAREN
3378                   /* The end of an array bound.  */
3379                   && next_token->type != CPP_CLOSE_SQUARE
3380                   /* The closing ">" in a template-argument-list.  */
3381                   && (next_token->type != CPP_GREATER
3382                       || parser->greater_than_is_operator_p)
3383                   /* C++0x only: A ">>" treated like two ">" tokens,
3384                      in a template-argument-list.  */
3385                   && (next_token->type != CPP_RSHIFT
3386                       || (cxx_dialect == cxx98)
3387                       || parser->greater_than_is_operator_p))
3388                 cast_p = false;
3389             }
3390
3391           /* If we are within a cast, then the constraint that the
3392              cast is to an integral or enumeration type will be
3393              checked at that point.  If we are not within a cast, then
3394              this code is invalid.  */
3395           if (!cast_p)
3396             cp_parser_non_integral_constant_expression (parser, NIC_FLOAT);
3397         }
3398       return token->u.value;
3399
3400     case CPP_STRING:
3401     case CPP_STRING16:
3402     case CPP_STRING32:
3403     case CPP_WSTRING:
3404     case CPP_UTF8STRING:
3405       /* ??? Should wide strings be allowed when parser->translate_strings_p
3406          is false (i.e. in attributes)?  If not, we can kill the third
3407          argument to cp_parser_string_literal.  */
3408       return cp_parser_string_literal (parser,
3409                                        parser->translate_strings_p,
3410                                        true);
3411
3412     case CPP_OPEN_PAREN:
3413       {
3414         tree expr;
3415         bool saved_greater_than_is_operator_p;
3416
3417         /* Consume the `('.  */
3418         cp_lexer_consume_token (parser->lexer);
3419         /* Within a parenthesized expression, a `>' token is always
3420            the greater-than operator.  */
3421         saved_greater_than_is_operator_p
3422           = parser->greater_than_is_operator_p;
3423         parser->greater_than_is_operator_p = true;
3424         /* If we see `( { ' then we are looking at the beginning of
3425            a GNU statement-expression.  */
3426         if (cp_parser_allow_gnu_extensions_p (parser)
3427             && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
3428           {
3429             /* Statement-expressions are not allowed by the standard.  */
3430             pedwarn (token->location, OPT_pedantic, 
3431                      "ISO C++ forbids braced-groups within expressions");
3432
3433             /* And they're not allowed outside of a function-body; you
3434                cannot, for example, write:
3435
3436                  int i = ({ int j = 3; j + 1; });
3437
3438                at class or namespace scope.  */
3439             if (!parser->in_function_body
3440                 || parser->in_template_argument_list_p)
3441               {
3442                 error_at (token->location,
3443                           "statement-expressions are not allowed outside "
3444                           "functions nor in template-argument lists");
3445                 cp_parser_skip_to_end_of_block_or_statement (parser);
3446                 expr = error_mark_node;
3447               }
3448             else
3449               {
3450                 /* Start the statement-expression.  */
3451                 expr = begin_stmt_expr ();
3452                 /* Parse the compound-statement.  */
3453                 cp_parser_compound_statement (parser, expr, false, false);
3454                 /* Finish up.  */
3455                 expr = finish_stmt_expr (expr, false);
3456               }
3457           }
3458         else
3459           {
3460             /* Parse the parenthesized expression.  */
3461             expr = cp_parser_expression (parser, cast_p, idk);
3462             /* Let the front end know that this expression was
3463                enclosed in parentheses. This matters in case, for
3464                example, the expression is of the form `A::B', since
3465                `&A::B' might be a pointer-to-member, but `&(A::B)' is
3466                not.  */
3467             finish_parenthesized_expr (expr);
3468             /* DR 705: Wrapping an unqualified name in parentheses
3469                suppresses arg-dependent lookup.  We want to pass back
3470                CP_ID_KIND_QUALIFIED for suppressing vtable lookup
3471                (c++/37862), but none of the others.  */
3472             if (*idk != CP_ID_KIND_QUALIFIED)
3473               *idk = CP_ID_KIND_NONE;
3474           }
3475         /* The `>' token might be the end of a template-id or
3476            template-parameter-list now.  */
3477         parser->greater_than_is_operator_p
3478           = saved_greater_than_is_operator_p;
3479         /* Consume the `)'.  */
3480         if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
3481           cp_parser_skip_to_end_of_statement (parser);
3482
3483         return expr;
3484       }
3485
3486     case CPP_OPEN_SQUARE:
3487       if (c_dialect_objc ())
3488         /* We have an Objective-C++ message. */
3489         return cp_parser_objc_expression (parser);
3490       {
3491         tree lam = cp_parser_lambda_expression (parser);
3492         /* Don't warn about a failed tentative parse.  */
3493         if (cp_parser_error_occurred (parser))
3494           return error_mark_node;
3495         maybe_warn_cpp0x (CPP0X_LAMBDA_EXPR);
3496         return lam;
3497       }
3498
3499     case CPP_OBJC_STRING:
3500       if (c_dialect_objc ())
3501         /* We have an Objective-C++ string literal. */
3502         return cp_parser_objc_expression (parser);
3503       cp_parser_error (parser, "expected primary-expression");
3504       return error_mark_node;
3505
3506     case CPP_KEYWORD:
3507       switch (token->keyword)
3508         {
3509           /* These two are the boolean literals.  */
3510         case RID_TRUE:
3511           cp_lexer_consume_token (parser->lexer);
3512           return boolean_true_node;
3513         case RID_FALSE:
3514           cp_lexer_consume_token (parser->lexer);
3515           return boolean_false_node;
3516
3517           /* The `__null' literal.  */
3518         case RID_NULL:
3519           cp_lexer_consume_token (parser->lexer);
3520           return null_node;
3521
3522           /* The `nullptr' literal.  */
3523         case RID_NULLPTR:
3524           cp_lexer_consume_token (parser->lexer);
3525           return nullptr_node;
3526
3527           /* Recognize the `this' keyword.  */
3528         case RID_THIS:
3529           cp_lexer_consume_token (parser->lexer);
3530           if (parser->local_variables_forbidden_p)
3531             {
3532               error_at (token->location,
3533                         "%<this%> may not be used in this context");
3534               return error_mark_node;
3535             }
3536           /* Pointers cannot appear in constant-expressions.  */
3537           if (cp_parser_non_integral_constant_expression (parser, NIC_THIS))
3538             return error_mark_node;
3539           return finish_this_expr ();
3540
3541           /* The `operator' keyword can be the beginning of an
3542              id-expression.  */
3543         case RID_OPERATOR:
3544           goto id_expression;
3545
3546         case RID_FUNCTION_NAME:
3547         case RID_PRETTY_FUNCTION_NAME:
3548         case RID_C99_FUNCTION_NAME:
3549           {
3550             non_integral_constant name;
3551
3552             /* The symbols __FUNCTION__, __PRETTY_FUNCTION__, and
3553                __func__ are the names of variables -- but they are
3554                treated specially.  Therefore, they are handled here,
3555                rather than relying on the generic id-expression logic
3556                below.  Grammatically, these names are id-expressions.
3557
3558                Consume the token.  */
3559             token = cp_lexer_consume_token (parser->lexer);
3560
3561             switch (token->keyword)
3562               {
3563               case RID_FUNCTION_NAME:
3564                 name = NIC_FUNC_NAME;
3565                 break;
3566               case RID_PRETTY_FUNCTION_NAME:
3567                 name = NIC_PRETTY_FUNC;
3568                 break;
3569               case RID_C99_FUNCTION_NAME:
3570                 name = NIC_C99_FUNC;
3571                 break;
3572               default:
3573                 gcc_unreachable ();
3574               }
3575
3576             if (cp_parser_non_integral_constant_expression (parser, name))
3577               return error_mark_node;
3578
3579             /* Look up the name.  */
3580             return finish_fname (token->u.value);
3581           }
3582
3583         case RID_VA_ARG:
3584           {
3585             tree expression;
3586             tree type;
3587
3588             /* The `__builtin_va_arg' construct is used to handle
3589                `va_arg'.  Consume the `__builtin_va_arg' token.  */
3590             cp_lexer_consume_token (parser->lexer);
3591             /* Look for the opening `('.  */
3592             cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
3593             /* Now, parse the assignment-expression.  */
3594             expression = cp_parser_assignment_expression (parser,
3595                                                           /*cast_p=*/false, NULL);
3596             /* Look for the `,'.  */
3597             cp_parser_require (parser, CPP_COMMA, RT_COMMA);
3598             /* Parse the type-id.  */
3599             type = cp_parser_type_id (parser);
3600             /* Look for the closing `)'.  */
3601             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
3602             /* Using `va_arg' in a constant-expression is not
3603                allowed.  */
3604             if (cp_parser_non_integral_constant_expression (parser,
3605                                                             NIC_VA_ARG))
3606               return error_mark_node;
3607             return build_x_va_arg (expression, type);
3608           }
3609
3610         case RID_OFFSETOF:
3611           return cp_parser_builtin_offsetof (parser);
3612
3613         case RID_HAS_NOTHROW_ASSIGN:
3614         case RID_HAS_NOTHROW_CONSTRUCTOR:
3615         case RID_HAS_NOTHROW_COPY:        
3616         case RID_HAS_TRIVIAL_ASSIGN:
3617         case RID_HAS_TRIVIAL_CONSTRUCTOR:
3618         case RID_HAS_TRIVIAL_COPY:        
3619         case RID_HAS_TRIVIAL_DESTRUCTOR:
3620         case RID_HAS_VIRTUAL_DESTRUCTOR:
3621         case RID_IS_ABSTRACT:
3622         case RID_IS_BASE_OF:
3623         case RID_IS_CLASS:
3624         case RID_IS_CONVERTIBLE_TO:
3625         case RID_IS_EMPTY:
3626         case RID_IS_ENUM:
3627         case RID_IS_LITERAL_TYPE:
3628         case RID_IS_POD:
3629         case RID_IS_POLYMORPHIC:
3630         case RID_IS_STD_LAYOUT:
3631         case RID_IS_TRIVIAL:
3632         case RID_IS_UNION:
3633           return cp_parser_trait_expr (parser, token->keyword);
3634
3635         /* Objective-C++ expressions.  */
3636         case RID_AT_ENCODE:
3637         case RID_AT_PROTOCOL:
3638         case RID_AT_SELECTOR:
3639           return cp_parser_objc_expression (parser);
3640
3641         case RID_TEMPLATE:
3642           if (parser->in_function_body
3643               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
3644                   == CPP_LESS))
3645             {
3646               error_at (token->location,
3647                         "a template declaration cannot appear at block scope");
3648               cp_parser_skip_to_end_of_block_or_statement (parser);
3649               return error_mark_node;
3650             }
3651         default:
3652           cp_parser_error (parser, "expected primary-expression");
3653           return error_mark_node;
3654         }
3655
3656       /* An id-expression can start with either an identifier, a
3657          `::' as the beginning of a qualified-id, or the "operator"
3658          keyword.  */
3659     case CPP_NAME:
3660     case CPP_SCOPE:
3661     case CPP_TEMPLATE_ID:
3662     case CPP_NESTED_NAME_SPECIFIER:
3663       {
3664         tree id_expression;
3665         tree decl;
3666         const char *error_msg;
3667         bool template_p;
3668         bool done;
3669         cp_token *id_expr_token;
3670
3671       id_expression:
3672         /* Parse the id-expression.  */
3673         id_expression
3674           = cp_parser_id_expression (parser,
3675                                      /*template_keyword_p=*/false,
3676                                      /*check_dependency_p=*/true,
3677                                      &template_p,
3678                                      /*declarator_p=*/false,
3679                                      /*optional_p=*/false);
3680         if (id_expression == error_mark_node)
3681           return error_mark_node;
3682         id_expr_token = token;
3683         token = cp_lexer_peek_token (parser->lexer);
3684         done = (token->type != CPP_OPEN_SQUARE
3685                 && token->type != CPP_OPEN_PAREN
3686                 && token->type != CPP_DOT
3687                 && token->type != CPP_DEREF
3688                 && token->type != CPP_PLUS_PLUS
3689                 && token->type != CPP_MINUS_MINUS);
3690         /* If we have a template-id, then no further lookup is
3691            required.  If the template-id was for a template-class, we
3692            will sometimes have a TYPE_DECL at this point.  */
3693         if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR
3694                  || TREE_CODE (id_expression) == TYPE_DECL)
3695           decl = id_expression;
3696         /* Look up the name.  */
3697         else
3698           {
3699             tree ambiguous_decls;
3700
3701             /* If we already know that this lookup is ambiguous, then
3702                we've already issued an error message; there's no reason
3703                to check again.  */
3704             if (id_expr_token->type == CPP_NAME
3705                 && id_expr_token->ambiguous_p)
3706               {
3707                 cp_parser_simulate_error (parser);
3708                 return error_mark_node;
3709               }
3710
3711             decl = cp_parser_lookup_name (parser, id_expression,
3712                                           none_type,
3713                                           template_p,
3714                                           /*is_namespace=*/false,
3715                                           /*check_dependency=*/true,
3716                                           &ambiguous_decls,
3717                                           id_expr_token->location);
3718             /* If the lookup was ambiguous, an error will already have
3719                been issued.  */
3720             if (ambiguous_decls)
3721               return error_mark_node;
3722
3723             /* In Objective-C++, we may have an Objective-C 2.0
3724                dot-syntax for classes here.  */
3725             if (c_dialect_objc ()
3726                 && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
3727                 && TREE_CODE (decl) == TYPE_DECL
3728                 && objc_is_class_name (decl))
3729               {
3730                 tree component;
3731                 cp_lexer_consume_token (parser->lexer);
3732                 component = cp_parser_identifier (parser);
3733                 if (component == error_mark_node)
3734                   return error_mark_node;
3735
3736                 return objc_build_class_component_ref (id_expression, component);
3737               }
3738
3739             /* In Objective-C++, an instance variable (ivar) may be preferred
3740                to whatever cp_parser_lookup_name() found.  */
3741             decl = objc_lookup_ivar (decl, id_expression);
3742
3743             /* If name lookup gives us a SCOPE_REF, then the
3744                qualifying scope was dependent.  */
3745             if (TREE_CODE (decl) == SCOPE_REF)
3746               {
3747                 /* At this point, we do not know if DECL is a valid
3748                    integral constant expression.  We assume that it is
3749                    in fact such an expression, so that code like:
3750
3751                       template <int N> struct A {
3752                         int a[B<N>::i];
3753                       };
3754                      
3755                    is accepted.  At template-instantiation time, we
3756                    will check that B<N>::i is actually a constant.  */
3757                 return decl;
3758               }
3759             /* Check to see if DECL is a local variable in a context
3760                where that is forbidden.  */
3761             if (parser->local_variables_forbidden_p
3762                 && local_variable_p (decl))
3763               {
3764                 /* It might be that we only found DECL because we are
3765                    trying to be generous with pre-ISO scoping rules.
3766                    For example, consider:
3767
3768                      int i;
3769                      void g() {
3770                        for (int i = 0; i < 10; ++i) {}
3771                        extern void f(int j = i);
3772                      }
3773
3774                    Here, name look up will originally find the out
3775                    of scope `i'.  We need to issue a warning message,
3776                    but then use the global `i'.  */
3777                 decl = check_for_out_of_scope_variable (decl);
3778                 if (local_variable_p (decl))
3779                   {
3780                     error_at (id_expr_token->location,
3781                               "local variable %qD may not appear in this context",
3782                               decl);
3783                     return error_mark_node;
3784                   }
3785               }
3786           }
3787
3788         decl = (finish_id_expression
3789                 (id_expression, decl, parser->scope,
3790                  idk,
3791                  parser->integral_constant_expression_p,
3792                  parser->allow_non_integral_constant_expression_p,
3793                  &parser->non_integral_constant_expression_p,
3794                  template_p, done, address_p,
3795                  template_arg_p,
3796                  &error_msg,
3797                  id_expr_token->location));
3798         if (error_msg)
3799           cp_parser_error (parser, error_msg);
3800         return decl;
3801       }
3802
3803       /* Anything else is an error.  */
3804     default:
3805       cp_parser_error (parser, "expected primary-expression");
3806       return error_mark_node;
3807     }
3808 }
3809
3810 /* Parse an id-expression.
3811
3812    id-expression:
3813      unqualified-id
3814      qualified-id
3815
3816    qualified-id:
3817      :: [opt] nested-name-specifier template [opt] unqualified-id
3818      :: identifier
3819      :: operator-function-id
3820      :: template-id
3821
3822    Return a representation of the unqualified portion of the
3823    identifier.  Sets PARSER->SCOPE to the qualifying scope if there is
3824    a `::' or nested-name-specifier.
3825
3826    Often, if the id-expression was a qualified-id, the caller will
3827    want to make a SCOPE_REF to represent the qualified-id.  This
3828    function does not do this in order to avoid wastefully creating
3829    SCOPE_REFs when they are not required.
3830
3831    If TEMPLATE_KEYWORD_P is true, then we have just seen the
3832    `template' keyword.
3833
3834    If CHECK_DEPENDENCY_P is false, then names are looked up inside
3835    uninstantiated templates.
3836
3837    If *TEMPLATE_P is non-NULL, it is set to true iff the
3838    `template' keyword is used to explicitly indicate that the entity
3839    named is a template.
3840
3841    If DECLARATOR_P is true, the id-expression is appearing as part of
3842    a declarator, rather than as part of an expression.  */
3843
3844 static tree
3845 cp_parser_id_expression (cp_parser *parser,
3846                          bool template_keyword_p,
3847                          bool check_dependency_p,
3848                          bool *template_p,
3849                          bool declarator_p,
3850                          bool optional_p)
3851 {
3852   bool global_scope_p;
3853   bool nested_name_specifier_p;
3854
3855   /* Assume the `template' keyword was not used.  */
3856   if (template_p)
3857     *template_p = template_keyword_p;
3858
3859   /* Look for the optional `::' operator.  */
3860   global_scope_p
3861     = (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false)
3862        != NULL_TREE);
3863   /* Look for the optional nested-name-specifier.  */
3864   nested_name_specifier_p
3865     = (cp_parser_nested_name_specifier_opt (parser,
3866                                             /*typename_keyword_p=*/false,
3867                                             check_dependency_p,
3868                                             /*type_p=*/false,
3869                                             declarator_p)
3870        != NULL_TREE);
3871   /* If there is a nested-name-specifier, then we are looking at
3872      the first qualified-id production.  */
3873   if (nested_name_specifier_p)
3874     {
3875       tree saved_scope;
3876       tree saved_object_scope;
3877       tree saved_qualifying_scope;
3878       tree unqualified_id;
3879       bool is_template;
3880
3881       /* See if the next token is the `template' keyword.  */
3882       if (!template_p)
3883         template_p = &is_template;
3884       *template_p = cp_parser_optional_template_keyword (parser);
3885       /* Name lookup we do during the processing of the
3886          unqualified-id might obliterate SCOPE.  */
3887       saved_scope = parser->scope;
3888       saved_object_scope = parser->object_scope;
3889       saved_qualifying_scope = parser->qualifying_scope;
3890       /* Process the final unqualified-id.  */
3891       unqualified_id = cp_parser_unqualified_id (parser, *template_p,
3892                                                  check_dependency_p,
3893                                                  declarator_p,
3894                                                  /*optional_p=*/false);
3895       /* Restore the SAVED_SCOPE for our caller.  */
3896       parser->scope = saved_scope;
3897       parser->object_scope = saved_object_scope;
3898       parser->qualifying_scope = saved_qualifying_scope;
3899
3900       return unqualified_id;
3901     }
3902   /* Otherwise, if we are in global scope, then we are looking at one
3903      of the other qualified-id productions.  */
3904   else if (global_scope_p)
3905     {
3906       cp_token *token;
3907       tree id;
3908
3909       /* Peek at the next token.  */
3910       token = cp_lexer_peek_token (parser->lexer);
3911
3912       /* If it's an identifier, and the next token is not a "<", then
3913          we can avoid the template-id case.  This is an optimization
3914          for this common case.  */
3915       if (token->type == CPP_NAME
3916           && !cp_parser_nth_token_starts_template_argument_list_p
3917                (parser, 2))
3918         return cp_parser_identifier (parser);
3919
3920       cp_parser_parse_tentatively (parser);
3921       /* Try a template-id.  */
3922       id = cp_parser_template_id (parser,
3923                                   /*template_keyword_p=*/false,
3924                                   /*check_dependency_p=*/true,
3925                                   declarator_p);
3926       /* If that worked, we're done.  */
3927       if (cp_parser_parse_definitely (parser))
3928         return id;
3929
3930       /* Peek at the next token.  (Changes in the token buffer may
3931          have invalidated the pointer obtained above.)  */
3932       token = cp_lexer_peek_token (parser->lexer);
3933
3934       switch (token->type)
3935         {
3936         case CPP_NAME:
3937           return cp_parser_identifier (parser);
3938
3939         case CPP_KEYWORD:
3940           if (token->keyword == RID_OPERATOR)
3941             return cp_parser_operator_function_id (parser);
3942           /* Fall through.  */
3943
3944         default:
3945           cp_parser_error (parser, "expected id-expression");
3946           return error_mark_node;
3947         }
3948     }
3949   else
3950     return cp_parser_unqualified_id (parser, template_keyword_p,
3951                                      /*check_dependency_p=*/true,
3952                                      declarator_p,
3953                                      optional_p);
3954 }
3955
3956 /* Parse an unqualified-id.
3957
3958    unqualified-id:
3959      identifier
3960      operator-function-id
3961      conversion-function-id
3962      ~ class-name
3963      template-id
3964
3965    If TEMPLATE_KEYWORD_P is TRUE, we have just seen the `template'
3966    keyword, in a construct like `A::template ...'.
3967
3968    Returns a representation of unqualified-id.  For the `identifier'
3969    production, an IDENTIFIER_NODE is returned.  For the `~ class-name'
3970    production a BIT_NOT_EXPR is returned; the operand of the
3971    BIT_NOT_EXPR is an IDENTIFIER_NODE for the class-name.  For the
3972    other productions, see the documentation accompanying the
3973    corresponding parsing functions.  If CHECK_DEPENDENCY_P is false,
3974    names are looked up in uninstantiated templates.  If DECLARATOR_P
3975    is true, the unqualified-id is appearing as part of a declarator,
3976    rather than as part of an expression.  */
3977
3978 static tree
3979 cp_parser_unqualified_id (cp_parser* parser,
3980                           bool template_keyword_p,
3981                           bool check_dependency_p,
3982                           bool declarator_p,
3983                           bool optional_p)
3984 {
3985   cp_token *token;
3986
3987   /* Peek at the next token.  */
3988   token = cp_lexer_peek_token (parser->lexer);
3989
3990   switch (token->type)
3991     {
3992     case CPP_NAME:
3993       {
3994         tree id;
3995
3996         /* We don't know yet whether or not this will be a
3997            template-id.  */
3998         cp_parser_parse_tentatively (parser);
3999         /* Try a template-id.  */
4000         id = cp_parser_template_id (parser, template_keyword_p,
4001                                     check_dependency_p,
4002                                     declarator_p);
4003         /* If it worked, we're done.  */
4004         if (cp_parser_parse_definitely (parser))
4005           return id;
4006         /* Otherwise, it's an ordinary identifier.  */
4007         return cp_parser_identifier (parser);
4008       }
4009
4010     case CPP_TEMPLATE_ID:
4011       return cp_parser_template_id (parser, template_keyword_p,
4012                                     check_dependency_p,
4013                                     declarator_p);
4014
4015     case CPP_COMPL:
4016       {
4017         tree type_decl;
4018         tree qualifying_scope;
4019         tree object_scope;
4020         tree scope;
4021         bool done;
4022
4023         /* Consume the `~' token.  */
4024         cp_lexer_consume_token (parser->lexer);
4025         /* Parse the class-name.  The standard, as written, seems to
4026            say that:
4027
4028              template <typename T> struct S { ~S (); };
4029              template <typename T> S<T>::~S() {}
4030
4031            is invalid, since `~' must be followed by a class-name, but
4032            `S<T>' is dependent, and so not known to be a class.
4033            That's not right; we need to look in uninstantiated
4034            templates.  A further complication arises from:
4035
4036              template <typename T> void f(T t) {
4037                t.T::~T();
4038              }
4039
4040            Here, it is not possible to look up `T' in the scope of `T'
4041            itself.  We must look in both the current scope, and the
4042            scope of the containing complete expression.
4043
4044            Yet another issue is:
4045
4046              struct S {
4047                int S;
4048                ~S();
4049              };
4050
4051              S::~S() {}
4052
4053            The standard does not seem to say that the `S' in `~S'
4054            should refer to the type `S' and not the data member
4055            `S::S'.  */
4056
4057         /* DR 244 says that we look up the name after the "~" in the
4058            same scope as we looked up the qualifying name.  That idea
4059            isn't fully worked out; it's more complicated than that.  */
4060         scope = parser->scope;
4061         object_scope = parser->object_scope;
4062         qualifying_scope = parser->qualifying_scope;
4063
4064         /* Check for invalid scopes.  */
4065         if (scope == error_mark_node)
4066           {
4067             if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
4068               cp_lexer_consume_token (parser->lexer);
4069             return error_mark_node;
4070           }
4071         if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
4072           {
4073             if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4074               error_at (token->location,
4075                         "scope %qT before %<~%> is not a class-name",
4076                         scope);
4077             cp_parser_simulate_error (parser);
4078             if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
4079               cp_lexer_consume_token (parser->lexer);
4080             return error_mark_node;
4081           }
4082         gcc_assert (!scope || TYPE_P (scope));
4083
4084         /* If the name is of the form "X::~X" it's OK even if X is a
4085            typedef.  */
4086         token = cp_lexer_peek_token (parser->lexer);
4087         if (scope
4088             && token->type == CPP_NAME
4089             && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4090                 != CPP_LESS)
4091             && (token->u.value == TYPE_IDENTIFIER (scope)
4092                 || (CLASS_TYPE_P (scope)
4093                     && constructor_name_p (token->u.value, scope))))
4094           {
4095             cp_lexer_consume_token (parser->lexer);
4096             return build_nt (BIT_NOT_EXPR, scope);
4097           }
4098
4099         /* If there was an explicit qualification (S::~T), first look
4100            in the scope given by the qualification (i.e., S).
4101
4102            Note: in the calls to cp_parser_class_name below we pass
4103            typename_type so that lookup finds the injected-class-name
4104            rather than the constructor.  */
4105         done = false;
4106         type_decl = NULL_TREE;
4107         if (scope)
4108           {
4109             cp_parser_parse_tentatively (parser);
4110             type_decl = cp_parser_class_name (parser,
4111                                               /*typename_keyword_p=*/false,
4112                                               /*template_keyword_p=*/false,
4113                                               typename_type,
4114                                               /*check_dependency=*/false,
4115                                               /*class_head_p=*/false,
4116                                               declarator_p);
4117             if (cp_parser_parse_definitely (parser))
4118               done = true;
4119           }
4120         /* In "N::S::~S", look in "N" as well.  */
4121         if (!done && scope && qualifying_scope)
4122           {
4123             cp_parser_parse_tentatively (parser);
4124             parser->scope = qualifying_scope;
4125             parser->object_scope = NULL_TREE;
4126             parser->qualifying_scope = NULL_TREE;
4127             type_decl
4128               = cp_parser_class_name (parser,
4129                                       /*typename_keyword_p=*/false,
4130                                       /*template_keyword_p=*/false,
4131                                       typename_type,
4132                                       /*check_dependency=*/false,
4133                                       /*class_head_p=*/false,
4134                                       declarator_p);
4135             if (cp_parser_parse_definitely (parser))
4136               done = true;
4137           }
4138         /* In "p->S::~T", look in the scope given by "*p" as well.  */
4139         else if (!done && object_scope)
4140           {
4141             cp_parser_parse_tentatively (parser);
4142             parser->scope = object_scope;
4143             parser->object_scope = NULL_TREE;
4144             parser->qualifying_scope = NULL_TREE;
4145             type_decl
4146               = cp_parser_class_name (parser,
4147                                       /*typename_keyword_p=*/false,
4148                                       /*template_keyword_p=*/false,
4149                                       typename_type,
4150                                       /*check_dependency=*/false,
4151                                       /*class_head_p=*/false,
4152                                       declarator_p);
4153             if (cp_parser_parse_definitely (parser))
4154               done = true;
4155           }
4156         /* Look in the surrounding context.  */
4157         if (!done)
4158           {
4159             parser->scope = NULL_TREE;
4160             parser->object_scope = NULL_TREE;
4161             parser->qualifying_scope = NULL_TREE;
4162             if (processing_template_decl)
4163               cp_parser_parse_tentatively (parser);
4164             type_decl
4165               = cp_parser_class_name (parser,
4166                                       /*typename_keyword_p=*/false,
4167                                       /*template_keyword_p=*/false,
4168                                       typename_type,
4169                                       /*check_dependency=*/false,
4170                                       /*class_head_p=*/false,
4171                                       declarator_p);
4172             if (processing_template_decl
4173                 && ! cp_parser_parse_definitely (parser))
4174               {
4175                 /* We couldn't find a type with this name, so just accept
4176                    it and check for a match at instantiation time.  */
4177                 type_decl = cp_parser_identifier (parser);
4178                 if (type_decl != error_mark_node)
4179                   type_decl = build_nt (BIT_NOT_EXPR, type_decl);
4180                 return type_decl;
4181               }
4182           }
4183         /* If an error occurred, assume that the name of the
4184            destructor is the same as the name of the qualifying
4185            class.  That allows us to keep parsing after running
4186            into ill-formed destructor names.  */
4187         if (type_decl == error_mark_node && scope)
4188           return build_nt (BIT_NOT_EXPR, scope);
4189         else if (type_decl == error_mark_node)
4190           return error_mark_node;
4191
4192         /* Check that destructor name and scope match.  */
4193         if (declarator_p && scope && !check_dtor_name (scope, type_decl))
4194           {
4195             if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4196               error_at (token->location,
4197                         "declaration of %<~%T%> as member of %qT",
4198                         type_decl, scope);
4199             cp_parser_simulate_error (parser);
4200             return error_mark_node;
4201           }
4202
4203         /* [class.dtor]
4204
4205            A typedef-name that names a class shall not be used as the
4206            identifier in the declarator for a destructor declaration.  */
4207         if (declarator_p
4208             && !DECL_IMPLICIT_TYPEDEF_P (type_decl)
4209             && !DECL_SELF_REFERENCE_P (type_decl)
4210             && !cp_parser_uncommitted_to_tentative_parse_p (parser))
4211           error_at (token->location,
4212                     "typedef-name %qD used as destructor declarator",
4213                     type_decl);
4214
4215         return build_nt (BIT_NOT_EXPR, TREE_TYPE (type_decl));
4216       }
4217
4218     case CPP_KEYWORD:
4219       if (token->keyword == RID_OPERATOR)
4220         {
4221           tree id;
4222
4223           /* This could be a template-id, so we try that first.  */
4224           cp_parser_parse_tentatively (parser);
4225           /* Try a template-id.  */
4226           id = cp_parser_template_id (parser, template_keyword_p,
4227                                       /*check_dependency_p=*/true,
4228                                       declarator_p);
4229           /* If that worked, we're done.  */
4230           if (cp_parser_parse_definitely (parser))
4231             return id;
4232           /* We still don't know whether we're looking at an
4233              operator-function-id or a conversion-function-id.  */
4234           cp_parser_parse_tentatively (parser);
4235           /* Try an operator-function-id.  */
4236           id = cp_parser_operator_function_id (parser);
4237           /* If that didn't work, try a conversion-function-id.  */
4238           if (!cp_parser_parse_definitely (parser))
4239             id = cp_parser_conversion_function_id (parser);
4240
4241           return id;
4242         }
4243       /* Fall through.  */
4244
4245     default:
4246       if (optional_p)
4247         return NULL_TREE;
4248       cp_parser_error (parser, "expected unqualified-id");
4249       return error_mark_node;
4250     }
4251 }
4252
4253 /* Parse an (optional) nested-name-specifier.
4254
4255    nested-name-specifier: [C++98]
4256      class-or-namespace-name :: nested-name-specifier [opt]
4257      class-or-namespace-name :: template nested-name-specifier [opt]
4258
4259    nested-name-specifier: [C++0x]
4260      type-name ::
4261      namespace-name ::
4262      nested-name-specifier identifier ::
4263      nested-name-specifier template [opt] simple-template-id ::
4264
4265    PARSER->SCOPE should be set appropriately before this function is
4266    called.  TYPENAME_KEYWORD_P is TRUE if the `typename' keyword is in
4267    effect.  TYPE_P is TRUE if we non-type bindings should be ignored
4268    in name lookups.
4269
4270    Sets PARSER->SCOPE to the class (TYPE) or namespace
4271    (NAMESPACE_DECL) specified by the nested-name-specifier, or leaves
4272    it unchanged if there is no nested-name-specifier.  Returns the new
4273    scope iff there is a nested-name-specifier, or NULL_TREE otherwise.
4274
4275    If IS_DECLARATION is TRUE, the nested-name-specifier is known to be
4276    part of a declaration and/or decl-specifier.  */
4277
4278 static tree
4279 cp_parser_nested_name_specifier_opt (cp_parser *parser,
4280                                      bool typename_keyword_p,
4281                                      bool check_dependency_p,
4282                                      bool type_p,
4283                                      bool is_declaration)
4284 {
4285   bool success = false;
4286   cp_token_position start = 0;
4287   cp_token *token;
4288
4289   /* Remember where the nested-name-specifier starts.  */
4290   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
4291     {
4292       start = cp_lexer_token_position (parser->lexer, false);
4293       push_deferring_access_checks (dk_deferred);
4294     }
4295
4296   while (true)
4297     {
4298       tree new_scope;
4299       tree old_scope;
4300       tree saved_qualifying_scope;
4301       bool template_keyword_p;
4302
4303       /* Spot cases that cannot be the beginning of a
4304          nested-name-specifier.  */
4305       token = cp_lexer_peek_token (parser->lexer);
4306
4307       /* If the next token is CPP_NESTED_NAME_SPECIFIER, just process
4308          the already parsed nested-name-specifier.  */
4309       if (token->type == CPP_NESTED_NAME_SPECIFIER)
4310         {
4311           /* Grab the nested-name-specifier and continue the loop.  */
4312           cp_parser_pre_parsed_nested_name_specifier (parser);
4313           /* If we originally encountered this nested-name-specifier
4314              with IS_DECLARATION set to false, we will not have
4315              resolved TYPENAME_TYPEs, so we must do so here.  */
4316           if (is_declaration
4317               && TREE_CODE (parser->scope) == TYPENAME_TYPE)
4318             {
4319               new_scope = resolve_typename_type (parser->scope,
4320                                                  /*only_current_p=*/false);
4321               if (TREE_CODE (new_scope) != TYPENAME_TYPE)
4322                 parser->scope = new_scope;
4323             }
4324           success = true;
4325           continue;
4326         }
4327
4328       /* Spot cases that cannot be the beginning of a
4329          nested-name-specifier.  On the second and subsequent times
4330          through the loop, we look for the `template' keyword.  */
4331       if (success && token->keyword == RID_TEMPLATE)
4332         ;
4333       /* A template-id can start a nested-name-specifier.  */
4334       else if (token->type == CPP_TEMPLATE_ID)
4335         ;
4336       /* DR 743: decltype can be used in a nested-name-specifier.  */
4337       else if (token_is_decltype (token))
4338         ;
4339       else
4340         {
4341           /* If the next token is not an identifier, then it is
4342              definitely not a type-name or namespace-name.  */
4343           if (token->type != CPP_NAME)
4344             break;
4345           /* If the following token is neither a `<' (to begin a
4346              template-id), nor a `::', then we are not looking at a
4347              nested-name-specifier.  */
4348           token = cp_lexer_peek_nth_token (parser->lexer, 2);
4349
4350           if (token->type == CPP_COLON
4351               && parser->colon_corrects_to_scope_p
4352               && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME)
4353             {
4354               error_at (token->location,
4355                         "found %<:%> in nested-name-specifier, expected %<::%>");
4356               token->type = CPP_SCOPE;
4357             }
4358
4359           if (token->type != CPP_SCOPE
4360               && !cp_parser_nth_token_starts_template_argument_list_p
4361                   (parser, 2))
4362             break;
4363         }
4364
4365       /* The nested-name-specifier is optional, so we parse
4366          tentatively.  */
4367       cp_parser_parse_tentatively (parser);
4368
4369       /* Look for the optional `template' keyword, if this isn't the
4370          first time through the loop.  */
4371       if (success)
4372         template_keyword_p = cp_parser_optional_template_keyword (parser);
4373       else
4374         template_keyword_p = false;
4375
4376       /* Save the old scope since the name lookup we are about to do
4377          might destroy it.  */
4378       old_scope = parser->scope;
4379       saved_qualifying_scope = parser->qualifying_scope;
4380       /* In a declarator-id like "X<T>::I::Y<T>" we must be able to
4381          look up names in "X<T>::I" in order to determine that "Y" is
4382          a template.  So, if we have a typename at this point, we make
4383          an effort to look through it.  */
4384       if (is_declaration
4385           && !typename_keyword_p
4386           && parser->scope
4387           && TREE_CODE (parser->scope) == TYPENAME_TYPE)
4388         parser->scope = resolve_typename_type (parser->scope,
4389                                                /*only_current_p=*/false);
4390       /* Parse the qualifying entity.  */
4391       new_scope
4392         = cp_parser_qualifying_entity (parser,
4393                                        typename_keyword_p,
4394                                        template_keyword_p,
4395                                        check_dependency_p,
4396                                        type_p,
4397                                        is_declaration);
4398       /* Look for the `::' token.  */
4399       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
4400
4401       /* If we found what we wanted, we keep going; otherwise, we're
4402          done.  */
4403       if (!cp_parser_parse_definitely (parser))
4404         {
4405           bool error_p = false;
4406
4407           /* Restore the OLD_SCOPE since it was valid before the
4408              failed attempt at finding the last
4409              class-or-namespace-name.  */
4410           parser->scope = old_scope;
4411           parser->qualifying_scope = saved_qualifying_scope;
4412
4413           /* If the next token is a decltype, and the one after that is a
4414              `::', then the decltype has failed to resolve to a class or
4415              enumeration type.  Give this error even when parsing
4416              tentatively since it can't possibly be valid--and we're going
4417              to replace it with a CPP_NESTED_NAME_SPECIFIER below, so we
4418              won't get another chance.*/
4419           if (cp_lexer_next_token_is (parser->lexer, CPP_DECLTYPE)
4420               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4421                   == CPP_SCOPE))
4422             {
4423               token = cp_lexer_consume_token (parser->lexer);
4424               error_at (token->location, "decltype evaluates to %qT, "
4425                         "which is not a class or enumeration type",
4426                         token->u.value);
4427               parser->scope = error_mark_node;
4428               error_p = true;
4429               /* As below.  */
4430               success = true;
4431               cp_lexer_consume_token (parser->lexer);
4432             }
4433
4434           if (cp_parser_uncommitted_to_tentative_parse_p (parser))
4435             break;
4436           /* If the next token is an identifier, and the one after
4437              that is a `::', then any valid interpretation would have
4438              found a class-or-namespace-name.  */
4439           while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
4440                  && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4441                      == CPP_SCOPE)
4442                  && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
4443                      != CPP_COMPL))
4444             {
4445               token = cp_lexer_consume_token (parser->lexer);
4446               if (!error_p)
4447                 {
4448                   if (!token->ambiguous_p)
4449                     {
4450                       tree decl;
4451                       tree ambiguous_decls;
4452
4453                       decl = cp_parser_lookup_name (parser, token->u.value,
4454                                                     none_type,
4455                                                     /*is_template=*/false,
4456                                                     /*is_namespace=*/false,
4457                                                     /*check_dependency=*/true,
4458                                                     &ambiguous_decls,
4459                                                     token->location);
4460                       if (TREE_CODE (decl) == TEMPLATE_DECL)
4461                         error_at (token->location,
4462                                   "%qD used without template parameters",
4463                                   decl);
4464                       else if (ambiguous_decls)
4465                         {
4466                           error_at (token->location,
4467                                     "reference to %qD is ambiguous",
4468                                     token->u.value);
4469                           print_candidates (ambiguous_decls);
4470                           decl = error_mark_node;
4471                         }
4472                       else
4473                         {
4474                           if (cxx_dialect != cxx98)
4475                             cp_parser_name_lookup_error
4476                             (parser, token->u.value, decl, NLE_NOT_CXX98,
4477                              token->location);
4478                           else
4479                             cp_parser_name_lookup_error
4480                             (parser, token->u.value, decl, NLE_CXX98,
4481                              token->location);
4482                         }
4483                     }
4484                   parser->scope = error_mark_node;
4485                   error_p = true;
4486                   /* Treat this as a successful nested-name-specifier
4487                      due to:
4488
4489                      [basic.lookup.qual]
4490
4491                      If the name found is not a class-name (clause
4492                      _class_) or namespace-name (_namespace.def_), the
4493                      program is ill-formed.  */
4494                   success = true;
4495                 }
4496               cp_lexer_consume_token (parser->lexer);
4497             }
4498           break;
4499         }
4500       /* We've found one valid nested-name-specifier.  */
4501       success = true;
4502       /* Name lookup always gives us a DECL.  */
4503       if (TREE_CODE (new_scope) == TYPE_DECL)
4504         new_scope = TREE_TYPE (new_scope);
4505       /* Uses of "template" must be followed by actual templates.  */
4506       if (template_keyword_p
4507           && !(CLASS_TYPE_P (new_scope)
4508                && ((CLASSTYPE_USE_TEMPLATE (new_scope)
4509                     && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (new_scope)))
4510                    || CLASSTYPE_IS_TEMPLATE (new_scope)))
4511           && !(TREE_CODE (new_scope) == TYPENAME_TYPE
4512                && (TREE_CODE (TYPENAME_TYPE_FULLNAME (new_scope))
4513                    == TEMPLATE_ID_EXPR)))
4514         permerror (input_location, TYPE_P (new_scope)
4515                    ? "%qT is not a template"
4516                    : "%qD is not a template",
4517                    new_scope);
4518       /* If it is a class scope, try to complete it; we are about to
4519          be looking up names inside the class.  */
4520       if (TYPE_P (new_scope)
4521           /* Since checking types for dependency can be expensive,
4522              avoid doing it if the type is already complete.  */
4523           && !COMPLETE_TYPE_P (new_scope)
4524           /* Do not try to complete dependent types.  */
4525           && !dependent_type_p (new_scope))
4526         {
4527           new_scope = complete_type (new_scope);
4528           /* If it is a typedef to current class, use the current
4529              class instead, as the typedef won't have any names inside
4530              it yet.  */
4531           if (!COMPLETE_TYPE_P (new_scope)
4532               && currently_open_class (new_scope))
4533             new_scope = TYPE_MAIN_VARIANT (new_scope);
4534         }
4535       /* Make sure we look in the right scope the next time through
4536          the loop.  */
4537       parser->scope = new_scope;
4538     }
4539
4540   /* If parsing tentatively, replace the sequence of tokens that makes
4541      up the nested-name-specifier with a CPP_NESTED_NAME_SPECIFIER
4542      token.  That way, should we re-parse the token stream, we will
4543      not have to repeat the effort required to do the parse, nor will
4544      we issue duplicate error messages.  */
4545   if (success && start)
4546     {
4547       cp_token *token;
4548
4549       token = cp_lexer_token_at (parser->lexer, start);
4550       /* Reset the contents of the START token.  */
4551       token->type = CPP_NESTED_NAME_SPECIFIER;
4552       /* Retrieve any deferred checks.  Do not pop this access checks yet
4553          so the memory will not be reclaimed during token replacing below.  */
4554       token->u.tree_check_value = ggc_alloc_cleared_tree_check ();
4555       token->u.tree_check_value->value = parser->scope;
4556       token->u.tree_check_value->checks = get_deferred_access_checks ();
4557       token->u.tree_check_value->qualifying_scope =
4558         parser->qualifying_scope;
4559       token->keyword = RID_MAX;
4560
4561       /* Purge all subsequent tokens.  */
4562       cp_lexer_purge_tokens_after (parser->lexer, start);
4563     }
4564
4565   if (start)
4566     pop_to_parent_deferring_access_checks ();
4567
4568   return success ? parser->scope : NULL_TREE;
4569 }
4570
4571 /* Parse a nested-name-specifier.  See
4572    cp_parser_nested_name_specifier_opt for details.  This function
4573    behaves identically, except that it will an issue an error if no
4574    nested-name-specifier is present.  */
4575
4576 static tree
4577 cp_parser_nested_name_specifier (cp_parser *parser,
4578                                  bool typename_keyword_p,
4579                                  bool check_dependency_p,
4580                                  bool type_p,
4581                                  bool is_declaration)
4582 {
4583   tree scope;
4584
4585   /* Look for the nested-name-specifier.  */
4586   scope = cp_parser_nested_name_specifier_opt (parser,
4587                                                typename_keyword_p,
4588                                                check_dependency_p,
4589                                                type_p,
4590                                                is_declaration);
4591   /* If it was not present, issue an error message.  */
4592   if (!scope)
4593     {
4594       cp_parser_error (parser, "expected nested-name-specifier");
4595       parser->scope = NULL_TREE;
4596     }
4597
4598   return scope;
4599 }
4600
4601 /* Parse the qualifying entity in a nested-name-specifier. For C++98,
4602    this is either a class-name or a namespace-name (which corresponds
4603    to the class-or-namespace-name production in the grammar). For
4604    C++0x, it can also be a type-name that refers to an enumeration
4605    type.
4606
4607    TYPENAME_KEYWORD_P is TRUE iff the `typename' keyword is in effect.
4608    TEMPLATE_KEYWORD_P is TRUE iff the `template' keyword is in effect.
4609    CHECK_DEPENDENCY_P is FALSE iff dependent names should be looked up.
4610    TYPE_P is TRUE iff the next name should be taken as a class-name,
4611    even the same name is declared to be another entity in the same
4612    scope.
4613
4614    Returns the class (TYPE_DECL) or namespace (NAMESPACE_DECL)
4615    specified by the class-or-namespace-name.  If neither is found the
4616    ERROR_MARK_NODE is returned.  */
4617
4618 static tree
4619 cp_parser_qualifying_entity (cp_parser *parser,
4620                              bool typename_keyword_p,
4621                              bool template_keyword_p,
4622                              bool check_dependency_p,
4623                              bool type_p,
4624                              bool is_declaration)
4625 {
4626   tree saved_scope;
4627   tree saved_qualifying_scope;
4628   tree saved_object_scope;
4629   tree scope;
4630   bool only_class_p;
4631   bool successful_parse_p;
4632
4633   /* DR 743: decltype can appear in a nested-name-specifier.  */
4634   if (cp_lexer_next_token_is_decltype (parser->lexer))
4635     {
4636       scope = cp_parser_decltype (parser);
4637       if (TREE_CODE (scope) != ENUMERAL_TYPE
4638           && !MAYBE_CLASS_TYPE_P (scope))
4639         {
4640           cp_parser_simulate_error (parser);
4641           return error_mark_node;
4642         }
4643       if (TYPE_NAME (scope))
4644         scope = TYPE_NAME (scope);
4645       return scope;
4646     }
4647
4648   /* Before we try to parse the class-name, we must save away the
4649      current PARSER->SCOPE since cp_parser_class_name will destroy
4650      it.  */
4651   saved_scope = parser->scope;
4652   saved_qualifying_scope = parser->qualifying_scope;
4653   saved_object_scope = parser->object_scope;
4654   /* Try for a class-name first.  If the SAVED_SCOPE is a type, then
4655      there is no need to look for a namespace-name.  */
4656   only_class_p = template_keyword_p 
4657     || (saved_scope && TYPE_P (saved_scope) && cxx_dialect == cxx98);
4658   if (!only_class_p)
4659     cp_parser_parse_tentatively (parser);
4660   scope = cp_parser_class_name (parser,
4661                                 typename_keyword_p,
4662                                 template_keyword_p,
4663                                 type_p ? class_type : none_type,
4664                                 check_dependency_p,
4665                                 /*class_head_p=*/false,
4666                                 is_declaration);
4667   successful_parse_p = only_class_p || cp_parser_parse_definitely (parser);
4668   /* If that didn't work and we're in C++0x mode, try for a type-name.  */
4669   if (!only_class_p 
4670       && cxx_dialect != cxx98
4671       && !successful_parse_p)
4672     {
4673       /* Restore the saved scope.  */
4674       parser->scope = saved_scope;
4675       parser->qualifying_scope = saved_qualifying_scope;
4676       parser->object_scope = saved_object_scope;
4677
4678       /* Parse tentatively.  */
4679       cp_parser_parse_tentatively (parser);
4680      
4681       /* Parse a typedef-name or enum-name.  */
4682       scope = cp_parser_nonclass_name (parser);
4683
4684       /* "If the name found does not designate a namespace or a class,
4685          enumeration, or dependent type, the program is ill-formed."
4686
4687          We cover classes and dependent types above and namespaces below,
4688          so this code is only looking for enums.  */
4689       if (!scope || TREE_CODE (scope) != TYPE_DECL
4690           || TREE_CODE (TREE_TYPE (scope)) != ENUMERAL_TYPE)
4691         cp_parser_simulate_error (parser);
4692
4693       successful_parse_p = cp_parser_parse_definitely (parser);
4694     }
4695   /* If that didn't work, try for a namespace-name.  */
4696   if (!only_class_p && !successful_parse_p)
4697     {
4698       /* Restore the saved scope.  */
4699       parser->scope = saved_scope;
4700       parser->qualifying_scope = saved_qualifying_scope;
4701       parser->object_scope = saved_object_scope;
4702       /* If we are not looking at an identifier followed by the scope
4703          resolution operator, then this is not part of a
4704          nested-name-specifier.  (Note that this function is only used
4705          to parse the components of a nested-name-specifier.)  */
4706       if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)
4707           || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
4708         return error_mark_node;
4709       scope = cp_parser_namespace_name (parser);
4710     }
4711
4712   return scope;
4713 }
4714
4715 /* Parse a postfix-expression.
4716
4717    postfix-expression:
4718      primary-expression
4719      postfix-expression [ expression ]
4720      postfix-expression ( expression-list [opt] )
4721      simple-type-specifier ( expression-list [opt] )
4722      typename :: [opt] nested-name-specifier identifier
4723        ( expression-list [opt] )
4724      typename :: [opt] nested-name-specifier template [opt] template-id
4725        ( expression-list [opt] )
4726      postfix-expression . template [opt] id-expression
4727      postfix-expression -> template [opt] id-expression
4728      postfix-expression . pseudo-destructor-name
4729      postfix-expression -> pseudo-destructor-name
4730      postfix-expression ++
4731      postfix-expression --
4732      dynamic_cast < type-id > ( expression )
4733      static_cast < type-id > ( expression )
4734      reinterpret_cast < type-id > ( expression )
4735      const_cast < type-id > ( expression )
4736      typeid ( expression )
4737      typeid ( type-id )
4738
4739    GNU Extension:
4740
4741    postfix-expression:
4742      ( type-id ) { initializer-list , [opt] }
4743
4744    This extension is a GNU version of the C99 compound-literal
4745    construct.  (The C99 grammar uses `type-name' instead of `type-id',
4746    but they are essentially the same concept.)
4747
4748    If ADDRESS_P is true, the postfix expression is the operand of the
4749    `&' operator.  CAST_P is true if this expression is the target of a
4750    cast.
4751
4752    If MEMBER_ACCESS_ONLY_P, we only allow postfix expressions that are
4753    class member access expressions [expr.ref].
4754
4755    Returns a representation of the expression.  */
4756
4757 static tree
4758 cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
4759                               bool member_access_only_p,
4760                               cp_id_kind * pidk_return)
4761 {
4762   cp_token *token;
4763   enum rid keyword;
4764   cp_id_kind idk = CP_ID_KIND_NONE;
4765   tree postfix_expression = NULL_TREE;
4766   bool is_member_access = false;
4767
4768   /* Peek at the next token.  */
4769   token = cp_lexer_peek_token (parser->lexer);
4770   /* Some of the productions are determined by keywords.  */
4771   keyword = token->keyword;
4772   switch (keyword)
4773     {
4774     case RID_DYNCAST:
4775     case RID_STATCAST:
4776     case RID_REINTCAST:
4777     case RID_CONSTCAST:
4778       {
4779         tree type;
4780         tree expression;
4781         const char *saved_message;
4782
4783         /* All of these can be handled in the same way from the point
4784            of view of parsing.  Begin by consuming the token
4785            identifying the cast.  */
4786         cp_lexer_consume_token (parser->lexer);
4787
4788         /* New types cannot be defined in the cast.  */
4789         saved_message = parser->type_definition_forbidden_message;
4790         parser->type_definition_forbidden_message
4791           = G_("types may not be defined in casts");
4792
4793         /* Look for the opening `<'.  */
4794         cp_parser_require (parser, CPP_LESS, RT_LESS);
4795         /* Parse the type to which we are casting.  */
4796         type = cp_parser_type_id (parser);
4797         /* Look for the closing `>'.  */
4798         cp_parser_require (parser, CPP_GREATER, RT_GREATER);
4799         /* Restore the old message.  */
4800         parser->type_definition_forbidden_message = saved_message;
4801
4802         /* And the expression which is being cast.  */
4803         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
4804         expression = cp_parser_expression (parser, /*cast_p=*/true, & idk);
4805         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4806
4807         /* Only type conversions to integral or enumeration types
4808            can be used in constant-expressions.  */
4809         if (!cast_valid_in_integral_constant_expression_p (type)
4810             && cp_parser_non_integral_constant_expression (parser, NIC_CAST))
4811           return error_mark_node;
4812
4813         switch (keyword)
4814           {
4815           case RID_DYNCAST:
4816             postfix_expression
4817               = build_dynamic_cast (type, expression, tf_warning_or_error);
4818             break;
4819           case RID_STATCAST:
4820             postfix_expression
4821               = build_static_cast (type, expression, tf_warning_or_error);
4822             break;
4823           case RID_REINTCAST:
4824             postfix_expression
4825               = build_reinterpret_cast (type, expression, 
4826                                         tf_warning_or_error);
4827             break;
4828           case RID_CONSTCAST:
4829             postfix_expression
4830               = build_const_cast (type, expression, tf_warning_or_error);
4831             break;
4832           default:
4833             gcc_unreachable ();
4834           }
4835       }
4836       break;
4837
4838     case RID_TYPEID:
4839       {
4840         tree type;
4841         const char *saved_message;
4842         bool saved_in_type_id_in_expr_p;
4843
4844         /* Consume the `typeid' token.  */
4845         cp_lexer_consume_token (parser->lexer);
4846         /* Look for the `(' token.  */
4847         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
4848         /* Types cannot be defined in a `typeid' expression.  */
4849         saved_message = parser->type_definition_forbidden_message;
4850         parser->type_definition_forbidden_message
4851           = G_("types may not be defined in a %<typeid%> expression");
4852         /* We can't be sure yet whether we're looking at a type-id or an
4853            expression.  */
4854         cp_parser_parse_tentatively (parser);
4855         /* Try a type-id first.  */
4856         saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
4857         parser->in_type_id_in_expr_p = true;
4858         type = cp_parser_type_id (parser);
4859         parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
4860         /* Look for the `)' token.  Otherwise, we can't be sure that
4861            we're not looking at an expression: consider `typeid (int
4862            (3))', for example.  */
4863         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4864         /* If all went well, simply lookup the type-id.  */
4865         if (cp_parser_parse_definitely (parser))
4866           postfix_expression = get_typeid (type);
4867         /* Otherwise, fall back to the expression variant.  */
4868         else
4869           {
4870             tree expression;
4871
4872             /* Look for an expression.  */
4873             expression = cp_parser_expression (parser, /*cast_p=*/false, & idk);
4874             /* Compute its typeid.  */
4875             postfix_expression = build_typeid (expression);
4876             /* Look for the `)' token.  */
4877             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4878           }
4879         /* Restore the saved message.  */
4880         parser->type_definition_forbidden_message = saved_message;
4881         /* `typeid' may not appear in an integral constant expression.  */
4882         if (cp_parser_non_integral_constant_expression(parser, NIC_TYPEID))
4883           return error_mark_node;
4884       }
4885       break;
4886
4887     case RID_TYPENAME:
4888       {
4889         tree type;
4890         /* The syntax permitted here is the same permitted for an
4891            elaborated-type-specifier.  */
4892         type = cp_parser_elaborated_type_specifier (parser,
4893                                                     /*is_friend=*/false,
4894                                                     /*is_declaration=*/false);
4895         postfix_expression = cp_parser_functional_cast (parser, type);
4896       }
4897       break;
4898
4899     default:
4900       {
4901         tree type;
4902
4903         /* If the next thing is a simple-type-specifier, we may be
4904            looking at a functional cast.  We could also be looking at
4905            an id-expression.  So, we try the functional cast, and if
4906            that doesn't work we fall back to the primary-expression.  */
4907         cp_parser_parse_tentatively (parser);
4908         /* Look for the simple-type-specifier.  */
4909         type = cp_parser_simple_type_specifier (parser,
4910                                                 /*decl_specs=*/NULL,
4911                                                 CP_PARSER_FLAGS_NONE);
4912         /* Parse the cast itself.  */
4913         if (!cp_parser_error_occurred (parser))
4914           postfix_expression
4915             = cp_parser_functional_cast (parser, type);
4916         /* If that worked, we're done.  */
4917         if (cp_parser_parse_definitely (parser))
4918           break;
4919
4920         /* If the functional-cast didn't work out, try a
4921            compound-literal.  */
4922         if (cp_parser_allow_gnu_extensions_p (parser)
4923             && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
4924           {
4925             VEC(constructor_elt,gc) *initializer_list = NULL;
4926             bool saved_in_type_id_in_expr_p;
4927
4928             cp_parser_parse_tentatively (parser);
4929             /* Consume the `('.  */
4930             cp_lexer_consume_token (parser->lexer);
4931             /* Parse the type.  */
4932             saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
4933             parser->in_type_id_in_expr_p = true;
4934             type = cp_parser_type_id (parser);
4935             parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
4936             /* Look for the `)'.  */
4937             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4938             /* Look for the `{'.  */
4939             cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
4940             /* If things aren't going well, there's no need to
4941                keep going.  */
4942             if (!cp_parser_error_occurred (parser))
4943               {
4944                 bool non_constant_p;
4945                 /* Parse the initializer-list.  */
4946                 initializer_list
4947                   = cp_parser_initializer_list (parser, &non_constant_p);
4948                 /* Allow a trailing `,'.  */
4949                 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
4950                   cp_lexer_consume_token (parser->lexer);
4951                 /* Look for the final `}'.  */
4952                 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
4953               }
4954             /* If that worked, we're definitely looking at a
4955                compound-literal expression.  */
4956             if (cp_parser_parse_definitely (parser))
4957               {
4958                 /* Warn the user that a compound literal is not
4959                    allowed in standard C++.  */
4960                 pedwarn (input_location, OPT_pedantic, "ISO C++ forbids compound-literals");
4961                 /* For simplicity, we disallow compound literals in
4962                    constant-expressions.  We could
4963                    allow compound literals of integer type, whose
4964                    initializer was a constant, in constant
4965                    expressions.  Permitting that usage, as a further
4966                    extension, would not change the meaning of any
4967                    currently accepted programs.  (Of course, as
4968                    compound literals are not part of ISO C++, the
4969                    standard has nothing to say.)  */
4970                 if (cp_parser_non_integral_constant_expression (parser,
4971                                                                 NIC_NCC))
4972                   {
4973                     postfix_expression = error_mark_node;
4974                     break;
4975                   }
4976                 /* Form the representation of the compound-literal.  */
4977                 postfix_expression
4978                   = (finish_compound_literal
4979                      (type, build_constructor (init_list_type_node,
4980                                                initializer_list),
4981                       tf_warning_or_error));
4982                 break;
4983               }
4984           }
4985
4986         /* It must be a primary-expression.  */
4987         postfix_expression
4988           = cp_parser_primary_expression (parser, address_p, cast_p,
4989                                           /*template_arg_p=*/false,
4990                                           &idk);
4991       }
4992       break;
4993     }
4994
4995   /* Keep looping until the postfix-expression is complete.  */
4996   while (true)
4997     {
4998       if (idk == CP_ID_KIND_UNQUALIFIED
4999           && TREE_CODE (postfix_expression) == IDENTIFIER_NODE
5000           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
5001         /* It is not a Koenig lookup function call.  */
5002         postfix_expression
5003           = unqualified_name_lookup_error (postfix_expression);
5004
5005       /* Peek at the next token.  */
5006       token = cp_lexer_peek_token (parser->lexer);
5007
5008       switch (token->type)
5009         {
5010         case CPP_OPEN_SQUARE:
5011           postfix_expression
5012             = cp_parser_postfix_open_square_expression (parser,
5013                                                         postfix_expression,
5014                                                         false);
5015           idk = CP_ID_KIND_NONE;
5016           is_member_access = false;
5017           break;
5018
5019         case CPP_OPEN_PAREN:
5020           /* postfix-expression ( expression-list [opt] ) */
5021           {
5022             bool koenig_p;
5023             bool is_builtin_constant_p;
5024             bool saved_integral_constant_expression_p = false;
5025             bool saved_non_integral_constant_expression_p = false;
5026             VEC(tree,gc) *args;
5027
5028             is_member_access = false;
5029
5030             is_builtin_constant_p
5031               = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
5032             if (is_builtin_constant_p)
5033               {
5034                 /* The whole point of __builtin_constant_p is to allow
5035                    non-constant expressions to appear as arguments.  */
5036                 saved_integral_constant_expression_p
5037                   = parser->integral_constant_expression_p;
5038                 saved_non_integral_constant_expression_p
5039                   = parser->non_integral_constant_expression_p;
5040                 parser->integral_constant_expression_p = false;
5041               }
5042             args = (cp_parser_parenthesized_expression_list
5043                     (parser, non_attr,
5044                      /*cast_p=*/false, /*allow_expansion_p=*/true,
5045                      /*non_constant_p=*/NULL));
5046             if (is_builtin_constant_p)
5047               {
5048                 parser->integral_constant_expression_p
5049                   = saved_integral_constant_expression_p;
5050                 parser->non_integral_constant_expression_p
5051                   = saved_non_integral_constant_expression_p;
5052               }
5053
5054             if (args == NULL)
5055               {
5056                 postfix_expression = error_mark_node;
5057                 break;
5058               }
5059
5060             /* Function calls are not permitted in
5061                constant-expressions.  */
5062             if (! builtin_valid_in_constant_expr_p (postfix_expression)
5063                 && cp_parser_non_integral_constant_expression (parser,
5064                                                                NIC_FUNC_CALL))
5065               {
5066                 postfix_expression = error_mark_node;
5067                 release_tree_vector (args);
5068                 break;
5069               }
5070
5071             koenig_p = false;
5072             if (idk == CP_ID_KIND_UNQUALIFIED
5073                 || idk == CP_ID_KIND_TEMPLATE_ID)
5074               {
5075                 if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
5076                   {
5077                     if (!VEC_empty (tree, args))
5078                       {
5079                         koenig_p = true;
5080                         if (!any_type_dependent_arguments_p (args))
5081                           postfix_expression
5082                             = perform_koenig_lookup (postfix_expression, args,
5083                                                      /*include_std=*/false,
5084                                                      tf_warning_or_error);
5085                       }
5086                     else
5087                       postfix_expression
5088                         = unqualified_fn_lookup_error (postfix_expression);
5089                   }
5090                 /* We do not perform argument-dependent lookup if
5091                    normal lookup finds a non-function, in accordance
5092                    with the expected resolution of DR 218.  */
5093                 else if (!VEC_empty (tree, args)
5094                          && is_overloaded_fn (postfix_expression))
5095                   {
5096                     tree fn = get_first_fn (postfix_expression);
5097                     fn = STRIP_TEMPLATE (fn);
5098
5099                     /* Do not do argument dependent lookup if regular
5100                        lookup finds a member function or a block-scope
5101                        function declaration.  [basic.lookup.argdep]/3  */
5102                     if (!DECL_FUNCTION_MEMBER_P (fn)
5103                         && !DECL_LOCAL_FUNCTION_P (fn))
5104                       {
5105                         koenig_p = true;
5106                         if (!any_type_dependent_arguments_p (args))
5107                           postfix_expression
5108                             = perform_koenig_lookup (postfix_expression, args,
5109                                                      /*include_std=*/false,
5110                                                      tf_warning_or_error);
5111                       }
5112                   }
5113               }
5114
5115             if (TREE_CODE (postfix_expression) == COMPONENT_REF)
5116               {
5117                 tree instance = TREE_OPERAND (postfix_expression, 0);
5118                 tree fn = TREE_OPERAND (postfix_expression, 1);
5119
5120                 if (processing_template_decl
5121                     && (type_dependent_expression_p (instance)
5122                         || (!BASELINK_P (fn)
5123                             && TREE_CODE (fn) != FIELD_DECL)
5124                         || type_dependent_expression_p (fn)
5125                         || any_type_dependent_arguments_p (args)))
5126                   {
5127                     postfix_expression
5128                       = build_nt_call_vec (postfix_expression, args);
5129                     release_tree_vector (args);
5130                     break;
5131                   }
5132
5133                 if (BASELINK_P (fn))
5134                   {
5135                   postfix_expression
5136                     = (build_new_method_call
5137                        (instance, fn, &args, NULL_TREE,
5138                         (idk == CP_ID_KIND_QUALIFIED
5139                          ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
5140                          : LOOKUP_NORMAL),
5141                         /*fn_p=*/NULL,
5142                         tf_warning_or_error));
5143                   }
5144                 else
5145                   postfix_expression
5146                     = finish_call_expr (postfix_expression, &args,
5147                                         /*disallow_virtual=*/false,
5148                                         /*koenig_p=*/false,
5149                                         tf_warning_or_error);
5150               }
5151             else if (TREE_CODE (postfix_expression) == OFFSET_REF
5152                      || TREE_CODE (postfix_expression) == MEMBER_REF
5153                      || TREE_CODE (postfix_expression) == DOTSTAR_EXPR)
5154               postfix_expression = (build_offset_ref_call_from_tree
5155                                     (postfix_expression, &args));
5156             else if (idk == CP_ID_KIND_QUALIFIED)
5157               /* A call to a static class member, or a namespace-scope
5158                  function.  */
5159               postfix_expression
5160                 = finish_call_expr (postfix_expression, &args,
5161                                     /*disallow_virtual=*/true,
5162                                     koenig_p,
5163                                     tf_warning_or_error);
5164             else
5165               /* All other function calls.  */
5166               postfix_expression
5167                 = finish_call_expr (postfix_expression, &args,
5168                                     /*disallow_virtual=*/false,
5169                                     koenig_p,
5170                                     tf_warning_or_error);
5171
5172             /* The POSTFIX_EXPRESSION is certainly no longer an id.  */
5173             idk = CP_ID_KIND_NONE;
5174
5175             release_tree_vector (args);
5176           }
5177           break;
5178
5179         case CPP_DOT:
5180         case CPP_DEREF:
5181           /* postfix-expression . template [opt] id-expression
5182              postfix-expression . pseudo-destructor-name
5183              postfix-expression -> template [opt] id-expression
5184              postfix-expression -> pseudo-destructor-name */
5185
5186           /* Consume the `.' or `->' operator.  */
5187           cp_lexer_consume_token (parser->lexer);
5188
5189           postfix_expression
5190             = cp_parser_postfix_dot_deref_expression (parser, token->type,
5191                                                       postfix_expression,
5192                                                       false, &idk,
5193                                                       token->location);
5194
5195           is_member_access = true;
5196           break;
5197
5198         case CPP_PLUS_PLUS:
5199           /* postfix-expression ++  */
5200           /* Consume the `++' token.  */
5201           cp_lexer_consume_token (parser->lexer);
5202           /* Generate a representation for the complete expression.  */
5203           postfix_expression
5204             = finish_increment_expr (postfix_expression,
5205                                      POSTINCREMENT_EXPR);
5206           /* Increments may not appear in constant-expressions.  */
5207           if (cp_parser_non_integral_constant_expression (parser, NIC_INC))
5208             postfix_expression = error_mark_node;
5209           idk = CP_ID_KIND_NONE;
5210           is_member_access = false;
5211           break;
5212
5213         case CPP_MINUS_MINUS:
5214           /* postfix-expression -- */
5215           /* Consume the `--' token.  */
5216           cp_lexer_consume_token (parser->lexer);
5217           /* Generate a representation for the complete expression.  */
5218           postfix_expression
5219             = finish_increment_expr (postfix_expression,
5220                                      POSTDECREMENT_EXPR);
5221           /* Decrements may not appear in constant-expressions.  */
5222           if (cp_parser_non_integral_constant_expression (parser, NIC_DEC))
5223             postfix_expression = error_mark_node;
5224           idk = CP_ID_KIND_NONE;
5225           is_member_access = false;
5226           break;
5227
5228         default:
5229           if (pidk_return != NULL)
5230             * pidk_return = idk;
5231           if (member_access_only_p)
5232             return is_member_access? postfix_expression : error_mark_node;
5233           else
5234             return postfix_expression;
5235         }
5236     }
5237
5238   /* We should never get here.  */
5239   gcc_unreachable ();
5240   return error_mark_node;
5241 }
5242
5243 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
5244    by cp_parser_builtin_offsetof.  We're looking for
5245
5246      postfix-expression [ expression ]
5247
5248    FOR_OFFSETOF is set if we're being called in that context, which
5249    changes how we deal with integer constant expressions.  */
5250
5251 static tree
5252 cp_parser_postfix_open_square_expression (cp_parser *parser,
5253                                           tree postfix_expression,
5254                                           bool for_offsetof)
5255 {
5256   tree index;
5257
5258   /* Consume the `[' token.  */
5259   cp_lexer_consume_token (parser->lexer);
5260
5261   /* Parse the index expression.  */
5262   /* ??? For offsetof, there is a question of what to allow here.  If
5263      offsetof is not being used in an integral constant expression context,
5264      then we *could* get the right answer by computing the value at runtime.
5265      If we are in an integral constant expression context, then we might
5266      could accept any constant expression; hard to say without analysis.
5267      Rather than open the barn door too wide right away, allow only integer
5268      constant expressions here.  */
5269   if (for_offsetof)
5270     index = cp_parser_constant_expression (parser, false, NULL);
5271   else
5272     index = cp_parser_expression (parser, /*cast_p=*/false, NULL);
5273
5274   /* Look for the closing `]'.  */
5275   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
5276
5277   /* Build the ARRAY_REF.  */
5278   postfix_expression = grok_array_decl (postfix_expression, index);
5279
5280   /* When not doing offsetof, array references are not permitted in
5281      constant-expressions.  */
5282   if (!for_offsetof
5283       && (cp_parser_non_integral_constant_expression (parser, NIC_ARRAY_REF)))
5284     postfix_expression = error_mark_node;
5285
5286   return postfix_expression;
5287 }
5288
5289 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
5290    by cp_parser_builtin_offsetof.  We're looking for
5291
5292      postfix-expression . template [opt] id-expression
5293      postfix-expression . pseudo-destructor-name
5294      postfix-expression -> template [opt] id-expression
5295      postfix-expression -> pseudo-destructor-name
5296
5297    FOR_OFFSETOF is set if we're being called in that context.  That sorta
5298    limits what of the above we'll actually accept, but nevermind.
5299    TOKEN_TYPE is the "." or "->" token, which will already have been
5300    removed from the stream.  */
5301
5302 static tree
5303 cp_parser_postfix_dot_deref_expression (cp_parser *parser,
5304                                         enum cpp_ttype token_type,
5305                                         tree postfix_expression,
5306                                         bool for_offsetof, cp_id_kind *idk,
5307                                         location_t location)
5308 {
5309   tree name;
5310   bool dependent_p;
5311   bool pseudo_destructor_p;
5312   tree scope = NULL_TREE;
5313
5314   /* If this is a `->' operator, dereference the pointer.  */
5315   if (token_type == CPP_DEREF)
5316     postfix_expression = build_x_arrow (postfix_expression);
5317   /* Check to see whether or not the expression is type-dependent.  */
5318   dependent_p = type_dependent_expression_p (postfix_expression);
5319   /* The identifier following the `->' or `.' is not qualified.  */
5320   parser->scope = NULL_TREE;
5321   parser->qualifying_scope = NULL_TREE;
5322   parser->object_scope = NULL_TREE;
5323   *idk = CP_ID_KIND_NONE;
5324
5325   /* Enter the scope corresponding to the type of the object
5326      given by the POSTFIX_EXPRESSION.  */
5327   if (!dependent_p && TREE_TYPE (postfix_expression) != NULL_TREE)
5328     {
5329       scope = TREE_TYPE (postfix_expression);
5330       /* According to the standard, no expression should ever have
5331          reference type.  Unfortunately, we do not currently match
5332          the standard in this respect in that our internal representation
5333          of an expression may have reference type even when the standard
5334          says it does not.  Therefore, we have to manually obtain the
5335          underlying type here.  */
5336       scope = non_reference (scope);
5337       /* The type of the POSTFIX_EXPRESSION must be complete.  */
5338       if (scope == unknown_type_node)
5339         {
5340           error_at (location, "%qE does not have class type",
5341                     postfix_expression);
5342           scope = NULL_TREE;
5343         }
5344       /* Unlike the object expression in other contexts, *this is not
5345          required to be of complete type for purposes of class member
5346          access (5.2.5) outside the member function body.  */
5347       else if (scope != current_class_ref
5348                && !(processing_template_decl && scope == current_class_type))
5349         scope = complete_type_or_else (scope, NULL_TREE);
5350       /* Let the name lookup machinery know that we are processing a
5351          class member access expression.  */
5352       parser->context->object_type = scope;
5353       /* If something went wrong, we want to be able to discern that case,
5354          as opposed to the case where there was no SCOPE due to the type
5355          of expression being dependent.  */
5356       if (!scope)
5357         scope = error_mark_node;
5358       /* If the SCOPE was erroneous, make the various semantic analysis
5359          functions exit quickly -- and without issuing additional error
5360          messages.  */
5361       if (scope == error_mark_node)
5362         postfix_expression = error_mark_node;
5363     }
5364
5365   /* Assume this expression is not a pseudo-destructor access.  */
5366   pseudo_destructor_p = false;
5367
5368   /* If the SCOPE is a scalar type, then, if this is a valid program,
5369      we must be looking at a pseudo-destructor-name.  If POSTFIX_EXPRESSION
5370      is type dependent, it can be pseudo-destructor-name or something else.
5371      Try to parse it as pseudo-destructor-name first.  */
5372   if ((scope && SCALAR_TYPE_P (scope)) || dependent_p)
5373     {
5374       tree s;
5375       tree type;
5376
5377       cp_parser_parse_tentatively (parser);
5378       /* Parse the pseudo-destructor-name.  */
5379       s = NULL_TREE;
5380       cp_parser_pseudo_destructor_name (parser, &s, &type);
5381       if (dependent_p
5382           && (cp_parser_error_occurred (parser)
5383               || TREE_CODE (type) != TYPE_DECL
5384               || !SCALAR_TYPE_P (TREE_TYPE (type))))
5385         cp_parser_abort_tentative_parse (parser);
5386       else if (cp_parser_parse_definitely (parser))
5387         {
5388           pseudo_destructor_p = true;
5389           postfix_expression
5390             = finish_pseudo_destructor_expr (postfix_expression,
5391                                              s, TREE_TYPE (type));
5392         }
5393     }
5394
5395   if (!pseudo_destructor_p)
5396     {
5397       /* If the SCOPE is not a scalar type, we are looking at an
5398          ordinary class member access expression, rather than a
5399          pseudo-destructor-name.  */
5400       bool template_p;
5401       cp_token *token = cp_lexer_peek_token (parser->lexer);
5402       /* Parse the id-expression.  */
5403       name = (cp_parser_id_expression
5404               (parser,
5405                cp_parser_optional_template_keyword (parser),
5406                /*check_dependency_p=*/true,
5407                &template_p,
5408                /*declarator_p=*/false,
5409                /*optional_p=*/false));
5410       /* In general, build a SCOPE_REF if the member name is qualified.
5411          However, if the name was not dependent and has already been
5412          resolved; there is no need to build the SCOPE_REF.  For example;
5413
5414              struct X { void f(); };
5415              template <typename T> void f(T* t) { t->X::f(); }
5416
5417          Even though "t" is dependent, "X::f" is not and has been resolved
5418          to a BASELINK; there is no need to include scope information.  */
5419
5420       /* But we do need to remember that there was an explicit scope for
5421          virtual function calls.  */
5422       if (parser->scope)
5423         *idk = CP_ID_KIND_QUALIFIED;
5424
5425       /* If the name is a template-id that names a type, we will get a
5426          TYPE_DECL here.  That is invalid code.  */
5427       if (TREE_CODE (name) == TYPE_DECL)
5428         {
5429           error_at (token->location, "invalid use of %qD", name);
5430           postfix_expression = error_mark_node;
5431         }
5432       else
5433         {
5434           if (name != error_mark_node && !BASELINK_P (name) && parser->scope)
5435             {
5436               name = build_qualified_name (/*type=*/NULL_TREE,
5437                                            parser->scope,
5438                                            name,
5439                                            template_p);
5440               parser->scope = NULL_TREE;
5441               parser->qualifying_scope = NULL_TREE;
5442               parser->object_scope = NULL_TREE;
5443             }
5444           if (scope && name && BASELINK_P (name))
5445             adjust_result_of_qualified_name_lookup
5446               (name, BINFO_TYPE (BASELINK_ACCESS_BINFO (name)), scope);
5447           postfix_expression
5448             = finish_class_member_access_expr (postfix_expression, name,
5449                                                template_p, 
5450                                                tf_warning_or_error);
5451         }
5452     }
5453
5454   /* We no longer need to look up names in the scope of the object on
5455      the left-hand side of the `.' or `->' operator.  */
5456   parser->context->object_type = NULL_TREE;
5457
5458   /* Outside of offsetof, these operators may not appear in
5459      constant-expressions.  */
5460   if (!for_offsetof
5461       && (cp_parser_non_integral_constant_expression
5462           (parser, token_type == CPP_DEREF ? NIC_ARROW : NIC_POINT)))
5463     postfix_expression = error_mark_node;
5464
5465   return postfix_expression;
5466 }
5467
5468 /* Parse a parenthesized expression-list.
5469
5470    expression-list:
5471      assignment-expression
5472      expression-list, assignment-expression
5473
5474    attribute-list:
5475      expression-list
5476      identifier
5477      identifier, expression-list
5478
5479    CAST_P is true if this expression is the target of a cast.
5480
5481    ALLOW_EXPANSION_P is true if this expression allows expansion of an
5482    argument pack.
5483
5484    Returns a vector of trees.  Each element is a representation of an
5485    assignment-expression.  NULL is returned if the ( and or ) are
5486    missing.  An empty, but allocated, vector is returned on no
5487    expressions.  The parentheses are eaten.  IS_ATTRIBUTE_LIST is id_attr
5488    if we are parsing an attribute list for an attribute that wants a
5489    plain identifier argument, normal_attr for an attribute that wants
5490    an expression, or non_attr if we aren't parsing an attribute list.  If
5491    NON_CONSTANT_P is non-NULL, *NON_CONSTANT_P indicates whether or
5492    not all of the expressions in the list were constant.  */
5493
5494 static VEC(tree,gc) *
5495 cp_parser_parenthesized_expression_list (cp_parser* parser,
5496                                          int is_attribute_list,
5497                                          bool cast_p,
5498                                          bool allow_expansion_p,
5499                                          bool *non_constant_p)
5500 {
5501   VEC(tree,gc) *expression_list;
5502   bool fold_expr_p = is_attribute_list != non_attr;
5503   tree identifier = NULL_TREE;
5504   bool saved_greater_than_is_operator_p;
5505
5506   /* Assume all the expressions will be constant.  */
5507   if (non_constant_p)
5508     *non_constant_p = false;
5509
5510   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
5511     return NULL;
5512
5513   expression_list = make_tree_vector ();
5514
5515   /* Within a parenthesized expression, a `>' token is always
5516      the greater-than operator.  */
5517   saved_greater_than_is_operator_p
5518     = parser->greater_than_is_operator_p;
5519   parser->greater_than_is_operator_p = true;
5520
5521   /* Consume expressions until there are no more.  */
5522   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
5523     while (true)
5524       {
5525         tree expr;
5526
5527         /* At the beginning of attribute lists, check to see if the
5528            next token is an identifier.  */
5529         if (is_attribute_list == id_attr
5530             && cp_lexer_peek_token (parser->lexer)->type == CPP_NAME)
5531           {
5532             cp_token *token;
5533
5534             /* Consume the identifier.  */
5535             token = cp_lexer_consume_token (parser->lexer);
5536             /* Save the identifier.  */
5537             identifier = token->u.value;
5538           }
5539         else
5540           {
5541             bool expr_non_constant_p;
5542
5543             /* Parse the next assignment-expression.  */
5544             if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
5545               {
5546                 /* A braced-init-list.  */
5547                 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
5548                 expr = cp_parser_braced_list (parser, &expr_non_constant_p);
5549                 if (non_constant_p && expr_non_constant_p)
5550                   *non_constant_p = true;
5551               }
5552             else if (non_constant_p)
5553               {
5554                 expr = (cp_parser_constant_expression
5555                         (parser, /*allow_non_constant_p=*/true,
5556                          &expr_non_constant_p));
5557                 if (expr_non_constant_p)
5558                   *non_constant_p = true;
5559               }
5560             else
5561               expr = cp_parser_assignment_expression (parser, cast_p, NULL);
5562
5563             if (fold_expr_p)
5564               expr = fold_non_dependent_expr (expr);
5565
5566             /* If we have an ellipsis, then this is an expression
5567                expansion.  */
5568             if (allow_expansion_p
5569                 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
5570               {
5571                 /* Consume the `...'.  */
5572                 cp_lexer_consume_token (parser->lexer);
5573
5574                 /* Build the argument pack.  */
5575                 expr = make_pack_expansion (expr);
5576               }
5577
5578              /* Add it to the list.  We add error_mark_node
5579                 expressions to the list, so that we can still tell if
5580                 the correct form for a parenthesized expression-list
5581                 is found. That gives better errors.  */
5582             VEC_safe_push (tree, gc, expression_list, expr);
5583
5584             if (expr == error_mark_node)
5585               goto skip_comma;
5586           }
5587
5588         /* After the first item, attribute lists look the same as
5589            expression lists.  */
5590         is_attribute_list = non_attr;
5591
5592       get_comma:;
5593         /* If the next token isn't a `,', then we are done.  */
5594         if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
5595           break;
5596
5597         /* Otherwise, consume the `,' and keep going.  */
5598         cp_lexer_consume_token (parser->lexer);
5599       }
5600
5601   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
5602     {
5603       int ending;
5604
5605     skip_comma:;
5606       /* We try and resync to an unnested comma, as that will give the
5607          user better diagnostics.  */
5608       ending = cp_parser_skip_to_closing_parenthesis (parser,
5609                                                       /*recovering=*/true,
5610                                                       /*or_comma=*/true,
5611                                                       /*consume_paren=*/true);
5612       if (ending < 0)
5613         goto get_comma;
5614       if (!ending)
5615         {
5616           parser->greater_than_is_operator_p
5617             = saved_greater_than_is_operator_p;
5618           return NULL;
5619         }
5620     }
5621
5622   parser->greater_than_is_operator_p
5623     = saved_greater_than_is_operator_p;
5624
5625   if (identifier)
5626     VEC_safe_insert (tree, gc, expression_list, 0, identifier);
5627
5628   return expression_list;
5629 }
5630
5631 /* Parse a pseudo-destructor-name.
5632
5633    pseudo-destructor-name:
5634      :: [opt] nested-name-specifier [opt] type-name :: ~ type-name
5635      :: [opt] nested-name-specifier template template-id :: ~ type-name
5636      :: [opt] nested-name-specifier [opt] ~ type-name
5637
5638    If either of the first two productions is used, sets *SCOPE to the
5639    TYPE specified before the final `::'.  Otherwise, *SCOPE is set to
5640    NULL_TREE.  *TYPE is set to the TYPE_DECL for the final type-name,
5641    or ERROR_MARK_NODE if the parse fails.  */
5642
5643 static void
5644 cp_parser_pseudo_destructor_name (cp_parser* parser,
5645                                   tree* scope,
5646                                   tree* type)
5647 {
5648   bool nested_name_specifier_p;
5649
5650   /* Assume that things will not work out.  */
5651   *type = error_mark_node;
5652
5653   /* Look for the optional `::' operator.  */
5654   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
5655   /* Look for the optional nested-name-specifier.  */
5656   nested_name_specifier_p
5657     = (cp_parser_nested_name_specifier_opt (parser,
5658                                             /*typename_keyword_p=*/false,
5659                                             /*check_dependency_p=*/true,
5660                                             /*type_p=*/false,
5661                                             /*is_declaration=*/false)
5662        != NULL_TREE);
5663   /* Now, if we saw a nested-name-specifier, we might be doing the
5664      second production.  */
5665   if (nested_name_specifier_p
5666       && cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
5667     {
5668       /* Consume the `template' keyword.  */
5669       cp_lexer_consume_token (parser->lexer);
5670       /* Parse the template-id.  */
5671       cp_parser_template_id (parser,
5672                              /*template_keyword_p=*/true,
5673                              /*check_dependency_p=*/false,
5674                              /*is_declaration=*/true);
5675       /* Look for the `::' token.  */
5676       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
5677     }
5678   /* If the next token is not a `~', then there might be some
5679      additional qualification.  */
5680   else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL))
5681     {
5682       /* At this point, we're looking for "type-name :: ~".  The type-name
5683          must not be a class-name, since this is a pseudo-destructor.  So,
5684          it must be either an enum-name, or a typedef-name -- both of which
5685          are just identifiers.  So, we peek ahead to check that the "::"
5686          and "~" tokens are present; if they are not, then we can avoid
5687          calling type_name.  */
5688       if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME
5689           || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE
5690           || cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_COMPL)
5691         {
5692           cp_parser_error (parser, "non-scalar type");
5693           return;
5694         }
5695
5696       /* Look for the type-name.  */
5697       *scope = TREE_TYPE (cp_parser_nonclass_name (parser));
5698       if (*scope == error_mark_node)
5699         return;
5700
5701       /* Look for the `::' token.  */
5702       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
5703     }
5704   else
5705     *scope = NULL_TREE;
5706
5707   /* Look for the `~'.  */
5708   cp_parser_require (parser, CPP_COMPL, RT_COMPL);
5709
5710   /* Once we see the ~, this has to be a pseudo-destructor.  */
5711   if (!processing_template_decl && !cp_parser_error_occurred (parser))
5712     cp_parser_commit_to_tentative_parse (parser);
5713
5714   /* Look for the type-name again.  We are not responsible for
5715      checking that it matches the first type-name.  */
5716   *type = cp_parser_nonclass_name (parser);
5717 }
5718
5719 /* Parse a unary-expression.
5720
5721    unary-expression:
5722      postfix-expression
5723      ++ cast-expression
5724      -- cast-expression
5725      unary-operator cast-expression
5726      sizeof unary-expression
5727      sizeof ( type-id )
5728      alignof ( type-id )  [C++0x]
5729      new-expression
5730      delete-expression
5731
5732    GNU Extensions:
5733
5734    unary-expression:
5735      __extension__ cast-expression
5736      __alignof__ unary-expression
5737      __alignof__ ( type-id )
5738      alignof unary-expression  [C++0x]
5739      __real__ cast-expression
5740      __imag__ cast-expression
5741      && identifier
5742
5743    ADDRESS_P is true iff the unary-expression is appearing as the
5744    operand of the `&' operator.   CAST_P is true if this expression is
5745    the target of a cast.
5746
5747    Returns a representation of the expression.  */
5748
5749 static tree
5750 cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p,
5751                             cp_id_kind * pidk)
5752 {
5753   cp_token *token;
5754   enum tree_code unary_operator;
5755
5756   /* Peek at the next token.  */
5757   token = cp_lexer_peek_token (parser->lexer);
5758   /* Some keywords give away the kind of expression.  */
5759   if (token->type == CPP_KEYWORD)
5760     {
5761       enum rid keyword = token->keyword;
5762
5763       switch (keyword)
5764         {
5765         case RID_ALIGNOF:
5766         case RID_SIZEOF:
5767           {
5768             tree operand;
5769             enum tree_code op;
5770
5771             op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
5772             /* Consume the token.  */
5773             cp_lexer_consume_token (parser->lexer);
5774             /* Parse the operand.  */
5775             operand = cp_parser_sizeof_operand (parser, keyword);
5776
5777             if (TYPE_P (operand))
5778               return cxx_sizeof_or_alignof_type (operand, op, true);
5779             else
5780               {
5781                 /* ISO C++ defines alignof only with types, not with
5782                    expressions. So pedwarn if alignof is used with a non-
5783                    type expression. However, __alignof__ is ok.  */
5784                 if (!strcmp (IDENTIFIER_POINTER (token->u.value), "alignof"))
5785                   pedwarn (token->location, OPT_pedantic,
5786                            "ISO C++ does not allow %<alignof%> "
5787                            "with a non-type");
5788
5789                 return cxx_sizeof_or_alignof_expr (operand, op, true);
5790               }
5791           }
5792
5793         case RID_NEW:
5794           return cp_parser_new_expression (parser);
5795
5796         case RID_DELETE:
5797           return cp_parser_delete_expression (parser);
5798
5799         case RID_EXTENSION:
5800           {
5801             /* The saved value of the PEDANTIC flag.  */
5802             int saved_pedantic;
5803             tree expr;
5804
5805             /* Save away the PEDANTIC flag.  */
5806             cp_parser_extension_opt (parser, &saved_pedantic);
5807             /* Parse the cast-expression.  */
5808             expr = cp_parser_simple_cast_expression (parser);
5809             /* Restore the PEDANTIC flag.  */
5810             pedantic = saved_pedantic;
5811
5812             return expr;
5813           }
5814
5815         case RID_REALPART:
5816         case RID_IMAGPART:
5817           {
5818             tree expression;
5819
5820             /* Consume the `__real__' or `__imag__' token.  */
5821             cp_lexer_consume_token (parser->lexer);
5822             /* Parse the cast-expression.  */
5823             expression = cp_parser_simple_cast_expression (parser);
5824             /* Create the complete representation.  */
5825             return build_x_unary_op ((keyword == RID_REALPART
5826                                       ? REALPART_EXPR : IMAGPART_EXPR),
5827                                      expression,
5828                                      tf_warning_or_error);
5829           }
5830           break;
5831
5832         case RID_NOEXCEPT:
5833           {
5834             tree expr;
5835             const char *saved_message;
5836             bool saved_integral_constant_expression_p;
5837             bool saved_non_integral_constant_expression_p;
5838             bool saved_greater_than_is_operator_p;
5839
5840             cp_lexer_consume_token (parser->lexer);
5841             cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
5842
5843             saved_message = parser->type_definition_forbidden_message;
5844             parser->type_definition_forbidden_message
5845               = G_("types may not be defined in %<noexcept%> expressions");
5846
5847             saved_integral_constant_expression_p
5848               = parser->integral_constant_expression_p;
5849             saved_non_integral_constant_expression_p
5850               = parser->non_integral_constant_expression_p;
5851             parser->integral_constant_expression_p = false;
5852
5853             saved_greater_than_is_operator_p
5854               = parser->greater_than_is_operator_p;
5855             parser->greater_than_is_operator_p = true;
5856
5857             ++cp_unevaluated_operand;
5858             ++c_inhibit_evaluation_warnings;
5859             expr = cp_parser_expression (parser, false, NULL);
5860             --c_inhibit_evaluation_warnings;
5861             --cp_unevaluated_operand;
5862
5863             parser->greater_than_is_operator_p
5864               = saved_greater_than_is_operator_p;
5865
5866             parser->integral_constant_expression_p
5867               = saved_integral_constant_expression_p;
5868             parser->non_integral_constant_expression_p
5869               = saved_non_integral_constant_expression_p;
5870
5871             parser->type_definition_forbidden_message = saved_message;
5872
5873             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
5874             return finish_noexcept_expr (expr, tf_warning_or_error);
5875           }
5876
5877         default:
5878           break;
5879         }
5880     }
5881
5882   /* Look for the `:: new' and `:: delete', which also signal the
5883      beginning of a new-expression, or delete-expression,
5884      respectively.  If the next token is `::', then it might be one of
5885      these.  */
5886   if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
5887     {
5888       enum rid keyword;
5889
5890       /* See if the token after the `::' is one of the keywords in
5891          which we're interested.  */
5892       keyword = cp_lexer_peek_nth_token (parser->lexer, 2)->keyword;
5893       /* If it's `new', we have a new-expression.  */
5894       if (keyword == RID_NEW)
5895         return cp_parser_new_expression (parser);
5896       /* Similarly, for `delete'.  */
5897       else if (keyword == RID_DELETE)
5898         return cp_parser_delete_expression (parser);
5899     }
5900
5901   /* Look for a unary operator.  */
5902   unary_operator = cp_parser_unary_operator (token);
5903   /* The `++' and `--' operators can be handled similarly, even though
5904      they are not technically unary-operators in the grammar.  */
5905   if (unary_operator == ERROR_MARK)
5906     {
5907       if (token->type == CPP_PLUS_PLUS)
5908         unary_operator = PREINCREMENT_EXPR;
5909       else if (token->type == CPP_MINUS_MINUS)
5910         unary_operator = PREDECREMENT_EXPR;
5911       /* Handle the GNU address-of-label extension.  */
5912       else if (cp_parser_allow_gnu_extensions_p (parser)
5913                && token->type == CPP_AND_AND)
5914         {
5915           tree identifier;
5916           tree expression;
5917           location_t loc = cp_lexer_peek_token (parser->lexer)->location;
5918
5919           /* Consume the '&&' token.  */
5920           cp_lexer_consume_token (parser->lexer);
5921           /* Look for the identifier.  */
5922           identifier = cp_parser_identifier (parser);
5923           /* Create an expression representing the address.  */
5924           expression = finish_label_address_expr (identifier, loc);
5925           if (cp_parser_non_integral_constant_expression (parser,
5926                                                           NIC_ADDR_LABEL))
5927             expression = error_mark_node;
5928           return expression;
5929         }
5930     }
5931   if (unary_operator != ERROR_MARK)
5932     {
5933       tree cast_expression;
5934       tree expression = error_mark_node;
5935       non_integral_constant non_constant_p = NIC_NONE;
5936
5937       /* Consume the operator token.  */
5938       token = cp_lexer_consume_token (parser->lexer);
5939       /* Parse the cast-expression.  */
5940       cast_expression
5941         = cp_parser_cast_expression (parser,
5942                                      unary_operator == ADDR_EXPR,
5943                                      /*cast_p=*/false, pidk);
5944       /* Now, build an appropriate representation.  */
5945       switch (unary_operator)
5946         {
5947         case INDIRECT_REF:
5948           non_constant_p = NIC_STAR;
5949           expression = build_x_indirect_ref (cast_expression, RO_UNARY_STAR,
5950                                              tf_warning_or_error);
5951           break;
5952
5953         case ADDR_EXPR:
5954            non_constant_p = NIC_ADDR;
5955           /* Fall through.  */
5956         case BIT_NOT_EXPR:
5957           expression = build_x_unary_op (unary_operator, cast_expression,
5958                                          tf_warning_or_error);
5959           break;
5960
5961         case PREINCREMENT_EXPR:
5962         case PREDECREMENT_EXPR:
5963           non_constant_p = unary_operator == PREINCREMENT_EXPR
5964                            ? NIC_PREINCREMENT : NIC_PREDECREMENT;
5965           /* Fall through.  */
5966         case UNARY_PLUS_EXPR:
5967         case NEGATE_EXPR:
5968         case TRUTH_NOT_EXPR:
5969           expression = finish_unary_op_expr (unary_operator, cast_expression);
5970           break;
5971
5972         default:
5973           gcc_unreachable ();
5974         }
5975
5976       if (non_constant_p != NIC_NONE
5977           && cp_parser_non_integral_constant_expression (parser,
5978                                                          non_constant_p))
5979         expression = error_mark_node;
5980
5981       return expression;
5982     }
5983
5984   return cp_parser_postfix_expression (parser, address_p, cast_p,
5985                                        /*member_access_only_p=*/false,
5986                                        pidk);
5987 }
5988
5989 /* Returns ERROR_MARK if TOKEN is not a unary-operator.  If TOKEN is a
5990    unary-operator, the corresponding tree code is returned.  */
5991
5992 static enum tree_code
5993 cp_parser_unary_operator (cp_token* token)
5994 {
5995   switch (token->type)
5996     {
5997     case CPP_MULT:
5998       return INDIRECT_REF;
5999
6000     case CPP_AND:
6001       return ADDR_EXPR;
6002
6003     case CPP_PLUS:
6004       return UNARY_PLUS_EXPR;
6005
6006     case CPP_MINUS:
6007       return NEGATE_EXPR;
6008
6009     case CPP_NOT:
6010       return TRUTH_NOT_EXPR;
6011
6012     case CPP_COMPL:
6013       return BIT_NOT_EXPR;
6014
6015     default:
6016       return ERROR_MARK;
6017     }
6018 }
6019
6020 /* Parse a new-expression.
6021
6022    new-expression:
6023      :: [opt] new new-placement [opt] new-type-id new-initializer [opt]
6024      :: [opt] new new-placement [opt] ( type-id ) new-initializer [opt]
6025
6026    Returns a representation of the expression.  */
6027
6028 static tree
6029 cp_parser_new_expression (cp_parser* parser)
6030 {
6031   bool global_scope_p;
6032   VEC(tree,gc) *placement;
6033   tree type;
6034   VEC(tree,gc) *initializer;
6035   tree nelts;
6036   tree ret;
6037
6038   /* Look for the optional `::' operator.  */
6039   global_scope_p
6040     = (cp_parser_global_scope_opt (parser,
6041                                    /*current_scope_valid_p=*/false)
6042        != NULL_TREE);
6043   /* Look for the `new' operator.  */
6044   cp_parser_require_keyword (parser, RID_NEW, RT_NEW);
6045   /* There's no easy way to tell a new-placement from the
6046      `( type-id )' construct.  */
6047   cp_parser_parse_tentatively (parser);
6048   /* Look for a new-placement.  */
6049   placement = cp_parser_new_placement (parser);
6050   /* If that didn't work out, there's no new-placement.  */
6051   if (!cp_parser_parse_definitely (parser))
6052     {
6053       if (placement != NULL)
6054         release_tree_vector (placement);
6055       placement = NULL;
6056     }
6057
6058   /* If the next token is a `(', then we have a parenthesized
6059      type-id.  */
6060   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
6061     {
6062       cp_token *token;
6063       /* Consume the `('.  */
6064       cp_lexer_consume_token (parser->lexer);
6065       /* Parse the type-id.  */
6066       type = cp_parser_type_id (parser);
6067       /* Look for the closing `)'.  */
6068       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
6069       token = cp_lexer_peek_token (parser->lexer);
6070       /* There should not be a direct-new-declarator in this production,
6071          but GCC used to allowed this, so we check and emit a sensible error
6072          message for this case.  */
6073       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6074         {
6075           error_at (token->location,
6076                     "array bound forbidden after parenthesized type-id");
6077           inform (token->location, 
6078                   "try removing the parentheses around the type-id");
6079           cp_parser_direct_new_declarator (parser);
6080         }
6081       nelts = NULL_TREE;
6082     }
6083   /* Otherwise, there must be a new-type-id.  */
6084   else
6085     type = cp_parser_new_type_id (parser, &nelts);
6086
6087   /* If the next token is a `(' or '{', then we have a new-initializer.  */
6088   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
6089       || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6090     initializer = cp_parser_new_initializer (parser);
6091   else
6092     initializer = NULL;
6093
6094   /* A new-expression may not appear in an integral constant
6095      expression.  */
6096   if (cp_parser_non_integral_constant_expression (parser, NIC_NEW))
6097     ret = error_mark_node;
6098   else
6099     {
6100       /* Create a representation of the new-expression.  */
6101       ret = build_new (&placement, type, nelts, &initializer, global_scope_p,
6102                        tf_warning_or_error);
6103     }
6104
6105   if (placement != NULL)
6106     release_tree_vector (placement);
6107   if (initializer != NULL)
6108     release_tree_vector (initializer);
6109
6110   return ret;
6111 }
6112
6113 /* Parse a new-placement.
6114
6115    new-placement:
6116      ( expression-list )
6117
6118    Returns the same representation as for an expression-list.  */
6119
6120 static VEC(tree,gc) *
6121 cp_parser_new_placement (cp_parser* parser)
6122 {
6123   VEC(tree,gc) *expression_list;
6124
6125   /* Parse the expression-list.  */
6126   expression_list = (cp_parser_parenthesized_expression_list
6127                      (parser, non_attr, /*cast_p=*/false,
6128                       /*allow_expansion_p=*/true,
6129                       /*non_constant_p=*/NULL));
6130
6131   return expression_list;
6132 }
6133
6134 /* Parse a new-type-id.
6135
6136    new-type-id:
6137      type-specifier-seq new-declarator [opt]
6138
6139    Returns the TYPE allocated.  If the new-type-id indicates an array
6140    type, *NELTS is set to the number of elements in the last array
6141    bound; the TYPE will not include the last array bound.  */
6142
6143 static tree
6144 cp_parser_new_type_id (cp_parser* parser, tree *nelts)
6145 {
6146   cp_decl_specifier_seq type_specifier_seq;
6147   cp_declarator *new_declarator;
6148   cp_declarator *declarator;
6149   cp_declarator *outer_declarator;
6150   const char *saved_message;
6151   tree type;
6152
6153   /* The type-specifier sequence must not contain type definitions.
6154      (It cannot contain declarations of new types either, but if they
6155      are not definitions we will catch that because they are not
6156      complete.)  */
6157   saved_message = parser->type_definition_forbidden_message;
6158   parser->type_definition_forbidden_message
6159     = G_("types may not be defined in a new-type-id");
6160   /* Parse the type-specifier-seq.  */
6161   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
6162                                 /*is_trailing_return=*/false,
6163                                 &type_specifier_seq);
6164   /* Restore the old message.  */
6165   parser->type_definition_forbidden_message = saved_message;
6166   /* Parse the new-declarator.  */
6167   new_declarator = cp_parser_new_declarator_opt (parser);
6168
6169   /* Determine the number of elements in the last array dimension, if
6170      any.  */
6171   *nelts = NULL_TREE;
6172   /* Skip down to the last array dimension.  */
6173   declarator = new_declarator;
6174   outer_declarator = NULL;
6175   while (declarator && (declarator->kind == cdk_pointer
6176                         || declarator->kind == cdk_ptrmem))
6177     {
6178       outer_declarator = declarator;
6179       declarator = declarator->declarator;
6180     }
6181   while (declarator
6182          && declarator->kind == cdk_array
6183          && declarator->declarator
6184          && declarator->declarator->kind == cdk_array)
6185     {
6186       outer_declarator = declarator;
6187       declarator = declarator->declarator;
6188     }
6189
6190   if (declarator && declarator->kind == cdk_array)
6191     {
6192       *nelts = declarator->u.array.bounds;
6193       if (*nelts == error_mark_node)
6194         *nelts = integer_one_node;
6195
6196       if (outer_declarator)
6197         outer_declarator->declarator = declarator->declarator;
6198       else
6199         new_declarator = NULL;
6200     }
6201
6202   type = groktypename (&type_specifier_seq, new_declarator, false);
6203   return type;
6204 }
6205
6206 /* Parse an (optional) new-declarator.
6207
6208    new-declarator:
6209      ptr-operator new-declarator [opt]
6210      direct-new-declarator
6211
6212    Returns the declarator.  */
6213
6214 static cp_declarator *
6215 cp_parser_new_declarator_opt (cp_parser* parser)
6216 {
6217   enum tree_code code;
6218   tree type;
6219   cp_cv_quals cv_quals;
6220
6221   /* We don't know if there's a ptr-operator next, or not.  */
6222   cp_parser_parse_tentatively (parser);
6223   /* Look for a ptr-operator.  */
6224   code = cp_parser_ptr_operator (parser, &type, &cv_quals);
6225   /* If that worked, look for more new-declarators.  */
6226   if (cp_parser_parse_definitely (parser))
6227     {
6228       cp_declarator *declarator;
6229
6230       /* Parse another optional declarator.  */
6231       declarator = cp_parser_new_declarator_opt (parser);
6232
6233       return cp_parser_make_indirect_declarator
6234         (code, type, cv_quals, declarator);
6235     }
6236
6237   /* If the next token is a `[', there is a direct-new-declarator.  */
6238   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6239     return cp_parser_direct_new_declarator (parser);
6240
6241   return NULL;
6242 }
6243
6244 /* Parse a direct-new-declarator.
6245
6246    direct-new-declarator:
6247      [ expression ]
6248      direct-new-declarator [constant-expression]
6249
6250    */
6251
6252 static cp_declarator *
6253 cp_parser_direct_new_declarator (cp_parser* parser)
6254 {
6255   cp_declarator *declarator = NULL;
6256
6257   while (true)
6258     {
6259       tree expression;
6260
6261       /* Look for the opening `['.  */
6262       cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
6263       /* The first expression is not required to be constant.  */
6264       if (!declarator)
6265         {
6266           cp_token *token = cp_lexer_peek_token (parser->lexer);
6267           expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
6268           /* The standard requires that the expression have integral
6269              type.  DR 74 adds enumeration types.  We believe that the
6270              real intent is that these expressions be handled like the
6271              expression in a `switch' condition, which also allows
6272              classes with a single conversion to integral or
6273              enumeration type.  */
6274           if (!processing_template_decl)
6275             {
6276               expression
6277                 = build_expr_type_conversion (WANT_INT | WANT_ENUM,
6278                                               expression,
6279                                               /*complain=*/true);
6280               if (!expression)
6281                 {
6282                   error_at (token->location,
6283                             "expression in new-declarator must have integral "
6284                             "or enumeration type");
6285                   expression = error_mark_node;
6286                 }
6287             }
6288         }
6289       /* But all the other expressions must be.  */
6290       else
6291         expression
6292           = cp_parser_constant_expression (parser,
6293                                            /*allow_non_constant=*/false,
6294                                            NULL);
6295       /* Look for the closing `]'.  */
6296       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6297
6298       /* Add this bound to the declarator.  */
6299       declarator = make_array_declarator (declarator, expression);
6300
6301       /* If the next token is not a `[', then there are no more
6302          bounds.  */
6303       if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
6304         break;
6305     }
6306
6307   return declarator;
6308 }
6309
6310 /* Parse a new-initializer.
6311
6312    new-initializer:
6313      ( expression-list [opt] )
6314      braced-init-list
6315
6316    Returns a representation of the expression-list.  */
6317
6318 static VEC(tree,gc) *
6319 cp_parser_new_initializer (cp_parser* parser)
6320 {
6321   VEC(tree,gc) *expression_list;
6322
6323   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6324     {
6325       tree t;
6326       bool expr_non_constant_p;
6327       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6328       t = cp_parser_braced_list (parser, &expr_non_constant_p);
6329       CONSTRUCTOR_IS_DIRECT_INIT (t) = 1;
6330       expression_list = make_tree_vector_single (t);
6331     }
6332   else
6333     expression_list = (cp_parser_parenthesized_expression_list
6334                        (parser, non_attr, /*cast_p=*/false,
6335                         /*allow_expansion_p=*/true,
6336                         /*non_constant_p=*/NULL));
6337
6338   return expression_list;
6339 }
6340
6341 /* Parse a delete-expression.
6342
6343    delete-expression:
6344      :: [opt] delete cast-expression
6345      :: [opt] delete [ ] cast-expression
6346
6347    Returns a representation of the expression.  */
6348
6349 static tree
6350 cp_parser_delete_expression (cp_parser* parser)
6351 {
6352   bool global_scope_p;
6353   bool array_p;
6354   tree expression;
6355
6356   /* Look for the optional `::' operator.  */
6357   global_scope_p
6358     = (cp_parser_global_scope_opt (parser,
6359                                    /*current_scope_valid_p=*/false)
6360        != NULL_TREE);
6361   /* Look for the `delete' keyword.  */
6362   cp_parser_require_keyword (parser, RID_DELETE, RT_DELETE);
6363   /* See if the array syntax is in use.  */
6364   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6365     {
6366       /* Consume the `[' token.  */
6367       cp_lexer_consume_token (parser->lexer);
6368       /* Look for the `]' token.  */
6369       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6370       /* Remember that this is the `[]' construct.  */
6371       array_p = true;
6372     }
6373   else
6374     array_p = false;
6375
6376   /* Parse the cast-expression.  */
6377   expression = cp_parser_simple_cast_expression (parser);
6378
6379   /* A delete-expression may not appear in an integral constant
6380      expression.  */
6381   if (cp_parser_non_integral_constant_expression (parser, NIC_DEL))
6382     return error_mark_node;
6383
6384   return delete_sanity (expression, NULL_TREE, array_p, global_scope_p,
6385                         tf_warning_or_error);
6386 }
6387
6388 /* Returns true if TOKEN may start a cast-expression and false
6389    otherwise.  */
6390
6391 static bool
6392 cp_parser_token_starts_cast_expression (cp_token *token)
6393 {
6394   switch (token->type)
6395     {
6396     case CPP_COMMA:
6397     case CPP_SEMICOLON:
6398     case CPP_QUERY:
6399     case CPP_COLON:
6400     case CPP_CLOSE_SQUARE:
6401     case CPP_CLOSE_PAREN:
6402     case CPP_CLOSE_BRACE:
6403     case CPP_DOT:
6404     case CPP_DOT_STAR:
6405     case CPP_DEREF:
6406     case CPP_DEREF_STAR:
6407     case CPP_DIV:
6408     case CPP_MOD:
6409     case CPP_LSHIFT:
6410     case CPP_RSHIFT:
6411     case CPP_LESS:
6412     case CPP_GREATER:
6413     case CPP_LESS_EQ:
6414     case CPP_GREATER_EQ:
6415     case CPP_EQ_EQ:
6416     case CPP_NOT_EQ:
6417     case CPP_EQ:
6418     case CPP_MULT_EQ:
6419     case CPP_DIV_EQ:
6420     case CPP_MOD_EQ:
6421     case CPP_PLUS_EQ:
6422     case CPP_MINUS_EQ:
6423     case CPP_RSHIFT_EQ:
6424     case CPP_LSHIFT_EQ:
6425     case CPP_AND_EQ:
6426     case CPP_XOR_EQ:
6427     case CPP_OR_EQ:
6428     case CPP_XOR:
6429     case CPP_OR:
6430     case CPP_OR_OR:
6431     case CPP_EOF:
6432       return false;
6433
6434       /* '[' may start a primary-expression in obj-c++.  */
6435     case CPP_OPEN_SQUARE:
6436       return c_dialect_objc ();
6437
6438     default:
6439       return true;
6440     }
6441 }
6442
6443 /* Parse a cast-expression.
6444
6445    cast-expression:
6446      unary-expression
6447      ( type-id ) cast-expression
6448
6449    ADDRESS_P is true iff the unary-expression is appearing as the
6450    operand of the `&' operator.   CAST_P is true if this expression is
6451    the target of a cast.
6452
6453    Returns a representation of the expression.  */
6454
6455 static tree
6456 cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p,
6457                            cp_id_kind * pidk)
6458 {
6459   /* If it's a `(', then we might be looking at a cast.  */
6460   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
6461     {
6462       tree type = NULL_TREE;
6463       tree expr = NULL_TREE;
6464       bool compound_literal_p;
6465       const char *saved_message;
6466
6467       /* There's no way to know yet whether or not this is a cast.
6468          For example, `(int (3))' is a unary-expression, while `(int)
6469          3' is a cast.  So, we resort to parsing tentatively.  */
6470       cp_parser_parse_tentatively (parser);
6471       /* Types may not be defined in a cast.  */
6472       saved_message = parser->type_definition_forbidden_message;
6473       parser->type_definition_forbidden_message
6474         = G_("types may not be defined in casts");
6475       /* Consume the `('.  */
6476       cp_lexer_consume_token (parser->lexer);
6477       /* A very tricky bit is that `(struct S) { 3 }' is a
6478          compound-literal (which we permit in C++ as an extension).
6479          But, that construct is not a cast-expression -- it is a
6480          postfix-expression.  (The reason is that `(struct S) { 3 }.i'
6481          is legal; if the compound-literal were a cast-expression,
6482          you'd need an extra set of parentheses.)  But, if we parse
6483          the type-id, and it happens to be a class-specifier, then we
6484          will commit to the parse at that point, because we cannot
6485          undo the action that is done when creating a new class.  So,
6486          then we cannot back up and do a postfix-expression.
6487
6488          Therefore, we scan ahead to the closing `)', and check to see
6489          if the token after the `)' is a `{'.  If so, we are not
6490          looking at a cast-expression.
6491
6492          Save tokens so that we can put them back.  */
6493       cp_lexer_save_tokens (parser->lexer);
6494       /* Skip tokens until the next token is a closing parenthesis.
6495          If we find the closing `)', and the next token is a `{', then
6496          we are looking at a compound-literal.  */
6497       compound_literal_p
6498         = (cp_parser_skip_to_closing_parenthesis (parser, false, false,
6499                                                   /*consume_paren=*/true)
6500            && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
6501       /* Roll back the tokens we skipped.  */
6502       cp_lexer_rollback_tokens (parser->lexer);
6503       /* If we were looking at a compound-literal, simulate an error
6504          so that the call to cp_parser_parse_definitely below will
6505          fail.  */
6506       if (compound_literal_p)
6507         cp_parser_simulate_error (parser);
6508       else
6509         {
6510           bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6511           parser->in_type_id_in_expr_p = true;
6512           /* Look for the type-id.  */
6513           type = cp_parser_type_id (parser);
6514           /* Look for the closing `)'.  */
6515           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
6516           parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6517         }
6518
6519       /* Restore the saved message.  */
6520       parser->type_definition_forbidden_message = saved_message;
6521
6522       /* At this point this can only be either a cast or a
6523          parenthesized ctor such as `(T ())' that looks like a cast to
6524          function returning T.  */
6525       if (!cp_parser_error_occurred (parser)
6526           && cp_parser_token_starts_cast_expression (cp_lexer_peek_token
6527                                                      (parser->lexer)))
6528         {
6529           cp_parser_parse_definitely (parser);
6530           expr = cp_parser_cast_expression (parser,
6531                                             /*address_p=*/false,
6532                                             /*cast_p=*/true, pidk);
6533
6534           /* Warn about old-style casts, if so requested.  */
6535           if (warn_old_style_cast
6536               && !in_system_header
6537               && !VOID_TYPE_P (type)
6538               && current_lang_name != lang_name_c)
6539             warning (OPT_Wold_style_cast, "use of old-style cast");
6540
6541           /* Only type conversions to integral or enumeration types
6542              can be used in constant-expressions.  */
6543           if (!cast_valid_in_integral_constant_expression_p (type)
6544               && cp_parser_non_integral_constant_expression (parser,
6545                                                              NIC_CAST))
6546             return error_mark_node;
6547
6548           /* Perform the cast.  */
6549           expr = build_c_cast (input_location, type, expr);
6550           return expr;
6551         }
6552       else 
6553         cp_parser_abort_tentative_parse (parser);
6554     }
6555
6556   /* If we get here, then it's not a cast, so it must be a
6557      unary-expression.  */
6558   return cp_parser_unary_expression (parser, address_p, cast_p, pidk);
6559 }
6560
6561 /* Parse a binary expression of the general form:
6562
6563    pm-expression:
6564      cast-expression
6565      pm-expression .* cast-expression
6566      pm-expression ->* cast-expression
6567
6568    multiplicative-expression:
6569      pm-expression
6570      multiplicative-expression * pm-expression
6571      multiplicative-expression / pm-expression
6572      multiplicative-expression % pm-expression
6573
6574    additive-expression:
6575      multiplicative-expression
6576      additive-expression + multiplicative-expression
6577      additive-expression - multiplicative-expression
6578
6579    shift-expression:
6580      additive-expression
6581      shift-expression << additive-expression
6582      shift-expression >> additive-expression
6583
6584    relational-expression:
6585      shift-expression
6586      relational-expression < shift-expression
6587      relational-expression > shift-expression
6588      relational-expression <= shift-expression
6589      relational-expression >= shift-expression
6590
6591   GNU Extension:
6592
6593    relational-expression:
6594      relational-expression <? shift-expression
6595      relational-expression >? shift-expression
6596
6597    equality-expression:
6598      relational-expression
6599      equality-expression == relational-expression
6600      equality-expression != relational-expression
6601
6602    and-expression:
6603      equality-expression
6604      and-expression & equality-expression
6605
6606    exclusive-or-expression:
6607      and-expression
6608      exclusive-or-expression ^ and-expression
6609
6610    inclusive-or-expression:
6611      exclusive-or-expression
6612      inclusive-or-expression | exclusive-or-expression
6613
6614    logical-and-expression:
6615      inclusive-or-expression
6616      logical-and-expression && inclusive-or-expression
6617
6618    logical-or-expression:
6619      logical-and-expression
6620      logical-or-expression || logical-and-expression
6621
6622    All these are implemented with a single function like:
6623
6624    binary-expression:
6625      simple-cast-expression
6626      binary-expression <token> binary-expression
6627
6628    CAST_P is true if this expression is the target of a cast.
6629
6630    The binops_by_token map is used to get the tree codes for each <token> type.
6631    binary-expressions are associated according to a precedence table.  */
6632
6633 #define TOKEN_PRECEDENCE(token)                              \
6634 (((token->type == CPP_GREATER                                \
6635    || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT)) \
6636   && !parser->greater_than_is_operator_p)                    \
6637  ? PREC_NOT_OPERATOR                                         \
6638  : binops_by_token[token->type].prec)
6639
6640 static tree
6641 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
6642                              bool no_toplevel_fold_p,
6643                              enum cp_parser_prec prec,
6644                              cp_id_kind * pidk)
6645 {
6646   cp_parser_expression_stack stack;
6647   cp_parser_expression_stack_entry *sp = &stack[0];
6648   tree lhs, rhs;
6649   cp_token *token;
6650   enum tree_code tree_type, lhs_type, rhs_type;
6651   enum cp_parser_prec new_prec, lookahead_prec;
6652   tree overload;
6653
6654   /* Parse the first expression.  */
6655   lhs = cp_parser_cast_expression (parser, /*address_p=*/false, cast_p, pidk);
6656   lhs_type = ERROR_MARK;
6657
6658   for (;;)
6659     {
6660       /* Get an operator token.  */
6661       token = cp_lexer_peek_token (parser->lexer);
6662
6663       if (warn_cxx0x_compat
6664           && token->type == CPP_RSHIFT
6665           && !parser->greater_than_is_operator_p)
6666         {
6667           if (warning_at (token->location, OPT_Wc__0x_compat, 
6668                           "%<>>%> operator will be treated as"
6669                           " two right angle brackets in C++0x"))
6670             inform (token->location,
6671                     "suggest parentheses around %<>>%> expression");
6672         }
6673
6674       new_prec = TOKEN_PRECEDENCE (token);
6675
6676       /* Popping an entry off the stack means we completed a subexpression:
6677          - either we found a token which is not an operator (`>' where it is not
6678            an operator, or prec == PREC_NOT_OPERATOR), in which case popping
6679            will happen repeatedly;
6680          - or, we found an operator which has lower priority.  This is the case
6681            where the recursive descent *ascends*, as in `3 * 4 + 5' after
6682            parsing `3 * 4'.  */
6683       if (new_prec <= prec)
6684         {
6685           if (sp == stack)
6686             break;
6687           else
6688             goto pop;
6689         }
6690
6691      get_rhs:
6692       tree_type = binops_by_token[token->type].tree_type;
6693
6694       /* We used the operator token.  */
6695       cp_lexer_consume_token (parser->lexer);
6696
6697       /* For "false && x" or "true || x", x will never be executed;
6698          disable warnings while evaluating it.  */
6699       if (tree_type == TRUTH_ANDIF_EXPR)
6700         c_inhibit_evaluation_warnings += lhs == truthvalue_false_node;
6701       else if (tree_type == TRUTH_ORIF_EXPR)
6702         c_inhibit_evaluation_warnings += lhs == truthvalue_true_node;
6703
6704       /* Extract another operand.  It may be the RHS of this expression
6705          or the LHS of a new, higher priority expression.  */
6706       rhs = cp_parser_simple_cast_expression (parser);
6707       rhs_type = ERROR_MARK;
6708
6709       /* Get another operator token.  Look up its precedence to avoid
6710          building a useless (immediately popped) stack entry for common
6711          cases such as 3 + 4 + 5 or 3 * 4 + 5.  */
6712       token = cp_lexer_peek_token (parser->lexer);
6713       lookahead_prec = TOKEN_PRECEDENCE (token);
6714       if (lookahead_prec > new_prec)
6715         {
6716           /* ... and prepare to parse the RHS of the new, higher priority
6717              expression.  Since precedence levels on the stack are
6718              monotonically increasing, we do not have to care about
6719              stack overflows.  */
6720           sp->prec = prec;
6721           sp->tree_type = tree_type;
6722           sp->lhs = lhs;
6723           sp->lhs_type = lhs_type;
6724           sp++;
6725           lhs = rhs;
6726           lhs_type = rhs_type;
6727           prec = new_prec;
6728           new_prec = lookahead_prec;
6729           goto get_rhs;
6730
6731          pop:
6732           lookahead_prec = new_prec;
6733           /* If the stack is not empty, we have parsed into LHS the right side
6734              (`4' in the example above) of an expression we had suspended.
6735              We can use the information on the stack to recover the LHS (`3')
6736              from the stack together with the tree code (`MULT_EXPR'), and
6737              the precedence of the higher level subexpression
6738              (`PREC_ADDITIVE_EXPRESSION').  TOKEN is the CPP_PLUS token,
6739              which will be used to actually build the additive expression.  */
6740           --sp;
6741           prec = sp->prec;
6742           tree_type = sp->tree_type;
6743           rhs = lhs;
6744           rhs_type = lhs_type;
6745           lhs = sp->lhs;
6746           lhs_type = sp->lhs_type;
6747         }
6748
6749       /* Undo the disabling of warnings done above.  */
6750       if (tree_type == TRUTH_ANDIF_EXPR)
6751         c_inhibit_evaluation_warnings -= lhs == truthvalue_false_node;
6752       else if (tree_type == TRUTH_ORIF_EXPR)
6753         c_inhibit_evaluation_warnings -= lhs == truthvalue_true_node;
6754
6755       overload = NULL;
6756       /* ??? Currently we pass lhs_type == ERROR_MARK and rhs_type ==
6757          ERROR_MARK for everything that is not a binary expression.
6758          This makes warn_about_parentheses miss some warnings that
6759          involve unary operators.  For unary expressions we should
6760          pass the correct tree_code unless the unary expression was
6761          surrounded by parentheses.
6762       */
6763       if (no_toplevel_fold_p
6764           && lookahead_prec <= prec
6765           && sp == stack
6766           && TREE_CODE_CLASS (tree_type) == tcc_comparison)
6767         lhs = build2 (tree_type, boolean_type_node, lhs, rhs);
6768       else
6769         lhs = build_x_binary_op (tree_type, lhs, lhs_type, rhs, rhs_type,
6770                                  &overload, tf_warning_or_error);
6771       lhs_type = tree_type;
6772
6773       /* If the binary operator required the use of an overloaded operator,
6774          then this expression cannot be an integral constant-expression.
6775          An overloaded operator can be used even if both operands are
6776          otherwise permissible in an integral constant-expression if at
6777          least one of the operands is of enumeration type.  */
6778
6779       if (overload
6780           && cp_parser_non_integral_constant_expression (parser,
6781                                                          NIC_OVERLOADED))
6782         return error_mark_node;
6783     }
6784
6785   return lhs;
6786 }
6787
6788
6789 /* Parse the `? expression : assignment-expression' part of a
6790    conditional-expression.  The LOGICAL_OR_EXPR is the
6791    logical-or-expression that started the conditional-expression.
6792    Returns a representation of the entire conditional-expression.
6793
6794    This routine is used by cp_parser_assignment_expression.
6795
6796      ? expression : assignment-expression
6797
6798    GNU Extensions:
6799
6800      ? : assignment-expression */
6801
6802 static tree
6803 cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
6804 {
6805   tree expr;
6806   tree assignment_expr;
6807   struct cp_token *token;
6808
6809   /* Consume the `?' token.  */
6810   cp_lexer_consume_token (parser->lexer);
6811   token = cp_lexer_peek_token (parser->lexer);
6812   if (cp_parser_allow_gnu_extensions_p (parser)
6813       && token->type == CPP_COLON)
6814     {
6815       pedwarn (token->location, OPT_pedantic, 
6816                "ISO C++ does not allow ?: with omitted middle operand");
6817       /* Implicit true clause.  */
6818       expr = NULL_TREE;
6819       c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_true_node;
6820       warn_for_omitted_condop (token->location, logical_or_expr);
6821     }
6822   else
6823     {
6824       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
6825       parser->colon_corrects_to_scope_p = false;
6826       /* Parse the expression.  */
6827       c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_false_node;
6828       expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
6829       c_inhibit_evaluation_warnings +=
6830         ((logical_or_expr == truthvalue_true_node)
6831          - (logical_or_expr == truthvalue_false_node));
6832       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
6833     }
6834
6835   /* The next token should be a `:'.  */
6836   cp_parser_require (parser, CPP_COLON, RT_COLON);
6837   /* Parse the assignment-expression.  */
6838   assignment_expr = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
6839   c_inhibit_evaluation_warnings -= logical_or_expr == truthvalue_true_node;
6840
6841   /* Build the conditional-expression.  */
6842   return build_x_conditional_expr (logical_or_expr,
6843                                    expr,
6844                                    assignment_expr,
6845                                    tf_warning_or_error);
6846 }
6847
6848 /* Parse an assignment-expression.
6849
6850    assignment-expression:
6851      conditional-expression
6852      logical-or-expression assignment-operator assignment_expression
6853      throw-expression
6854
6855    CAST_P is true if this expression is the target of a cast.
6856
6857    Returns a representation for the expression.  */
6858
6859 static tree
6860 cp_parser_assignment_expression (cp_parser* parser, bool cast_p,
6861                                  cp_id_kind * pidk)
6862 {
6863   tree expr;
6864
6865   /* If the next token is the `throw' keyword, then we're looking at
6866      a throw-expression.  */
6867   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THROW))
6868     expr = cp_parser_throw_expression (parser);
6869   /* Otherwise, it must be that we are looking at a
6870      logical-or-expression.  */
6871   else
6872     {
6873       /* Parse the binary expressions (logical-or-expression).  */
6874       expr = cp_parser_binary_expression (parser, cast_p, false,
6875                                           PREC_NOT_OPERATOR, pidk);
6876       /* If the next token is a `?' then we're actually looking at a
6877          conditional-expression.  */
6878       if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
6879         return cp_parser_question_colon_clause (parser, expr);
6880       else
6881         {
6882           enum tree_code assignment_operator;
6883
6884           /* If it's an assignment-operator, we're using the second
6885              production.  */
6886           assignment_operator
6887             = cp_parser_assignment_operator_opt (parser);
6888           if (assignment_operator != ERROR_MARK)
6889             {
6890               bool non_constant_p;
6891
6892               /* Parse the right-hand side of the assignment.  */
6893               tree rhs = cp_parser_initializer_clause (parser, &non_constant_p);
6894
6895               if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
6896                 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6897
6898               /* An assignment may not appear in a
6899                  constant-expression.  */
6900               if (cp_parser_non_integral_constant_expression (parser,
6901                                                               NIC_ASSIGNMENT))
6902                 return error_mark_node;
6903               /* Build the assignment expression.  */
6904               expr = build_x_modify_expr (expr,
6905                                           assignment_operator,
6906                                           rhs,
6907                                           tf_warning_or_error);
6908             }
6909         }
6910     }
6911
6912   return expr;
6913 }
6914
6915 /* Parse an (optional) assignment-operator.
6916
6917    assignment-operator: one of
6918      = *= /= %= += -= >>= <<= &= ^= |=
6919
6920    GNU Extension:
6921
6922    assignment-operator: one of
6923      <?= >?=
6924
6925    If the next token is an assignment operator, the corresponding tree
6926    code is returned, and the token is consumed.  For example, for
6927    `+=', PLUS_EXPR is returned.  For `=' itself, the code returned is
6928    NOP_EXPR.  For `/', TRUNC_DIV_EXPR is returned; for `%',
6929    TRUNC_MOD_EXPR is returned.  If TOKEN is not an assignment
6930    operator, ERROR_MARK is returned.  */
6931
6932 static enum tree_code
6933 cp_parser_assignment_operator_opt (cp_parser* parser)
6934 {
6935   enum tree_code op;
6936   cp_token *token;
6937
6938   /* Peek at the next token.  */
6939   token = cp_lexer_peek_token (parser->lexer);
6940
6941   switch (token->type)
6942     {
6943     case CPP_EQ:
6944       op = NOP_EXPR;
6945       break;
6946
6947     case CPP_MULT_EQ:
6948       op = MULT_EXPR;
6949       break;
6950
6951     case CPP_DIV_EQ:
6952       op = TRUNC_DIV_EXPR;
6953       break;
6954
6955     case CPP_MOD_EQ:
6956       op = TRUNC_MOD_EXPR;
6957       break;
6958
6959     case CPP_PLUS_EQ:
6960       op = PLUS_EXPR;
6961       break;
6962
6963     case CPP_MINUS_EQ:
6964       op = MINUS_EXPR;
6965       break;
6966
6967     case CPP_RSHIFT_EQ:
6968       op = RSHIFT_EXPR;
6969       break;
6970
6971     case CPP_LSHIFT_EQ:
6972       op = LSHIFT_EXPR;
6973       break;
6974
6975     case CPP_AND_EQ:
6976       op = BIT_AND_EXPR;
6977       break;
6978
6979     case CPP_XOR_EQ:
6980       op = BIT_XOR_EXPR;
6981       break;
6982
6983     case CPP_OR_EQ:
6984       op = BIT_IOR_EXPR;
6985       break;
6986
6987     default:
6988       /* Nothing else is an assignment operator.  */
6989       op = ERROR_MARK;
6990     }
6991
6992   /* If it was an assignment operator, consume it.  */
6993   if (op != ERROR_MARK)
6994     cp_lexer_consume_token (parser->lexer);
6995
6996   return op;
6997 }
6998
6999 /* Parse an expression.
7000
7001    expression:
7002      assignment-expression
7003      expression , assignment-expression
7004
7005    CAST_P is true if this expression is the target of a cast.
7006
7007    Returns a representation of the expression.  */
7008
7009 static tree
7010 cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk)
7011 {
7012   tree expression = NULL_TREE;
7013
7014   while (true)
7015     {
7016       tree assignment_expression;
7017
7018       /* Parse the next assignment-expression.  */
7019       assignment_expression
7020         = cp_parser_assignment_expression (parser, cast_p, pidk);
7021       /* If this is the first assignment-expression, we can just
7022          save it away.  */
7023       if (!expression)
7024         expression = assignment_expression;
7025       else
7026         expression = build_x_compound_expr (expression,
7027                                             assignment_expression,
7028                                             tf_warning_or_error);
7029       /* If the next token is not a comma, then we are done with the
7030          expression.  */
7031       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
7032         break;
7033       /* Consume the `,'.  */
7034       cp_lexer_consume_token (parser->lexer);
7035       /* A comma operator cannot appear in a constant-expression.  */
7036       if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA))
7037         expression = error_mark_node;
7038     }
7039
7040   return expression;
7041 }
7042
7043 /* Parse a constant-expression.
7044
7045    constant-expression:
7046      conditional-expression
7047
7048   If ALLOW_NON_CONSTANT_P a non-constant expression is silently
7049   accepted.  If ALLOW_NON_CONSTANT_P is true and the expression is not
7050   constant, *NON_CONSTANT_P is set to TRUE.  If ALLOW_NON_CONSTANT_P
7051   is false, NON_CONSTANT_P should be NULL.  */
7052
7053 static tree
7054 cp_parser_constant_expression (cp_parser* parser,
7055                                bool allow_non_constant_p,
7056                                bool *non_constant_p)
7057 {
7058   bool saved_integral_constant_expression_p;
7059   bool saved_allow_non_integral_constant_expression_p;
7060   bool saved_non_integral_constant_expression_p;
7061   tree expression;
7062
7063   /* It might seem that we could simply parse the
7064      conditional-expression, and then check to see if it were
7065      TREE_CONSTANT.  However, an expression that is TREE_CONSTANT is
7066      one that the compiler can figure out is constant, possibly after
7067      doing some simplifications or optimizations.  The standard has a
7068      precise definition of constant-expression, and we must honor
7069      that, even though it is somewhat more restrictive.
7070
7071      For example:
7072
7073        int i[(2, 3)];
7074
7075      is not a legal declaration, because `(2, 3)' is not a
7076      constant-expression.  The `,' operator is forbidden in a
7077      constant-expression.  However, GCC's constant-folding machinery
7078      will fold this operation to an INTEGER_CST for `3'.  */
7079
7080   /* Save the old settings.  */
7081   saved_integral_constant_expression_p = parser->integral_constant_expression_p;
7082   saved_allow_non_integral_constant_expression_p
7083     = parser->allow_non_integral_constant_expression_p;
7084   saved_non_integral_constant_expression_p = parser->non_integral_constant_expression_p;
7085   /* We are now parsing a constant-expression.  */
7086   parser->integral_constant_expression_p = true;
7087   parser->allow_non_integral_constant_expression_p
7088     = (allow_non_constant_p || cxx_dialect >= cxx0x);
7089   parser->non_integral_constant_expression_p = false;
7090   /* Although the grammar says "conditional-expression", we parse an
7091      "assignment-expression", which also permits "throw-expression"
7092      and the use of assignment operators.  In the case that
7093      ALLOW_NON_CONSTANT_P is false, we get better errors than we would
7094      otherwise.  In the case that ALLOW_NON_CONSTANT_P is true, it is
7095      actually essential that we look for an assignment-expression.
7096      For example, cp_parser_initializer_clauses uses this function to
7097      determine whether a particular assignment-expression is in fact
7098      constant.  */
7099   expression = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
7100   /* Restore the old settings.  */
7101   parser->integral_constant_expression_p
7102     = saved_integral_constant_expression_p;
7103   parser->allow_non_integral_constant_expression_p
7104     = saved_allow_non_integral_constant_expression_p;
7105   if (cxx_dialect >= cxx0x)
7106     {
7107       /* Require an rvalue constant expression here; that's what our
7108          callers expect.  Reference constant expressions are handled
7109          separately in e.g. cp_parser_template_argument.  */
7110       bool is_const = potential_rvalue_constant_expression (expression);
7111       parser->non_integral_constant_expression_p = !is_const;
7112       if (!is_const && !allow_non_constant_p)
7113         require_potential_rvalue_constant_expression (expression);
7114     }
7115   if (allow_non_constant_p)
7116     *non_constant_p = parser->non_integral_constant_expression_p;
7117   parser->non_integral_constant_expression_p
7118     = saved_non_integral_constant_expression_p;
7119
7120   return expression;
7121 }
7122
7123 /* Parse __builtin_offsetof.
7124
7125    offsetof-expression:
7126      "__builtin_offsetof" "(" type-id "," offsetof-member-designator ")"
7127
7128    offsetof-member-designator:
7129      id-expression
7130      | offsetof-member-designator "." id-expression
7131      | offsetof-member-designator "[" expression "]"
7132      | offsetof-member-designator "->" id-expression  */
7133
7134 static tree
7135 cp_parser_builtin_offsetof (cp_parser *parser)
7136 {
7137   int save_ice_p, save_non_ice_p;
7138   tree type, expr;
7139   cp_id_kind dummy;
7140   cp_token *token;
7141
7142   /* We're about to accept non-integral-constant things, but will
7143      definitely yield an integral constant expression.  Save and
7144      restore these values around our local parsing.  */
7145   save_ice_p = parser->integral_constant_expression_p;
7146   save_non_ice_p = parser->non_integral_constant_expression_p;
7147
7148   /* Consume the "__builtin_offsetof" token.  */
7149   cp_lexer_consume_token (parser->lexer);
7150   /* Consume the opening `('.  */
7151   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
7152   /* Parse the type-id.  */
7153   type = cp_parser_type_id (parser);
7154   /* Look for the `,'.  */
7155   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7156   token = cp_lexer_peek_token (parser->lexer);
7157
7158   /* Build the (type *)null that begins the traditional offsetof macro.  */
7159   expr = build_static_cast (build_pointer_type (type), null_pointer_node,
7160                             tf_warning_or_error);
7161
7162   /* Parse the offsetof-member-designator.  We begin as if we saw "expr->".  */
7163   expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DEREF, expr,
7164                                                  true, &dummy, token->location);
7165   while (true)
7166     {
7167       token = cp_lexer_peek_token (parser->lexer);
7168       switch (token->type)
7169         {
7170         case CPP_OPEN_SQUARE:
7171           /* offsetof-member-designator "[" expression "]" */
7172           expr = cp_parser_postfix_open_square_expression (parser, expr, true);
7173           break;
7174
7175         case CPP_DEREF:
7176           /* offsetof-member-designator "->" identifier */
7177           expr = grok_array_decl (expr, integer_zero_node);
7178           /* FALLTHRU */
7179
7180         case CPP_DOT:
7181           /* offsetof-member-designator "." identifier */
7182           cp_lexer_consume_token (parser->lexer);
7183           expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
7184                                                          expr, true, &dummy,
7185                                                          token->location);
7186           break;
7187
7188         case CPP_CLOSE_PAREN:
7189           /* Consume the ")" token.  */
7190           cp_lexer_consume_token (parser->lexer);
7191           goto success;
7192
7193         default:
7194           /* Error.  We know the following require will fail, but
7195              that gives the proper error message.  */
7196           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7197           cp_parser_skip_to_closing_parenthesis (parser, true, false, true);
7198           expr = error_mark_node;
7199           goto failure;
7200         }
7201     }
7202
7203  success:
7204   /* If we're processing a template, we can't finish the semantics yet.
7205      Otherwise we can fold the entire expression now.  */
7206   if (processing_template_decl)
7207     expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
7208   else
7209     expr = finish_offsetof (expr);
7210
7211  failure:
7212   parser->integral_constant_expression_p = save_ice_p;
7213   parser->non_integral_constant_expression_p = save_non_ice_p;
7214
7215   return expr;
7216 }
7217
7218 /* Parse a trait expression.
7219
7220    Returns a representation of the expression, the underlying type
7221    of the type at issue when KEYWORD is RID_UNDERLYING_TYPE.  */
7222
7223 static tree
7224 cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
7225 {
7226   cp_trait_kind kind;
7227   tree type1, type2 = NULL_TREE;
7228   bool binary = false;
7229   cp_decl_specifier_seq decl_specs;
7230
7231   switch (keyword)
7232     {
7233     case RID_HAS_NOTHROW_ASSIGN:
7234       kind = CPTK_HAS_NOTHROW_ASSIGN;
7235       break;
7236     case RID_HAS_NOTHROW_CONSTRUCTOR:
7237       kind = CPTK_HAS_NOTHROW_CONSTRUCTOR;
7238       break;
7239     case RID_HAS_NOTHROW_COPY:
7240       kind = CPTK_HAS_NOTHROW_COPY;
7241       break;
7242     case RID_HAS_TRIVIAL_ASSIGN:
7243       kind = CPTK_HAS_TRIVIAL_ASSIGN;
7244       break;
7245     case RID_HAS_TRIVIAL_CONSTRUCTOR:
7246       kind = CPTK_HAS_TRIVIAL_CONSTRUCTOR;
7247       break;
7248     case RID_HAS_TRIVIAL_COPY:
7249       kind = CPTK_HAS_TRIVIAL_COPY;
7250       break;
7251     case RID_HAS_TRIVIAL_DESTRUCTOR:
7252       kind = CPTK_HAS_TRIVIAL_DESTRUCTOR;
7253       break;
7254     case RID_HAS_VIRTUAL_DESTRUCTOR:
7255       kind = CPTK_HAS_VIRTUAL_DESTRUCTOR;
7256       break;
7257     case RID_IS_ABSTRACT:
7258       kind = CPTK_IS_ABSTRACT;
7259       break;
7260     case RID_IS_BASE_OF:
7261       kind = CPTK_IS_BASE_OF;
7262       binary = true;
7263       break;
7264     case RID_IS_CLASS:
7265       kind = CPTK_IS_CLASS;
7266       break;
7267     case RID_IS_CONVERTIBLE_TO:
7268       kind = CPTK_IS_CONVERTIBLE_TO;
7269       binary = true;
7270       break;
7271     case RID_IS_EMPTY:
7272       kind = CPTK_IS_EMPTY;
7273       break;
7274     case RID_IS_ENUM:
7275       kind = CPTK_IS_ENUM;
7276       break;
7277     case RID_IS_LITERAL_TYPE:
7278       kind = CPTK_IS_LITERAL_TYPE;
7279       break;
7280     case RID_IS_POD:
7281       kind = CPTK_IS_POD;
7282       break;
7283     case RID_IS_POLYMORPHIC:
7284       kind = CPTK_IS_POLYMORPHIC;
7285       break;
7286     case RID_IS_STD_LAYOUT:
7287       kind = CPTK_IS_STD_LAYOUT;
7288       break;
7289     case RID_IS_TRIVIAL:
7290       kind = CPTK_IS_TRIVIAL;
7291       break;
7292     case RID_IS_UNION:
7293       kind = CPTK_IS_UNION;
7294       break;
7295     case RID_UNDERLYING_TYPE:
7296       kind = CPTK_UNDERLYING_TYPE;
7297       break;
7298     default:
7299       gcc_unreachable ();
7300     }
7301
7302   /* Consume the token.  */
7303   cp_lexer_consume_token (parser->lexer);
7304
7305   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
7306
7307   type1 = cp_parser_type_id (parser);
7308
7309   if (type1 == error_mark_node)
7310     return error_mark_node;
7311
7312   /* Build a trivial decl-specifier-seq.  */
7313   clear_decl_specs (&decl_specs);
7314   decl_specs.type = type1;
7315
7316   /* Call grokdeclarator to figure out what type this is.  */
7317   type1 = grokdeclarator (NULL, &decl_specs, TYPENAME,
7318                           /*initialized=*/0, /*attrlist=*/NULL);
7319
7320   if (binary)
7321     {
7322       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7323  
7324       type2 = cp_parser_type_id (parser);
7325
7326       if (type2 == error_mark_node)
7327         return error_mark_node;
7328
7329       /* Build a trivial decl-specifier-seq.  */
7330       clear_decl_specs (&decl_specs);
7331       decl_specs.type = type2;
7332
7333       /* Call grokdeclarator to figure out what type this is.  */
7334       type2 = grokdeclarator (NULL, &decl_specs, TYPENAME,
7335                               /*initialized=*/0, /*attrlist=*/NULL);
7336     }
7337
7338   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7339
7340   /* Complete the trait expression, which may mean either processing
7341      the trait expr now or saving it for template instantiation.  */
7342   return kind != CPTK_UNDERLYING_TYPE
7343     ? finish_trait_expr (kind, type1, type2)
7344     : finish_underlying_type (type1);
7345 }
7346
7347 /* Lambdas that appear in variable initializer or default argument scope
7348    get that in their mangling, so we need to record it.  We might as well
7349    use the count for function and namespace scopes as well.  */
7350 static GTY(()) tree lambda_scope;
7351 static GTY(()) int lambda_count;
7352 typedef struct GTY(()) tree_int
7353 {
7354   tree t;
7355   int i;
7356 } tree_int;
7357 DEF_VEC_O(tree_int);
7358 DEF_VEC_ALLOC_O(tree_int,gc);
7359 static GTY(()) VEC(tree_int,gc) *lambda_scope_stack;
7360
7361 static void
7362 start_lambda_scope (tree decl)
7363 {
7364   tree_int ti;
7365   gcc_assert (decl);
7366   /* Once we're inside a function, we ignore other scopes and just push
7367      the function again so that popping works properly.  */
7368   if (current_function_decl && TREE_CODE (decl) != FUNCTION_DECL)
7369     decl = current_function_decl;
7370   ti.t = lambda_scope;
7371   ti.i = lambda_count;
7372   VEC_safe_push (tree_int, gc, lambda_scope_stack, &ti);
7373   if (lambda_scope != decl)
7374     {
7375       /* Don't reset the count if we're still in the same function.  */
7376       lambda_scope = decl;
7377       lambda_count = 0;
7378     }
7379 }
7380
7381 static void
7382 record_lambda_scope (tree lambda)
7383 {
7384   LAMBDA_EXPR_EXTRA_SCOPE (lambda) = lambda_scope;
7385   LAMBDA_EXPR_DISCRIMINATOR (lambda) = lambda_count++;
7386 }
7387
7388 static void
7389 finish_lambda_scope (void)
7390 {
7391   tree_int *p = VEC_last (tree_int, lambda_scope_stack);
7392   if (lambda_scope != p->t)
7393     {
7394       lambda_scope = p->t;
7395       lambda_count = p->i;
7396     }
7397   VEC_pop (tree_int, lambda_scope_stack);
7398 }
7399
7400 /* Parse a lambda expression.
7401
7402    lambda-expression:
7403      lambda-introducer lambda-declarator [opt] compound-statement
7404
7405    Returns a representation of the expression.  */
7406
7407 static tree
7408 cp_parser_lambda_expression (cp_parser* parser)
7409 {
7410   tree lambda_expr = build_lambda_expr ();
7411   tree type;
7412   bool ok;
7413
7414   LAMBDA_EXPR_LOCATION (lambda_expr)
7415     = cp_lexer_peek_token (parser->lexer)->location;
7416
7417   if (cp_unevaluated_operand)
7418     error_at (LAMBDA_EXPR_LOCATION (lambda_expr),
7419               "lambda-expression in unevaluated context");
7420
7421   /* We may be in the middle of deferred access check.  Disable
7422      it now.  */
7423   push_deferring_access_checks (dk_no_deferred);
7424
7425   cp_parser_lambda_introducer (parser, lambda_expr);
7426
7427   type = begin_lambda_type (lambda_expr);
7428
7429   record_lambda_scope (lambda_expr);
7430
7431   /* Do this again now that LAMBDA_EXPR_EXTRA_SCOPE is set.  */
7432   determine_visibility (TYPE_NAME (type));
7433
7434   /* Now that we've started the type, add the capture fields for any
7435      explicit captures.  */
7436   register_capture_members (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
7437
7438   {
7439     /* Inside the class, surrounding template-parameter-lists do not apply.  */
7440     unsigned int saved_num_template_parameter_lists
7441         = parser->num_template_parameter_lists;
7442     unsigned char in_statement = parser->in_statement;
7443     bool in_switch_statement_p = parser->in_switch_statement_p;
7444
7445     parser->num_template_parameter_lists = 0;
7446     parser->in_statement = 0;
7447     parser->in_switch_statement_p = false;
7448
7449     /* By virtue of defining a local class, a lambda expression has access to
7450        the private variables of enclosing classes.  */
7451
7452     ok = cp_parser_lambda_declarator_opt (parser, lambda_expr);
7453
7454     if (ok)
7455       cp_parser_lambda_body (parser, lambda_expr);
7456     else if (cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
7457       cp_parser_skip_to_end_of_block_or_statement (parser);
7458
7459     /* The capture list was built up in reverse order; fix that now.  */
7460     {
7461       tree newlist = NULL_TREE;
7462       tree elt, next;
7463
7464       for (elt = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr);
7465            elt; elt = next)
7466         {
7467           next = TREE_CHAIN (elt);
7468           TREE_CHAIN (elt) = newlist;
7469           newlist = elt;
7470         }
7471       LAMBDA_EXPR_CAPTURE_LIST (lambda_expr) = newlist;
7472     }
7473
7474     if (ok)
7475       maybe_add_lambda_conv_op (type);
7476
7477     type = finish_struct (type, /*attributes=*/NULL_TREE);
7478
7479     parser->num_template_parameter_lists = saved_num_template_parameter_lists;
7480     parser->in_statement = in_statement;
7481     parser->in_switch_statement_p = in_switch_statement_p;
7482   }
7483
7484   pop_deferring_access_checks ();
7485
7486   /* This field is only used during parsing of the lambda.  */
7487   LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
7488
7489   /* This lambda shouldn't have any proxies left at this point.  */
7490   gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (lambda_expr) == NULL);
7491   /* And now that we're done, push proxies for an enclosing lambda.  */
7492   insert_pending_capture_proxies ();
7493
7494   if (ok)
7495     return build_lambda_object (lambda_expr);
7496   else
7497     return error_mark_node;
7498 }
7499
7500 /* Parse the beginning of a lambda expression.
7501
7502    lambda-introducer:
7503      [ lambda-capture [opt] ]
7504
7505    LAMBDA_EXPR is the current representation of the lambda expression.  */
7506
7507 static void
7508 cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
7509 {
7510   /* Need commas after the first capture.  */
7511   bool first = true;
7512
7513   /* Eat the leading `['.  */
7514   cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
7515
7516   /* Record default capture mode.  "[&" "[=" "[&," "[=,"  */
7517   if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
7518       && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_NAME)
7519     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_REFERENCE;
7520   else if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
7521     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_COPY;
7522
7523   if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE)
7524     {
7525       cp_lexer_consume_token (parser->lexer);
7526       first = false;
7527     }
7528
7529   while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_SQUARE))
7530     {
7531       cp_token* capture_token;
7532       tree capture_id;
7533       tree capture_init_expr;
7534       cp_id_kind idk = CP_ID_KIND_NONE;
7535       bool explicit_init_p = false;
7536
7537       enum capture_kind_type
7538       {
7539         BY_COPY,
7540         BY_REFERENCE
7541       };
7542       enum capture_kind_type capture_kind = BY_COPY;
7543
7544       if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
7545         {
7546           error ("expected end of capture-list");
7547           return;
7548         }
7549
7550       if (first)
7551         first = false;
7552       else
7553         cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7554
7555       /* Possibly capture `this'.  */
7556       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THIS))
7557         {
7558           location_t loc = cp_lexer_peek_token (parser->lexer)->location;
7559           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
7560             pedwarn (loc, 0, "explicit by-copy capture of %<this%> redundant "
7561                      "with by-copy capture default");
7562           cp_lexer_consume_token (parser->lexer);
7563           add_capture (lambda_expr,
7564                        /*id=*/this_identifier,
7565                        /*initializer=*/finish_this_expr(),
7566                        /*by_reference_p=*/false,
7567                        explicit_init_p);
7568           continue;
7569         }
7570
7571       /* Remember whether we want to capture as a reference or not.  */
7572       if (cp_lexer_next_token_is (parser->lexer, CPP_AND))
7573         {
7574           capture_kind = BY_REFERENCE;
7575           cp_lexer_consume_token (parser->lexer);
7576         }
7577
7578       /* Get the identifier.  */
7579       capture_token = cp_lexer_peek_token (parser->lexer);
7580       capture_id = cp_parser_identifier (parser);
7581
7582       if (capture_id == error_mark_node)
7583         /* Would be nice to have a cp_parser_skip_to_closing_x for general
7584            delimiters, but I modified this to stop on unnested ']' as well.  It
7585            was already changed to stop on unnested '}', so the
7586            "closing_parenthesis" name is no more misleading with my change.  */
7587         {
7588           cp_parser_skip_to_closing_parenthesis (parser,
7589                                                  /*recovering=*/true,
7590                                                  /*or_comma=*/true,
7591                                                  /*consume_paren=*/true);
7592           break;
7593         }
7594
7595       /* Find the initializer for this capture.  */
7596       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
7597         {
7598           /* An explicit expression exists.  */
7599           cp_lexer_consume_token (parser->lexer);
7600           pedwarn (input_location, OPT_pedantic,
7601                    "ISO C++ does not allow initializers "
7602                    "in lambda expression capture lists");
7603           capture_init_expr = cp_parser_assignment_expression (parser,
7604                                                                /*cast_p=*/true,
7605                                                                &idk);
7606           explicit_init_p = true;
7607         }
7608       else
7609         {
7610           const char* error_msg;
7611
7612           /* Turn the identifier into an id-expression.  */
7613           capture_init_expr
7614             = cp_parser_lookup_name
7615                 (parser,
7616                  capture_id,
7617                  none_type,
7618                  /*is_template=*/false,
7619                  /*is_namespace=*/false,
7620                  /*check_dependency=*/true,
7621                  /*ambiguous_decls=*/NULL,
7622                  capture_token->location);
7623
7624           capture_init_expr
7625             = finish_id_expression
7626                 (capture_id,
7627                  capture_init_expr,
7628                  parser->scope,
7629                  &idk,
7630                  /*integral_constant_expression_p=*/false,
7631                  /*allow_non_integral_constant_expression_p=*/false,
7632                  /*non_integral_constant_expression_p=*/NULL,
7633                  /*template_p=*/false,
7634                  /*done=*/true,
7635                  /*address_p=*/false,
7636                  /*template_arg_p=*/false,
7637                  &error_msg,
7638                  capture_token->location);
7639         }
7640
7641       if (TREE_CODE (capture_init_expr) == IDENTIFIER_NODE)
7642         capture_init_expr
7643           = unqualified_name_lookup_error (capture_init_expr);
7644
7645       if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE
7646           && !explicit_init_p)
7647         {
7648           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY
7649               && capture_kind == BY_COPY)
7650             pedwarn (capture_token->location, 0, "explicit by-copy capture "
7651                      "of %qD redundant with by-copy capture default",
7652                      capture_id);
7653           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_REFERENCE
7654               && capture_kind == BY_REFERENCE)
7655             pedwarn (capture_token->location, 0, "explicit by-reference "
7656                      "capture of %qD redundant with by-reference capture "
7657                      "default", capture_id);
7658         }
7659
7660       add_capture (lambda_expr,
7661                    capture_id,
7662                    capture_init_expr,
7663                    /*by_reference_p=*/capture_kind == BY_REFERENCE,
7664                    explicit_init_p);
7665     }
7666
7667   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7668 }
7669
7670 /* Parse the (optional) middle of a lambda expression.
7671
7672    lambda-declarator:
7673      ( parameter-declaration-clause [opt] )
7674        attribute-specifier [opt]
7675        mutable [opt]
7676        exception-specification [opt]
7677        lambda-return-type-clause [opt]
7678
7679    LAMBDA_EXPR is the current representation of the lambda expression.  */
7680
7681 static bool
7682 cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
7683 {
7684   /* 5.1.1.4 of the standard says:
7685        If a lambda-expression does not include a lambda-declarator, it is as if
7686        the lambda-declarator were ().
7687      This means an empty parameter list, no attributes, and no exception
7688      specification.  */
7689   tree param_list = void_list_node;
7690   tree attributes = NULL_TREE;
7691   tree exception_spec = NULL_TREE;
7692   tree t;
7693
7694   /* The lambda-declarator is optional, but must begin with an opening
7695      parenthesis if present.  */
7696   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
7697     {
7698       cp_lexer_consume_token (parser->lexer);
7699
7700       begin_scope (sk_function_parms, /*entity=*/NULL_TREE);
7701
7702       /* Parse parameters.  */
7703       param_list = cp_parser_parameter_declaration_clause (parser);
7704
7705       /* Default arguments shall not be specified in the
7706          parameter-declaration-clause of a lambda-declarator.  */
7707       for (t = param_list; t; t = TREE_CHAIN (t))
7708         if (TREE_PURPOSE (t))
7709           pedwarn (DECL_SOURCE_LOCATION (TREE_VALUE (t)), OPT_pedantic,
7710                    "default argument specified for lambda parameter");
7711
7712       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7713
7714       attributes = cp_parser_attributes_opt (parser);
7715
7716       /* Parse optional `mutable' keyword.  */
7717       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_MUTABLE))
7718         {
7719           cp_lexer_consume_token (parser->lexer);
7720           LAMBDA_EXPR_MUTABLE_P (lambda_expr) = 1;
7721         }
7722
7723       /* Parse optional exception specification.  */
7724       exception_spec = cp_parser_exception_specification_opt (parser);
7725
7726       /* Parse optional trailing return type.  */
7727       if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
7728         {
7729           cp_lexer_consume_token (parser->lexer);
7730           LAMBDA_EXPR_RETURN_TYPE (lambda_expr) = cp_parser_type_id (parser);
7731         }
7732
7733       /* The function parameters must be in scope all the way until after the
7734          trailing-return-type in case of decltype.  */
7735       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
7736         pop_binding (DECL_NAME (t), t);
7737
7738       leave_scope ();
7739     }
7740
7741   /* Create the function call operator.
7742
7743      Messing with declarators like this is no uglier than building up the
7744      FUNCTION_DECL by hand, and this is less likely to get out of sync with
7745      other code.  */
7746   {
7747     cp_decl_specifier_seq return_type_specs;
7748     cp_declarator* declarator;
7749     tree fco;
7750     int quals;
7751     void *p;
7752
7753     clear_decl_specs (&return_type_specs);
7754     if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7755       return_type_specs.type = LAMBDA_EXPR_RETURN_TYPE (lambda_expr);
7756     else
7757       /* Maybe we will deduce the return type later, but we can use void
7758          as a placeholder return type anyways.  */
7759       return_type_specs.type = void_type_node;
7760
7761     p = obstack_alloc (&declarator_obstack, 0);
7762
7763     declarator = make_id_declarator (NULL_TREE, ansi_opname (CALL_EXPR),
7764                                      sfk_none);
7765
7766     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
7767              ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
7768     declarator = make_call_declarator (declarator, param_list, quals,
7769                                        VIRT_SPEC_UNSPECIFIED,
7770                                        exception_spec,
7771                                        /*late_return_type=*/NULL_TREE);
7772     declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
7773
7774     fco = grokmethod (&return_type_specs,
7775                       declarator,
7776                       attributes);
7777     if (fco != error_mark_node)
7778       {
7779         DECL_INITIALIZED_IN_CLASS_P (fco) = 1;
7780         DECL_ARTIFICIAL (fco) = 1;
7781         /* Give the object parameter a different name.  */
7782         DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure");
7783       }
7784
7785     finish_member_declaration (fco);
7786
7787     obstack_free (&declarator_obstack, p);
7788
7789     return (fco != error_mark_node);
7790   }
7791 }
7792
7793 /* Parse the body of a lambda expression, which is simply
7794
7795    compound-statement
7796
7797    but which requires special handling.
7798    LAMBDA_EXPR is the current representation of the lambda expression.  */
7799
7800 static void
7801 cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
7802 {
7803   bool nested = (current_function_decl != NULL_TREE);
7804   bool local_variables_forbidden_p = parser->local_variables_forbidden_p;
7805   if (nested)
7806     push_function_context ();
7807   else
7808     /* Still increment function_depth so that we don't GC in the
7809        middle of an expression.  */
7810     ++function_depth;
7811   /* Clear this in case we're in the middle of a default argument.  */
7812   parser->local_variables_forbidden_p = false;
7813
7814   /* Finish the function call operator
7815      - class_specifier
7816      + late_parsing_for_member
7817      + function_definition_after_declarator
7818      + ctor_initializer_opt_and_function_body  */
7819   {
7820     tree fco = lambda_function (lambda_expr);
7821     tree body;
7822     bool done = false;
7823     tree compound_stmt;
7824     tree cap;
7825
7826     /* Let the front end know that we are going to be defining this
7827        function.  */
7828     start_preparsed_function (fco,
7829                               NULL_TREE,
7830                               SF_PRE_PARSED | SF_INCLASS_INLINE);
7831
7832     start_lambda_scope (fco);
7833     body = begin_function_body ();
7834
7835     if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
7836       goto out;
7837
7838     /* Push the proxies for any explicit captures.  */
7839     for (cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
7840          cap = TREE_CHAIN (cap))
7841       build_capture_proxy (TREE_PURPOSE (cap));
7842
7843     compound_stmt = begin_compound_stmt (0);
7844
7845     /* 5.1.1.4 of the standard says:
7846          If a lambda-expression does not include a trailing-return-type, it
7847          is as if the trailing-return-type denotes the following type:
7848           * if the compound-statement is of the form
7849                { return attribute-specifier [opt] expression ; }
7850              the type of the returned expression after lvalue-to-rvalue
7851              conversion (_conv.lval_ 4.1), array-to-pointer conversion
7852              (_conv.array_ 4.2), and function-to-pointer conversion
7853              (_conv.func_ 4.3);
7854           * otherwise, void.  */
7855
7856     /* In a lambda that has neither a lambda-return-type-clause
7857        nor a deducible form, errors should be reported for return statements
7858        in the body.  Since we used void as the placeholder return type, parsing
7859        the body as usual will give such desired behavior.  */
7860     if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
7861         && cp_lexer_peek_nth_token (parser->lexer, 1)->keyword == RID_RETURN
7862         && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SEMICOLON)
7863       {
7864         tree expr = NULL_TREE;
7865         cp_id_kind idk = CP_ID_KIND_NONE;
7866
7867         /* Parse tentatively in case there's more after the initial return
7868            statement.  */
7869         cp_parser_parse_tentatively (parser);
7870
7871         cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN);
7872
7873         expr = cp_parser_expression (parser, /*cast_p=*/false, &idk);
7874
7875         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
7876         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7877
7878         if (cp_parser_parse_definitely (parser))
7879           {
7880             apply_lambda_return_type (lambda_expr, lambda_return_type (expr));
7881
7882             /* Will get error here if type not deduced yet.  */
7883             finish_return_stmt (expr);
7884
7885             done = true;
7886           }
7887       }
7888
7889     if (!done)
7890       {
7891         if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7892           LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true;
7893         while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
7894           cp_parser_label_declaration (parser);
7895         cp_parser_statement_seq_opt (parser, NULL_TREE);
7896         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7897         LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = false;
7898       }
7899
7900     finish_compound_stmt (compound_stmt);
7901
7902   out:
7903     finish_function_body (body);
7904     finish_lambda_scope ();
7905
7906     /* Finish the function and generate code for it if necessary.  */
7907     expand_or_defer_fn (finish_function (/*inline*/2));
7908   }
7909
7910   parser->local_variables_forbidden_p = local_variables_forbidden_p;
7911   if (nested)
7912     pop_function_context();
7913   else
7914     --function_depth;
7915 }
7916
7917 /* Statements [gram.stmt.stmt]  */
7918
7919 /* Parse a statement.
7920
7921    statement:
7922      labeled-statement
7923      expression-statement
7924      compound-statement
7925      selection-statement
7926      iteration-statement
7927      jump-statement
7928      declaration-statement
7929      try-block
7930
7931   IN_COMPOUND is true when the statement is nested inside a
7932   cp_parser_compound_statement; this matters for certain pragmas.
7933
7934   If IF_P is not NULL, *IF_P is set to indicate whether the statement
7935   is a (possibly labeled) if statement which is not enclosed in braces
7936   and has an else clause.  This is used to implement -Wparentheses.  */
7937
7938 static void
7939 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
7940                      bool in_compound, bool *if_p)
7941 {
7942   tree statement;
7943   cp_token *token;
7944   location_t statement_location;
7945
7946  restart:
7947   if (if_p != NULL)
7948     *if_p = false;
7949   /* There is no statement yet.  */
7950   statement = NULL_TREE;
7951   /* Peek at the next token.  */
7952   token = cp_lexer_peek_token (parser->lexer);
7953   /* Remember the location of the first token in the statement.  */
7954   statement_location = token->location;
7955   /* If this is a keyword, then that will often determine what kind of
7956      statement we have.  */
7957   if (token->type == CPP_KEYWORD)
7958     {
7959       enum rid keyword = token->keyword;
7960
7961       switch (keyword)
7962         {
7963         case RID_CASE:
7964         case RID_DEFAULT:
7965           /* Looks like a labeled-statement with a case label.
7966              Parse the label, and then use tail recursion to parse
7967              the statement.  */
7968           cp_parser_label_for_labeled_statement (parser);
7969           goto restart;
7970
7971         case RID_IF:
7972         case RID_SWITCH:
7973           statement = cp_parser_selection_statement (parser, if_p);
7974           break;
7975
7976         case RID_WHILE:
7977         case RID_DO:
7978         case RID_FOR:
7979           statement = cp_parser_iteration_statement (parser);
7980           break;
7981
7982         case RID_BREAK:
7983         case RID_CONTINUE:
7984         case RID_RETURN:
7985         case RID_GOTO:
7986           statement = cp_parser_jump_statement (parser);
7987           break;
7988
7989           /* Objective-C++ exception-handling constructs.  */
7990         case RID_AT_TRY:
7991         case RID_AT_CATCH:
7992         case RID_AT_FINALLY:
7993         case RID_AT_SYNCHRONIZED:
7994         case RID_AT_THROW:
7995           statement = cp_parser_objc_statement (parser);
7996           break;
7997
7998         case RID_TRY:
7999           statement = cp_parser_try_block (parser);
8000           break;
8001
8002         case RID_NAMESPACE:
8003           /* This must be a namespace alias definition.  */
8004           cp_parser_declaration_statement (parser);
8005           return;
8006           
8007         default:
8008           /* It might be a keyword like `int' that can start a
8009              declaration-statement.  */
8010           break;
8011         }
8012     }
8013   else if (token->type == CPP_NAME)
8014     {
8015       /* If the next token is a `:', then we are looking at a
8016          labeled-statement.  */
8017       token = cp_lexer_peek_nth_token (parser->lexer, 2);
8018       if (token->type == CPP_COLON)
8019         {
8020           /* Looks like a labeled-statement with an ordinary label.
8021              Parse the label, and then use tail recursion to parse
8022              the statement.  */
8023           cp_parser_label_for_labeled_statement (parser);
8024           goto restart;
8025         }
8026     }
8027   /* Anything that starts with a `{' must be a compound-statement.  */
8028   else if (token->type == CPP_OPEN_BRACE)
8029     statement = cp_parser_compound_statement (parser, NULL, false, false);
8030   /* CPP_PRAGMA is a #pragma inside a function body, which constitutes
8031      a statement all its own.  */
8032   else if (token->type == CPP_PRAGMA)
8033     {
8034       /* Only certain OpenMP pragmas are attached to statements, and thus
8035          are considered statements themselves.  All others are not.  In
8036          the context of a compound, accept the pragma as a "statement" and
8037          return so that we can check for a close brace.  Otherwise we
8038          require a real statement and must go back and read one.  */
8039       if (in_compound)
8040         cp_parser_pragma (parser, pragma_compound);
8041       else if (!cp_parser_pragma (parser, pragma_stmt))
8042         goto restart;
8043       return;
8044     }
8045   else if (token->type == CPP_EOF)
8046     {
8047       cp_parser_error (parser, "expected statement");
8048       return;
8049     }
8050
8051   /* Everything else must be a declaration-statement or an
8052      expression-statement.  Try for the declaration-statement
8053      first, unless we are looking at a `;', in which case we know that
8054      we have an expression-statement.  */
8055   if (!statement)
8056     {
8057       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8058         {
8059           cp_parser_parse_tentatively (parser);
8060           /* Try to parse the declaration-statement.  */
8061           cp_parser_declaration_statement (parser);
8062           /* If that worked, we're done.  */
8063           if (cp_parser_parse_definitely (parser))
8064             return;
8065         }
8066       /* Look for an expression-statement instead.  */
8067       statement = cp_parser_expression_statement (parser, in_statement_expr);
8068     }
8069
8070   /* Set the line number for the statement.  */
8071   if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
8072     SET_EXPR_LOCATION (statement, statement_location);
8073 }
8074
8075 /* Parse the label for a labeled-statement, i.e.
8076
8077    identifier :
8078    case constant-expression :
8079    default :
8080
8081    GNU Extension:
8082    case constant-expression ... constant-expression : statement
8083
8084    When a label is parsed without errors, the label is added to the
8085    parse tree by the finish_* functions, so this function doesn't
8086    have to return the label.  */
8087
8088 static void
8089 cp_parser_label_for_labeled_statement (cp_parser* parser)
8090 {
8091   cp_token *token;
8092   tree label = NULL_TREE;
8093   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
8094
8095   /* The next token should be an identifier.  */
8096   token = cp_lexer_peek_token (parser->lexer);
8097   if (token->type != CPP_NAME
8098       && token->type != CPP_KEYWORD)
8099     {
8100       cp_parser_error (parser, "expected labeled-statement");
8101       return;
8102     }
8103
8104   parser->colon_corrects_to_scope_p = false;
8105   switch (token->keyword)
8106     {
8107     case RID_CASE:
8108       {
8109         tree expr, expr_hi;
8110         cp_token *ellipsis;
8111
8112         /* Consume the `case' token.  */
8113         cp_lexer_consume_token (parser->lexer);
8114         /* Parse the constant-expression.  */
8115         expr = cp_parser_constant_expression (parser,
8116                                               /*allow_non_constant_p=*/false,
8117                                               NULL);
8118
8119         ellipsis = cp_lexer_peek_token (parser->lexer);
8120         if (ellipsis->type == CPP_ELLIPSIS)
8121           {
8122             /* Consume the `...' token.  */
8123             cp_lexer_consume_token (parser->lexer);
8124             expr_hi =
8125               cp_parser_constant_expression (parser,
8126                                              /*allow_non_constant_p=*/false,
8127                                              NULL);
8128             /* We don't need to emit warnings here, as the common code
8129                will do this for us.  */
8130           }
8131         else
8132           expr_hi = NULL_TREE;
8133
8134         if (parser->in_switch_statement_p)
8135           finish_case_label (token->location, expr, expr_hi);
8136         else
8137           error_at (token->location,
8138                     "case label %qE not within a switch statement",
8139                     expr);
8140       }
8141       break;
8142
8143     case RID_DEFAULT:
8144       /* Consume the `default' token.  */
8145       cp_lexer_consume_token (parser->lexer);
8146
8147       if (parser->in_switch_statement_p)
8148         finish_case_label (token->location, NULL_TREE, NULL_TREE);
8149       else
8150         error_at (token->location, "case label not within a switch statement");
8151       break;
8152
8153     default:
8154       /* Anything else must be an ordinary label.  */
8155       label = finish_label_stmt (cp_parser_identifier (parser));
8156       break;
8157     }
8158
8159   /* Require the `:' token.  */
8160   cp_parser_require (parser, CPP_COLON, RT_COLON);
8161
8162   /* An ordinary label may optionally be followed by attributes.
8163      However, this is only permitted if the attributes are then
8164      followed by a semicolon.  This is because, for backward
8165      compatibility, when parsing
8166        lab: __attribute__ ((unused)) int i;
8167      we want the attribute to attach to "i", not "lab".  */
8168   if (label != NULL_TREE
8169       && cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
8170     {
8171       tree attrs;
8172
8173       cp_parser_parse_tentatively (parser);
8174       attrs = cp_parser_attributes_opt (parser);
8175       if (attrs == NULL_TREE
8176           || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8177         cp_parser_abort_tentative_parse (parser);
8178       else if (!cp_parser_parse_definitely (parser))
8179         ;
8180       else
8181         cplus_decl_attributes (&label, attrs, 0);
8182     }
8183
8184   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8185 }
8186
8187 /* Parse an expression-statement.
8188
8189    expression-statement:
8190      expression [opt] ;
8191
8192    Returns the new EXPR_STMT -- or NULL_TREE if the expression
8193    statement consists of nothing more than an `;'. IN_STATEMENT_EXPR_P
8194    indicates whether this expression-statement is part of an
8195    expression statement.  */
8196
8197 static tree
8198 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
8199 {
8200   tree statement = NULL_TREE;
8201   cp_token *token = cp_lexer_peek_token (parser->lexer);
8202
8203   /* If the next token is a ';', then there is no expression
8204      statement.  */
8205   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8206     statement = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8207
8208   /* Give a helpful message for "A<T>::type t;" and the like.  */
8209   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
8210       && !cp_parser_uncommitted_to_tentative_parse_p (parser))
8211     {
8212       if (TREE_CODE (statement) == SCOPE_REF)
8213         error_at (token->location, "need %<typename%> before %qE because "
8214                   "%qT is a dependent scope",
8215                   statement, TREE_OPERAND (statement, 0));
8216       else if (is_overloaded_fn (statement)
8217                && DECL_CONSTRUCTOR_P (get_first_fn (statement)))
8218         {
8219           /* A::A a; */
8220           tree fn = get_first_fn (statement);
8221           error_at (token->location,
8222                     "%<%T::%D%> names the constructor, not the type",
8223                     DECL_CONTEXT (fn), DECL_NAME (fn));
8224         }
8225     }
8226
8227   /* Consume the final `;'.  */
8228   cp_parser_consume_semicolon_at_end_of_statement (parser);
8229
8230   if (in_statement_expr
8231       && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
8232     /* This is the final expression statement of a statement
8233        expression.  */
8234     statement = finish_stmt_expr_expr (statement, in_statement_expr);
8235   else if (statement)
8236     statement = finish_expr_stmt (statement);
8237   else
8238     finish_stmt ();
8239
8240   return statement;
8241 }
8242
8243 /* Parse a compound-statement.
8244
8245    compound-statement:
8246      { statement-seq [opt] }
8247
8248    GNU extension:
8249
8250    compound-statement:
8251      { label-declaration-seq [opt] statement-seq [opt] }
8252
8253    label-declaration-seq:
8254      label-declaration
8255      label-declaration-seq label-declaration
8256
8257    Returns a tree representing the statement.  */
8258
8259 static tree
8260 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
8261                               bool in_try, bool function_body)
8262 {
8263   tree compound_stmt;
8264
8265   /* Consume the `{'.  */
8266   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
8267     return error_mark_node;
8268   if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
8269       && !function_body)
8270     pedwarn (input_location, OPT_pedantic,
8271              "compound-statement in constexpr function");
8272   /* Begin the compound-statement.  */
8273   compound_stmt = begin_compound_stmt (in_try ? BCS_TRY_BLOCK : 0);
8274   /* If the next keyword is `__label__' we have a label declaration.  */
8275   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
8276     cp_parser_label_declaration (parser);
8277   /* Parse an (optional) statement-seq.  */
8278   cp_parser_statement_seq_opt (parser, in_statement_expr);
8279   /* Finish the compound-statement.  */
8280   finish_compound_stmt (compound_stmt);
8281   /* Consume the `}'.  */
8282   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
8283
8284   return compound_stmt;
8285 }
8286
8287 /* Parse an (optional) statement-seq.
8288
8289    statement-seq:
8290      statement
8291      statement-seq [opt] statement  */
8292
8293 static void
8294 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
8295 {
8296   /* Scan statements until there aren't any more.  */
8297   while (true)
8298     {
8299       cp_token *token = cp_lexer_peek_token (parser->lexer);
8300
8301       /* If we are looking at a `}', then we have run out of
8302          statements; the same is true if we have reached the end
8303          of file, or have stumbled upon a stray '@end'.  */
8304       if (token->type == CPP_CLOSE_BRACE
8305           || token->type == CPP_EOF
8306           || token->type == CPP_PRAGMA_EOL
8307           || (token->type == CPP_KEYWORD && token->keyword == RID_AT_END))
8308         break;
8309       
8310       /* If we are in a compound statement and find 'else' then
8311          something went wrong.  */
8312       else if (token->type == CPP_KEYWORD && token->keyword == RID_ELSE)
8313         {
8314           if (parser->in_statement & IN_IF_STMT) 
8315             break;
8316           else
8317             {
8318               token = cp_lexer_consume_token (parser->lexer);
8319               error_at (token->location, "%<else%> without a previous %<if%>");
8320             }
8321         }
8322
8323       /* Parse the statement.  */
8324       cp_parser_statement (parser, in_statement_expr, true, NULL);
8325     }
8326 }
8327
8328 /* Parse a selection-statement.
8329
8330    selection-statement:
8331      if ( condition ) statement
8332      if ( condition ) statement else statement
8333      switch ( condition ) statement
8334
8335    Returns the new IF_STMT or SWITCH_STMT.
8336
8337    If IF_P is not NULL, *IF_P is set to indicate whether the statement
8338    is a (possibly labeled) if statement which is not enclosed in
8339    braces and has an else clause.  This is used to implement
8340    -Wparentheses.  */
8341
8342 static tree
8343 cp_parser_selection_statement (cp_parser* parser, bool *if_p)
8344 {
8345   cp_token *token;
8346   enum rid keyword;
8347
8348   if (if_p != NULL)
8349     *if_p = false;
8350
8351   /* Peek at the next token.  */
8352   token = cp_parser_require (parser, CPP_KEYWORD, RT_SELECT);
8353
8354   /* See what kind of keyword it is.  */
8355   keyword = token->keyword;
8356   switch (keyword)
8357     {
8358     case RID_IF:
8359     case RID_SWITCH:
8360       {
8361         tree statement;
8362         tree condition;
8363
8364         /* Look for the `('.  */
8365         if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
8366           {
8367             cp_parser_skip_to_end_of_statement (parser);
8368             return error_mark_node;
8369           }
8370
8371         /* Begin the selection-statement.  */
8372         if (keyword == RID_IF)
8373           statement = begin_if_stmt ();
8374         else
8375           statement = begin_switch_stmt ();
8376
8377         /* Parse the condition.  */
8378         condition = cp_parser_condition (parser);
8379         /* Look for the `)'.  */
8380         if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
8381           cp_parser_skip_to_closing_parenthesis (parser, true, false,
8382                                                  /*consume_paren=*/true);
8383
8384         if (keyword == RID_IF)
8385           {
8386             bool nested_if;
8387             unsigned char in_statement;
8388
8389             /* Add the condition.  */
8390             finish_if_stmt_cond (condition, statement);
8391
8392             /* Parse the then-clause.  */
8393             in_statement = parser->in_statement;
8394             parser->in_statement |= IN_IF_STMT;
8395             if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8396               {
8397                 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8398                 add_stmt (build_empty_stmt (loc));
8399                 cp_lexer_consume_token (parser->lexer);
8400                 if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_ELSE))
8401                   warning_at (loc, OPT_Wempty_body, "suggest braces around "
8402                               "empty body in an %<if%> statement");
8403                 nested_if = false;
8404               }
8405             else
8406               cp_parser_implicitly_scoped_statement (parser, &nested_if);
8407             parser->in_statement = in_statement;
8408
8409             finish_then_clause (statement);
8410
8411             /* If the next token is `else', parse the else-clause.  */
8412             if (cp_lexer_next_token_is_keyword (parser->lexer,
8413                                                 RID_ELSE))
8414               {
8415                 /* Consume the `else' keyword.  */
8416                 cp_lexer_consume_token (parser->lexer);
8417                 begin_else_clause (statement);
8418                 /* Parse the else-clause.  */
8419                 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8420                   {
8421                     location_t loc;
8422                     loc = cp_lexer_peek_token (parser->lexer)->location;
8423                     warning_at (loc,
8424                                 OPT_Wempty_body, "suggest braces around "
8425                                 "empty body in an %<else%> statement");
8426                     add_stmt (build_empty_stmt (loc));
8427                     cp_lexer_consume_token (parser->lexer);
8428                   }
8429                 else
8430                   cp_parser_implicitly_scoped_statement (parser, NULL);
8431
8432                 finish_else_clause (statement);
8433
8434                 /* If we are currently parsing a then-clause, then
8435                    IF_P will not be NULL.  We set it to true to
8436                    indicate that this if statement has an else clause.
8437                    This may trigger the Wparentheses warning below
8438                    when we get back up to the parent if statement.  */
8439                 if (if_p != NULL)
8440                   *if_p = true;
8441               }
8442             else
8443               {
8444                 /* This if statement does not have an else clause.  If
8445                    NESTED_IF is true, then the then-clause is an if
8446                    statement which does have an else clause.  We warn
8447                    about the potential ambiguity.  */
8448                 if (nested_if)
8449                   warning_at (EXPR_LOCATION (statement), OPT_Wparentheses,
8450                               "suggest explicit braces to avoid ambiguous"
8451                               " %<else%>");
8452               }
8453
8454             /* Now we're all done with the if-statement.  */
8455             finish_if_stmt (statement);
8456           }
8457         else
8458           {
8459             bool in_switch_statement_p;
8460             unsigned char in_statement;
8461
8462             /* Add the condition.  */
8463             finish_switch_cond (condition, statement);
8464
8465             /* Parse the body of the switch-statement.  */
8466             in_switch_statement_p = parser->in_switch_statement_p;
8467             in_statement = parser->in_statement;
8468             parser->in_switch_statement_p = true;
8469             parser->in_statement |= IN_SWITCH_STMT;
8470             cp_parser_implicitly_scoped_statement (parser, NULL);
8471             parser->in_switch_statement_p = in_switch_statement_p;
8472             parser->in_statement = in_statement;
8473
8474             /* Now we're all done with the switch-statement.  */
8475             finish_switch_stmt (statement);
8476           }
8477
8478         return statement;
8479       }
8480       break;
8481
8482     default:
8483       cp_parser_error (parser, "expected selection-statement");
8484       return error_mark_node;
8485     }
8486 }
8487
8488 /* Parse a condition.
8489
8490    condition:
8491      expression
8492      type-specifier-seq declarator = initializer-clause
8493      type-specifier-seq declarator braced-init-list
8494
8495    GNU Extension:
8496
8497    condition:
8498      type-specifier-seq declarator asm-specification [opt]
8499        attributes [opt] = assignment-expression
8500
8501    Returns the expression that should be tested.  */
8502
8503 static tree
8504 cp_parser_condition (cp_parser* parser)
8505 {
8506   cp_decl_specifier_seq type_specifiers;
8507   const char *saved_message;
8508   int declares_class_or_enum;
8509
8510   /* Try the declaration first.  */
8511   cp_parser_parse_tentatively (parser);
8512   /* New types are not allowed in the type-specifier-seq for a
8513      condition.  */
8514   saved_message = parser->type_definition_forbidden_message;
8515   parser->type_definition_forbidden_message
8516     = G_("types may not be defined in conditions");
8517   /* Parse the type-specifier-seq.  */
8518   cp_parser_decl_specifier_seq (parser,
8519                                 CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR,
8520                                 &type_specifiers,
8521                                 &declares_class_or_enum);
8522   /* Restore the saved message.  */
8523   parser->type_definition_forbidden_message = saved_message;
8524   /* If all is well, we might be looking at a declaration.  */
8525   if (!cp_parser_error_occurred (parser))
8526     {
8527       tree decl;
8528       tree asm_specification;
8529       tree attributes;
8530       cp_declarator *declarator;
8531       tree initializer = NULL_TREE;
8532
8533       /* Parse the declarator.  */
8534       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
8535                                          /*ctor_dtor_or_conv_p=*/NULL,
8536                                          /*parenthesized_p=*/NULL,
8537                                          /*member_p=*/false);
8538       /* Parse the attributes.  */
8539       attributes = cp_parser_attributes_opt (parser);
8540       /* Parse the asm-specification.  */
8541       asm_specification = cp_parser_asm_specification_opt (parser);
8542       /* If the next token is not an `=' or '{', then we might still be
8543          looking at an expression.  For example:
8544
8545            if (A(a).x)
8546
8547          looks like a decl-specifier-seq and a declarator -- but then
8548          there is no `=', so this is an expression.  */
8549       if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
8550           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
8551         cp_parser_simulate_error (parser);
8552         
8553       /* If we did see an `=' or '{', then we are looking at a declaration
8554          for sure.  */
8555       if (cp_parser_parse_definitely (parser))
8556         {
8557           tree pushed_scope;
8558           bool non_constant_p;
8559           bool flags = LOOKUP_ONLYCONVERTING;
8560
8561           /* Create the declaration.  */
8562           decl = start_decl (declarator, &type_specifiers,
8563                              /*initialized_p=*/true,
8564                              attributes, /*prefix_attributes=*/NULL_TREE,
8565                              &pushed_scope);
8566
8567           /* Parse the initializer.  */
8568           if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8569             {
8570               initializer = cp_parser_braced_list (parser, &non_constant_p);
8571               CONSTRUCTOR_IS_DIRECT_INIT (initializer) = 1;
8572               flags = 0;
8573             }
8574           else
8575             {
8576               /* Consume the `='.  */
8577               cp_parser_require (parser, CPP_EQ, RT_EQ);
8578               initializer = cp_parser_initializer_clause (parser, &non_constant_p);
8579             }
8580           if (BRACE_ENCLOSED_INITIALIZER_P (initializer))
8581             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
8582
8583           /* Process the initializer.  */
8584           cp_finish_decl (decl,
8585                           initializer, !non_constant_p,
8586                           asm_specification,
8587                           flags);
8588
8589           if (pushed_scope)
8590             pop_scope (pushed_scope);
8591
8592           return convert_from_reference (decl);
8593         }
8594     }
8595   /* If we didn't even get past the declarator successfully, we are
8596      definitely not looking at a declaration.  */
8597   else
8598     cp_parser_abort_tentative_parse (parser);
8599
8600   /* Otherwise, we are looking at an expression.  */
8601   return cp_parser_expression (parser, /*cast_p=*/false, NULL);
8602 }
8603
8604 /* Parses a for-statement or range-for-statement until the closing ')',
8605    not included. */
8606
8607 static tree
8608 cp_parser_for (cp_parser *parser)
8609 {
8610   tree init, scope, decl;
8611   bool is_range_for;
8612
8613   /* Begin the for-statement.  */
8614   scope = begin_for_scope (&init);
8615
8616   /* Parse the initialization.  */
8617   is_range_for = cp_parser_for_init_statement (parser, &decl);
8618
8619   if (is_range_for)
8620     return cp_parser_range_for (parser, scope, init, decl);
8621   else
8622     return cp_parser_c_for (parser, scope, init);
8623 }
8624
8625 static tree
8626 cp_parser_c_for (cp_parser *parser, tree scope, tree init)
8627 {
8628   /* Normal for loop */
8629   tree condition = NULL_TREE;
8630   tree expression = NULL_TREE;
8631   tree stmt;
8632
8633   stmt = begin_for_stmt (scope, init);
8634   /* The for-init-statement has already been parsed in
8635      cp_parser_for_init_statement, so no work is needed here.  */
8636   finish_for_init_stmt (stmt);
8637
8638   /* If there's a condition, process it.  */
8639   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8640     condition = cp_parser_condition (parser);
8641   finish_for_cond (condition, stmt);
8642   /* Look for the `;'.  */
8643   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8644
8645   /* If there's an expression, process it.  */
8646   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
8647     expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8648   finish_for_expr (expression, stmt);
8649
8650   return stmt;
8651 }
8652
8653 /* Tries to parse a range-based for-statement:
8654
8655   range-based-for:
8656     decl-specifier-seq declarator : expression
8657
8658   The decl-specifier-seq declarator and the `:' are already parsed by
8659   cp_parser_for_init_statement. If processing_template_decl it returns a
8660   newly created RANGE_FOR_STMT; if not, it is converted to a
8661   regular FOR_STMT.  */
8662
8663 static tree
8664 cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl)
8665 {
8666   tree stmt, range_expr;
8667
8668   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8669     {
8670       bool expr_non_constant_p;
8671       range_expr = cp_parser_braced_list (parser, &expr_non_constant_p);
8672     }
8673   else
8674     range_expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8675
8676   /* If in template, STMT is converted to a normal for-statement
8677      at instantiation. If not, it is done just ahead. */
8678   if (processing_template_decl)
8679     {
8680       stmt = begin_range_for_stmt (scope, init);
8681       finish_range_for_decl (stmt, range_decl, range_expr);
8682       if (!type_dependent_expression_p (range_expr))
8683         do_range_for_auto_deduction (range_decl, range_expr);
8684     }
8685   else
8686     {
8687       stmt = begin_for_stmt (scope, init);
8688       stmt = cp_convert_range_for (stmt, range_decl, range_expr);
8689     }
8690   return stmt;
8691 }
8692
8693 /* Subroutine of cp_convert_range_for: given the initializer expression,
8694    builds up the range temporary.  */
8695
8696 static tree
8697 build_range_temp (tree range_expr)
8698 {
8699   tree range_type, range_temp;
8700
8701   /* Find out the type deduced by the declaration
8702      `auto &&__range = range_expr'.  */
8703   range_type = cp_build_reference_type (make_auto (), true);
8704   range_type = do_auto_deduction (range_type, range_expr,
8705                                   type_uses_auto (range_type));
8706
8707   /* Create the __range variable.  */
8708   range_temp = build_decl (input_location, VAR_DECL,
8709                            get_identifier ("__for_range"), range_type);
8710   TREE_USED (range_temp) = 1;
8711   DECL_ARTIFICIAL (range_temp) = 1;
8712
8713   return range_temp;
8714 }
8715
8716 /* Used by cp_parser_range_for in template context: we aren't going to
8717    do a full conversion yet, but we still need to resolve auto in the
8718    type of the for-range-declaration if present.  This is basically
8719    a shortcut version of cp_convert_range_for.  */
8720
8721 static void
8722 do_range_for_auto_deduction (tree decl, tree range_expr)
8723 {
8724   tree auto_node = type_uses_auto (TREE_TYPE (decl));
8725   if (auto_node)
8726     {
8727       tree begin_dummy, end_dummy, range_temp, iter_type, iter_decl;
8728       range_temp = convert_from_reference (build_range_temp (range_expr));
8729       iter_type = (cp_parser_perform_range_for_lookup
8730                    (range_temp, &begin_dummy, &end_dummy));
8731       iter_decl = build_decl (input_location, VAR_DECL, NULL_TREE, iter_type);
8732       iter_decl = build_x_indirect_ref (iter_decl, RO_NULL,
8733                                         tf_warning_or_error);
8734       TREE_TYPE (decl) = do_auto_deduction (TREE_TYPE (decl),
8735                                             iter_decl, auto_node);
8736     }
8737 }
8738
8739 /* Converts a range-based for-statement into a normal
8740    for-statement, as per the definition.
8741
8742       for (RANGE_DECL : RANGE_EXPR)
8743         BLOCK
8744
8745    should be equivalent to:
8746
8747       {
8748         auto &&__range = RANGE_EXPR;
8749         for (auto __begin = BEGIN_EXPR, end = END_EXPR;
8750               __begin != __end;
8751               ++__begin)
8752           {
8753               RANGE_DECL = *__begin;
8754               BLOCK
8755           }
8756       }
8757
8758    If RANGE_EXPR is an array:
8759         BEGIN_EXPR = __range
8760         END_EXPR = __range + ARRAY_SIZE(__range)
8761    Else if RANGE_EXPR has a member 'begin' or 'end':
8762         BEGIN_EXPR = __range.begin()
8763         END_EXPR = __range.end()
8764    Else:
8765         BEGIN_EXPR = begin(__range)
8766         END_EXPR = end(__range);
8767
8768    If __range has a member 'begin' but not 'end', or vice versa, we must
8769    still use the second alternative (it will surely fail, however).
8770    When calling begin()/end() in the third alternative we must use
8771    argument dependent lookup, but always considering 'std' as an associated
8772    namespace.  */
8773
8774 tree
8775 cp_convert_range_for (tree statement, tree range_decl, tree range_expr)
8776 {
8777   tree begin, end;
8778   tree iter_type, begin_expr, end_expr;
8779   tree condition, expression;
8780
8781   if (range_decl == error_mark_node || range_expr == error_mark_node)
8782     /* If an error happened previously do nothing or else a lot of
8783        unhelpful errors would be issued.  */
8784     begin_expr = end_expr = iter_type = error_mark_node;
8785   else
8786     {
8787       tree range_temp = build_range_temp (range_expr);
8788       pushdecl (range_temp);
8789       cp_finish_decl (range_temp, range_expr,
8790                       /*is_constant_init*/false, NULL_TREE,
8791                       LOOKUP_ONLYCONVERTING);
8792
8793       range_temp = convert_from_reference (range_temp);
8794       iter_type = cp_parser_perform_range_for_lookup (range_temp,
8795                                                       &begin_expr, &end_expr);
8796     }
8797
8798   /* The new for initialization statement.  */
8799   begin = build_decl (input_location, VAR_DECL,
8800                       get_identifier ("__for_begin"), iter_type);
8801   TREE_USED (begin) = 1;
8802   DECL_ARTIFICIAL (begin) = 1;
8803   pushdecl (begin);
8804   cp_finish_decl (begin, begin_expr,
8805                   /*is_constant_init*/false, NULL_TREE,
8806                   LOOKUP_ONLYCONVERTING);
8807
8808   end = build_decl (input_location, VAR_DECL,
8809                     get_identifier ("__for_end"), iter_type);
8810   TREE_USED (end) = 1;
8811   DECL_ARTIFICIAL (end) = 1;
8812   pushdecl (end);
8813   cp_finish_decl (end, end_expr,
8814                   /*is_constant_init*/false, NULL_TREE,
8815                   LOOKUP_ONLYCONVERTING);
8816
8817   finish_for_init_stmt (statement);
8818
8819   /* The new for condition.  */
8820   condition = build_x_binary_op (NE_EXPR,
8821                                  begin, ERROR_MARK,
8822                                  end, ERROR_MARK,
8823                                  NULL, tf_warning_or_error);
8824   finish_for_cond (condition, statement);
8825
8826   /* The new increment expression.  */
8827   expression = finish_unary_op_expr (PREINCREMENT_EXPR, begin);
8828   finish_for_expr (expression, statement);
8829
8830   /* The declaration is initialized with *__begin inside the loop body.  */
8831   cp_finish_decl (range_decl,
8832                   build_x_indirect_ref (begin, RO_NULL, tf_warning_or_error),
8833                   /*is_constant_init*/false, NULL_TREE,
8834                   LOOKUP_ONLYCONVERTING);
8835
8836   return statement;
8837 }
8838
8839 /* Solves BEGIN_EXPR and END_EXPR as described in cp_convert_range_for.
8840    We need to solve both at the same time because the method used
8841    depends on the existence of members begin or end.
8842    Returns the type deduced for the iterator expression.  */
8843
8844 static tree
8845 cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end)
8846 {
8847   if (error_operand_p (range))
8848     {
8849       *begin = *end = error_mark_node;
8850       return error_mark_node;
8851     }
8852
8853   if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (range))))
8854     {
8855       error ("range-based %<for%> expression of type %qT "
8856              "has incomplete type", TREE_TYPE (range));
8857       *begin = *end = error_mark_node;
8858       return error_mark_node;
8859     }
8860   if (TREE_CODE (TREE_TYPE (range)) == ARRAY_TYPE)
8861     {
8862       /* If RANGE is an array, we will use pointer arithmetic.  */
8863       *begin = range;
8864       *end = build_binary_op (input_location, PLUS_EXPR,
8865                               range,
8866                               array_type_nelts_top (TREE_TYPE (range)),
8867                               0);
8868       return build_pointer_type (TREE_TYPE (TREE_TYPE (range)));
8869     }
8870   else
8871     {
8872       /* If it is not an array, we must do a bit of magic.  */
8873       tree id_begin, id_end;
8874       tree member_begin, member_end;
8875
8876       *begin = *end = error_mark_node;
8877
8878       id_begin = get_identifier ("begin");
8879       id_end = get_identifier ("end");
8880       member_begin = lookup_member (TREE_TYPE (range), id_begin,
8881                                     /*protect=*/2, /*want_type=*/false);
8882       member_end = lookup_member (TREE_TYPE (range), id_end,
8883                                   /*protect=*/2, /*want_type=*/false);
8884
8885       if (member_begin != NULL_TREE || member_end != NULL_TREE)
8886         {
8887           /* Use the member functions.  */
8888           if (member_begin != NULL_TREE)
8889             *begin = cp_parser_range_for_member_function (range, id_begin);
8890           else
8891             error ("range-based %<for%> expression of type %qT has an "
8892                    "%<end%> member but not a %<begin%>", TREE_TYPE (range));
8893
8894           if (member_end != NULL_TREE)
8895             *end = cp_parser_range_for_member_function (range, id_end);
8896           else
8897             error ("range-based %<for%> expression of type %qT has a "
8898                    "%<begin%> member but not an %<end%>", TREE_TYPE (range));
8899         }
8900       else
8901         {
8902           /* Use global functions with ADL.  */
8903           VEC(tree,gc) *vec;
8904           vec = make_tree_vector ();
8905
8906           VEC_safe_push (tree, gc, vec, range);
8907
8908           member_begin = perform_koenig_lookup (id_begin, vec,
8909                                                 /*include_std=*/true,
8910                                                 tf_warning_or_error);
8911           *begin = finish_call_expr (member_begin, &vec, false, true,
8912                                      tf_warning_or_error);
8913           member_end = perform_koenig_lookup (id_end, vec,
8914                                               /*include_std=*/true,
8915                                               tf_warning_or_error);
8916           *end = finish_call_expr (member_end, &vec, false, true,
8917                                    tf_warning_or_error);
8918
8919           release_tree_vector (vec);
8920         }
8921
8922       /* Last common checks.  */
8923       if (*begin == error_mark_node || *end == error_mark_node)
8924         {
8925           /* If one of the expressions is an error do no more checks.  */
8926           *begin = *end = error_mark_node;
8927           return error_mark_node;
8928         }
8929       else
8930         {
8931           tree iter_type = cv_unqualified (TREE_TYPE (*begin));
8932           /* The unqualified type of the __begin and __end temporaries should
8933              be the same, as required by the multiple auto declaration.  */
8934           if (!same_type_p (iter_type, cv_unqualified (TREE_TYPE (*end))))
8935             error ("inconsistent begin/end types in range-based %<for%> "
8936                    "statement: %qT and %qT",
8937                    TREE_TYPE (*begin), TREE_TYPE (*end));
8938           return iter_type;
8939         }
8940     }
8941 }
8942
8943 /* Helper function for cp_parser_perform_range_for_lookup.
8944    Builds a tree for RANGE.IDENTIFIER().  */
8945
8946 static tree
8947 cp_parser_range_for_member_function (tree range, tree identifier)
8948 {
8949   tree member, res;
8950   VEC(tree,gc) *vec;
8951
8952   member = finish_class_member_access_expr (range, identifier,
8953                                             false, tf_warning_or_error);
8954   if (member == error_mark_node)
8955     return error_mark_node;
8956
8957   vec = make_tree_vector ();
8958   res = finish_call_expr (member, &vec,
8959                           /*disallow_virtual=*/false,
8960                           /*koenig_p=*/false,
8961                           tf_warning_or_error);
8962   release_tree_vector (vec);
8963   return res;
8964 }
8965
8966 /* Parse an iteration-statement.
8967
8968    iteration-statement:
8969      while ( condition ) statement
8970      do statement while ( expression ) ;
8971      for ( for-init-statement condition [opt] ; expression [opt] )
8972        statement
8973
8974    Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT.  */
8975
8976 static tree
8977 cp_parser_iteration_statement (cp_parser* parser)
8978 {
8979   cp_token *token;
8980   enum rid keyword;
8981   tree statement;
8982   unsigned char in_statement;
8983
8984   /* Peek at the next token.  */
8985   token = cp_parser_require (parser, CPP_KEYWORD, RT_INTERATION);
8986   if (!token)
8987     return error_mark_node;
8988
8989   /* Remember whether or not we are already within an iteration
8990      statement.  */
8991   in_statement = parser->in_statement;
8992
8993   /* See what kind of keyword it is.  */
8994   keyword = token->keyword;
8995   switch (keyword)
8996     {
8997     case RID_WHILE:
8998       {
8999         tree condition;
9000
9001         /* Begin the while-statement.  */
9002         statement = begin_while_stmt ();
9003         /* Look for the `('.  */
9004         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
9005         /* Parse the condition.  */
9006         condition = cp_parser_condition (parser);
9007         finish_while_stmt_cond (condition, statement);
9008         /* Look for the `)'.  */
9009         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
9010         /* Parse the dependent statement.  */
9011         parser->in_statement = IN_ITERATION_STMT;
9012         cp_parser_already_scoped_statement (parser);
9013         parser->in_statement = in_statement;
9014         /* We're done with the while-statement.  */
9015         finish_while_stmt (statement);
9016       }
9017       break;
9018
9019     case RID_DO:
9020       {
9021         tree expression;
9022
9023         /* Begin the do-statement.  */
9024         statement = begin_do_stmt ();
9025         /* Parse the body of the do-statement.  */
9026         parser->in_statement = IN_ITERATION_STMT;
9027         cp_parser_implicitly_scoped_statement (parser, NULL);
9028         parser->in_statement = in_statement;
9029         finish_do_body (statement);
9030         /* Look for the `while' keyword.  */
9031         cp_parser_require_keyword (parser, RID_WHILE, RT_WHILE);
9032         /* Look for the `('.  */
9033         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
9034         /* Parse the expression.  */
9035         expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
9036         /* We're done with the do-statement.  */
9037         finish_do_stmt (expression, statement);
9038         /* Look for the `)'.  */
9039         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
9040         /* Look for the `;'.  */
9041         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9042       }
9043       break;
9044
9045     case RID_FOR:
9046       {
9047         /* Look for the `('.  */
9048         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
9049
9050         statement = cp_parser_for (parser);
9051
9052         /* Look for the `)'.  */
9053         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
9054
9055         /* Parse the body of the for-statement.  */
9056         parser->in_statement = IN_ITERATION_STMT;
9057         cp_parser_already_scoped_statement (parser);
9058         parser->in_statement = in_statement;
9059
9060         /* We're done with the for-statement.  */
9061         finish_for_stmt (statement);
9062       }
9063       break;
9064
9065     default:
9066       cp_parser_error (parser, "expected iteration-statement");
9067       statement = error_mark_node;
9068       break;
9069     }
9070
9071   return statement;
9072 }
9073
9074 /* Parse a for-init-statement or the declarator of a range-based-for.
9075    Returns true if a range-based-for declaration is seen.
9076
9077    for-init-statement:
9078      expression-statement
9079      simple-declaration  */
9080
9081 static bool
9082 cp_parser_for_init_statement (cp_parser* parser, tree *decl)
9083 {
9084   /* If the next token is a `;', then we have an empty
9085      expression-statement.  Grammatically, this is also a
9086      simple-declaration, but an invalid one, because it does not
9087      declare anything.  Therefore, if we did not handle this case
9088      specially, we would issue an error message about an invalid
9089      declaration.  */
9090   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9091     {
9092       bool is_range_for = false;
9093       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
9094
9095       parser->colon_corrects_to_scope_p = false;
9096
9097       /* We're going to speculatively look for a declaration, falling back
9098          to an expression, if necessary.  */
9099       cp_parser_parse_tentatively (parser);
9100       /* Parse the declaration.  */
9101       cp_parser_simple_declaration (parser,
9102                                     /*function_definition_allowed_p=*/false,
9103                                     decl);
9104       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
9105       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
9106         {
9107           /* It is a range-for, consume the ':' */
9108           cp_lexer_consume_token (parser->lexer);
9109           is_range_for = true;
9110           if (cxx_dialect < cxx0x)
9111             {
9112               error_at (cp_lexer_peek_token (parser->lexer)->location,
9113                         "range-based %<for%> loops are not allowed "
9114                         "in C++98 mode");
9115               *decl = error_mark_node;
9116             }
9117         }
9118       else
9119           /* The ';' is not consumed yet because we told
9120              cp_parser_simple_declaration not to.  */
9121           cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9122
9123       if (cp_parser_parse_definitely (parser))
9124         return is_range_for;
9125       /* If the tentative parse failed, then we shall need to look for an
9126          expression-statement.  */
9127     }
9128   /* If we are here, it is an expression-statement.  */
9129   cp_parser_expression_statement (parser, NULL_TREE);
9130   return false;
9131 }
9132
9133 /* Parse a jump-statement.
9134
9135    jump-statement:
9136      break ;
9137      continue ;
9138      return expression [opt] ;
9139      return braced-init-list ;
9140      goto identifier ;
9141
9142    GNU extension:
9143
9144    jump-statement:
9145      goto * expression ;
9146
9147    Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR.  */
9148
9149 static tree
9150 cp_parser_jump_statement (cp_parser* parser)
9151 {
9152   tree statement = error_mark_node;
9153   cp_token *token;
9154   enum rid keyword;
9155   unsigned char in_statement;
9156
9157   /* Peek at the next token.  */
9158   token = cp_parser_require (parser, CPP_KEYWORD, RT_JUMP);
9159   if (!token)
9160     return error_mark_node;
9161
9162   /* See what kind of keyword it is.  */
9163   keyword = token->keyword;
9164   switch (keyword)
9165     {
9166     case RID_BREAK:
9167       in_statement = parser->in_statement & ~IN_IF_STMT;      
9168       switch (in_statement)
9169         {
9170         case 0:
9171           error_at (token->location, "break statement not within loop or switch");
9172           break;
9173         default:
9174           gcc_assert ((in_statement & IN_SWITCH_STMT)
9175                       || in_statement == IN_ITERATION_STMT);
9176           statement = finish_break_stmt ();
9177           break;
9178         case IN_OMP_BLOCK:
9179           error_at (token->location, "invalid exit from OpenMP structured block");
9180           break;
9181         case IN_OMP_FOR:
9182           error_at (token->location, "break statement used with OpenMP for loop");
9183           break;
9184         }
9185       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9186       break;
9187
9188     case RID_CONTINUE:
9189       switch (parser->in_statement & ~(IN_SWITCH_STMT | IN_IF_STMT))
9190         {
9191         case 0:
9192           error_at (token->location, "continue statement not within a loop");
9193           break;
9194         case IN_ITERATION_STMT:
9195         case IN_OMP_FOR:
9196           statement = finish_continue_stmt ();
9197           break;
9198         case IN_OMP_BLOCK:
9199           error_at (token->location, "invalid exit from OpenMP structured block");
9200           break;
9201         default:
9202           gcc_unreachable ();
9203         }
9204       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9205       break;
9206
9207     case RID_RETURN:
9208       {
9209         tree expr;
9210         bool expr_non_constant_p;
9211
9212         if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9213           {
9214             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
9215             expr = cp_parser_braced_list (parser, &expr_non_constant_p);
9216           }
9217         else if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9218           expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
9219         else
9220           /* If the next token is a `;', then there is no
9221              expression.  */
9222           expr = NULL_TREE;
9223         /* Build the return-statement.  */
9224         statement = finish_return_stmt (expr);
9225         /* Look for the final `;'.  */
9226         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9227       }
9228       break;
9229
9230     case RID_GOTO:
9231       /* Create the goto-statement.  */
9232       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
9233         {
9234           /* Issue a warning about this use of a GNU extension.  */
9235           pedwarn (token->location, OPT_pedantic, "ISO C++ forbids computed gotos");
9236           /* Consume the '*' token.  */
9237           cp_lexer_consume_token (parser->lexer);
9238           /* Parse the dependent expression.  */
9239           finish_goto_stmt (cp_parser_expression (parser, /*cast_p=*/false, NULL));
9240         }
9241       else
9242         finish_goto_stmt (cp_parser_identifier (parser));
9243       /* Look for the final `;'.  */
9244       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9245       break;
9246
9247     default:
9248       cp_parser_error (parser, "expected jump-statement");
9249       break;
9250     }
9251
9252   return statement;
9253 }
9254
9255 /* Parse a declaration-statement.
9256
9257    declaration-statement:
9258      block-declaration  */
9259
9260 static void
9261 cp_parser_declaration_statement (cp_parser* parser)
9262 {
9263   void *p;
9264
9265   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9266   p = obstack_alloc (&declarator_obstack, 0);
9267
9268  /* Parse the block-declaration.  */
9269   cp_parser_block_declaration (parser, /*statement_p=*/true);
9270
9271   /* Free any declarators allocated.  */
9272   obstack_free (&declarator_obstack, p);
9273
9274   /* Finish off the statement.  */
9275   finish_stmt ();
9276 }
9277
9278 /* Some dependent statements (like `if (cond) statement'), are
9279    implicitly in their own scope.  In other words, if the statement is
9280    a single statement (as opposed to a compound-statement), it is
9281    none-the-less treated as if it were enclosed in braces.  Any
9282    declarations appearing in the dependent statement are out of scope
9283    after control passes that point.  This function parses a statement,
9284    but ensures that is in its own scope, even if it is not a
9285    compound-statement.
9286
9287    If IF_P is not NULL, *IF_P is set to indicate whether the statement
9288    is a (possibly labeled) if statement which is not enclosed in
9289    braces and has an else clause.  This is used to implement
9290    -Wparentheses.
9291
9292    Returns the new statement.  */
9293
9294 static tree
9295 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p)
9296 {
9297   tree statement;
9298
9299   if (if_p != NULL)
9300     *if_p = false;
9301
9302   /* Mark if () ; with a special NOP_EXPR.  */
9303   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9304     {
9305       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9306       cp_lexer_consume_token (parser->lexer);
9307       statement = add_stmt (build_empty_stmt (loc));
9308     }
9309   /* if a compound is opened, we simply parse the statement directly.  */
9310   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9311     statement = cp_parser_compound_statement (parser, NULL, false, false);
9312   /* If the token is not a `{', then we must take special action.  */
9313   else
9314     {
9315       /* Create a compound-statement.  */
9316       statement = begin_compound_stmt (0);
9317       /* Parse the dependent-statement.  */
9318       cp_parser_statement (parser, NULL_TREE, false, if_p);
9319       /* Finish the dummy compound-statement.  */
9320       finish_compound_stmt (statement);
9321     }
9322
9323   /* Return the statement.  */
9324   return statement;
9325 }
9326
9327 /* For some dependent statements (like `while (cond) statement'), we
9328    have already created a scope.  Therefore, even if the dependent
9329    statement is a compound-statement, we do not want to create another
9330    scope.  */
9331
9332 static void
9333 cp_parser_already_scoped_statement (cp_parser* parser)
9334 {
9335   /* If the token is a `{', then we must take special action.  */
9336   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
9337     cp_parser_statement (parser, NULL_TREE, false, NULL);
9338   else
9339     {
9340       /* Avoid calling cp_parser_compound_statement, so that we
9341          don't create a new scope.  Do everything else by hand.  */
9342       cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
9343       /* If the next keyword is `__label__' we have a label declaration.  */
9344       while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
9345         cp_parser_label_declaration (parser);
9346       /* Parse an (optional) statement-seq.  */
9347       cp_parser_statement_seq_opt (parser, NULL_TREE);
9348       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
9349     }
9350 }
9351
9352 /* Declarations [gram.dcl.dcl] */
9353
9354 /* Parse an optional declaration-sequence.
9355
9356    declaration-seq:
9357      declaration
9358      declaration-seq declaration  */
9359
9360 static void
9361 cp_parser_declaration_seq_opt (cp_parser* parser)
9362 {
9363   while (true)
9364     {
9365       cp_token *token;
9366
9367       token = cp_lexer_peek_token (parser->lexer);
9368
9369       if (token->type == CPP_CLOSE_BRACE
9370           || token->type == CPP_EOF
9371           || token->type == CPP_PRAGMA_EOL)
9372         break;
9373
9374       if (token->type == CPP_SEMICOLON)
9375         {
9376           /* A declaration consisting of a single semicolon is
9377              invalid.  Allow it unless we're being pedantic.  */
9378           cp_lexer_consume_token (parser->lexer);
9379           if (!in_system_header)
9380             pedwarn (input_location, OPT_pedantic, "extra %<;%>");
9381           continue;
9382         }
9383
9384       /* If we're entering or exiting a region that's implicitly
9385          extern "C", modify the lang context appropriately.  */
9386       if (!parser->implicit_extern_c && token->implicit_extern_c)
9387         {
9388           push_lang_context (lang_name_c);
9389           parser->implicit_extern_c = true;
9390         }
9391       else if (parser->implicit_extern_c && !token->implicit_extern_c)
9392         {
9393           pop_lang_context ();
9394           parser->implicit_extern_c = false;
9395         }
9396
9397       if (token->type == CPP_PRAGMA)
9398         {
9399           /* A top-level declaration can consist solely of a #pragma.
9400              A nested declaration cannot, so this is done here and not
9401              in cp_parser_declaration.  (A #pragma at block scope is
9402              handled in cp_parser_statement.)  */
9403           cp_parser_pragma (parser, pragma_external);
9404           continue;
9405         }
9406
9407       /* Parse the declaration itself.  */
9408       cp_parser_declaration (parser);
9409     }
9410 }
9411
9412 /* Parse a declaration.
9413
9414    declaration:
9415      block-declaration
9416      function-definition
9417      template-declaration
9418      explicit-instantiation
9419      explicit-specialization
9420      linkage-specification
9421      namespace-definition
9422
9423    GNU extension:
9424
9425    declaration:
9426       __extension__ declaration */
9427
9428 static void
9429 cp_parser_declaration (cp_parser* parser)
9430 {
9431   cp_token token1;
9432   cp_token token2;
9433   int saved_pedantic;
9434   void *p;
9435   tree attributes = NULL_TREE;
9436
9437   /* Check for the `__extension__' keyword.  */
9438   if (cp_parser_extension_opt (parser, &saved_pedantic))
9439     {
9440       /* Parse the qualified declaration.  */
9441       cp_parser_declaration (parser);
9442       /* Restore the PEDANTIC flag.  */
9443       pedantic = saved_pedantic;
9444
9445       return;
9446     }
9447
9448   /* Try to figure out what kind of declaration is present.  */
9449   token1 = *cp_lexer_peek_token (parser->lexer);
9450
9451   if (token1.type != CPP_EOF)
9452     token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
9453   else
9454     {
9455       token2.type = CPP_EOF;
9456       token2.keyword = RID_MAX;
9457     }
9458
9459   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9460   p = obstack_alloc (&declarator_obstack, 0);
9461
9462   /* If the next token is `extern' and the following token is a string
9463      literal, then we have a linkage specification.  */
9464   if (token1.keyword == RID_EXTERN
9465       && cp_parser_is_string_literal (&token2))
9466     cp_parser_linkage_specification (parser);
9467   /* If the next token is `template', then we have either a template
9468      declaration, an explicit instantiation, or an explicit
9469      specialization.  */
9470   else if (token1.keyword == RID_TEMPLATE)
9471     {
9472       /* `template <>' indicates a template specialization.  */
9473       if (token2.type == CPP_LESS
9474           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
9475         cp_parser_explicit_specialization (parser);
9476       /* `template <' indicates a template declaration.  */
9477       else if (token2.type == CPP_LESS)
9478         cp_parser_template_declaration (parser, /*member_p=*/false);
9479       /* Anything else must be an explicit instantiation.  */
9480       else
9481         cp_parser_explicit_instantiation (parser);
9482     }
9483   /* If the next token is `export', then we have a template
9484      declaration.  */
9485   else if (token1.keyword == RID_EXPORT)
9486     cp_parser_template_declaration (parser, /*member_p=*/false);
9487   /* If the next token is `extern', 'static' or 'inline' and the one
9488      after that is `template', we have a GNU extended explicit
9489      instantiation directive.  */
9490   else if (cp_parser_allow_gnu_extensions_p (parser)
9491            && (token1.keyword == RID_EXTERN
9492                || token1.keyword == RID_STATIC
9493                || token1.keyword == RID_INLINE)
9494            && token2.keyword == RID_TEMPLATE)
9495     cp_parser_explicit_instantiation (parser);
9496   /* If the next token is `namespace', check for a named or unnamed
9497      namespace definition.  */
9498   else if (token1.keyword == RID_NAMESPACE
9499            && (/* A named namespace definition.  */
9500                (token2.type == CPP_NAME
9501                 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
9502                     != CPP_EQ))
9503                /* An unnamed namespace definition.  */
9504                || token2.type == CPP_OPEN_BRACE
9505                || token2.keyword == RID_ATTRIBUTE))
9506     cp_parser_namespace_definition (parser);
9507   /* An inline (associated) namespace definition.  */
9508   else if (token1.keyword == RID_INLINE
9509            && token2.keyword == RID_NAMESPACE)
9510     cp_parser_namespace_definition (parser);
9511   /* Objective-C++ declaration/definition.  */
9512   else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
9513     cp_parser_objc_declaration (parser, NULL_TREE);
9514   else if (c_dialect_objc ()
9515            && token1.keyword == RID_ATTRIBUTE
9516            && cp_parser_objc_valid_prefix_attributes (parser, &attributes))
9517     cp_parser_objc_declaration (parser, attributes);
9518   /* We must have either a block declaration or a function
9519      definition.  */
9520   else
9521     /* Try to parse a block-declaration, or a function-definition.  */
9522     cp_parser_block_declaration (parser, /*statement_p=*/false);
9523
9524   /* Free any declarators allocated.  */
9525   obstack_free (&declarator_obstack, p);
9526 }
9527
9528 /* Parse a block-declaration.
9529
9530    block-declaration:
9531      simple-declaration
9532      asm-definition
9533      namespace-alias-definition
9534      using-declaration
9535      using-directive
9536
9537    GNU Extension:
9538
9539    block-declaration:
9540      __extension__ block-declaration
9541
9542    C++0x Extension:
9543
9544    block-declaration:
9545      static_assert-declaration
9546
9547    If STATEMENT_P is TRUE, then this block-declaration is occurring as
9548    part of a declaration-statement.  */
9549
9550 static void
9551 cp_parser_block_declaration (cp_parser *parser,
9552                              bool      statement_p)
9553 {
9554   cp_token *token1;
9555   int saved_pedantic;
9556
9557   /* Check for the `__extension__' keyword.  */
9558   if (cp_parser_extension_opt (parser, &saved_pedantic))
9559     {
9560       /* Parse the qualified declaration.  */
9561       cp_parser_block_declaration (parser, statement_p);
9562       /* Restore the PEDANTIC flag.  */
9563       pedantic = saved_pedantic;
9564
9565       return;
9566     }
9567
9568   /* Peek at the next token to figure out which kind of declaration is
9569      present.  */
9570   token1 = cp_lexer_peek_token (parser->lexer);
9571
9572   /* If the next keyword is `asm', we have an asm-definition.  */
9573   if (token1->keyword == RID_ASM)
9574     {
9575       if (statement_p)
9576         cp_parser_commit_to_tentative_parse (parser);
9577       cp_parser_asm_definition (parser);
9578     }
9579   /* If the next keyword is `namespace', we have a
9580      namespace-alias-definition.  */
9581   else if (token1->keyword == RID_NAMESPACE)
9582     cp_parser_namespace_alias_definition (parser);
9583   /* If the next keyword is `using', we have either a
9584      using-declaration or a using-directive.  */
9585   else if (token1->keyword == RID_USING)
9586     {
9587       cp_token *token2;
9588
9589       if (statement_p)
9590         cp_parser_commit_to_tentative_parse (parser);
9591       /* If the token after `using' is `namespace', then we have a
9592          using-directive.  */
9593       token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
9594       if (token2->keyword == RID_NAMESPACE)
9595         cp_parser_using_directive (parser);
9596       /* Otherwise, it's a using-declaration.  */
9597       else
9598         cp_parser_using_declaration (parser,
9599                                      /*access_declaration_p=*/false);
9600     }
9601   /* If the next keyword is `__label__' we have a misplaced label
9602      declaration.  */
9603   else if (token1->keyword == RID_LABEL)
9604     {
9605       cp_lexer_consume_token (parser->lexer);
9606       error_at (token1->location, "%<__label__%> not at the beginning of a block");
9607       cp_parser_skip_to_end_of_statement (parser);
9608       /* If the next token is now a `;', consume it.  */
9609       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9610         cp_lexer_consume_token (parser->lexer);
9611     }
9612   /* If the next token is `static_assert' we have a static assertion.  */
9613   else if (token1->keyword == RID_STATIC_ASSERT)
9614     cp_parser_static_assert (parser, /*member_p=*/false);
9615   /* Anything else must be a simple-declaration.  */
9616   else
9617     cp_parser_simple_declaration (parser, !statement_p,
9618                                   /*maybe_range_for_decl*/NULL);
9619 }
9620
9621 /* Parse a simple-declaration.
9622
9623    simple-declaration:
9624      decl-specifier-seq [opt] init-declarator-list [opt] ;
9625
9626    init-declarator-list:
9627      init-declarator
9628      init-declarator-list , init-declarator
9629
9630    If FUNCTION_DEFINITION_ALLOWED_P is TRUE, then we also recognize a
9631    function-definition as a simple-declaration.
9632
9633    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
9634    parsed declaration if it is an uninitialized single declarator not followed
9635    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
9636    if present, will not be consumed.  */
9637
9638 static void
9639 cp_parser_simple_declaration (cp_parser* parser,
9640                               bool function_definition_allowed_p,
9641                               tree *maybe_range_for_decl)
9642 {
9643   cp_decl_specifier_seq decl_specifiers;
9644   int declares_class_or_enum;
9645   bool saw_declarator;
9646
9647   if (maybe_range_for_decl)
9648     *maybe_range_for_decl = NULL_TREE;
9649
9650   /* Defer access checks until we know what is being declared; the
9651      checks for names appearing in the decl-specifier-seq should be
9652      done as if we were in the scope of the thing being declared.  */
9653   push_deferring_access_checks (dk_deferred);
9654
9655   /* Parse the decl-specifier-seq.  We have to keep track of whether
9656      or not the decl-specifier-seq declares a named class or
9657      enumeration type, since that is the only case in which the
9658      init-declarator-list is allowed to be empty.
9659
9660      [dcl.dcl]
9661
9662      In a simple-declaration, the optional init-declarator-list can be
9663      omitted only when declaring a class or enumeration, that is when
9664      the decl-specifier-seq contains either a class-specifier, an
9665      elaborated-type-specifier, or an enum-specifier.  */
9666   cp_parser_decl_specifier_seq (parser,
9667                                 CP_PARSER_FLAGS_OPTIONAL,
9668                                 &decl_specifiers,
9669                                 &declares_class_or_enum);
9670   /* We no longer need to defer access checks.  */
9671   stop_deferring_access_checks ();
9672
9673   /* In a block scope, a valid declaration must always have a
9674      decl-specifier-seq.  By not trying to parse declarators, we can
9675      resolve the declaration/expression ambiguity more quickly.  */
9676   if (!function_definition_allowed_p
9677       && !decl_specifiers.any_specifiers_p)
9678     {
9679       cp_parser_error (parser, "expected declaration");
9680       goto done;
9681     }
9682
9683   /* If the next two tokens are both identifiers, the code is
9684      erroneous. The usual cause of this situation is code like:
9685
9686        T t;
9687
9688      where "T" should name a type -- but does not.  */
9689   if (!decl_specifiers.any_type_specifiers_p
9690       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
9691     {
9692       /* If parsing tentatively, we should commit; we really are
9693          looking at a declaration.  */
9694       cp_parser_commit_to_tentative_parse (parser);
9695       /* Give up.  */
9696       goto done;
9697     }
9698
9699   /* If we have seen at least one decl-specifier, and the next token
9700      is not a parenthesis, then we must be looking at a declaration.
9701      (After "int (" we might be looking at a functional cast.)  */
9702   if (decl_specifiers.any_specifiers_p
9703       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
9704       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
9705       && !cp_parser_error_occurred (parser))
9706     cp_parser_commit_to_tentative_parse (parser);
9707
9708   /* Keep going until we hit the `;' at the end of the simple
9709      declaration.  */
9710   saw_declarator = false;
9711   while (cp_lexer_next_token_is_not (parser->lexer,
9712                                      CPP_SEMICOLON))
9713     {
9714       cp_token *token;
9715       bool function_definition_p;
9716       tree decl;
9717
9718       if (saw_declarator)
9719         {
9720           /* If we are processing next declarator, coma is expected */
9721           token = cp_lexer_peek_token (parser->lexer);
9722           gcc_assert (token->type == CPP_COMMA);
9723           cp_lexer_consume_token (parser->lexer);
9724           if (maybe_range_for_decl)
9725             *maybe_range_for_decl = error_mark_node;
9726         }
9727       else
9728         saw_declarator = true;
9729
9730       /* Parse the init-declarator.  */
9731       decl = cp_parser_init_declarator (parser, &decl_specifiers,
9732                                         /*checks=*/NULL,
9733                                         function_definition_allowed_p,
9734                                         /*member_p=*/false,
9735                                         declares_class_or_enum,
9736                                         &function_definition_p,
9737                                         maybe_range_for_decl);
9738       /* If an error occurred while parsing tentatively, exit quickly.
9739          (That usually happens when in the body of a function; each
9740          statement is treated as a declaration-statement until proven
9741          otherwise.)  */
9742       if (cp_parser_error_occurred (parser))
9743         goto done;
9744       /* Handle function definitions specially.  */
9745       if (function_definition_p)
9746         {
9747           /* If the next token is a `,', then we are probably
9748              processing something like:
9749
9750                void f() {}, *p;
9751
9752              which is erroneous.  */
9753           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
9754             {
9755               cp_token *token = cp_lexer_peek_token (parser->lexer);
9756               error_at (token->location,
9757                         "mixing"
9758                         " declarations and function-definitions is forbidden");
9759             }
9760           /* Otherwise, we're done with the list of declarators.  */
9761           else
9762             {
9763               pop_deferring_access_checks ();
9764               return;
9765             }
9766         }
9767       if (maybe_range_for_decl && *maybe_range_for_decl == NULL_TREE)
9768         *maybe_range_for_decl = decl;
9769       /* The next token should be either a `,' or a `;'.  */
9770       token = cp_lexer_peek_token (parser->lexer);
9771       /* If it's a `,', there are more declarators to come.  */
9772       if (token->type == CPP_COMMA)
9773         /* will be consumed next time around */;
9774       /* If it's a `;', we are done.  */
9775       else if (token->type == CPP_SEMICOLON || maybe_range_for_decl)
9776         break;
9777       /* Anything else is an error.  */
9778       else
9779         {
9780           /* If we have already issued an error message we don't need
9781              to issue another one.  */
9782           if (decl != error_mark_node
9783               || cp_parser_uncommitted_to_tentative_parse_p (parser))
9784             cp_parser_error (parser, "expected %<,%> or %<;%>");
9785           /* Skip tokens until we reach the end of the statement.  */
9786           cp_parser_skip_to_end_of_statement (parser);
9787           /* If the next token is now a `;', consume it.  */
9788           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9789             cp_lexer_consume_token (parser->lexer);
9790           goto done;
9791         }
9792       /* After the first time around, a function-definition is not
9793          allowed -- even if it was OK at first.  For example:
9794
9795            int i, f() {}
9796
9797          is not valid.  */
9798       function_definition_allowed_p = false;
9799     }
9800
9801   /* Issue an error message if no declarators are present, and the
9802      decl-specifier-seq does not itself declare a class or
9803      enumeration.  */
9804   if (!saw_declarator)
9805     {
9806       if (cp_parser_declares_only_class_p (parser))
9807         shadow_tag (&decl_specifiers);
9808       /* Perform any deferred access checks.  */
9809       perform_deferred_access_checks ();
9810     }
9811
9812   /* Consume the `;'.  */
9813   if (!maybe_range_for_decl)
9814       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9815
9816  done:
9817   pop_deferring_access_checks ();
9818 }
9819
9820 /* Parse a decl-specifier-seq.
9821
9822    decl-specifier-seq:
9823      decl-specifier-seq [opt] decl-specifier
9824
9825    decl-specifier:
9826      storage-class-specifier
9827      type-specifier
9828      function-specifier
9829      friend
9830      typedef
9831
9832    GNU Extension:
9833
9834    decl-specifier:
9835      attributes
9836
9837    Set *DECL_SPECS to a representation of the decl-specifier-seq.
9838
9839    The parser flags FLAGS is used to control type-specifier parsing.
9840
9841    *DECLARES_CLASS_OR_ENUM is set to the bitwise or of the following
9842    flags:
9843
9844      1: one of the decl-specifiers is an elaborated-type-specifier
9845         (i.e., a type declaration)
9846      2: one of the decl-specifiers is an enum-specifier or a
9847         class-specifier (i.e., a type definition)
9848
9849    */
9850
9851 static void
9852 cp_parser_decl_specifier_seq (cp_parser* parser,
9853                               cp_parser_flags flags,
9854                               cp_decl_specifier_seq *decl_specs,
9855                               int* declares_class_or_enum)
9856 {
9857   bool constructor_possible_p = !parser->in_declarator_p;
9858   cp_token *start_token = NULL;
9859
9860   /* Clear DECL_SPECS.  */
9861   clear_decl_specs (decl_specs);
9862
9863   /* Assume no class or enumeration type is declared.  */
9864   *declares_class_or_enum = 0;
9865
9866   /* Keep reading specifiers until there are no more to read.  */
9867   while (true)
9868     {
9869       bool constructor_p;
9870       bool found_decl_spec;
9871       cp_token *token;
9872
9873       /* Peek at the next token.  */
9874       token = cp_lexer_peek_token (parser->lexer);
9875
9876       /* Save the first token of the decl spec list for error
9877          reporting.  */
9878       if (!start_token)
9879         start_token = token;
9880       /* Handle attributes.  */
9881       if (token->keyword == RID_ATTRIBUTE)
9882         {
9883           /* Parse the attributes.  */
9884           decl_specs->attributes
9885             = chainon (decl_specs->attributes,
9886                        cp_parser_attributes_opt (parser));
9887           continue;
9888         }
9889       /* Assume we will find a decl-specifier keyword.  */
9890       found_decl_spec = true;
9891       /* If the next token is an appropriate keyword, we can simply
9892          add it to the list.  */
9893       switch (token->keyword)
9894         {
9895           /* decl-specifier:
9896                friend
9897                constexpr */
9898         case RID_FRIEND:
9899           if (!at_class_scope_p ())
9900             {
9901               error_at (token->location, "%<friend%> used outside of class");
9902               cp_lexer_purge_token (parser->lexer);
9903             }
9904           else
9905             {
9906               ++decl_specs->specs[(int) ds_friend];
9907               /* Consume the token.  */
9908               cp_lexer_consume_token (parser->lexer);
9909             }
9910           break;
9911
9912         case RID_CONSTEXPR:
9913           ++decl_specs->specs[(int) ds_constexpr];
9914           cp_lexer_consume_token (parser->lexer);
9915           break;
9916
9917           /* function-specifier:
9918                inline
9919                virtual
9920                explicit  */
9921         case RID_INLINE:
9922         case RID_VIRTUAL:
9923         case RID_EXPLICIT:
9924           cp_parser_function_specifier_opt (parser, decl_specs);
9925           break;
9926
9927           /* decl-specifier:
9928                typedef  */
9929         case RID_TYPEDEF:
9930           ++decl_specs->specs[(int) ds_typedef];
9931           /* Consume the token.  */
9932           cp_lexer_consume_token (parser->lexer);
9933           /* A constructor declarator cannot appear in a typedef.  */
9934           constructor_possible_p = false;
9935           /* The "typedef" keyword can only occur in a declaration; we
9936              may as well commit at this point.  */
9937           cp_parser_commit_to_tentative_parse (parser);
9938
9939           if (decl_specs->storage_class != sc_none)
9940             decl_specs->conflicting_specifiers_p = true;
9941           break;
9942
9943           /* storage-class-specifier:
9944                auto
9945                register
9946                static
9947                extern
9948                mutable
9949
9950              GNU Extension:
9951                thread  */
9952         case RID_AUTO:
9953           if (cxx_dialect == cxx98) 
9954             {
9955               /* Consume the token.  */
9956               cp_lexer_consume_token (parser->lexer);
9957
9958               /* Complain about `auto' as a storage specifier, if
9959                  we're complaining about C++0x compatibility.  */
9960               warning_at (token->location, OPT_Wc__0x_compat, "%<auto%>"
9961                           " will change meaning in C++0x; please remove it");
9962
9963               /* Set the storage class anyway.  */
9964               cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
9965                                            token->location);
9966             }
9967           else
9968             /* C++0x auto type-specifier.  */
9969             found_decl_spec = false;
9970           break;
9971
9972         case RID_REGISTER:
9973         case RID_STATIC:
9974         case RID_EXTERN:
9975         case RID_MUTABLE:
9976           /* Consume the token.  */
9977           cp_lexer_consume_token (parser->lexer);
9978           cp_parser_set_storage_class (parser, decl_specs, token->keyword,
9979                                        token->location);
9980           break;
9981         case RID_THREAD:
9982           /* Consume the token.  */
9983           cp_lexer_consume_token (parser->lexer);
9984           ++decl_specs->specs[(int) ds_thread];
9985           break;
9986
9987         default:
9988           /* We did not yet find a decl-specifier yet.  */
9989           found_decl_spec = false;
9990           break;
9991         }
9992
9993       if (found_decl_spec
9994           && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
9995           && token->keyword != RID_CONSTEXPR)
9996         error ("decl-specifier invalid in condition");
9997
9998       /* Constructors are a special case.  The `S' in `S()' is not a
9999          decl-specifier; it is the beginning of the declarator.  */
10000       constructor_p
10001         = (!found_decl_spec
10002            && constructor_possible_p
10003            && (cp_parser_constructor_declarator_p
10004                (parser, decl_specs->specs[(int) ds_friend] != 0)));
10005
10006       /* If we don't have a DECL_SPEC yet, then we must be looking at
10007          a type-specifier.  */
10008       if (!found_decl_spec && !constructor_p)
10009         {
10010           int decl_spec_declares_class_or_enum;
10011           bool is_cv_qualifier;
10012           tree type_spec;
10013
10014           type_spec
10015             = cp_parser_type_specifier (parser, flags,
10016                                         decl_specs,
10017                                         /*is_declaration=*/true,
10018                                         &decl_spec_declares_class_or_enum,
10019                                         &is_cv_qualifier);
10020           *declares_class_or_enum |= decl_spec_declares_class_or_enum;
10021
10022           /* If this type-specifier referenced a user-defined type
10023              (a typedef, class-name, etc.), then we can't allow any
10024              more such type-specifiers henceforth.
10025
10026              [dcl.spec]
10027
10028              The longest sequence of decl-specifiers that could
10029              possibly be a type name is taken as the
10030              decl-specifier-seq of a declaration.  The sequence shall
10031              be self-consistent as described below.
10032
10033              [dcl.type]
10034
10035              As a general rule, at most one type-specifier is allowed
10036              in the complete decl-specifier-seq of a declaration.  The
10037              only exceptions are the following:
10038
10039              -- const or volatile can be combined with any other
10040                 type-specifier.
10041
10042              -- signed or unsigned can be combined with char, long,
10043                 short, or int.
10044
10045              -- ..
10046
10047              Example:
10048
10049                typedef char* Pc;
10050                void g (const int Pc);
10051
10052              Here, Pc is *not* part of the decl-specifier seq; it's
10053              the declarator.  Therefore, once we see a type-specifier
10054              (other than a cv-qualifier), we forbid any additional
10055              user-defined types.  We *do* still allow things like `int
10056              int' to be considered a decl-specifier-seq, and issue the
10057              error message later.  */
10058           if (type_spec && !is_cv_qualifier)
10059             flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
10060           /* A constructor declarator cannot follow a type-specifier.  */
10061           if (type_spec)
10062             {
10063               constructor_possible_p = false;
10064               found_decl_spec = true;
10065               if (!is_cv_qualifier)
10066                 decl_specs->any_type_specifiers_p = true;
10067             }
10068         }
10069
10070       /* If we still do not have a DECL_SPEC, then there are no more
10071          decl-specifiers.  */
10072       if (!found_decl_spec)
10073         break;
10074
10075       decl_specs->any_specifiers_p = true;
10076       /* After we see one decl-specifier, further decl-specifiers are
10077          always optional.  */
10078       flags |= CP_PARSER_FLAGS_OPTIONAL;
10079     }
10080
10081   cp_parser_check_decl_spec (decl_specs, start_token->location);
10082
10083   /* Don't allow a friend specifier with a class definition.  */
10084   if (decl_specs->specs[(int) ds_friend] != 0
10085       && (*declares_class_or_enum & 2))
10086     error_at (start_token->location,
10087               "class definition may not be declared a friend");
10088 }
10089
10090 /* Parse an (optional) storage-class-specifier.
10091
10092    storage-class-specifier:
10093      auto
10094      register
10095      static
10096      extern
10097      mutable
10098
10099    GNU Extension:
10100
10101    storage-class-specifier:
10102      thread
10103
10104    Returns an IDENTIFIER_NODE corresponding to the keyword used.  */
10105
10106 static tree
10107 cp_parser_storage_class_specifier_opt (cp_parser* parser)
10108 {
10109   switch (cp_lexer_peek_token (parser->lexer)->keyword)
10110     {
10111     case RID_AUTO:
10112       if (cxx_dialect != cxx98)
10113         return NULL_TREE;
10114       /* Fall through for C++98.  */
10115
10116     case RID_REGISTER:
10117     case RID_STATIC:
10118     case RID_EXTERN:
10119     case RID_MUTABLE:
10120     case RID_THREAD:
10121       /* Consume the token.  */
10122       return cp_lexer_consume_token (parser->lexer)->u.value;
10123
10124     default:
10125       return NULL_TREE;
10126     }
10127 }
10128
10129 /* Parse an (optional) function-specifier.
10130
10131    function-specifier:
10132      inline
10133      virtual
10134      explicit
10135
10136    Returns an IDENTIFIER_NODE corresponding to the keyword used.
10137    Updates DECL_SPECS, if it is non-NULL.  */
10138
10139 static tree
10140 cp_parser_function_specifier_opt (cp_parser* parser,
10141                                   cp_decl_specifier_seq *decl_specs)
10142 {
10143   cp_token *token = cp_lexer_peek_token (parser->lexer);
10144   switch (token->keyword)
10145     {
10146     case RID_INLINE:
10147       if (decl_specs)
10148         ++decl_specs->specs[(int) ds_inline];
10149       break;
10150
10151     case RID_VIRTUAL:
10152       /* 14.5.2.3 [temp.mem]
10153
10154          A member function template shall not be virtual.  */
10155       if (PROCESSING_REAL_TEMPLATE_DECL_P ())
10156         error_at (token->location, "templates may not be %<virtual%>");
10157       else if (decl_specs)
10158         ++decl_specs->specs[(int) ds_virtual];
10159       break;
10160
10161     case RID_EXPLICIT:
10162       if (decl_specs)
10163         ++decl_specs->specs[(int) ds_explicit];
10164       break;
10165
10166     default:
10167       return NULL_TREE;
10168     }
10169
10170   /* Consume the token.  */
10171   return cp_lexer_consume_token (parser->lexer)->u.value;
10172 }
10173
10174 /* Parse a linkage-specification.
10175
10176    linkage-specification:
10177      extern string-literal { declaration-seq [opt] }
10178      extern string-literal declaration  */
10179
10180 static void
10181 cp_parser_linkage_specification (cp_parser* parser)
10182 {
10183   tree linkage;
10184
10185   /* Look for the `extern' keyword.  */
10186   cp_parser_require_keyword (parser, RID_EXTERN, RT_EXTERN);
10187
10188   /* Look for the string-literal.  */
10189   linkage = cp_parser_string_literal (parser, false, false);
10190
10191   /* Transform the literal into an identifier.  If the literal is a
10192      wide-character string, or contains embedded NULs, then we can't
10193      handle it as the user wants.  */
10194   if (strlen (TREE_STRING_POINTER (linkage))
10195       != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
10196     {
10197       cp_parser_error (parser, "invalid linkage-specification");
10198       /* Assume C++ linkage.  */
10199       linkage = lang_name_cplusplus;
10200     }
10201   else
10202     linkage = get_identifier (TREE_STRING_POINTER (linkage));
10203
10204   /* We're now using the new linkage.  */
10205   push_lang_context (linkage);
10206
10207   /* If the next token is a `{', then we're using the first
10208      production.  */
10209   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10210     {
10211       /* Consume the `{' token.  */
10212       cp_lexer_consume_token (parser->lexer);
10213       /* Parse the declarations.  */
10214       cp_parser_declaration_seq_opt (parser);
10215       /* Look for the closing `}'.  */
10216       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
10217     }
10218   /* Otherwise, there's just one declaration.  */
10219   else
10220     {
10221       bool saved_in_unbraced_linkage_specification_p;
10222
10223       saved_in_unbraced_linkage_specification_p
10224         = parser->in_unbraced_linkage_specification_p;
10225       parser->in_unbraced_linkage_specification_p = true;
10226       cp_parser_declaration (parser);
10227       parser->in_unbraced_linkage_specification_p
10228         = saved_in_unbraced_linkage_specification_p;
10229     }
10230
10231   /* We're done with the linkage-specification.  */
10232   pop_lang_context ();
10233 }
10234
10235 /* Parse a static_assert-declaration.
10236
10237    static_assert-declaration:
10238      static_assert ( constant-expression , string-literal ) ; 
10239
10240    If MEMBER_P, this static_assert is a class member.  */
10241
10242 static void 
10243 cp_parser_static_assert(cp_parser *parser, bool member_p)
10244 {
10245   tree condition;
10246   tree message;
10247   cp_token *token;
10248   location_t saved_loc;
10249   bool dummy;
10250
10251   /* Peek at the `static_assert' token so we can keep track of exactly
10252      where the static assertion started.  */
10253   token = cp_lexer_peek_token (parser->lexer);
10254   saved_loc = token->location;
10255
10256   /* Look for the `static_assert' keyword.  */
10257   if (!cp_parser_require_keyword (parser, RID_STATIC_ASSERT, 
10258                                   RT_STATIC_ASSERT))
10259     return;
10260
10261   /*  We know we are in a static assertion; commit to any tentative
10262       parse.  */
10263   if (cp_parser_parsing_tentatively (parser))
10264     cp_parser_commit_to_tentative_parse (parser);
10265
10266   /* Parse the `(' starting the static assertion condition.  */
10267   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10268
10269   /* Parse the constant-expression.  Allow a non-constant expression
10270      here in order to give better diagnostics in finish_static_assert.  */
10271   condition = 
10272     cp_parser_constant_expression (parser,
10273                                    /*allow_non_constant_p=*/true,
10274                                    /*non_constant_p=*/&dummy);
10275
10276   /* Parse the separating `,'.  */
10277   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
10278
10279   /* Parse the string-literal message.  */
10280   message = cp_parser_string_literal (parser, 
10281                                       /*translate=*/false,
10282                                       /*wide_ok=*/true);
10283
10284   /* A `)' completes the static assertion.  */
10285   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10286     cp_parser_skip_to_closing_parenthesis (parser, 
10287                                            /*recovering=*/true, 
10288                                            /*or_comma=*/false,
10289                                            /*consume_paren=*/true);
10290
10291   /* A semicolon terminates the declaration.  */
10292   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10293
10294   /* Complete the static assertion, which may mean either processing 
10295      the static assert now or saving it for template instantiation.  */
10296   finish_static_assert (condition, message, saved_loc, member_p);
10297 }
10298
10299 /* Parse a `decltype' type. Returns the type. 
10300
10301    simple-type-specifier:
10302      decltype ( expression )  */
10303
10304 static tree
10305 cp_parser_decltype (cp_parser *parser)
10306 {
10307   tree expr;
10308   bool id_expression_or_member_access_p = false;
10309   const char *saved_message;
10310   bool saved_integral_constant_expression_p;
10311   bool saved_non_integral_constant_expression_p;
10312   cp_token *id_expr_start_token;
10313   cp_token *start_token = cp_lexer_peek_token (parser->lexer);
10314
10315   if (start_token->type == CPP_DECLTYPE)
10316     {
10317       /* Already parsed.  */
10318       cp_lexer_consume_token (parser->lexer);
10319       return start_token->u.value;
10320     }
10321
10322   /* Look for the `decltype' token.  */
10323   if (!cp_parser_require_keyword (parser, RID_DECLTYPE, RT_DECLTYPE))
10324     return error_mark_node;
10325
10326   /* Types cannot be defined in a `decltype' expression.  Save away the
10327      old message.  */
10328   saved_message = parser->type_definition_forbidden_message;
10329
10330   /* And create the new one.  */
10331   parser->type_definition_forbidden_message
10332     = G_("types may not be defined in %<decltype%> expressions");
10333
10334   /* The restrictions on constant-expressions do not apply inside
10335      decltype expressions.  */
10336   saved_integral_constant_expression_p
10337     = parser->integral_constant_expression_p;
10338   saved_non_integral_constant_expression_p
10339     = parser->non_integral_constant_expression_p;
10340   parser->integral_constant_expression_p = false;
10341
10342   /* Do not actually evaluate the expression.  */
10343   ++cp_unevaluated_operand;
10344
10345   /* Do not warn about problems with the expression.  */
10346   ++c_inhibit_evaluation_warnings;
10347
10348   /* Parse the opening `('.  */
10349   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
10350     return error_mark_node;
10351   
10352   /* First, try parsing an id-expression.  */
10353   id_expr_start_token = cp_lexer_peek_token (parser->lexer);
10354   cp_parser_parse_tentatively (parser);
10355   expr = cp_parser_id_expression (parser,
10356                                   /*template_keyword_p=*/false,
10357                                   /*check_dependency_p=*/true,
10358                                   /*template_p=*/NULL,
10359                                   /*declarator_p=*/false,
10360                                   /*optional_p=*/false);
10361
10362   if (!cp_parser_error_occurred (parser) && expr != error_mark_node)
10363     {
10364       bool non_integral_constant_expression_p = false;
10365       tree id_expression = expr;
10366       cp_id_kind idk;
10367       const char *error_msg;
10368
10369       if (TREE_CODE (expr) == IDENTIFIER_NODE)
10370         /* Lookup the name we got back from the id-expression.  */
10371         expr = cp_parser_lookup_name (parser, expr,
10372                                       none_type,
10373                                       /*is_template=*/false,
10374                                       /*is_namespace=*/false,
10375                                       /*check_dependency=*/true,
10376                                       /*ambiguous_decls=*/NULL,
10377                                       id_expr_start_token->location);
10378
10379       if (expr
10380           && expr != error_mark_node
10381           && TREE_CODE (expr) != TEMPLATE_ID_EXPR
10382           && TREE_CODE (expr) != TYPE_DECL
10383           && (TREE_CODE (expr) != BIT_NOT_EXPR
10384               || !TYPE_P (TREE_OPERAND (expr, 0)))
10385           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10386         {
10387           /* Complete lookup of the id-expression.  */
10388           expr = (finish_id_expression
10389                   (id_expression, expr, parser->scope, &idk,
10390                    /*integral_constant_expression_p=*/false,
10391                    /*allow_non_integral_constant_expression_p=*/true,
10392                    &non_integral_constant_expression_p,
10393                    /*template_p=*/false,
10394                    /*done=*/true,
10395                    /*address_p=*/false,
10396                    /*template_arg_p=*/false,
10397                    &error_msg,
10398                    id_expr_start_token->location));
10399
10400           if (expr == error_mark_node)
10401             /* We found an id-expression, but it was something that we
10402                should not have found. This is an error, not something
10403                we can recover from, so note that we found an
10404                id-expression and we'll recover as gracefully as
10405                possible.  */
10406             id_expression_or_member_access_p = true;
10407         }
10408
10409       if (expr 
10410           && expr != error_mark_node
10411           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10412         /* We have an id-expression.  */
10413         id_expression_or_member_access_p = true;
10414     }
10415
10416   if (!id_expression_or_member_access_p)
10417     {
10418       /* Abort the id-expression parse.  */
10419       cp_parser_abort_tentative_parse (parser);
10420
10421       /* Parsing tentatively, again.  */
10422       cp_parser_parse_tentatively (parser);
10423
10424       /* Parse a class member access.  */
10425       expr = cp_parser_postfix_expression (parser, /*address_p=*/false,
10426                                            /*cast_p=*/false,
10427                                            /*member_access_only_p=*/true, NULL);
10428
10429       if (expr 
10430           && expr != error_mark_node
10431           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10432         /* We have an id-expression.  */
10433         id_expression_or_member_access_p = true;
10434     }
10435
10436   if (id_expression_or_member_access_p)
10437     /* We have parsed the complete id-expression or member access.  */
10438     cp_parser_parse_definitely (parser);
10439   else
10440     {
10441       bool saved_greater_than_is_operator_p;
10442
10443       /* Abort our attempt to parse an id-expression or member access
10444          expression.  */
10445       cp_parser_abort_tentative_parse (parser);
10446
10447       /* Within a parenthesized expression, a `>' token is always
10448          the greater-than operator.  */
10449       saved_greater_than_is_operator_p
10450         = parser->greater_than_is_operator_p;
10451       parser->greater_than_is_operator_p = true;
10452
10453       /* Parse a full expression.  */
10454       expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
10455
10456       /* The `>' token might be the end of a template-id or
10457          template-parameter-list now.  */
10458       parser->greater_than_is_operator_p
10459         = saved_greater_than_is_operator_p;
10460     }
10461
10462   /* Go back to evaluating expressions.  */
10463   --cp_unevaluated_operand;
10464   --c_inhibit_evaluation_warnings;
10465
10466   /* Restore the old message and the integral constant expression
10467      flags.  */
10468   parser->type_definition_forbidden_message = saved_message;
10469   parser->integral_constant_expression_p
10470     = saved_integral_constant_expression_p;
10471   parser->non_integral_constant_expression_p
10472     = saved_non_integral_constant_expression_p;
10473
10474   /* Parse to the closing `)'.  */
10475   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10476     {
10477       cp_parser_skip_to_closing_parenthesis (parser, true, false,
10478                                              /*consume_paren=*/true);
10479       return error_mark_node;
10480     }
10481
10482   expr = finish_decltype_type (expr, id_expression_or_member_access_p,
10483                                tf_warning_or_error);
10484
10485   /* Replace the decltype with a CPP_DECLTYPE so we don't need to parse
10486      it again.  */
10487   start_token->type = CPP_DECLTYPE;
10488   start_token->u.value = expr;
10489   start_token->keyword = RID_MAX;
10490   cp_lexer_purge_tokens_after (parser->lexer, start_token);
10491
10492   return expr;
10493 }
10494
10495 /* Special member functions [gram.special] */
10496
10497 /* Parse a conversion-function-id.
10498
10499    conversion-function-id:
10500      operator conversion-type-id
10501
10502    Returns an IDENTIFIER_NODE representing the operator.  */
10503
10504 static tree
10505 cp_parser_conversion_function_id (cp_parser* parser)
10506 {
10507   tree type;
10508   tree saved_scope;
10509   tree saved_qualifying_scope;
10510   tree saved_object_scope;
10511   tree pushed_scope = NULL_TREE;
10512
10513   /* Look for the `operator' token.  */
10514   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10515     return error_mark_node;
10516   /* When we parse the conversion-type-id, the current scope will be
10517      reset.  However, we need that information in able to look up the
10518      conversion function later, so we save it here.  */
10519   saved_scope = parser->scope;
10520   saved_qualifying_scope = parser->qualifying_scope;
10521   saved_object_scope = parser->object_scope;
10522   /* We must enter the scope of the class so that the names of
10523      entities declared within the class are available in the
10524      conversion-type-id.  For example, consider:
10525
10526        struct S {
10527          typedef int I;
10528          operator I();
10529        };
10530
10531        S::operator I() { ... }
10532
10533      In order to see that `I' is a type-name in the definition, we
10534      must be in the scope of `S'.  */
10535   if (saved_scope)
10536     pushed_scope = push_scope (saved_scope);
10537   /* Parse the conversion-type-id.  */
10538   type = cp_parser_conversion_type_id (parser);
10539   /* Leave the scope of the class, if any.  */
10540   if (pushed_scope)
10541     pop_scope (pushed_scope);
10542   /* Restore the saved scope.  */
10543   parser->scope = saved_scope;
10544   parser->qualifying_scope = saved_qualifying_scope;
10545   parser->object_scope = saved_object_scope;
10546   /* If the TYPE is invalid, indicate failure.  */
10547   if (type == error_mark_node)
10548     return error_mark_node;
10549   return mangle_conv_op_name_for_type (type);
10550 }
10551
10552 /* Parse a conversion-type-id:
10553
10554    conversion-type-id:
10555      type-specifier-seq conversion-declarator [opt]
10556
10557    Returns the TYPE specified.  */
10558
10559 static tree
10560 cp_parser_conversion_type_id (cp_parser* parser)
10561 {
10562   tree attributes;
10563   cp_decl_specifier_seq type_specifiers;
10564   cp_declarator *declarator;
10565   tree type_specified;
10566
10567   /* Parse the attributes.  */
10568   attributes = cp_parser_attributes_opt (parser);
10569   /* Parse the type-specifiers.  */
10570   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
10571                                 /*is_trailing_return=*/false,
10572                                 &type_specifiers);
10573   /* If that didn't work, stop.  */
10574   if (type_specifiers.type == error_mark_node)
10575     return error_mark_node;
10576   /* Parse the conversion-declarator.  */
10577   declarator = cp_parser_conversion_declarator_opt (parser);
10578
10579   type_specified =  grokdeclarator (declarator, &type_specifiers, TYPENAME,
10580                                     /*initialized=*/0, &attributes);
10581   if (attributes)
10582     cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
10583
10584   /* Don't give this error when parsing tentatively.  This happens to
10585      work because we always parse this definitively once.  */
10586   if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
10587       && type_uses_auto (type_specified))
10588     {
10589       error ("invalid use of %<auto%> in conversion operator");
10590       return error_mark_node;
10591     }
10592
10593   return type_specified;
10594 }
10595
10596 /* Parse an (optional) conversion-declarator.
10597
10598    conversion-declarator:
10599      ptr-operator conversion-declarator [opt]
10600
10601    */
10602
10603 static cp_declarator *
10604 cp_parser_conversion_declarator_opt (cp_parser* parser)
10605 {
10606   enum tree_code code;
10607   tree class_type;
10608   cp_cv_quals cv_quals;
10609
10610   /* We don't know if there's a ptr-operator next, or not.  */
10611   cp_parser_parse_tentatively (parser);
10612   /* Try the ptr-operator.  */
10613   code = cp_parser_ptr_operator (parser, &class_type, &cv_quals);
10614   /* If it worked, look for more conversion-declarators.  */
10615   if (cp_parser_parse_definitely (parser))
10616     {
10617       cp_declarator *declarator;
10618
10619       /* Parse another optional declarator.  */
10620       declarator = cp_parser_conversion_declarator_opt (parser);
10621
10622       return cp_parser_make_indirect_declarator
10623         (code, class_type, cv_quals, declarator);
10624    }
10625
10626   return NULL;
10627 }
10628
10629 /* Parse an (optional) ctor-initializer.
10630
10631    ctor-initializer:
10632      : mem-initializer-list
10633
10634    Returns TRUE iff the ctor-initializer was actually present.  */
10635
10636 static bool
10637 cp_parser_ctor_initializer_opt (cp_parser* parser)
10638 {
10639   /* If the next token is not a `:', then there is no
10640      ctor-initializer.  */
10641   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
10642     {
10643       /* Do default initialization of any bases and members.  */
10644       if (DECL_CONSTRUCTOR_P (current_function_decl))
10645         finish_mem_initializers (NULL_TREE);
10646
10647       return false;
10648     }
10649
10650   /* Consume the `:' token.  */
10651   cp_lexer_consume_token (parser->lexer);
10652   /* And the mem-initializer-list.  */
10653   cp_parser_mem_initializer_list (parser);
10654
10655   return true;
10656 }
10657
10658 /* Parse a mem-initializer-list.
10659
10660    mem-initializer-list:
10661      mem-initializer ... [opt]
10662      mem-initializer ... [opt] , mem-initializer-list  */
10663
10664 static void
10665 cp_parser_mem_initializer_list (cp_parser* parser)
10666 {
10667   tree mem_initializer_list = NULL_TREE;
10668   cp_token *token = cp_lexer_peek_token (parser->lexer);
10669
10670   /* Let the semantic analysis code know that we are starting the
10671      mem-initializer-list.  */
10672   if (!DECL_CONSTRUCTOR_P (current_function_decl))
10673     error_at (token->location,
10674               "only constructors take member initializers");
10675
10676   /* Loop through the list.  */
10677   while (true)
10678     {
10679       tree mem_initializer;
10680
10681       token = cp_lexer_peek_token (parser->lexer);
10682       /* Parse the mem-initializer.  */
10683       mem_initializer = cp_parser_mem_initializer (parser);
10684       /* If the next token is a `...', we're expanding member initializers. */
10685       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
10686         {
10687           /* Consume the `...'. */
10688           cp_lexer_consume_token (parser->lexer);
10689
10690           /* The TREE_PURPOSE must be a _TYPE, because base-specifiers
10691              can be expanded but members cannot. */
10692           if (mem_initializer != error_mark_node
10693               && !TYPE_P (TREE_PURPOSE (mem_initializer)))
10694             {
10695               error_at (token->location,
10696                         "cannot expand initializer for member %<%D%>",
10697                         TREE_PURPOSE (mem_initializer));
10698               mem_initializer = error_mark_node;
10699             }
10700
10701           /* Construct the pack expansion type. */
10702           if (mem_initializer != error_mark_node)
10703             mem_initializer = make_pack_expansion (mem_initializer);
10704         }
10705       /* Add it to the list, unless it was erroneous.  */
10706       if (mem_initializer != error_mark_node)
10707         {
10708           TREE_CHAIN (mem_initializer) = mem_initializer_list;
10709           mem_initializer_list = mem_initializer;
10710         }
10711       /* If the next token is not a `,', we're done.  */
10712       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
10713         break;
10714       /* Consume the `,' token.  */
10715       cp_lexer_consume_token (parser->lexer);
10716     }
10717
10718   /* Perform semantic analysis.  */
10719   if (DECL_CONSTRUCTOR_P (current_function_decl))
10720     finish_mem_initializers (mem_initializer_list);
10721 }
10722
10723 /* Parse a mem-initializer.
10724
10725    mem-initializer:
10726      mem-initializer-id ( expression-list [opt] )
10727      mem-initializer-id braced-init-list
10728
10729    GNU extension:
10730
10731    mem-initializer:
10732      ( expression-list [opt] )
10733
10734    Returns a TREE_LIST.  The TREE_PURPOSE is the TYPE (for a base
10735    class) or FIELD_DECL (for a non-static data member) to initialize;
10736    the TREE_VALUE is the expression-list.  An empty initialization
10737    list is represented by void_list_node.  */
10738
10739 static tree
10740 cp_parser_mem_initializer (cp_parser* parser)
10741 {
10742   tree mem_initializer_id;
10743   tree expression_list;
10744   tree member;
10745   cp_token *token = cp_lexer_peek_token (parser->lexer);
10746
10747   /* Find out what is being initialized.  */
10748   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
10749     {
10750       permerror (token->location,
10751                  "anachronistic old-style base class initializer");
10752       mem_initializer_id = NULL_TREE;
10753     }
10754   else
10755     {
10756       mem_initializer_id = cp_parser_mem_initializer_id (parser);
10757       if (mem_initializer_id == error_mark_node)
10758         return mem_initializer_id;
10759     }
10760   member = expand_member_init (mem_initializer_id);
10761   if (member && !DECL_P (member))
10762     in_base_initializer = 1;
10763
10764   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10765     {
10766       bool expr_non_constant_p;
10767       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
10768       expression_list = cp_parser_braced_list (parser, &expr_non_constant_p);
10769       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
10770       expression_list = build_tree_list (NULL_TREE, expression_list);
10771     }
10772   else
10773     {
10774       VEC(tree,gc)* vec;
10775       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
10776                                                      /*cast_p=*/false,
10777                                                      /*allow_expansion_p=*/true,
10778                                                      /*non_constant_p=*/NULL);
10779       if (vec == NULL)
10780         return error_mark_node;
10781       expression_list = build_tree_list_vec (vec);
10782       release_tree_vector (vec);
10783     }
10784
10785   if (expression_list == error_mark_node)
10786     return error_mark_node;
10787   if (!expression_list)
10788     expression_list = void_type_node;
10789
10790   in_base_initializer = 0;
10791
10792   return member ? build_tree_list (member, expression_list) : error_mark_node;
10793 }
10794
10795 /* Parse a mem-initializer-id.
10796
10797    mem-initializer-id:
10798      :: [opt] nested-name-specifier [opt] class-name
10799      identifier
10800
10801    Returns a TYPE indicating the class to be initializer for the first
10802    production.  Returns an IDENTIFIER_NODE indicating the data member
10803    to be initialized for the second production.  */
10804
10805 static tree
10806 cp_parser_mem_initializer_id (cp_parser* parser)
10807 {
10808   bool global_scope_p;
10809   bool nested_name_specifier_p;
10810   bool template_p = false;
10811   tree id;
10812
10813   cp_token *token = cp_lexer_peek_token (parser->lexer);
10814
10815   /* `typename' is not allowed in this context ([temp.res]).  */
10816   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
10817     {
10818       error_at (token->location, 
10819                 "keyword %<typename%> not allowed in this context (a qualified "
10820                 "member initializer is implicitly a type)");
10821       cp_lexer_consume_token (parser->lexer);
10822     }
10823   /* Look for the optional `::' operator.  */
10824   global_scope_p
10825     = (cp_parser_global_scope_opt (parser,
10826                                    /*current_scope_valid_p=*/false)
10827        != NULL_TREE);
10828   /* Look for the optional nested-name-specifier.  The simplest way to
10829      implement:
10830
10831        [temp.res]
10832
10833        The keyword `typename' is not permitted in a base-specifier or
10834        mem-initializer; in these contexts a qualified name that
10835        depends on a template-parameter is implicitly assumed to be a
10836        type name.
10837
10838      is to assume that we have seen the `typename' keyword at this
10839      point.  */
10840   nested_name_specifier_p
10841     = (cp_parser_nested_name_specifier_opt (parser,
10842                                             /*typename_keyword_p=*/true,
10843                                             /*check_dependency_p=*/true,
10844                                             /*type_p=*/true,
10845                                             /*is_declaration=*/true)
10846        != NULL_TREE);
10847   if (nested_name_specifier_p)
10848     template_p = cp_parser_optional_template_keyword (parser);
10849   /* If there is a `::' operator or a nested-name-specifier, then we
10850      are definitely looking for a class-name.  */
10851   if (global_scope_p || nested_name_specifier_p)
10852     return cp_parser_class_name (parser,
10853                                  /*typename_keyword_p=*/true,
10854                                  /*template_keyword_p=*/template_p,
10855                                  typename_type,
10856                                  /*check_dependency_p=*/true,
10857                                  /*class_head_p=*/false,
10858                                  /*is_declaration=*/true);
10859   /* Otherwise, we could also be looking for an ordinary identifier.  */
10860   cp_parser_parse_tentatively (parser);
10861   /* Try a class-name.  */
10862   id = cp_parser_class_name (parser,
10863                              /*typename_keyword_p=*/true,
10864                              /*template_keyword_p=*/false,
10865                              none_type,
10866                              /*check_dependency_p=*/true,
10867                              /*class_head_p=*/false,
10868                              /*is_declaration=*/true);
10869   /* If we found one, we're done.  */
10870   if (cp_parser_parse_definitely (parser))
10871     return id;
10872   /* Otherwise, look for an ordinary identifier.  */
10873   return cp_parser_identifier (parser);
10874 }
10875
10876 /* Overloading [gram.over] */
10877
10878 /* Parse an operator-function-id.
10879
10880    operator-function-id:
10881      operator operator
10882
10883    Returns an IDENTIFIER_NODE for the operator which is a
10884    human-readable spelling of the identifier, e.g., `operator +'.  */
10885
10886 static tree
10887 cp_parser_operator_function_id (cp_parser* parser)
10888 {
10889   /* Look for the `operator' keyword.  */
10890   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10891     return error_mark_node;
10892   /* And then the name of the operator itself.  */
10893   return cp_parser_operator (parser);
10894 }
10895
10896 /* Parse an operator.
10897
10898    operator:
10899      new delete new[] delete[] + - * / % ^ & | ~ ! = < >
10900      += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= &&
10901      || ++ -- , ->* -> () []
10902
10903    GNU Extensions:
10904
10905    operator:
10906      <? >? <?= >?=
10907
10908    Returns an IDENTIFIER_NODE for the operator which is a
10909    human-readable spelling of the identifier, e.g., `operator +'.  */
10910
10911 static tree
10912 cp_parser_operator (cp_parser* parser)
10913 {
10914   tree id = NULL_TREE;
10915   cp_token *token;
10916
10917   /* Peek at the next token.  */
10918   token = cp_lexer_peek_token (parser->lexer);
10919   /* Figure out which operator we have.  */
10920   switch (token->type)
10921     {
10922     case CPP_KEYWORD:
10923       {
10924         enum tree_code op;
10925
10926         /* The keyword should be either `new' or `delete'.  */
10927         if (token->keyword == RID_NEW)
10928           op = NEW_EXPR;
10929         else if (token->keyword == RID_DELETE)
10930           op = DELETE_EXPR;
10931         else
10932           break;
10933
10934         /* Consume the `new' or `delete' token.  */
10935         cp_lexer_consume_token (parser->lexer);
10936
10937         /* Peek at the next token.  */
10938         token = cp_lexer_peek_token (parser->lexer);
10939         /* If it's a `[' token then this is the array variant of the
10940            operator.  */
10941         if (token->type == CPP_OPEN_SQUARE)
10942           {
10943             /* Consume the `[' token.  */
10944             cp_lexer_consume_token (parser->lexer);
10945             /* Look for the `]' token.  */
10946             cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10947             id = ansi_opname (op == NEW_EXPR
10948                               ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
10949           }
10950         /* Otherwise, we have the non-array variant.  */
10951         else
10952           id = ansi_opname (op);
10953
10954         return id;
10955       }
10956
10957     case CPP_PLUS:
10958       id = ansi_opname (PLUS_EXPR);
10959       break;
10960
10961     case CPP_MINUS:
10962       id = ansi_opname (MINUS_EXPR);
10963       break;
10964
10965     case CPP_MULT:
10966       id = ansi_opname (MULT_EXPR);
10967       break;
10968
10969     case CPP_DIV:
10970       id = ansi_opname (TRUNC_DIV_EXPR);
10971       break;
10972
10973     case CPP_MOD:
10974       id = ansi_opname (TRUNC_MOD_EXPR);
10975       break;
10976
10977     case CPP_XOR:
10978       id = ansi_opname (BIT_XOR_EXPR);
10979       break;
10980
10981     case CPP_AND:
10982       id = ansi_opname (BIT_AND_EXPR);
10983       break;
10984
10985     case CPP_OR:
10986       id = ansi_opname (BIT_IOR_EXPR);
10987       break;
10988
10989     case CPP_COMPL:
10990       id = ansi_opname (BIT_NOT_EXPR);
10991       break;
10992
10993     case CPP_NOT:
10994       id = ansi_opname (TRUTH_NOT_EXPR);
10995       break;
10996
10997     case CPP_EQ:
10998       id = ansi_assopname (NOP_EXPR);
10999       break;
11000
11001     case CPP_LESS:
11002       id = ansi_opname (LT_EXPR);
11003       break;
11004
11005     case CPP_GREATER:
11006       id = ansi_opname (GT_EXPR);
11007       break;
11008
11009     case CPP_PLUS_EQ:
11010       id = ansi_assopname (PLUS_EXPR);
11011       break;
11012
11013     case CPP_MINUS_EQ:
11014       id = ansi_assopname (MINUS_EXPR);
11015       break;
11016
11017     case CPP_MULT_EQ:
11018       id = ansi_assopname (MULT_EXPR);
11019       break;
11020
11021     case CPP_DIV_EQ:
11022       id = ansi_assopname (TRUNC_DIV_EXPR);
11023       break;
11024
11025     case CPP_MOD_EQ:
11026       id = ansi_assopname (TRUNC_MOD_EXPR);
11027       break;
11028
11029     case CPP_XOR_EQ:
11030       id = ansi_assopname (BIT_XOR_EXPR);
11031       break;
11032
11033     case CPP_AND_EQ:
11034       id = ansi_assopname (BIT_AND_EXPR);
11035       break;
11036
11037     case CPP_OR_EQ:
11038       id = ansi_assopname (BIT_IOR_EXPR);
11039       break;
11040
11041     case CPP_LSHIFT:
11042       id = ansi_opname (LSHIFT_EXPR);
11043       break;
11044
11045     case CPP_RSHIFT:
11046       id = ansi_opname (RSHIFT_EXPR);
11047       break;
11048
11049     case CPP_LSHIFT_EQ:
11050       id = ansi_assopname (LSHIFT_EXPR);
11051       break;
11052
11053     case CPP_RSHIFT_EQ:
11054       id = ansi_assopname (RSHIFT_EXPR);
11055       break;
11056
11057     case CPP_EQ_EQ:
11058       id = ansi_opname (EQ_EXPR);
11059       break;
11060
11061     case CPP_NOT_EQ:
11062       id = ansi_opname (NE_EXPR);
11063       break;
11064
11065     case CPP_LESS_EQ:
11066       id = ansi_opname (LE_EXPR);
11067       break;
11068
11069     case CPP_GREATER_EQ:
11070       id = ansi_opname (GE_EXPR);
11071       break;
11072
11073     case CPP_AND_AND:
11074       id = ansi_opname (TRUTH_ANDIF_EXPR);
11075       break;
11076
11077     case CPP_OR_OR:
11078       id = ansi_opname (TRUTH_ORIF_EXPR);
11079       break;
11080
11081     case CPP_PLUS_PLUS:
11082       id = ansi_opname (POSTINCREMENT_EXPR);
11083       break;
11084
11085     case CPP_MINUS_MINUS:
11086       id = ansi_opname (PREDECREMENT_EXPR);
11087       break;
11088
11089     case CPP_COMMA:
11090       id = ansi_opname (COMPOUND_EXPR);
11091       break;
11092
11093     case CPP_DEREF_STAR:
11094       id = ansi_opname (MEMBER_REF);
11095       break;
11096
11097     case CPP_DEREF:
11098       id = ansi_opname (COMPONENT_REF);
11099       break;
11100
11101     case CPP_OPEN_PAREN:
11102       /* Consume the `('.  */
11103       cp_lexer_consume_token (parser->lexer);
11104       /* Look for the matching `)'.  */
11105       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
11106       return ansi_opname (CALL_EXPR);
11107
11108     case CPP_OPEN_SQUARE:
11109       /* Consume the `['.  */
11110       cp_lexer_consume_token (parser->lexer);
11111       /* Look for the matching `]'.  */
11112       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
11113       return ansi_opname (ARRAY_REF);
11114
11115     default:
11116       /* Anything else is an error.  */
11117       break;
11118     }
11119
11120   /* If we have selected an identifier, we need to consume the
11121      operator token.  */
11122   if (id)
11123     cp_lexer_consume_token (parser->lexer);
11124   /* Otherwise, no valid operator name was present.  */
11125   else
11126     {
11127       cp_parser_error (parser, "expected operator");
11128       id = error_mark_node;
11129     }
11130
11131   return id;
11132 }
11133
11134 /* Parse a template-declaration.
11135
11136    template-declaration:
11137      export [opt] template < template-parameter-list > declaration
11138
11139    If MEMBER_P is TRUE, this template-declaration occurs within a
11140    class-specifier.
11141
11142    The grammar rule given by the standard isn't correct.  What
11143    is really meant is:
11144
11145    template-declaration:
11146      export [opt] template-parameter-list-seq
11147        decl-specifier-seq [opt] init-declarator [opt] ;
11148      export [opt] template-parameter-list-seq
11149        function-definition
11150
11151    template-parameter-list-seq:
11152      template-parameter-list-seq [opt]
11153      template < template-parameter-list >  */
11154
11155 static void
11156 cp_parser_template_declaration (cp_parser* parser, bool member_p)
11157 {
11158   /* Check for `export'.  */
11159   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
11160     {
11161       /* Consume the `export' token.  */
11162       cp_lexer_consume_token (parser->lexer);
11163       /* Warn that we do not support `export'.  */
11164       warning (0, "keyword %<export%> not implemented, and will be ignored");
11165     }
11166
11167   cp_parser_template_declaration_after_export (parser, member_p);
11168 }
11169
11170 /* Parse a template-parameter-list.
11171
11172    template-parameter-list:
11173      template-parameter
11174      template-parameter-list , template-parameter
11175
11176    Returns a TREE_LIST.  Each node represents a template parameter.
11177    The nodes are connected via their TREE_CHAINs.  */
11178
11179 static tree
11180 cp_parser_template_parameter_list (cp_parser* parser)
11181 {
11182   tree parameter_list = NULL_TREE;
11183
11184   begin_template_parm_list ();
11185
11186   /* The loop below parses the template parms.  We first need to know
11187      the total number of template parms to be able to compute proper
11188      canonical types of each dependent type. So after the loop, when
11189      we know the total number of template parms,
11190      end_template_parm_list computes the proper canonical types and
11191      fixes up the dependent types accordingly.  */
11192   while (true)
11193     {
11194       tree parameter;
11195       bool is_non_type;
11196       bool is_parameter_pack;
11197       location_t parm_loc;
11198
11199       /* Parse the template-parameter.  */
11200       parm_loc = cp_lexer_peek_token (parser->lexer)->location;
11201       parameter = cp_parser_template_parameter (parser, 
11202                                                 &is_non_type,
11203                                                 &is_parameter_pack);
11204       /* Add it to the list.  */
11205       if (parameter != error_mark_node)
11206         parameter_list = process_template_parm (parameter_list,
11207                                                 parm_loc,
11208                                                 parameter,
11209                                                 is_non_type,
11210                                                 is_parameter_pack,
11211                                                 0);
11212       else
11213        {
11214          tree err_parm = build_tree_list (parameter, parameter);
11215          parameter_list = chainon (parameter_list, err_parm);
11216        }
11217
11218       /* If the next token is not a `,', we're done.  */
11219       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11220         break;
11221       /* Otherwise, consume the `,' token.  */
11222       cp_lexer_consume_token (parser->lexer);
11223     }
11224
11225   return end_template_parm_list (parameter_list);
11226 }
11227
11228 /* Parse a template-parameter.
11229
11230    template-parameter:
11231      type-parameter
11232      parameter-declaration
11233
11234    If all goes well, returns a TREE_LIST.  The TREE_VALUE represents
11235    the parameter.  The TREE_PURPOSE is the default value, if any.
11236    Returns ERROR_MARK_NODE on failure.  *IS_NON_TYPE is set to true
11237    iff this parameter is a non-type parameter.  *IS_PARAMETER_PACK is
11238    set to true iff this parameter is a parameter pack. */
11239
11240 static tree
11241 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
11242                               bool *is_parameter_pack)
11243 {
11244   cp_token *token;
11245   cp_parameter_declarator *parameter_declarator;
11246   cp_declarator *id_declarator;
11247   tree parm;
11248
11249   /* Assume it is a type parameter or a template parameter.  */
11250   *is_non_type = false;
11251   /* Assume it not a parameter pack. */
11252   *is_parameter_pack = false;
11253   /* Peek at the next token.  */
11254   token = cp_lexer_peek_token (parser->lexer);
11255   /* If it is `class' or `template', we have a type-parameter.  */
11256   if (token->keyword == RID_TEMPLATE)
11257     return cp_parser_type_parameter (parser, is_parameter_pack);
11258   /* If it is `class' or `typename' we do not know yet whether it is a
11259      type parameter or a non-type parameter.  Consider:
11260
11261        template <typename T, typename T::X X> ...
11262
11263      or:
11264
11265        template <class C, class D*> ...
11266
11267      Here, the first parameter is a type parameter, and the second is
11268      a non-type parameter.  We can tell by looking at the token after
11269      the identifier -- if it is a `,', `=', or `>' then we have a type
11270      parameter.  */
11271   if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
11272     {
11273       /* Peek at the token after `class' or `typename'.  */
11274       token = cp_lexer_peek_nth_token (parser->lexer, 2);
11275       /* If it's an ellipsis, we have a template type parameter
11276          pack. */
11277       if (token->type == CPP_ELLIPSIS)
11278         return cp_parser_type_parameter (parser, is_parameter_pack);
11279       /* If it's an identifier, skip it.  */
11280       if (token->type == CPP_NAME)
11281         token = cp_lexer_peek_nth_token (parser->lexer, 3);
11282       /* Now, see if the token looks like the end of a template
11283          parameter.  */
11284       if (token->type == CPP_COMMA
11285           || token->type == CPP_EQ
11286           || token->type == CPP_GREATER)
11287         return cp_parser_type_parameter (parser, is_parameter_pack);
11288     }
11289
11290   /* Otherwise, it is a non-type parameter.
11291
11292      [temp.param]
11293
11294      When parsing a default template-argument for a non-type
11295      template-parameter, the first non-nested `>' is taken as the end
11296      of the template parameter-list rather than a greater-than
11297      operator.  */
11298   *is_non_type = true;
11299   parameter_declarator
11300      = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
11301                                         /*parenthesized_p=*/NULL);
11302
11303   /* If the parameter declaration is marked as a parameter pack, set
11304      *IS_PARAMETER_PACK to notify the caller. Also, unmark the
11305      declarator's PACK_EXPANSION_P, otherwise we'll get errors from
11306      grokdeclarator. */
11307   if (parameter_declarator
11308       && parameter_declarator->declarator
11309       && parameter_declarator->declarator->parameter_pack_p)
11310     {
11311       *is_parameter_pack = true;
11312       parameter_declarator->declarator->parameter_pack_p = false;
11313     }
11314
11315   /* If the next token is an ellipsis, and we don't already have it
11316      marked as a parameter pack, then we have a parameter pack (that
11317      has no declarator).  */
11318   if (!*is_parameter_pack
11319       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
11320       && declarator_can_be_parameter_pack (parameter_declarator->declarator))
11321     {
11322       /* Consume the `...'.  */
11323       cp_lexer_consume_token (parser->lexer);
11324       maybe_warn_variadic_templates ();
11325       
11326       *is_parameter_pack = true;
11327     }
11328   /* We might end up with a pack expansion as the type of the non-type
11329      template parameter, in which case this is a non-type template
11330      parameter pack.  */
11331   else if (parameter_declarator
11332            && parameter_declarator->decl_specifiers.type
11333            && PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type))
11334     {
11335       *is_parameter_pack = true;
11336       parameter_declarator->decl_specifiers.type = 
11337         PACK_EXPANSION_PATTERN (parameter_declarator->decl_specifiers.type);
11338     }
11339
11340   if (*is_parameter_pack && cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11341     {
11342       /* Parameter packs cannot have default arguments.  However, a
11343          user may try to do so, so we'll parse them and give an
11344          appropriate diagnostic here.  */
11345
11346       /* Consume the `='.  */
11347       cp_token *start_token = cp_lexer_peek_token (parser->lexer);
11348       cp_lexer_consume_token (parser->lexer);
11349       
11350       /* Find the name of the parameter pack.  */     
11351       id_declarator = parameter_declarator->declarator;
11352       while (id_declarator && id_declarator->kind != cdk_id)
11353         id_declarator = id_declarator->declarator;
11354       
11355       if (id_declarator && id_declarator->kind == cdk_id)
11356         error_at (start_token->location,
11357                   "template parameter pack %qD cannot have a default argument",
11358                   id_declarator->u.id.unqualified_name);
11359       else
11360         error_at (start_token->location,
11361                   "template parameter pack cannot have a default argument");
11362       
11363       /* Parse the default argument, but throw away the result.  */
11364       cp_parser_default_argument (parser, /*template_parm_p=*/true);
11365     }
11366
11367   parm = grokdeclarator (parameter_declarator->declarator,
11368                          &parameter_declarator->decl_specifiers,
11369                          TPARM, /*initialized=*/0,
11370                          /*attrlist=*/NULL);
11371   if (parm == error_mark_node)
11372     return error_mark_node;
11373
11374   return build_tree_list (parameter_declarator->default_argument, parm);
11375 }
11376
11377 /* Parse a type-parameter.
11378
11379    type-parameter:
11380      class identifier [opt]
11381      class identifier [opt] = type-id
11382      typename identifier [opt]
11383      typename identifier [opt] = type-id
11384      template < template-parameter-list > class identifier [opt]
11385      template < template-parameter-list > class identifier [opt]
11386        = id-expression
11387
11388    GNU Extension (variadic templates):
11389
11390    type-parameter:
11391      class ... identifier [opt]
11392      typename ... identifier [opt]
11393
11394    Returns a TREE_LIST.  The TREE_VALUE is itself a TREE_LIST.  The
11395    TREE_PURPOSE is the default-argument, if any.  The TREE_VALUE is
11396    the declaration of the parameter.
11397
11398    Sets *IS_PARAMETER_PACK if this is a template parameter pack. */
11399
11400 static tree
11401 cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
11402 {
11403   cp_token *token;
11404   tree parameter;
11405
11406   /* Look for a keyword to tell us what kind of parameter this is.  */
11407   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_TYPENAME_TEMPLATE);
11408   if (!token)
11409     return error_mark_node;
11410
11411   switch (token->keyword)
11412     {
11413     case RID_CLASS:
11414     case RID_TYPENAME:
11415       {
11416         tree identifier;
11417         tree default_argument;
11418
11419         /* If the next token is an ellipsis, we have a template
11420            argument pack. */
11421         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11422           {
11423             /* Consume the `...' token. */
11424             cp_lexer_consume_token (parser->lexer);
11425             maybe_warn_variadic_templates ();
11426
11427             *is_parameter_pack = true;
11428           }
11429
11430         /* If the next token is an identifier, then it names the
11431            parameter.  */
11432         if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
11433           identifier = cp_parser_identifier (parser);
11434         else
11435           identifier = NULL_TREE;
11436
11437         /* Create the parameter.  */
11438         parameter = finish_template_type_parm (class_type_node, identifier);
11439
11440         /* If the next token is an `=', we have a default argument.  */
11441         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11442           {
11443             /* Consume the `=' token.  */
11444             cp_lexer_consume_token (parser->lexer);
11445             /* Parse the default-argument.  */
11446             push_deferring_access_checks (dk_no_deferred);
11447             default_argument = cp_parser_type_id (parser);
11448
11449             /* Template parameter packs cannot have default
11450                arguments. */
11451             if (*is_parameter_pack)
11452               {
11453                 if (identifier)
11454                   error_at (token->location,
11455                             "template parameter pack %qD cannot have a "
11456                             "default argument", identifier);
11457                 else
11458                   error_at (token->location,
11459                             "template parameter packs cannot have "
11460                             "default arguments");
11461                 default_argument = NULL_TREE;
11462               }
11463             pop_deferring_access_checks ();
11464           }
11465         else
11466           default_argument = NULL_TREE;
11467
11468         /* Create the combined representation of the parameter and the
11469            default argument.  */
11470         parameter = build_tree_list (default_argument, parameter);
11471       }
11472       break;
11473
11474     case RID_TEMPLATE:
11475       {
11476         tree identifier;
11477         tree default_argument;
11478
11479         /* Look for the `<'.  */
11480         cp_parser_require (parser, CPP_LESS, RT_LESS);
11481         /* Parse the template-parameter-list.  */
11482         cp_parser_template_parameter_list (parser);
11483         /* Look for the `>'.  */
11484         cp_parser_require (parser, CPP_GREATER, RT_GREATER);
11485         /* Look for the `class' keyword.  */
11486         cp_parser_require_keyword (parser, RID_CLASS, RT_CLASS);
11487         /* If the next token is an ellipsis, we have a template
11488            argument pack. */
11489         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11490           {
11491             /* Consume the `...' token. */
11492             cp_lexer_consume_token (parser->lexer);
11493             maybe_warn_variadic_templates ();
11494
11495             *is_parameter_pack = true;
11496           }
11497         /* If the next token is an `=', then there is a
11498            default-argument.  If the next token is a `>', we are at
11499            the end of the parameter-list.  If the next token is a `,',
11500            then we are at the end of this parameter.  */
11501         if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
11502             && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
11503             && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11504           {
11505             identifier = cp_parser_identifier (parser);
11506             /* Treat invalid names as if the parameter were nameless.  */
11507             if (identifier == error_mark_node)
11508               identifier = NULL_TREE;
11509           }
11510         else
11511           identifier = NULL_TREE;
11512
11513         /* Create the template parameter.  */
11514         parameter = finish_template_template_parm (class_type_node,
11515                                                    identifier);
11516
11517         /* If the next token is an `=', then there is a
11518            default-argument.  */
11519         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11520           {
11521             bool is_template;
11522
11523             /* Consume the `='.  */
11524             cp_lexer_consume_token (parser->lexer);
11525             /* Parse the id-expression.  */
11526             push_deferring_access_checks (dk_no_deferred);
11527             /* save token before parsing the id-expression, for error
11528                reporting */
11529             token = cp_lexer_peek_token (parser->lexer);
11530             default_argument
11531               = cp_parser_id_expression (parser,
11532                                          /*template_keyword_p=*/false,
11533                                          /*check_dependency_p=*/true,
11534                                          /*template_p=*/&is_template,
11535                                          /*declarator_p=*/false,
11536                                          /*optional_p=*/false);
11537             if (TREE_CODE (default_argument) == TYPE_DECL)
11538               /* If the id-expression was a template-id that refers to
11539                  a template-class, we already have the declaration here,
11540                  so no further lookup is needed.  */
11541                  ;
11542             else
11543               /* Look up the name.  */
11544               default_argument
11545                 = cp_parser_lookup_name (parser, default_argument,
11546                                          none_type,
11547                                          /*is_template=*/is_template,
11548                                          /*is_namespace=*/false,
11549                                          /*check_dependency=*/true,
11550                                          /*ambiguous_decls=*/NULL,
11551                                          token->location);
11552             /* See if the default argument is valid.  */
11553             default_argument
11554               = check_template_template_default_arg (default_argument);
11555
11556             /* Template parameter packs cannot have default
11557                arguments. */
11558             if (*is_parameter_pack)
11559               {
11560                 if (identifier)
11561                   error_at (token->location,
11562                             "template parameter pack %qD cannot "
11563                             "have a default argument",
11564                             identifier);
11565                 else
11566                   error_at (token->location, "template parameter packs cannot "
11567                             "have default arguments");
11568                 default_argument = NULL_TREE;
11569               }
11570             pop_deferring_access_checks ();
11571           }
11572         else
11573           default_argument = NULL_TREE;
11574
11575         /* Create the combined representation of the parameter and the
11576            default argument.  */
11577         parameter = build_tree_list (default_argument, parameter);
11578       }
11579       break;
11580
11581     default:
11582       gcc_unreachable ();
11583       break;
11584     }
11585
11586   return parameter;
11587 }
11588
11589 /* Parse a template-id.
11590
11591    template-id:
11592      template-name < template-argument-list [opt] >
11593
11594    If TEMPLATE_KEYWORD_P is TRUE, then we have just seen the
11595    `template' keyword.  In this case, a TEMPLATE_ID_EXPR will be
11596    returned.  Otherwise, if the template-name names a function, or set
11597    of functions, returns a TEMPLATE_ID_EXPR.  If the template-name
11598    names a class, returns a TYPE_DECL for the specialization.
11599
11600    If CHECK_DEPENDENCY_P is FALSE, names are looked up in
11601    uninstantiated templates.  */
11602
11603 static tree
11604 cp_parser_template_id (cp_parser *parser,
11605                        bool template_keyword_p,
11606                        bool check_dependency_p,
11607                        bool is_declaration)
11608 {
11609   int i;
11610   tree templ;
11611   tree arguments;
11612   tree template_id;
11613   cp_token_position start_of_id = 0;
11614   deferred_access_check *chk;
11615   VEC (deferred_access_check,gc) *access_check;
11616   cp_token *next_token = NULL, *next_token_2 = NULL;
11617   bool is_identifier;
11618
11619   /* If the next token corresponds to a template-id, there is no need
11620      to reparse it.  */
11621   next_token = cp_lexer_peek_token (parser->lexer);
11622   if (next_token->type == CPP_TEMPLATE_ID)
11623     {
11624       struct tree_check *check_value;
11625
11626       /* Get the stored value.  */
11627       check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
11628       /* Perform any access checks that were deferred.  */
11629       access_check = check_value->checks;
11630       if (access_check)
11631         {
11632           FOR_EACH_VEC_ELT (deferred_access_check, access_check, i, chk)
11633             perform_or_defer_access_check (chk->binfo,
11634                                            chk->decl,
11635                                            chk->diag_decl);
11636         }
11637       /* Return the stored value.  */
11638       return check_value->value;
11639     }
11640
11641   /* Avoid performing name lookup if there is no possibility of
11642      finding a template-id.  */
11643   if ((next_token->type != CPP_NAME && next_token->keyword != RID_OPERATOR)
11644       || (next_token->type == CPP_NAME
11645           && !cp_parser_nth_token_starts_template_argument_list_p
11646                (parser, 2)))
11647     {
11648       cp_parser_error (parser, "expected template-id");
11649       return error_mark_node;
11650     }
11651
11652   /* Remember where the template-id starts.  */
11653   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
11654     start_of_id = cp_lexer_token_position (parser->lexer, false);
11655
11656   push_deferring_access_checks (dk_deferred);
11657
11658   /* Parse the template-name.  */
11659   is_identifier = false;
11660   templ = cp_parser_template_name (parser, template_keyword_p,
11661                                    check_dependency_p,
11662                                    is_declaration,
11663                                    &is_identifier);
11664   if (templ == error_mark_node || is_identifier)
11665     {
11666       pop_deferring_access_checks ();
11667       return templ;
11668     }
11669
11670   /* If we find the sequence `[:' after a template-name, it's probably
11671      a digraph-typo for `< ::'. Substitute the tokens and check if we can
11672      parse correctly the argument list.  */
11673   next_token = cp_lexer_peek_token (parser->lexer);
11674   next_token_2 = cp_lexer_peek_nth_token (parser->lexer, 2);
11675   if (next_token->type == CPP_OPEN_SQUARE
11676       && next_token->flags & DIGRAPH
11677       && next_token_2->type == CPP_COLON
11678       && !(next_token_2->flags & PREV_WHITE))
11679     {
11680       cp_parser_parse_tentatively (parser);
11681       /* Change `:' into `::'.  */
11682       next_token_2->type = CPP_SCOPE;
11683       /* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
11684          CPP_LESS.  */
11685       cp_lexer_consume_token (parser->lexer);
11686
11687       /* Parse the arguments.  */
11688       arguments = cp_parser_enclosed_template_argument_list (parser);
11689       if (!cp_parser_parse_definitely (parser))
11690         {
11691           /* If we couldn't parse an argument list, then we revert our changes
11692              and return simply an error. Maybe this is not a template-id
11693              after all.  */
11694           next_token_2->type = CPP_COLON;
11695           cp_parser_error (parser, "expected %<<%>");
11696           pop_deferring_access_checks ();
11697           return error_mark_node;
11698         }
11699       /* Otherwise, emit an error about the invalid digraph, but continue
11700          parsing because we got our argument list.  */
11701       if (permerror (next_token->location,
11702                      "%<<::%> cannot begin a template-argument list"))
11703         {
11704           static bool hint = false;
11705           inform (next_token->location,
11706                   "%<<:%> is an alternate spelling for %<[%>."
11707                   " Insert whitespace between %<<%> and %<::%>");
11708           if (!hint && !flag_permissive)
11709             {
11710               inform (next_token->location, "(if you use %<-fpermissive%>"
11711                       " G++ will accept your code)");
11712               hint = true;
11713             }
11714         }
11715     }
11716   else
11717     {
11718       /* Look for the `<' that starts the template-argument-list.  */
11719       if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
11720         {
11721           pop_deferring_access_checks ();
11722           return error_mark_node;
11723         }
11724       /* Parse the arguments.  */
11725       arguments = cp_parser_enclosed_template_argument_list (parser);
11726     }
11727
11728   /* Build a representation of the specialization.  */
11729   if (TREE_CODE (templ) == IDENTIFIER_NODE)
11730     template_id = build_min_nt (TEMPLATE_ID_EXPR, templ, arguments);
11731   else if (DECL_CLASS_TEMPLATE_P (templ)
11732            || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
11733     {
11734       bool entering_scope;
11735       /* In "template <typename T> ... A<T>::", A<T> is the abstract A
11736          template (rather than some instantiation thereof) only if
11737          is not nested within some other construct.  For example, in
11738          "template <typename T> void f(T) { A<T>::", A<T> is just an
11739          instantiation of A.  */
11740       entering_scope = (template_parm_scope_p ()
11741                         && cp_lexer_next_token_is (parser->lexer,
11742                                                    CPP_SCOPE));
11743       template_id
11744         = finish_template_type (templ, arguments, entering_scope);
11745     }
11746   else
11747     {
11748       /* If it's not a class-template or a template-template, it should be
11749          a function-template.  */
11750       gcc_assert ((DECL_FUNCTION_TEMPLATE_P (templ)
11751                    || TREE_CODE (templ) == OVERLOAD
11752                    || BASELINK_P (templ)));
11753
11754       template_id = lookup_template_function (templ, arguments);
11755     }
11756
11757   /* If parsing tentatively, replace the sequence of tokens that makes
11758      up the template-id with a CPP_TEMPLATE_ID token.  That way,
11759      should we re-parse the token stream, we will not have to repeat
11760      the effort required to do the parse, nor will we issue duplicate
11761      error messages about problems during instantiation of the
11762      template.  */
11763   if (start_of_id)
11764     {
11765       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
11766
11767       /* Reset the contents of the START_OF_ID token.  */
11768       token->type = CPP_TEMPLATE_ID;
11769       /* Retrieve any deferred checks.  Do not pop this access checks yet
11770          so the memory will not be reclaimed during token replacing below.  */
11771       token->u.tree_check_value = ggc_alloc_cleared_tree_check ();
11772       token->u.tree_check_value->value = template_id;
11773       token->u.tree_check_value->checks = get_deferred_access_checks ();
11774       token->keyword = RID_MAX;
11775
11776       /* Purge all subsequent tokens.  */
11777       cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
11778
11779       /* ??? Can we actually assume that, if template_id ==
11780          error_mark_node, we will have issued a diagnostic to the
11781          user, as opposed to simply marking the tentative parse as
11782          failed?  */
11783       if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
11784         error_at (token->location, "parse error in template argument list");
11785     }
11786
11787   pop_deferring_access_checks ();
11788   return template_id;
11789 }
11790
11791 /* Parse a template-name.
11792
11793    template-name:
11794      identifier
11795
11796    The standard should actually say:
11797
11798    template-name:
11799      identifier
11800      operator-function-id
11801
11802    A defect report has been filed about this issue.
11803
11804    A conversion-function-id cannot be a template name because they cannot
11805    be part of a template-id. In fact, looking at this code:
11806
11807    a.operator K<int>()
11808
11809    the conversion-function-id is "operator K<int>", and K<int> is a type-id.
11810    It is impossible to call a templated conversion-function-id with an
11811    explicit argument list, since the only allowed template parameter is
11812    the type to which it is converting.
11813
11814    If TEMPLATE_KEYWORD_P is true, then we have just seen the
11815    `template' keyword, in a construction like:
11816
11817      T::template f<3>()
11818
11819    In that case `f' is taken to be a template-name, even though there
11820    is no way of knowing for sure.
11821
11822    Returns the TEMPLATE_DECL for the template, or an OVERLOAD if the
11823    name refers to a set of overloaded functions, at least one of which
11824    is a template, or an IDENTIFIER_NODE with the name of the template,
11825    if TEMPLATE_KEYWORD_P is true.  If CHECK_DEPENDENCY_P is FALSE,
11826    names are looked up inside uninstantiated templates.  */
11827
11828 static tree
11829 cp_parser_template_name (cp_parser* parser,
11830                          bool template_keyword_p,
11831                          bool check_dependency_p,
11832                          bool is_declaration,
11833                          bool *is_identifier)
11834 {
11835   tree identifier;
11836   tree decl;
11837   tree fns;
11838   cp_token *token = cp_lexer_peek_token (parser->lexer);
11839
11840   /* If the next token is `operator', then we have either an
11841      operator-function-id or a conversion-function-id.  */
11842   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_OPERATOR))
11843     {
11844       /* We don't know whether we're looking at an
11845          operator-function-id or a conversion-function-id.  */
11846       cp_parser_parse_tentatively (parser);
11847       /* Try an operator-function-id.  */
11848       identifier = cp_parser_operator_function_id (parser);
11849       /* If that didn't work, try a conversion-function-id.  */
11850       if (!cp_parser_parse_definitely (parser))
11851         {
11852           cp_parser_error (parser, "expected template-name");
11853           return error_mark_node;
11854         }
11855     }
11856   /* Look for the identifier.  */
11857   else
11858     identifier = cp_parser_identifier (parser);
11859
11860   /* If we didn't find an identifier, we don't have a template-id.  */
11861   if (identifier == error_mark_node)
11862     return error_mark_node;
11863
11864   /* If the name immediately followed the `template' keyword, then it
11865      is a template-name.  However, if the next token is not `<', then
11866      we do not treat it as a template-name, since it is not being used
11867      as part of a template-id.  This enables us to handle constructs
11868      like:
11869
11870        template <typename T> struct S { S(); };
11871        template <typename T> S<T>::S();
11872
11873      correctly.  We would treat `S' as a template -- if it were `S<T>'
11874      -- but we do not if there is no `<'.  */
11875
11876   if (processing_template_decl
11877       && cp_parser_nth_token_starts_template_argument_list_p (parser, 1))
11878     {
11879       /* In a declaration, in a dependent context, we pretend that the
11880          "template" keyword was present in order to improve error
11881          recovery.  For example, given:
11882
11883            template <typename T> void f(T::X<int>);
11884
11885          we want to treat "X<int>" as a template-id.  */
11886       if (is_declaration
11887           && !template_keyword_p
11888           && parser->scope && TYPE_P (parser->scope)
11889           && check_dependency_p
11890           && dependent_scope_p (parser->scope)
11891           /* Do not do this for dtors (or ctors), since they never
11892              need the template keyword before their name.  */
11893           && !constructor_name_p (identifier, parser->scope))
11894         {
11895           cp_token_position start = 0;
11896
11897           /* Explain what went wrong.  */
11898           error_at (token->location, "non-template %qD used as template",
11899                     identifier);
11900           inform (token->location, "use %<%T::template %D%> to indicate that it is a template",
11901                   parser->scope, identifier);
11902           /* If parsing tentatively, find the location of the "<" token.  */
11903           if (cp_parser_simulate_error (parser))
11904             start = cp_lexer_token_position (parser->lexer, true);
11905           /* Parse the template arguments so that we can issue error
11906              messages about them.  */
11907           cp_lexer_consume_token (parser->lexer);
11908           cp_parser_enclosed_template_argument_list (parser);
11909           /* Skip tokens until we find a good place from which to
11910              continue parsing.  */
11911           cp_parser_skip_to_closing_parenthesis (parser,
11912                                                  /*recovering=*/true,
11913                                                  /*or_comma=*/true,
11914                                                  /*consume_paren=*/false);
11915           /* If parsing tentatively, permanently remove the
11916              template argument list.  That will prevent duplicate
11917              error messages from being issued about the missing
11918              "template" keyword.  */
11919           if (start)
11920             cp_lexer_purge_tokens_after (parser->lexer, start);
11921           if (is_identifier)
11922             *is_identifier = true;
11923           return identifier;
11924         }
11925
11926       /* If the "template" keyword is present, then there is generally
11927          no point in doing name-lookup, so we just return IDENTIFIER.
11928          But, if the qualifying scope is non-dependent then we can
11929          (and must) do name-lookup normally.  */
11930       if (template_keyword_p
11931           && (!parser->scope
11932               || (TYPE_P (parser->scope)
11933                   && dependent_type_p (parser->scope))))
11934         return identifier;
11935     }
11936
11937   /* Look up the name.  */
11938   decl = cp_parser_lookup_name (parser, identifier,
11939                                 none_type,
11940                                 /*is_template=*/true,
11941                                 /*is_namespace=*/false,
11942                                 check_dependency_p,
11943                                 /*ambiguous_decls=*/NULL,
11944                                 token->location);
11945
11946   /* If DECL is a template, then the name was a template-name.  */
11947   if (TREE_CODE (decl) == TEMPLATE_DECL)
11948     ;
11949   else
11950     {
11951       tree fn = NULL_TREE;
11952
11953       /* The standard does not explicitly indicate whether a name that
11954          names a set of overloaded declarations, some of which are
11955          templates, is a template-name.  However, such a name should
11956          be a template-name; otherwise, there is no way to form a
11957          template-id for the overloaded templates.  */
11958       fns = BASELINK_P (decl) ? BASELINK_FUNCTIONS (decl) : decl;
11959       if (TREE_CODE (fns) == OVERLOAD)
11960         for (fn = fns; fn; fn = OVL_NEXT (fn))
11961           if (TREE_CODE (OVL_CURRENT (fn)) == TEMPLATE_DECL)
11962             break;
11963
11964       if (!fn)
11965         {
11966           /* The name does not name a template.  */
11967           cp_parser_error (parser, "expected template-name");
11968           return error_mark_node;
11969         }
11970     }
11971
11972   /* If DECL is dependent, and refers to a function, then just return
11973      its name; we will look it up again during template instantiation.  */
11974   if (DECL_FUNCTION_TEMPLATE_P (decl) || !DECL_P (decl))
11975     {
11976       tree scope = CP_DECL_CONTEXT (get_first_fn (decl));
11977       if (TYPE_P (scope) && dependent_type_p (scope))
11978         return identifier;
11979     }
11980
11981   return decl;
11982 }
11983
11984 /* Parse a template-argument-list.
11985
11986    template-argument-list:
11987      template-argument ... [opt]
11988      template-argument-list , template-argument ... [opt]
11989
11990    Returns a TREE_VEC containing the arguments.  */
11991
11992 static tree
11993 cp_parser_template_argument_list (cp_parser* parser)
11994 {
11995   tree fixed_args[10];
11996   unsigned n_args = 0;
11997   unsigned alloced = 10;
11998   tree *arg_ary = fixed_args;
11999   tree vec;
12000   bool saved_in_template_argument_list_p;
12001   bool saved_ice_p;
12002   bool saved_non_ice_p;
12003
12004   saved_in_template_argument_list_p = parser->in_template_argument_list_p;
12005   parser->in_template_argument_list_p = true;
12006   /* Even if the template-id appears in an integral
12007      constant-expression, the contents of the argument list do
12008      not.  */
12009   saved_ice_p = parser->integral_constant_expression_p;
12010   parser->integral_constant_expression_p = false;
12011   saved_non_ice_p = parser->non_integral_constant_expression_p;
12012   parser->non_integral_constant_expression_p = false;
12013   /* Parse the arguments.  */
12014   do
12015     {
12016       tree argument;
12017
12018       if (n_args)
12019         /* Consume the comma.  */
12020         cp_lexer_consume_token (parser->lexer);
12021
12022       /* Parse the template-argument.  */
12023       argument = cp_parser_template_argument (parser);
12024
12025       /* If the next token is an ellipsis, we're expanding a template
12026          argument pack. */
12027       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
12028         {
12029           if (argument == error_mark_node)
12030             {
12031               cp_token *token = cp_lexer_peek_token (parser->lexer);
12032               error_at (token->location,
12033                         "expected parameter pack before %<...%>");
12034             }
12035           /* Consume the `...' token. */
12036           cp_lexer_consume_token (parser->lexer);
12037
12038           /* Make the argument into a TYPE_PACK_EXPANSION or
12039              EXPR_PACK_EXPANSION. */
12040           argument = make_pack_expansion (argument);
12041         }
12042
12043       if (n_args == alloced)
12044         {
12045           alloced *= 2;
12046
12047           if (arg_ary == fixed_args)
12048             {
12049               arg_ary = XNEWVEC (tree, alloced);
12050               memcpy (arg_ary, fixed_args, sizeof (tree) * n_args);
12051             }
12052           else
12053             arg_ary = XRESIZEVEC (tree, arg_ary, alloced);
12054         }
12055       arg_ary[n_args++] = argument;
12056     }
12057   while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
12058
12059   vec = make_tree_vec (n_args);
12060
12061   while (n_args--)
12062     TREE_VEC_ELT (vec, n_args) = arg_ary[n_args];
12063
12064   if (arg_ary != fixed_args)
12065     free (arg_ary);
12066   parser->non_integral_constant_expression_p = saved_non_ice_p;
12067   parser->integral_constant_expression_p = saved_ice_p;
12068   parser->in_template_argument_list_p = saved_in_template_argument_list_p;
12069 #ifdef ENABLE_CHECKING
12070   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec));
12071 #endif
12072   return vec;
12073 }
12074
12075 /* Parse a template-argument.
12076
12077    template-argument:
12078      assignment-expression
12079      type-id
12080      id-expression
12081
12082    The representation is that of an assignment-expression, type-id, or
12083    id-expression -- except that the qualified id-expression is
12084    evaluated, so that the value returned is either a DECL or an
12085    OVERLOAD.
12086
12087    Although the standard says "assignment-expression", it forbids
12088    throw-expressions or assignments in the template argument.
12089    Therefore, we use "conditional-expression" instead.  */
12090
12091 static tree
12092 cp_parser_template_argument (cp_parser* parser)
12093 {
12094   tree argument;
12095   bool template_p;
12096   bool address_p;
12097   bool maybe_type_id = false;
12098   cp_token *token = NULL, *argument_start_token = NULL;
12099   cp_id_kind idk;
12100
12101   /* There's really no way to know what we're looking at, so we just
12102      try each alternative in order.
12103
12104        [temp.arg]
12105
12106        In a template-argument, an ambiguity between a type-id and an
12107        expression is resolved to a type-id, regardless of the form of
12108        the corresponding template-parameter.
12109
12110      Therefore, we try a type-id first.  */
12111   cp_parser_parse_tentatively (parser);
12112   argument = cp_parser_template_type_arg (parser);
12113   /* If there was no error parsing the type-id but the next token is a
12114      '>>', our behavior depends on which dialect of C++ we're
12115      parsing. In C++98, we probably found a typo for '> >'. But there
12116      are type-id which are also valid expressions. For instance:
12117
12118      struct X { int operator >> (int); };
12119      template <int V> struct Foo {};
12120      Foo<X () >> 5> r;
12121
12122      Here 'X()' is a valid type-id of a function type, but the user just
12123      wanted to write the expression "X() >> 5". Thus, we remember that we
12124      found a valid type-id, but we still try to parse the argument as an
12125      expression to see what happens. 
12126
12127      In C++0x, the '>>' will be considered two separate '>'
12128      tokens.  */
12129   if (!cp_parser_error_occurred (parser)
12130       && cxx_dialect == cxx98
12131       && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
12132     {
12133       maybe_type_id = true;
12134       cp_parser_abort_tentative_parse (parser);
12135     }
12136   else
12137     {
12138       /* If the next token isn't a `,' or a `>', then this argument wasn't
12139       really finished. This means that the argument is not a valid
12140       type-id.  */
12141       if (!cp_parser_next_token_ends_template_argument_p (parser))
12142         cp_parser_error (parser, "expected template-argument");
12143       /* If that worked, we're done.  */
12144       if (cp_parser_parse_definitely (parser))
12145         return argument;
12146     }
12147   /* We're still not sure what the argument will be.  */
12148   cp_parser_parse_tentatively (parser);
12149   /* Try a template.  */
12150   argument_start_token = cp_lexer_peek_token (parser->lexer);
12151   argument = cp_parser_id_expression (parser,
12152                                       /*template_keyword_p=*/false,
12153                                       /*check_dependency_p=*/true,
12154                                       &template_p,
12155                                       /*declarator_p=*/false,
12156                                       /*optional_p=*/false);
12157   /* If the next token isn't a `,' or a `>', then this argument wasn't
12158      really finished.  */
12159   if (!cp_parser_next_token_ends_template_argument_p (parser))
12160     cp_parser_error (parser, "expected template-argument");
12161   if (!cp_parser_error_occurred (parser))
12162     {
12163       /* Figure out what is being referred to.  If the id-expression
12164          was for a class template specialization, then we will have a
12165          TYPE_DECL at this point.  There is no need to do name lookup
12166          at this point in that case.  */
12167       if (TREE_CODE (argument) != TYPE_DECL)
12168         argument = cp_parser_lookup_name (parser, argument,
12169                                           none_type,
12170                                           /*is_template=*/template_p,
12171                                           /*is_namespace=*/false,
12172                                           /*check_dependency=*/true,
12173                                           /*ambiguous_decls=*/NULL,
12174                                           argument_start_token->location);
12175       if (TREE_CODE (argument) != TEMPLATE_DECL
12176           && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
12177         cp_parser_error (parser, "expected template-name");
12178     }
12179   if (cp_parser_parse_definitely (parser))
12180     return argument;
12181   /* It must be a non-type argument.  There permitted cases are given
12182      in [temp.arg.nontype]:
12183
12184      -- an integral constant-expression of integral or enumeration
12185         type; or
12186
12187      -- the name of a non-type template-parameter; or
12188
12189      -- the name of an object or function with external linkage...
12190
12191      -- the address of an object or function with external linkage...
12192
12193      -- a pointer to member...  */
12194   /* Look for a non-type template parameter.  */
12195   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
12196     {
12197       cp_parser_parse_tentatively (parser);
12198       argument = cp_parser_primary_expression (parser,
12199                                                /*address_p=*/false,
12200                                                /*cast_p=*/false,
12201                                                /*template_arg_p=*/true,
12202                                                &idk);
12203       if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX
12204           || !cp_parser_next_token_ends_template_argument_p (parser))
12205         cp_parser_simulate_error (parser);
12206       if (cp_parser_parse_definitely (parser))
12207         return argument;
12208     }
12209
12210   /* If the next token is "&", the argument must be the address of an
12211      object or function with external linkage.  */
12212   address_p = cp_lexer_next_token_is (parser->lexer, CPP_AND);
12213   if (address_p)
12214     cp_lexer_consume_token (parser->lexer);
12215   /* See if we might have an id-expression.  */
12216   token = cp_lexer_peek_token (parser->lexer);
12217   if (token->type == CPP_NAME
12218       || token->keyword == RID_OPERATOR
12219       || token->type == CPP_SCOPE
12220       || token->type == CPP_TEMPLATE_ID
12221       || token->type == CPP_NESTED_NAME_SPECIFIER)
12222     {
12223       cp_parser_parse_tentatively (parser);
12224       argument = cp_parser_primary_expression (parser,
12225                                                address_p,
12226                                                /*cast_p=*/false,
12227                                                /*template_arg_p=*/true,
12228                                                &idk);
12229       if (cp_parser_error_occurred (parser)
12230           || !cp_parser_next_token_ends_template_argument_p (parser))
12231         cp_parser_abort_tentative_parse (parser);
12232       else
12233         {
12234           tree probe;
12235
12236           if (TREE_CODE (argument) == INDIRECT_REF)
12237             {
12238               gcc_assert (REFERENCE_REF_P (argument));
12239               argument = TREE_OPERAND (argument, 0);
12240             }
12241
12242           /* If we're in a template, we represent a qualified-id referring
12243              to a static data member as a SCOPE_REF even if the scope isn't
12244              dependent so that we can check access control later.  */
12245           probe = argument;
12246           if (TREE_CODE (probe) == SCOPE_REF)
12247             probe = TREE_OPERAND (probe, 1);
12248           if (TREE_CODE (probe) == VAR_DECL)
12249             {
12250               /* A variable without external linkage might still be a
12251                  valid constant-expression, so no error is issued here
12252                  if the external-linkage check fails.  */
12253               if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe))
12254                 cp_parser_simulate_error (parser);
12255             }
12256           else if (is_overloaded_fn (argument))
12257             /* All overloaded functions are allowed; if the external
12258                linkage test does not pass, an error will be issued
12259                later.  */
12260             ;
12261           else if (address_p
12262                    && (TREE_CODE (argument) == OFFSET_REF
12263                        || TREE_CODE (argument) == SCOPE_REF))
12264             /* A pointer-to-member.  */
12265             ;
12266           else if (TREE_CODE (argument) == TEMPLATE_PARM_INDEX)
12267             ;
12268           else
12269             cp_parser_simulate_error (parser);
12270
12271           if (cp_parser_parse_definitely (parser))
12272             {
12273               if (address_p)
12274                 argument = build_x_unary_op (ADDR_EXPR, argument,
12275                                              tf_warning_or_error);
12276               return argument;
12277             }
12278         }
12279     }
12280   /* If the argument started with "&", there are no other valid
12281      alternatives at this point.  */
12282   if (address_p)
12283     {
12284       cp_parser_error (parser, "invalid non-type template argument");
12285       return error_mark_node;
12286     }
12287
12288   /* If the argument wasn't successfully parsed as a type-id followed
12289      by '>>', the argument can only be a constant expression now.
12290      Otherwise, we try parsing the constant-expression tentatively,
12291      because the argument could really be a type-id.  */
12292   if (maybe_type_id)
12293     cp_parser_parse_tentatively (parser);
12294   argument = cp_parser_constant_expression (parser,
12295                                             /*allow_non_constant_p=*/false,
12296                                             /*non_constant_p=*/NULL);
12297   argument = fold_non_dependent_expr (argument);
12298   if (!maybe_type_id)
12299     return argument;
12300   if (!cp_parser_next_token_ends_template_argument_p (parser))
12301     cp_parser_error (parser, "expected template-argument");
12302   if (cp_parser_parse_definitely (parser))
12303     return argument;
12304   /* We did our best to parse the argument as a non type-id, but that
12305      was the only alternative that matched (albeit with a '>' after
12306      it). We can assume it's just a typo from the user, and a
12307      diagnostic will then be issued.  */
12308   return cp_parser_template_type_arg (parser);
12309 }
12310
12311 /* Parse an explicit-instantiation.
12312
12313    explicit-instantiation:
12314      template declaration
12315
12316    Although the standard says `declaration', what it really means is:
12317
12318    explicit-instantiation:
12319      template decl-specifier-seq [opt] declarator [opt] ;
12320
12321    Things like `template int S<int>::i = 5, int S<double>::j;' are not
12322    supposed to be allowed.  A defect report has been filed about this
12323    issue.
12324
12325    GNU Extension:
12326
12327    explicit-instantiation:
12328      storage-class-specifier template
12329        decl-specifier-seq [opt] declarator [opt] ;
12330      function-specifier template
12331        decl-specifier-seq [opt] declarator [opt] ;  */
12332
12333 static void
12334 cp_parser_explicit_instantiation (cp_parser* parser)
12335 {
12336   int declares_class_or_enum;
12337   cp_decl_specifier_seq decl_specifiers;
12338   tree extension_specifier = NULL_TREE;
12339
12340   timevar_push (TV_TEMPLATE_INST);
12341
12342   /* Look for an (optional) storage-class-specifier or
12343      function-specifier.  */
12344   if (cp_parser_allow_gnu_extensions_p (parser))
12345     {
12346       extension_specifier
12347         = cp_parser_storage_class_specifier_opt (parser);
12348       if (!extension_specifier)
12349         extension_specifier
12350           = cp_parser_function_specifier_opt (parser,
12351                                               /*decl_specs=*/NULL);
12352     }
12353
12354   /* Look for the `template' keyword.  */
12355   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12356   /* Let the front end know that we are processing an explicit
12357      instantiation.  */
12358   begin_explicit_instantiation ();
12359   /* [temp.explicit] says that we are supposed to ignore access
12360      control while processing explicit instantiation directives.  */
12361   push_deferring_access_checks (dk_no_check);
12362   /* Parse a decl-specifier-seq.  */
12363   cp_parser_decl_specifier_seq (parser,
12364                                 CP_PARSER_FLAGS_OPTIONAL,
12365                                 &decl_specifiers,
12366                                 &declares_class_or_enum);
12367   /* If there was exactly one decl-specifier, and it declared a class,
12368      and there's no declarator, then we have an explicit type
12369      instantiation.  */
12370   if (declares_class_or_enum && cp_parser_declares_only_class_p (parser))
12371     {
12372       tree type;
12373
12374       type = check_tag_decl (&decl_specifiers);
12375       /* Turn access control back on for names used during
12376          template instantiation.  */
12377       pop_deferring_access_checks ();
12378       if (type)
12379         do_type_instantiation (type, extension_specifier,
12380                                /*complain=*/tf_error);
12381     }
12382   else
12383     {
12384       cp_declarator *declarator;
12385       tree decl;
12386
12387       /* Parse the declarator.  */
12388       declarator
12389         = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
12390                                 /*ctor_dtor_or_conv_p=*/NULL,
12391                                 /*parenthesized_p=*/NULL,
12392                                 /*member_p=*/false);
12393       if (declares_class_or_enum & 2)
12394         cp_parser_check_for_definition_in_return_type (declarator,
12395                                                        decl_specifiers.type,
12396                                                        decl_specifiers.type_location);
12397       if (declarator != cp_error_declarator)
12398         {
12399           if (decl_specifiers.specs[(int)ds_inline])
12400             permerror (input_location, "explicit instantiation shall not use"
12401                        " %<inline%> specifier");
12402           if (decl_specifiers.specs[(int)ds_constexpr])
12403             permerror (input_location, "explicit instantiation shall not use"
12404                        " %<constexpr%> specifier");
12405
12406           decl = grokdeclarator (declarator, &decl_specifiers,
12407                                  NORMAL, 0, &decl_specifiers.attributes);
12408           /* Turn access control back on for names used during
12409              template instantiation.  */
12410           pop_deferring_access_checks ();
12411           /* Do the explicit instantiation.  */
12412           do_decl_instantiation (decl, extension_specifier);
12413         }
12414       else
12415         {
12416           pop_deferring_access_checks ();
12417           /* Skip the body of the explicit instantiation.  */
12418           cp_parser_skip_to_end_of_statement (parser);
12419         }
12420     }
12421   /* We're done with the instantiation.  */
12422   end_explicit_instantiation ();
12423
12424   cp_parser_consume_semicolon_at_end_of_statement (parser);
12425
12426   timevar_pop (TV_TEMPLATE_INST);
12427 }
12428
12429 /* Parse an explicit-specialization.
12430
12431    explicit-specialization:
12432      template < > declaration
12433
12434    Although the standard says `declaration', what it really means is:
12435
12436    explicit-specialization:
12437      template <> decl-specifier [opt] init-declarator [opt] ;
12438      template <> function-definition
12439      template <> explicit-specialization
12440      template <> template-declaration  */
12441
12442 static void
12443 cp_parser_explicit_specialization (cp_parser* parser)
12444 {
12445   bool need_lang_pop;
12446   cp_token *token = cp_lexer_peek_token (parser->lexer);
12447
12448   /* Look for the `template' keyword.  */
12449   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12450   /* Look for the `<'.  */
12451   cp_parser_require (parser, CPP_LESS, RT_LESS);
12452   /* Look for the `>'.  */
12453   cp_parser_require (parser, CPP_GREATER, RT_GREATER);
12454   /* We have processed another parameter list.  */
12455   ++parser->num_template_parameter_lists;
12456   /* [temp]
12457
12458      A template ... explicit specialization ... shall not have C
12459      linkage.  */
12460   if (current_lang_name == lang_name_c)
12461     {
12462       error_at (token->location, "template specialization with C linkage");
12463       /* Give it C++ linkage to avoid confusing other parts of the
12464          front end.  */
12465       push_lang_context (lang_name_cplusplus);
12466       need_lang_pop = true;
12467     }
12468   else
12469     need_lang_pop = false;
12470   /* Let the front end know that we are beginning a specialization.  */
12471   if (!begin_specialization ())
12472     {
12473       end_specialization ();
12474       return;
12475     }
12476
12477   /* If the next keyword is `template', we need to figure out whether
12478      or not we're looking a template-declaration.  */
12479   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
12480     {
12481       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
12482           && cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_GREATER)
12483         cp_parser_template_declaration_after_export (parser,
12484                                                      /*member_p=*/false);
12485       else
12486         cp_parser_explicit_specialization (parser);
12487     }
12488   else
12489     /* Parse the dependent declaration.  */
12490     cp_parser_single_declaration (parser,
12491                                   /*checks=*/NULL,
12492                                   /*member_p=*/false,
12493                                   /*explicit_specialization_p=*/true,
12494                                   /*friend_p=*/NULL);
12495   /* We're done with the specialization.  */
12496   end_specialization ();
12497   /* For the erroneous case of a template with C linkage, we pushed an
12498      implicit C++ linkage scope; exit that scope now.  */
12499   if (need_lang_pop)
12500     pop_lang_context ();
12501   /* We're done with this parameter list.  */
12502   --parser->num_template_parameter_lists;
12503 }
12504
12505 /* Parse a type-specifier.
12506
12507    type-specifier:
12508      simple-type-specifier
12509      class-specifier
12510      enum-specifier
12511      elaborated-type-specifier
12512      cv-qualifier
12513
12514    GNU Extension:
12515
12516    type-specifier:
12517      __complex__
12518
12519    Returns a representation of the type-specifier.  For a
12520    class-specifier, enum-specifier, or elaborated-type-specifier, a
12521    TREE_TYPE is returned; otherwise, a TYPE_DECL is returned.
12522
12523    The parser flags FLAGS is used to control type-specifier parsing.
12524
12525    If IS_DECLARATION is TRUE, then this type-specifier is appearing
12526    in a decl-specifier-seq.
12527
12528    If DECLARES_CLASS_OR_ENUM is non-NULL, and the type-specifier is a
12529    class-specifier, enum-specifier, or elaborated-type-specifier, then
12530    *DECLARES_CLASS_OR_ENUM is set to a nonzero value.  The value is 1
12531    if a type is declared; 2 if it is defined.  Otherwise, it is set to
12532    zero.
12533
12534    If IS_CV_QUALIFIER is non-NULL, and the type-specifier is a
12535    cv-qualifier, then IS_CV_QUALIFIER is set to TRUE.  Otherwise, it
12536    is set to FALSE.  */
12537
12538 static tree
12539 cp_parser_type_specifier (cp_parser* parser,
12540                           cp_parser_flags flags,
12541                           cp_decl_specifier_seq *decl_specs,
12542                           bool is_declaration,
12543                           int* declares_class_or_enum,
12544                           bool* is_cv_qualifier)
12545 {
12546   tree type_spec = NULL_TREE;
12547   cp_token *token;
12548   enum rid keyword;
12549   cp_decl_spec ds = ds_last;
12550
12551   /* Assume this type-specifier does not declare a new type.  */
12552   if (declares_class_or_enum)
12553     *declares_class_or_enum = 0;
12554   /* And that it does not specify a cv-qualifier.  */
12555   if (is_cv_qualifier)
12556     *is_cv_qualifier = false;
12557   /* Peek at the next token.  */
12558   token = cp_lexer_peek_token (parser->lexer);
12559
12560   /* If we're looking at a keyword, we can use that to guide the
12561      production we choose.  */
12562   keyword = token->keyword;
12563   switch (keyword)
12564     {
12565     case RID_ENUM:
12566       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12567         goto elaborated_type_specifier;
12568
12569       /* Look for the enum-specifier.  */
12570       type_spec = cp_parser_enum_specifier (parser);
12571       /* If that worked, we're done.  */
12572       if (type_spec)
12573         {
12574           if (declares_class_or_enum)
12575             *declares_class_or_enum = 2;
12576           if (decl_specs)
12577             cp_parser_set_decl_spec_type (decl_specs,
12578                                           type_spec,
12579                                           token->location,
12580                                           /*type_definition_p=*/true);
12581           return type_spec;
12582         }
12583       else
12584         goto elaborated_type_specifier;
12585
12586       /* Any of these indicate either a class-specifier, or an
12587          elaborated-type-specifier.  */
12588     case RID_CLASS:
12589     case RID_STRUCT:
12590     case RID_UNION:
12591       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12592         goto elaborated_type_specifier;
12593
12594       /* Parse tentatively so that we can back up if we don't find a
12595          class-specifier.  */
12596       cp_parser_parse_tentatively (parser);
12597       /* Look for the class-specifier.  */
12598       type_spec = cp_parser_class_specifier (parser);
12599       invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, type_spec);
12600       /* If that worked, we're done.  */
12601       if (cp_parser_parse_definitely (parser))
12602         {
12603           if (declares_class_or_enum)
12604             *declares_class_or_enum = 2;
12605           if (decl_specs)
12606             cp_parser_set_decl_spec_type (decl_specs,
12607                                           type_spec,
12608                                           token->location,
12609                                           /*type_definition_p=*/true);
12610           return type_spec;
12611         }
12612
12613       /* Fall through.  */
12614     elaborated_type_specifier:
12615       /* We're declaring (not defining) a class or enum.  */
12616       if (declares_class_or_enum)
12617         *declares_class_or_enum = 1;
12618
12619       /* Fall through.  */
12620     case RID_TYPENAME:
12621       /* Look for an elaborated-type-specifier.  */
12622       type_spec
12623         = (cp_parser_elaborated_type_specifier
12624            (parser,
12625             decl_specs && decl_specs->specs[(int) ds_friend],
12626             is_declaration));
12627       if (decl_specs)
12628         cp_parser_set_decl_spec_type (decl_specs,
12629                                       type_spec,
12630                                       token->location,
12631                                       /*type_definition_p=*/false);
12632       return type_spec;
12633
12634     case RID_CONST:
12635       ds = ds_const;
12636       if (is_cv_qualifier)
12637         *is_cv_qualifier = true;
12638       break;
12639
12640     case RID_VOLATILE:
12641       ds = ds_volatile;
12642       if (is_cv_qualifier)
12643         *is_cv_qualifier = true;
12644       break;
12645
12646     case RID_RESTRICT:
12647       ds = ds_restrict;
12648       if (is_cv_qualifier)
12649         *is_cv_qualifier = true;
12650       break;
12651
12652     case RID_COMPLEX:
12653       /* The `__complex__' keyword is a GNU extension.  */
12654       ds = ds_complex;
12655       break;
12656
12657     default:
12658       break;
12659     }
12660
12661   /* Handle simple keywords.  */
12662   if (ds != ds_last)
12663     {
12664       if (decl_specs)
12665         {
12666           ++decl_specs->specs[(int)ds];
12667           decl_specs->any_specifiers_p = true;
12668         }
12669       return cp_lexer_consume_token (parser->lexer)->u.value;
12670     }
12671
12672   /* If we do not already have a type-specifier, assume we are looking
12673      at a simple-type-specifier.  */
12674   type_spec = cp_parser_simple_type_specifier (parser,
12675                                                decl_specs,
12676                                                flags);
12677
12678   /* If we didn't find a type-specifier, and a type-specifier was not
12679      optional in this context, issue an error message.  */
12680   if (!type_spec && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12681     {
12682       cp_parser_error (parser, "expected type specifier");
12683       return error_mark_node;
12684     }
12685
12686   return type_spec;
12687 }
12688
12689 /* Parse a simple-type-specifier.
12690
12691    simple-type-specifier:
12692      :: [opt] nested-name-specifier [opt] type-name
12693      :: [opt] nested-name-specifier template template-id
12694      char
12695      wchar_t
12696      bool
12697      short
12698      int
12699      long
12700      signed
12701      unsigned
12702      float
12703      double
12704      void
12705
12706    C++0x Extension:
12707
12708    simple-type-specifier:
12709      auto
12710      decltype ( expression )   
12711      char16_t
12712      char32_t
12713      __underlying_type ( type-id )
12714
12715    GNU Extension:
12716
12717    simple-type-specifier:
12718      __int128
12719      __typeof__ unary-expression
12720      __typeof__ ( type-id )
12721
12722    Returns the indicated TYPE_DECL.  If DECL_SPECS is not NULL, it is
12723    appropriately updated.  */
12724
12725 static tree
12726 cp_parser_simple_type_specifier (cp_parser* parser,
12727                                  cp_decl_specifier_seq *decl_specs,
12728                                  cp_parser_flags flags)
12729 {
12730   tree type = NULL_TREE;
12731   cp_token *token;
12732
12733   /* Peek at the next token.  */
12734   token = cp_lexer_peek_token (parser->lexer);
12735
12736   /* If we're looking at a keyword, things are easy.  */
12737   switch (token->keyword)
12738     {
12739     case RID_CHAR:
12740       if (decl_specs)
12741         decl_specs->explicit_char_p = true;
12742       type = char_type_node;
12743       break;
12744     case RID_CHAR16:
12745       type = char16_type_node;
12746       break;
12747     case RID_CHAR32:
12748       type = char32_type_node;
12749       break;
12750     case RID_WCHAR:
12751       type = wchar_type_node;
12752       break;
12753     case RID_BOOL:
12754       type = boolean_type_node;
12755       break;
12756     case RID_SHORT:
12757       if (decl_specs)
12758         ++decl_specs->specs[(int) ds_short];
12759       type = short_integer_type_node;
12760       break;
12761     case RID_INT:
12762       if (decl_specs)
12763         decl_specs->explicit_int_p = true;
12764       type = integer_type_node;
12765       break;
12766     case RID_INT128:
12767       if (!int128_integer_type_node)
12768         break;
12769       if (decl_specs)
12770         decl_specs->explicit_int128_p = true;
12771       type = int128_integer_type_node;
12772       break;
12773     case RID_LONG:
12774       if (decl_specs)
12775         ++decl_specs->specs[(int) ds_long];
12776       type = long_integer_type_node;
12777       break;
12778     case RID_SIGNED:
12779       if (decl_specs)
12780         ++decl_specs->specs[(int) ds_signed];
12781       type = integer_type_node;
12782       break;
12783     case RID_UNSIGNED:
12784       if (decl_specs)
12785         ++decl_specs->specs[(int) ds_unsigned];
12786       type = unsigned_type_node;
12787       break;
12788     case RID_FLOAT:
12789       type = float_type_node;
12790       break;
12791     case RID_DOUBLE:
12792       type = double_type_node;
12793       break;
12794     case RID_VOID:
12795       type = void_type_node;
12796       break;
12797       
12798     case RID_AUTO:
12799       maybe_warn_cpp0x (CPP0X_AUTO);
12800       type = make_auto ();
12801       break;
12802
12803     case RID_DECLTYPE:
12804       /* Since DR 743, decltype can either be a simple-type-specifier by
12805          itself or begin a nested-name-specifier.  Parsing it will replace
12806          it with a CPP_DECLTYPE, so just rewind and let the CPP_DECLTYPE
12807          handling below decide what to do.  */
12808       cp_parser_decltype (parser);
12809       cp_lexer_set_token_position (parser->lexer, token);
12810       break;
12811
12812     case RID_TYPEOF:
12813       /* Consume the `typeof' token.  */
12814       cp_lexer_consume_token (parser->lexer);
12815       /* Parse the operand to `typeof'.  */
12816       type = cp_parser_sizeof_operand (parser, RID_TYPEOF);
12817       /* If it is not already a TYPE, take its type.  */
12818       if (!TYPE_P (type))
12819         type = finish_typeof (type);
12820
12821       if (decl_specs)
12822         cp_parser_set_decl_spec_type (decl_specs, type,
12823                                       token->location,
12824                                       /*type_definition_p=*/false);
12825
12826       return type;
12827
12828     case RID_UNDERLYING_TYPE:
12829       type = cp_parser_trait_expr (parser, RID_UNDERLYING_TYPE);
12830
12831       if (decl_specs)
12832         cp_parser_set_decl_spec_type (decl_specs, type,
12833                                       token->location,
12834                                       /*type_definition_p=*/false);
12835
12836       return type;
12837
12838     default:
12839       break;
12840     }
12841
12842   /* If token is an already-parsed decltype not followed by ::,
12843      it's a simple-type-specifier.  */
12844   if (token->type == CPP_DECLTYPE
12845       && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
12846     {
12847       type = token->u.value;
12848       if (decl_specs)
12849         cp_parser_set_decl_spec_type (decl_specs, type,
12850                                       token->location,
12851                                       /*type_definition_p=*/false);
12852       cp_lexer_consume_token (parser->lexer);
12853       return type;
12854     }
12855
12856   /* If the type-specifier was for a built-in type, we're done.  */
12857   if (type)
12858     {
12859       /* Record the type.  */
12860       if (decl_specs
12861           && (token->keyword != RID_SIGNED
12862               && token->keyword != RID_UNSIGNED
12863               && token->keyword != RID_SHORT
12864               && token->keyword != RID_LONG))
12865         cp_parser_set_decl_spec_type (decl_specs,
12866                                       type,
12867                                       token->location,
12868                                       /*type_definition_p=*/false);
12869       if (decl_specs)
12870         decl_specs->any_specifiers_p = true;
12871
12872       /* Consume the token.  */
12873       cp_lexer_consume_token (parser->lexer);
12874
12875       /* There is no valid C++ program where a non-template type is
12876          followed by a "<".  That usually indicates that the user thought
12877          that the type was a template.  */
12878       cp_parser_check_for_invalid_template_id (parser, type, token->location);
12879
12880       return TYPE_NAME (type);
12881     }
12882
12883   /* The type-specifier must be a user-defined type.  */
12884   if (!(flags & CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES))
12885     {
12886       bool qualified_p;
12887       bool global_p;
12888
12889       /* Don't gobble tokens or issue error messages if this is an
12890          optional type-specifier.  */
12891       if (flags & CP_PARSER_FLAGS_OPTIONAL)
12892         cp_parser_parse_tentatively (parser);
12893
12894       /* Look for the optional `::' operator.  */
12895       global_p
12896         = (cp_parser_global_scope_opt (parser,
12897                                        /*current_scope_valid_p=*/false)
12898            != NULL_TREE);
12899       /* Look for the nested-name specifier.  */
12900       qualified_p
12901         = (cp_parser_nested_name_specifier_opt (parser,
12902                                                 /*typename_keyword_p=*/false,
12903                                                 /*check_dependency_p=*/true,
12904                                                 /*type_p=*/false,
12905                                                 /*is_declaration=*/false)
12906            != NULL_TREE);
12907       token = cp_lexer_peek_token (parser->lexer);
12908       /* If we have seen a nested-name-specifier, and the next token
12909          is `template', then we are using the template-id production.  */
12910       if (parser->scope
12911           && cp_parser_optional_template_keyword (parser))
12912         {
12913           /* Look for the template-id.  */
12914           type = cp_parser_template_id (parser,
12915                                         /*template_keyword_p=*/true,
12916                                         /*check_dependency_p=*/true,
12917                                         /*is_declaration=*/false);
12918           /* If the template-id did not name a type, we are out of
12919              luck.  */
12920           if (TREE_CODE (type) != TYPE_DECL)
12921             {
12922               cp_parser_error (parser, "expected template-id for type");
12923               type = NULL_TREE;
12924             }
12925         }
12926       /* Otherwise, look for a type-name.  */
12927       else
12928         type = cp_parser_type_name (parser);
12929       /* Keep track of all name-lookups performed in class scopes.  */
12930       if (type
12931           && !global_p
12932           && !qualified_p
12933           && TREE_CODE (type) == TYPE_DECL
12934           && TREE_CODE (DECL_NAME (type)) == IDENTIFIER_NODE)
12935         maybe_note_name_used_in_class (DECL_NAME (type), type);
12936       /* If it didn't work out, we don't have a TYPE.  */
12937       if ((flags & CP_PARSER_FLAGS_OPTIONAL)
12938           && !cp_parser_parse_definitely (parser))
12939         type = NULL_TREE;
12940       if (type && decl_specs)
12941         cp_parser_set_decl_spec_type (decl_specs, type,
12942                                       token->location,
12943                                       /*type_definition_p=*/false);
12944     }
12945
12946   /* If we didn't get a type-name, issue an error message.  */
12947   if (!type && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12948     {
12949       cp_parser_error (parser, "expected type-name");
12950       return error_mark_node;
12951     }
12952
12953   if (type && type != error_mark_node)
12954     {
12955       /* See if TYPE is an Objective-C type, and if so, parse and
12956          accept any protocol references following it.  Do this before
12957          the cp_parser_check_for_invalid_template_id() call, because
12958          Objective-C types can be followed by '<...>' which would
12959          enclose protocol names rather than template arguments, and so
12960          everything is fine.  */
12961       if (c_dialect_objc () && !parser->scope
12962           && (objc_is_id (type) || objc_is_class_name (type)))
12963         {
12964           tree protos = cp_parser_objc_protocol_refs_opt (parser);
12965           tree qual_type = objc_get_protocol_qualified_type (type, protos);
12966
12967           /* Clobber the "unqualified" type previously entered into
12968              DECL_SPECS with the new, improved protocol-qualified version.  */
12969           if (decl_specs)
12970             decl_specs->type = qual_type;
12971
12972           return qual_type;
12973         }
12974
12975       /* There is no valid C++ program where a non-template type is
12976          followed by a "<".  That usually indicates that the user
12977          thought that the type was a template.  */
12978       cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type),
12979                                                token->location);
12980     }
12981
12982   return type;
12983 }
12984
12985 /* Parse a type-name.
12986
12987    type-name:
12988      class-name
12989      enum-name
12990      typedef-name
12991
12992    enum-name:
12993      identifier
12994
12995    typedef-name:
12996      identifier
12997
12998    Returns a TYPE_DECL for the type.  */
12999
13000 static tree
13001 cp_parser_type_name (cp_parser* parser)
13002 {
13003   tree type_decl;
13004
13005   /* We can't know yet whether it is a class-name or not.  */
13006   cp_parser_parse_tentatively (parser);
13007   /* Try a class-name.  */
13008   type_decl = cp_parser_class_name (parser,
13009                                     /*typename_keyword_p=*/false,
13010                                     /*template_keyword_p=*/false,
13011                                     none_type,
13012                                     /*check_dependency_p=*/true,
13013                                     /*class_head_p=*/false,
13014                                     /*is_declaration=*/false);
13015   /* If it's not a class-name, keep looking.  */
13016   if (!cp_parser_parse_definitely (parser))
13017     {
13018       /* It must be a typedef-name or an enum-name.  */
13019       return cp_parser_nonclass_name (parser);
13020     }
13021
13022   return type_decl;
13023 }
13024
13025 /* Parse a non-class type-name, that is, either an enum-name or a typedef-name.
13026
13027    enum-name:
13028      identifier
13029
13030    typedef-name:
13031      identifier
13032
13033    Returns a TYPE_DECL for the type.  */
13034
13035 static tree
13036 cp_parser_nonclass_name (cp_parser* parser)
13037 {
13038   tree type_decl;
13039   tree identifier;
13040
13041   cp_token *token = cp_lexer_peek_token (parser->lexer);
13042   identifier = cp_parser_identifier (parser);
13043   if (identifier == error_mark_node)
13044     return error_mark_node;
13045
13046   /* Look up the type-name.  */
13047   type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
13048
13049   if (TREE_CODE (type_decl) != TYPE_DECL
13050       && (objc_is_id (identifier) || objc_is_class_name (identifier)))
13051     {
13052       /* See if this is an Objective-C type.  */
13053       tree protos = cp_parser_objc_protocol_refs_opt (parser);
13054       tree type = objc_get_protocol_qualified_type (identifier, protos);
13055       if (type)
13056         type_decl = TYPE_NAME (type);
13057     }
13058
13059   /* Issue an error if we did not find a type-name.  */
13060   if (TREE_CODE (type_decl) != TYPE_DECL
13061       /* In Objective-C, we have the complication that class names are
13062          normally type names and start declarations (eg, the
13063          "NSObject" in "NSObject *object;"), but can be used in an
13064          Objective-C 2.0 dot-syntax (as in "NSObject.version") which
13065          is an expression.  So, a classname followed by a dot is not a
13066          valid type-name.  */
13067       || (objc_is_class_name (TREE_TYPE (type_decl))
13068           && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT))
13069     {
13070       if (!cp_parser_simulate_error (parser))
13071         cp_parser_name_lookup_error (parser, identifier, type_decl,
13072                                      NLE_TYPE, token->location);
13073       return error_mark_node;
13074     }
13075   /* Remember that the name was used in the definition of the
13076      current class so that we can check later to see if the
13077      meaning would have been different after the class was
13078      entirely defined.  */
13079   else if (type_decl != error_mark_node
13080            && !parser->scope)
13081     maybe_note_name_used_in_class (identifier, type_decl);
13082   
13083   return type_decl;
13084 }
13085
13086 /* Parse an elaborated-type-specifier.  Note that the grammar given
13087    here incorporates the resolution to DR68.
13088
13089    elaborated-type-specifier:
13090      class-key :: [opt] nested-name-specifier [opt] identifier
13091      class-key :: [opt] nested-name-specifier [opt] template [opt] template-id
13092      enum-key :: [opt] nested-name-specifier [opt] identifier
13093      typename :: [opt] nested-name-specifier identifier
13094      typename :: [opt] nested-name-specifier template [opt]
13095        template-id
13096
13097    GNU extension:
13098
13099    elaborated-type-specifier:
13100      class-key attributes :: [opt] nested-name-specifier [opt] identifier
13101      class-key attributes :: [opt] nested-name-specifier [opt]
13102                template [opt] template-id
13103      enum attributes :: [opt] nested-name-specifier [opt] identifier
13104
13105    If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
13106    declared `friend'.  If IS_DECLARATION is TRUE, then this
13107    elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
13108    something is being declared.
13109
13110    Returns the TYPE specified.  */
13111
13112 static tree
13113 cp_parser_elaborated_type_specifier (cp_parser* parser,
13114                                      bool is_friend,
13115                                      bool is_declaration)
13116 {
13117   enum tag_types tag_type;
13118   tree identifier;
13119   tree type = NULL_TREE;
13120   tree attributes = NULL_TREE;
13121   tree globalscope;
13122   cp_token *token = NULL;
13123
13124   /* See if we're looking at the `enum' keyword.  */
13125   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
13126     {
13127       /* Consume the `enum' token.  */
13128       cp_lexer_consume_token (parser->lexer);
13129       /* Remember that it's an enumeration type.  */
13130       tag_type = enum_type;
13131       /* Issue a warning if the `struct' or `class' key (for C++0x scoped
13132          enums) is used here.  */
13133       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
13134           || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
13135         {
13136             pedwarn (input_location, 0, "elaborated-type-specifier "
13137                       "for a scoped enum must not use the %<%D%> keyword",
13138                       cp_lexer_peek_token (parser->lexer)->u.value);
13139           /* Consume the `struct' or `class' and parse it anyway.  */
13140           cp_lexer_consume_token (parser->lexer);
13141         }
13142       /* Parse the attributes.  */
13143       attributes = cp_parser_attributes_opt (parser);
13144     }
13145   /* Or, it might be `typename'.  */
13146   else if (cp_lexer_next_token_is_keyword (parser->lexer,
13147                                            RID_TYPENAME))
13148     {
13149       /* Consume the `typename' token.  */
13150       cp_lexer_consume_token (parser->lexer);
13151       /* Remember that it's a `typename' type.  */
13152       tag_type = typename_type;
13153     }
13154   /* Otherwise it must be a class-key.  */
13155   else
13156     {
13157       tag_type = cp_parser_class_key (parser);
13158       if (tag_type == none_type)
13159         return error_mark_node;
13160       /* Parse the attributes.  */
13161       attributes = cp_parser_attributes_opt (parser);
13162     }
13163
13164   /* Look for the `::' operator.  */
13165   globalscope =  cp_parser_global_scope_opt (parser,
13166                                              /*current_scope_valid_p=*/false);
13167   /* Look for the nested-name-specifier.  */
13168   if (tag_type == typename_type && !globalscope)
13169     {
13170       if (!cp_parser_nested_name_specifier (parser,
13171                                            /*typename_keyword_p=*/true,
13172                                            /*check_dependency_p=*/true,
13173                                            /*type_p=*/true,
13174                                             is_declaration))
13175         return error_mark_node;
13176     }
13177   else
13178     /* Even though `typename' is not present, the proposed resolution
13179        to Core Issue 180 says that in `class A<T>::B', `B' should be
13180        considered a type-name, even if `A<T>' is dependent.  */
13181     cp_parser_nested_name_specifier_opt (parser,
13182                                          /*typename_keyword_p=*/true,
13183                                          /*check_dependency_p=*/true,
13184                                          /*type_p=*/true,
13185                                          is_declaration);
13186  /* For everything but enumeration types, consider a template-id.
13187     For an enumeration type, consider only a plain identifier.  */
13188   if (tag_type != enum_type)
13189     {
13190       bool template_p = false;
13191       tree decl;
13192
13193       /* Allow the `template' keyword.  */
13194       template_p = cp_parser_optional_template_keyword (parser);
13195       /* If we didn't see `template', we don't know if there's a
13196          template-id or not.  */
13197       if (!template_p)
13198         cp_parser_parse_tentatively (parser);
13199       /* Parse the template-id.  */
13200       token = cp_lexer_peek_token (parser->lexer);
13201       decl = cp_parser_template_id (parser, template_p,
13202                                     /*check_dependency_p=*/true,
13203                                     is_declaration);
13204       /* If we didn't find a template-id, look for an ordinary
13205          identifier.  */
13206       if (!template_p && !cp_parser_parse_definitely (parser))
13207         ;
13208       /* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
13209          in effect, then we must assume that, upon instantiation, the
13210          template will correspond to a class.  */
13211       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
13212                && tag_type == typename_type)
13213         type = make_typename_type (parser->scope, decl,
13214                                    typename_type,
13215                                    /*complain=*/tf_error);
13216       /* If the `typename' keyword is in effect and DECL is not a type
13217          decl. Then type is non existant.   */
13218       else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL)
13219         type = NULL_TREE; 
13220       else 
13221         type = TREE_TYPE (decl);
13222     }
13223
13224   if (!type)
13225     {
13226       token = cp_lexer_peek_token (parser->lexer);
13227       identifier = cp_parser_identifier (parser);
13228
13229       if (identifier == error_mark_node)
13230         {
13231           parser->scope = NULL_TREE;
13232           return error_mark_node;
13233         }
13234
13235       /* For a `typename', we needn't call xref_tag.  */
13236       if (tag_type == typename_type
13237           && TREE_CODE (parser->scope) != NAMESPACE_DECL)
13238         return cp_parser_make_typename_type (parser, parser->scope,
13239                                              identifier,
13240                                              token->location);
13241       /* Look up a qualified name in the usual way.  */
13242       if (parser->scope)
13243         {
13244           tree decl;
13245           tree ambiguous_decls;
13246
13247           decl = cp_parser_lookup_name (parser, identifier,
13248                                         tag_type,
13249                                         /*is_template=*/false,
13250                                         /*is_namespace=*/false,
13251                                         /*check_dependency=*/true,
13252                                         &ambiguous_decls,
13253                                         token->location);
13254
13255           /* If the lookup was ambiguous, an error will already have been
13256              issued.  */
13257           if (ambiguous_decls)
13258             return error_mark_node;
13259
13260           /* If we are parsing friend declaration, DECL may be a
13261              TEMPLATE_DECL tree node here.  However, we need to check
13262              whether this TEMPLATE_DECL results in valid code.  Consider
13263              the following example:
13264
13265                namespace N {
13266                  template <class T> class C {};
13267                }
13268                class X {
13269                  template <class T> friend class N::C; // #1, valid code
13270                };
13271                template <class T> class Y {
13272                  friend class N::C;                    // #2, invalid code
13273                };
13274
13275              For both case #1 and #2, we arrive at a TEMPLATE_DECL after
13276              name lookup of `N::C'.  We see that friend declaration must
13277              be template for the code to be valid.  Note that
13278              processing_template_decl does not work here since it is
13279              always 1 for the above two cases.  */
13280
13281           decl = (cp_parser_maybe_treat_template_as_class
13282                   (decl, /*tag_name_p=*/is_friend
13283                          && parser->num_template_parameter_lists));
13284
13285           if (TREE_CODE (decl) != TYPE_DECL)
13286             {
13287               cp_parser_diagnose_invalid_type_name (parser,
13288                                                     parser->scope,
13289                                                     identifier,
13290                                                     token->location);
13291               return error_mark_node;
13292             }
13293
13294           if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
13295             {
13296               bool allow_template = (parser->num_template_parameter_lists
13297                                       || DECL_SELF_REFERENCE_P (decl));
13298               type = check_elaborated_type_specifier (tag_type, decl, 
13299                                                       allow_template);
13300
13301               if (type == error_mark_node)
13302                 return error_mark_node;
13303             }
13304
13305           /* Forward declarations of nested types, such as
13306
13307                class C1::C2;
13308                class C1::C2::C3;
13309
13310              are invalid unless all components preceding the final '::'
13311              are complete.  If all enclosing types are complete, these
13312              declarations become merely pointless.
13313
13314              Invalid forward declarations of nested types are errors
13315              caught elsewhere in parsing.  Those that are pointless arrive
13316              here.  */
13317
13318           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
13319               && !is_friend && !processing_explicit_instantiation)
13320             warning (0, "declaration %qD does not declare anything", decl);
13321
13322           type = TREE_TYPE (decl);
13323         }
13324       else
13325         {
13326           /* An elaborated-type-specifier sometimes introduces a new type and
13327              sometimes names an existing type.  Normally, the rule is that it
13328              introduces a new type only if there is not an existing type of
13329              the same name already in scope.  For example, given:
13330
13331                struct S {};
13332                void f() { struct S s; }
13333
13334              the `struct S' in the body of `f' is the same `struct S' as in
13335              the global scope; the existing definition is used.  However, if
13336              there were no global declaration, this would introduce a new
13337              local class named `S'.
13338
13339              An exception to this rule applies to the following code:
13340
13341                namespace N { struct S; }
13342
13343              Here, the elaborated-type-specifier names a new type
13344              unconditionally; even if there is already an `S' in the
13345              containing scope this declaration names a new type.
13346              This exception only applies if the elaborated-type-specifier
13347              forms the complete declaration:
13348
13349                [class.name]
13350
13351                A declaration consisting solely of `class-key identifier ;' is
13352                either a redeclaration of the name in the current scope or a
13353                forward declaration of the identifier as a class name.  It
13354                introduces the name into the current scope.
13355
13356              We are in this situation precisely when the next token is a `;'.
13357
13358              An exception to the exception is that a `friend' declaration does
13359              *not* name a new type; i.e., given:
13360
13361                struct S { friend struct T; };
13362
13363              `T' is not a new type in the scope of `S'.
13364
13365              Also, `new struct S' or `sizeof (struct S)' never results in the
13366              definition of a new type; a new type can only be declared in a
13367              declaration context.  */
13368
13369           tag_scope ts;
13370           bool template_p;
13371
13372           if (is_friend)
13373             /* Friends have special name lookup rules.  */
13374             ts = ts_within_enclosing_non_class;
13375           else if (is_declaration
13376                    && cp_lexer_next_token_is (parser->lexer,
13377                                               CPP_SEMICOLON))
13378             /* This is a `class-key identifier ;' */
13379             ts = ts_current;
13380           else
13381             ts = ts_global;
13382
13383           template_p =
13384             (parser->num_template_parameter_lists
13385              && (cp_parser_next_token_starts_class_definition_p (parser)
13386                  || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
13387           /* An unqualified name was used to reference this type, so
13388              there were no qualifying templates.  */
13389           if (!cp_parser_check_template_parameters (parser,
13390                                                     /*num_templates=*/0,
13391                                                     token->location,
13392                                                     /*declarator=*/NULL))
13393             return error_mark_node;
13394           type = xref_tag (tag_type, identifier, ts, template_p);
13395         }
13396     }
13397
13398   if (type == error_mark_node)
13399     return error_mark_node;
13400
13401   /* Allow attributes on forward declarations of classes.  */
13402   if (attributes)
13403     {
13404       if (TREE_CODE (type) == TYPENAME_TYPE)
13405         warning (OPT_Wattributes,
13406                  "attributes ignored on uninstantiated type");
13407       else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
13408                && ! processing_explicit_instantiation)
13409         warning (OPT_Wattributes,
13410                  "attributes ignored on template instantiation");
13411       else if (is_declaration && cp_parser_declares_only_class_p (parser))
13412         cplus_decl_attributes (&type, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
13413       else
13414         warning (OPT_Wattributes,
13415                  "attributes ignored on elaborated-type-specifier that is not a forward declaration");
13416     }
13417
13418   if (tag_type != enum_type)
13419     cp_parser_check_class_key (tag_type, type);
13420
13421   /* A "<" cannot follow an elaborated type specifier.  If that
13422      happens, the user was probably trying to form a template-id.  */
13423   cp_parser_check_for_invalid_template_id (parser, type, token->location);
13424
13425   return type;
13426 }
13427
13428 /* Parse an enum-specifier.
13429
13430    enum-specifier:
13431      enum-head { enumerator-list [opt] }
13432
13433    enum-head:
13434      enum-key identifier [opt] enum-base [opt]
13435      enum-key nested-name-specifier identifier enum-base [opt]
13436
13437    enum-key:
13438      enum
13439      enum class   [C++0x]
13440      enum struct  [C++0x]
13441
13442    enum-base:   [C++0x]
13443      : type-specifier-seq
13444
13445    opaque-enum-specifier:
13446      enum-key identifier enum-base [opt] ;
13447
13448    GNU Extensions:
13449      enum-key attributes[opt] identifier [opt] enum-base [opt] 
13450        { enumerator-list [opt] }attributes[opt]
13451
13452    Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
13453    if the token stream isn't an enum-specifier after all.  */
13454
13455 static tree
13456 cp_parser_enum_specifier (cp_parser* parser)
13457 {
13458   tree identifier;
13459   tree type = NULL_TREE;
13460   tree prev_scope;
13461   tree nested_name_specifier = NULL_TREE;
13462   tree attributes;
13463   bool scoped_enum_p = false;
13464   bool has_underlying_type = false;
13465   bool nested_being_defined = false;
13466   bool new_value_list = false;
13467   bool is_new_type = false;
13468   bool is_anonymous = false;
13469   tree underlying_type = NULL_TREE;
13470   cp_token *type_start_token = NULL;
13471   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
13472
13473   parser->colon_corrects_to_scope_p = false;
13474
13475   /* Parse tentatively so that we can back up if we don't find a
13476      enum-specifier.  */
13477   cp_parser_parse_tentatively (parser);
13478
13479   /* Caller guarantees that the current token is 'enum', an identifier
13480      possibly follows, and the token after that is an opening brace.
13481      If we don't have an identifier, fabricate an anonymous name for
13482      the enumeration being defined.  */
13483   cp_lexer_consume_token (parser->lexer);
13484
13485   /* Parse the "class" or "struct", which indicates a scoped
13486      enumeration type in C++0x.  */
13487   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
13488       || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
13489     {
13490       if (cxx_dialect < cxx0x)
13491         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13492
13493       /* Consume the `struct' or `class' token.  */
13494       cp_lexer_consume_token (parser->lexer);
13495
13496       scoped_enum_p = true;
13497     }
13498
13499   attributes = cp_parser_attributes_opt (parser);
13500
13501   /* Clear the qualification.  */
13502   parser->scope = NULL_TREE;
13503   parser->qualifying_scope = NULL_TREE;
13504   parser->object_scope = NULL_TREE;
13505
13506   /* Figure out in what scope the declaration is being placed.  */
13507   prev_scope = current_scope ();
13508
13509   type_start_token = cp_lexer_peek_token (parser->lexer);
13510
13511   push_deferring_access_checks (dk_no_check);
13512   nested_name_specifier
13513       = cp_parser_nested_name_specifier_opt (parser,
13514                                              /*typename_keyword_p=*/true,
13515                                              /*check_dependency_p=*/false,
13516                                              /*type_p=*/false,
13517                                              /*is_declaration=*/false);
13518
13519   if (nested_name_specifier)
13520     {
13521       tree name;
13522
13523       identifier = cp_parser_identifier (parser);
13524       name =  cp_parser_lookup_name (parser, identifier,
13525                                      enum_type,
13526                                      /*is_template=*/false,
13527                                      /*is_namespace=*/false,
13528                                      /*check_dependency=*/true,
13529                                      /*ambiguous_decls=*/NULL,
13530                                      input_location);
13531       if (name)
13532         {
13533           type = TREE_TYPE (name);
13534           if (TREE_CODE (type) == TYPENAME_TYPE)
13535             {
13536               /* Are template enums allowed in ISO? */
13537               if (template_parm_scope_p ())
13538                 pedwarn (type_start_token->location, OPT_pedantic,
13539                          "%qD is an enumeration template", name);
13540               /* ignore a typename reference, for it will be solved by name
13541                  in start_enum.  */
13542               type = NULL_TREE;
13543             }
13544         }
13545       else
13546         error_at (type_start_token->location,
13547                   "%qD is not an enumerator-name", identifier);
13548     }
13549   else
13550     {
13551       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13552         identifier = cp_parser_identifier (parser);
13553       else
13554         {
13555           identifier = make_anon_name ();
13556           is_anonymous = true;
13557         }
13558     }
13559   pop_deferring_access_checks ();
13560
13561   /* Check for the `:' that denotes a specified underlying type in C++0x.
13562      Note that a ':' could also indicate a bitfield width, however.  */
13563   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
13564     {
13565       cp_decl_specifier_seq type_specifiers;
13566
13567       /* Consume the `:'.  */
13568       cp_lexer_consume_token (parser->lexer);
13569
13570       /* Parse the type-specifier-seq.  */
13571       cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
13572                                     /*is_trailing_return=*/false,
13573                                     &type_specifiers);
13574
13575       /* At this point this is surely not elaborated type specifier.  */
13576       if (!cp_parser_parse_definitely (parser))
13577         return NULL_TREE;
13578
13579       if (cxx_dialect < cxx0x)
13580         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13581
13582       has_underlying_type = true;
13583
13584       /* If that didn't work, stop.  */
13585       if (type_specifiers.type != error_mark_node)
13586         {
13587           underlying_type = grokdeclarator (NULL, &type_specifiers, TYPENAME,
13588                                             /*initialized=*/0, NULL);
13589           if (underlying_type == error_mark_node)
13590             underlying_type = NULL_TREE;
13591         }
13592     }
13593
13594   /* Look for the `{' but don't consume it yet.  */
13595   if (!cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13596     {
13597       if (cxx_dialect < cxx0x || (!scoped_enum_p && !underlying_type))
13598         {
13599           cp_parser_error (parser, "expected %<{%>");
13600           if (has_underlying_type)
13601             {
13602               type = NULL_TREE;
13603               goto out;
13604             }
13605         }
13606       /* An opaque-enum-specifier must have a ';' here.  */
13607       if ((scoped_enum_p || underlying_type)
13608           && cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
13609         {
13610           cp_parser_error (parser, "expected %<;%> or %<{%>");
13611           if (has_underlying_type)
13612             {
13613               type = NULL_TREE;
13614               goto out;
13615             }
13616         }
13617     }
13618
13619   if (!has_underlying_type && !cp_parser_parse_definitely (parser))
13620     return NULL_TREE;
13621
13622   if (nested_name_specifier)
13623     {
13624       if (CLASS_TYPE_P (nested_name_specifier))
13625         {
13626           nested_being_defined = TYPE_BEING_DEFINED (nested_name_specifier);
13627           TYPE_BEING_DEFINED (nested_name_specifier) = 1;
13628           push_scope (nested_name_specifier);
13629         }
13630       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13631         {
13632           push_nested_namespace (nested_name_specifier);
13633         }
13634     }
13635
13636   /* Issue an error message if type-definitions are forbidden here.  */
13637   if (!cp_parser_check_type_definition (parser))
13638     type = error_mark_node;
13639   else
13640     /* Create the new type.  We do this before consuming the opening
13641        brace so the enum will be recorded as being on the line of its
13642        tag (or the 'enum' keyword, if there is no tag).  */
13643     type = start_enum (identifier, type, underlying_type,
13644                        scoped_enum_p, &is_new_type);
13645
13646   /* If the next token is not '{' it is an opaque-enum-specifier or an
13647      elaborated-type-specifier.  */
13648   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13649     {
13650       timevar_push (TV_PARSE_ENUM);
13651       if (nested_name_specifier)
13652         {
13653           /* The following catches invalid code such as:
13654              enum class S<int>::E { A, B, C }; */
13655           if (!processing_specialization
13656               && CLASS_TYPE_P (nested_name_specifier)
13657               && CLASSTYPE_USE_TEMPLATE (nested_name_specifier))
13658             error_at (type_start_token->location, "cannot add an enumerator "
13659                       "list to a template instantiation");
13660
13661           /* If that scope does not contain the scope in which the
13662              class was originally declared, the program is invalid.  */
13663           if (prev_scope && !is_ancestor (prev_scope, nested_name_specifier))
13664             {
13665               if (at_namespace_scope_p ())
13666                 error_at (type_start_token->location,
13667                           "declaration of %qD in namespace %qD which does not "
13668                           "enclose %qD",
13669                           type, prev_scope, nested_name_specifier);
13670               else
13671                 error_at (type_start_token->location,
13672                           "declaration of %qD in %qD which does not enclose %qD",
13673                           type, prev_scope, nested_name_specifier);
13674               type = error_mark_node;
13675             }
13676         }
13677
13678       if (scoped_enum_p)
13679         begin_scope (sk_scoped_enum, type);
13680
13681       /* Consume the opening brace.  */
13682       cp_lexer_consume_token (parser->lexer);
13683
13684       if (type == error_mark_node)
13685         ; /* Nothing to add */
13686       else if (OPAQUE_ENUM_P (type)
13687                || (cxx_dialect > cxx98 && processing_specialization))
13688         {
13689           new_value_list = true;
13690           SET_OPAQUE_ENUM_P (type, false);
13691           DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
13692         }
13693       else
13694         {
13695           error_at (type_start_token->location, "multiple definition of %q#T", type);
13696           error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
13697                     "previous definition here");
13698           type = error_mark_node;
13699         }
13700
13701       if (type == error_mark_node)
13702         cp_parser_skip_to_end_of_block_or_statement (parser);
13703       /* If the next token is not '}', then there are some enumerators.  */
13704       else if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
13705         cp_parser_enumerator_list (parser, type);
13706
13707       /* Consume the final '}'.  */
13708       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13709
13710       if (scoped_enum_p)
13711         finish_scope ();
13712       timevar_pop (TV_PARSE_ENUM);
13713     }
13714   else
13715     {
13716       /* If a ';' follows, then it is an opaque-enum-specifier
13717         and additional restrictions apply.  */
13718       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
13719         {
13720           if (is_anonymous)
13721             error_at (type_start_token->location,
13722                       "opaque-enum-specifier without name");
13723           else if (nested_name_specifier)
13724             error_at (type_start_token->location,
13725                       "opaque-enum-specifier must use a simple identifier");
13726         }
13727     }
13728
13729   /* Look for trailing attributes to apply to this enumeration, and
13730      apply them if appropriate.  */
13731   if (cp_parser_allow_gnu_extensions_p (parser))
13732     {
13733       tree trailing_attr = cp_parser_attributes_opt (parser);
13734       trailing_attr = chainon (trailing_attr, attributes);
13735       cplus_decl_attributes (&type,
13736                              trailing_attr,
13737                              (int) ATTR_FLAG_TYPE_IN_PLACE);
13738     }
13739
13740   /* Finish up the enumeration.  */
13741   if (type != error_mark_node)
13742     {
13743       if (new_value_list)
13744         finish_enum_value_list (type);
13745       if (is_new_type)
13746         finish_enum (type);
13747     }
13748
13749   if (nested_name_specifier)
13750     {
13751       if (CLASS_TYPE_P (nested_name_specifier))
13752         {
13753           TYPE_BEING_DEFINED (nested_name_specifier) = nested_being_defined;
13754           pop_scope (nested_name_specifier);
13755         }
13756       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13757         {
13758           pop_nested_namespace (nested_name_specifier);
13759         }
13760     }
13761  out:
13762   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
13763   return type;
13764 }
13765
13766 /* Parse an enumerator-list.  The enumerators all have the indicated
13767    TYPE.
13768
13769    enumerator-list:
13770      enumerator-definition
13771      enumerator-list , enumerator-definition  */
13772
13773 static void
13774 cp_parser_enumerator_list (cp_parser* parser, tree type)
13775 {
13776   while (true)
13777     {
13778       /* Parse an enumerator-definition.  */
13779       cp_parser_enumerator_definition (parser, type);
13780
13781       /* If the next token is not a ',', we've reached the end of
13782          the list.  */
13783       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
13784         break;
13785       /* Otherwise, consume the `,' and keep going.  */
13786       cp_lexer_consume_token (parser->lexer);
13787       /* If the next token is a `}', there is a trailing comma.  */
13788       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
13789         {
13790           if (!in_system_header)
13791             pedwarn (input_location, OPT_pedantic, "comma at end of enumerator list");
13792           break;
13793         }
13794     }
13795 }
13796
13797 /* Parse an enumerator-definition.  The enumerator has the indicated
13798    TYPE.
13799
13800    enumerator-definition:
13801      enumerator
13802      enumerator = constant-expression
13803
13804    enumerator:
13805      identifier  */
13806
13807 static void
13808 cp_parser_enumerator_definition (cp_parser* parser, tree type)
13809 {
13810   tree identifier;
13811   tree value;
13812   location_t loc;
13813
13814   /* Save the input location because we are interested in the location
13815      of the identifier and not the location of the explicit value.  */
13816   loc = cp_lexer_peek_token (parser->lexer)->location;
13817
13818   /* Look for the identifier.  */
13819   identifier = cp_parser_identifier (parser);
13820   if (identifier == error_mark_node)
13821     return;
13822
13823   /* If the next token is an '=', then there is an explicit value.  */
13824   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13825     {
13826       /* Consume the `=' token.  */
13827       cp_lexer_consume_token (parser->lexer);
13828       /* Parse the value.  */
13829       value = cp_parser_constant_expression (parser,
13830                                              /*allow_non_constant_p=*/false,
13831                                              NULL);
13832     }
13833   else
13834     value = NULL_TREE;
13835
13836   /* If we are processing a template, make sure the initializer of the
13837      enumerator doesn't contain any bare template parameter pack.  */
13838   if (check_for_bare_parameter_packs (value))
13839     value = error_mark_node;
13840
13841   /* integral_constant_value will pull out this expression, so make sure
13842      it's folded as appropriate.  */
13843   value = fold_non_dependent_expr (value);
13844
13845   /* Create the enumerator.  */
13846   build_enumerator (identifier, value, type, loc);
13847 }
13848
13849 /* Parse a namespace-name.
13850
13851    namespace-name:
13852      original-namespace-name
13853      namespace-alias
13854
13855    Returns the NAMESPACE_DECL for the namespace.  */
13856
13857 static tree
13858 cp_parser_namespace_name (cp_parser* parser)
13859 {
13860   tree identifier;
13861   tree namespace_decl;
13862
13863   cp_token *token = cp_lexer_peek_token (parser->lexer);
13864
13865   /* Get the name of the namespace.  */
13866   identifier = cp_parser_identifier (parser);
13867   if (identifier == error_mark_node)
13868     return error_mark_node;
13869
13870   /* Look up the identifier in the currently active scope.  Look only
13871      for namespaces, due to:
13872
13873        [basic.lookup.udir]
13874
13875        When looking up a namespace-name in a using-directive or alias
13876        definition, only namespace names are considered.
13877
13878      And:
13879
13880        [basic.lookup.qual]
13881
13882        During the lookup of a name preceding the :: scope resolution
13883        operator, object, function, and enumerator names are ignored.
13884
13885      (Note that cp_parser_qualifying_entity only calls this
13886      function if the token after the name is the scope resolution
13887      operator.)  */
13888   namespace_decl = cp_parser_lookup_name (parser, identifier,
13889                                           none_type,
13890                                           /*is_template=*/false,
13891                                           /*is_namespace=*/true,
13892                                           /*check_dependency=*/true,
13893                                           /*ambiguous_decls=*/NULL,
13894                                           token->location);
13895   /* If it's not a namespace, issue an error.  */
13896   if (namespace_decl == error_mark_node
13897       || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
13898     {
13899       if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
13900         error_at (token->location, "%qD is not a namespace-name", identifier);
13901       cp_parser_error (parser, "expected namespace-name");
13902       namespace_decl = error_mark_node;
13903     }
13904
13905   return namespace_decl;
13906 }
13907
13908 /* Parse a namespace-definition.
13909
13910    namespace-definition:
13911      named-namespace-definition
13912      unnamed-namespace-definition
13913
13914    named-namespace-definition:
13915      original-namespace-definition
13916      extension-namespace-definition
13917
13918    original-namespace-definition:
13919      namespace identifier { namespace-body }
13920
13921    extension-namespace-definition:
13922      namespace original-namespace-name { namespace-body }
13923
13924    unnamed-namespace-definition:
13925      namespace { namespace-body } */
13926
13927 static void
13928 cp_parser_namespace_definition (cp_parser* parser)
13929 {
13930   tree identifier, attribs;
13931   bool has_visibility;
13932   bool is_inline;
13933
13934   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_INLINE))
13935     {
13936       maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES);
13937       is_inline = true;
13938       cp_lexer_consume_token (parser->lexer);
13939     }
13940   else
13941     is_inline = false;
13942
13943   /* Look for the `namespace' keyword.  */
13944   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
13945
13946   /* Get the name of the namespace.  We do not attempt to distinguish
13947      between an original-namespace-definition and an
13948      extension-namespace-definition at this point.  The semantic
13949      analysis routines are responsible for that.  */
13950   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13951     identifier = cp_parser_identifier (parser);
13952   else
13953     identifier = NULL_TREE;
13954
13955   /* Parse any specified attributes.  */
13956   attribs = cp_parser_attributes_opt (parser);
13957
13958   /* Look for the `{' to start the namespace.  */
13959   cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
13960   /* Start the namespace.  */
13961   push_namespace (identifier);
13962
13963   /* "inline namespace" is equivalent to a stub namespace definition
13964      followed by a strong using directive.  */
13965   if (is_inline)
13966     {
13967       tree name_space = current_namespace;
13968       /* Set up namespace association.  */
13969       DECL_NAMESPACE_ASSOCIATIONS (name_space)
13970         = tree_cons (CP_DECL_CONTEXT (name_space), NULL_TREE,
13971                      DECL_NAMESPACE_ASSOCIATIONS (name_space));
13972       /* Import the contents of the inline namespace.  */
13973       pop_namespace ();
13974       do_using_directive (name_space);
13975       push_namespace (identifier);
13976     }
13977
13978   has_visibility = handle_namespace_attrs (current_namespace, attribs);
13979
13980   /* Parse the body of the namespace.  */
13981   cp_parser_namespace_body (parser);
13982
13983   if (has_visibility)
13984     pop_visibility (1);
13985
13986   /* Finish the namespace.  */
13987   pop_namespace ();
13988   /* Look for the final `}'.  */
13989   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13990 }
13991
13992 /* Parse a namespace-body.
13993
13994    namespace-body:
13995      declaration-seq [opt]  */
13996
13997 static void
13998 cp_parser_namespace_body (cp_parser* parser)
13999 {
14000   cp_parser_declaration_seq_opt (parser);
14001 }
14002
14003 /* Parse a namespace-alias-definition.
14004
14005    namespace-alias-definition:
14006      namespace identifier = qualified-namespace-specifier ;  */
14007
14008 static void
14009 cp_parser_namespace_alias_definition (cp_parser* parser)
14010 {
14011   tree identifier;
14012   tree namespace_specifier;
14013
14014   cp_token *token = cp_lexer_peek_token (parser->lexer);
14015
14016   /* Look for the `namespace' keyword.  */
14017   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
14018   /* Look for the identifier.  */
14019   identifier = cp_parser_identifier (parser);
14020   if (identifier == error_mark_node)
14021     return;
14022   /* Look for the `=' token.  */
14023   if (!cp_parser_uncommitted_to_tentative_parse_p (parser)
14024       && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) 
14025     {
14026       error_at (token->location, "%<namespace%> definition is not allowed here");
14027       /* Skip the definition.  */
14028       cp_lexer_consume_token (parser->lexer);
14029       if (cp_parser_skip_to_closing_brace (parser))
14030         cp_lexer_consume_token (parser->lexer);
14031       return;
14032     }
14033   cp_parser_require (parser, CPP_EQ, RT_EQ);
14034   /* Look for the qualified-namespace-specifier.  */
14035   namespace_specifier
14036     = cp_parser_qualified_namespace_specifier (parser);
14037   /* Look for the `;' token.  */
14038   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14039
14040   /* Register the alias in the symbol table.  */
14041   do_namespace_alias (identifier, namespace_specifier);
14042 }
14043
14044 /* Parse a qualified-namespace-specifier.
14045
14046    qualified-namespace-specifier:
14047      :: [opt] nested-name-specifier [opt] namespace-name
14048
14049    Returns a NAMESPACE_DECL corresponding to the specified
14050    namespace.  */
14051
14052 static tree
14053 cp_parser_qualified_namespace_specifier (cp_parser* parser)
14054 {
14055   /* Look for the optional `::'.  */
14056   cp_parser_global_scope_opt (parser,
14057                               /*current_scope_valid_p=*/false);
14058
14059   /* Look for the optional nested-name-specifier.  */
14060   cp_parser_nested_name_specifier_opt (parser,
14061                                        /*typename_keyword_p=*/false,
14062                                        /*check_dependency_p=*/true,
14063                                        /*type_p=*/false,
14064                                        /*is_declaration=*/true);
14065
14066   return cp_parser_namespace_name (parser);
14067 }
14068
14069 /* Parse a using-declaration, or, if ACCESS_DECLARATION_P is true, an
14070    access declaration.
14071
14072    using-declaration:
14073      using typename [opt] :: [opt] nested-name-specifier unqualified-id ;
14074      using :: unqualified-id ;  
14075
14076    access-declaration:
14077      qualified-id ;  
14078
14079    */
14080
14081 static bool
14082 cp_parser_using_declaration (cp_parser* parser, 
14083                              bool access_declaration_p)
14084 {
14085   cp_token *token;
14086   bool typename_p = false;
14087   bool global_scope_p;
14088   tree decl;
14089   tree identifier;
14090   tree qscope;
14091
14092   if (access_declaration_p)
14093     cp_parser_parse_tentatively (parser);
14094   else
14095     {
14096       /* Look for the `using' keyword.  */
14097       cp_parser_require_keyword (parser, RID_USING, RT_USING);
14098       
14099       /* Peek at the next token.  */
14100       token = cp_lexer_peek_token (parser->lexer);
14101       /* See if it's `typename'.  */
14102       if (token->keyword == RID_TYPENAME)
14103         {
14104           /* Remember that we've seen it.  */
14105           typename_p = true;
14106           /* Consume the `typename' token.  */
14107           cp_lexer_consume_token (parser->lexer);
14108         }
14109     }
14110
14111   /* Look for the optional global scope qualification.  */
14112   global_scope_p
14113     = (cp_parser_global_scope_opt (parser,
14114                                    /*current_scope_valid_p=*/false)
14115        != NULL_TREE);
14116
14117   /* If we saw `typename', or didn't see `::', then there must be a
14118      nested-name-specifier present.  */
14119   if (typename_p || !global_scope_p)
14120     qscope = cp_parser_nested_name_specifier (parser, typename_p,
14121                                               /*check_dependency_p=*/true,
14122                                               /*type_p=*/false,
14123                                               /*is_declaration=*/true);
14124   /* Otherwise, we could be in either of the two productions.  In that
14125      case, treat the nested-name-specifier as optional.  */
14126   else
14127     qscope = cp_parser_nested_name_specifier_opt (parser,
14128                                                   /*typename_keyword_p=*/false,
14129                                                   /*check_dependency_p=*/true,
14130                                                   /*type_p=*/false,
14131                                                   /*is_declaration=*/true);
14132   if (!qscope)
14133     qscope = global_namespace;
14134
14135   if (access_declaration_p && cp_parser_error_occurred (parser))
14136     /* Something has already gone wrong; there's no need to parse
14137        further.  Since an error has occurred, the return value of
14138        cp_parser_parse_definitely will be false, as required.  */
14139     return cp_parser_parse_definitely (parser);
14140
14141   token = cp_lexer_peek_token (parser->lexer);
14142   /* Parse the unqualified-id.  */
14143   identifier = cp_parser_unqualified_id (parser,
14144                                          /*template_keyword_p=*/false,
14145                                          /*check_dependency_p=*/true,
14146                                          /*declarator_p=*/true,
14147                                          /*optional_p=*/false);
14148
14149   if (access_declaration_p)
14150     {
14151       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
14152         cp_parser_simulate_error (parser);
14153       if (!cp_parser_parse_definitely (parser))
14154         return false;
14155     }
14156
14157   /* The function we call to handle a using-declaration is different
14158      depending on what scope we are in.  */
14159   if (qscope == error_mark_node || identifier == error_mark_node)
14160     ;
14161   else if (TREE_CODE (identifier) != IDENTIFIER_NODE
14162            && TREE_CODE (identifier) != BIT_NOT_EXPR)
14163     /* [namespace.udecl]
14164
14165        A using declaration shall not name a template-id.  */
14166     error_at (token->location,
14167               "a template-id may not appear in a using-declaration");
14168   else
14169     {
14170       if (at_class_scope_p ())
14171         {
14172           /* Create the USING_DECL.  */
14173           decl = do_class_using_decl (parser->scope, identifier);
14174
14175           if (check_for_bare_parameter_packs (decl))
14176             return false;
14177           else
14178             /* Add it to the list of members in this class.  */
14179             finish_member_declaration (decl);
14180         }
14181       else
14182         {
14183           decl = cp_parser_lookup_name_simple (parser,
14184                                                identifier,
14185                                                token->location);
14186           if (decl == error_mark_node)
14187             cp_parser_name_lookup_error (parser, identifier,
14188                                          decl, NLE_NULL,
14189                                          token->location);
14190           else if (check_for_bare_parameter_packs (decl))
14191             return false;
14192           else if (!at_namespace_scope_p ())
14193             do_local_using_decl (decl, qscope, identifier);
14194           else
14195             do_toplevel_using_decl (decl, qscope, identifier);
14196         }
14197     }
14198
14199   /* Look for the final `;'.  */
14200   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14201   
14202   return true;
14203 }
14204
14205 /* Parse a using-directive.
14206
14207    using-directive:
14208      using namespace :: [opt] nested-name-specifier [opt]
14209        namespace-name ;  */
14210
14211 static void
14212 cp_parser_using_directive (cp_parser* parser)
14213 {
14214   tree namespace_decl;
14215   tree attribs;
14216
14217   /* Look for the `using' keyword.  */
14218   cp_parser_require_keyword (parser, RID_USING, RT_USING);
14219   /* And the `namespace' keyword.  */
14220   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
14221   /* Look for the optional `::' operator.  */
14222   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
14223   /* And the optional nested-name-specifier.  */
14224   cp_parser_nested_name_specifier_opt (parser,
14225                                        /*typename_keyword_p=*/false,
14226                                        /*check_dependency_p=*/true,
14227                                        /*type_p=*/false,
14228                                        /*is_declaration=*/true);
14229   /* Get the namespace being used.  */
14230   namespace_decl = cp_parser_namespace_name (parser);
14231   /* And any specified attributes.  */
14232   attribs = cp_parser_attributes_opt (parser);
14233   /* Update the symbol table.  */
14234   parse_using_directive (namespace_decl, attribs);
14235   /* Look for the final `;'.  */
14236   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14237 }
14238
14239 /* Parse an asm-definition.
14240
14241    asm-definition:
14242      asm ( string-literal ) ;
14243
14244    GNU Extension:
14245
14246    asm-definition:
14247      asm volatile [opt] ( string-literal ) ;
14248      asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
14249      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14250                           : asm-operand-list [opt] ) ;
14251      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14252                           : asm-operand-list [opt]
14253                           : asm-clobber-list [opt] ) ;
14254      asm volatile [opt] goto ( string-literal : : asm-operand-list [opt]
14255                                : asm-clobber-list [opt]
14256                                : asm-goto-list ) ;  */
14257
14258 static void
14259 cp_parser_asm_definition (cp_parser* parser)
14260 {
14261   tree string;
14262   tree outputs = NULL_TREE;
14263   tree inputs = NULL_TREE;
14264   tree clobbers = NULL_TREE;
14265   tree labels = NULL_TREE;
14266   tree asm_stmt;
14267   bool volatile_p = false;
14268   bool extended_p = false;
14269   bool invalid_inputs_p = false;
14270   bool invalid_outputs_p = false;
14271   bool goto_p = false;
14272   required_token missing = RT_NONE;
14273
14274   /* Look for the `asm' keyword.  */
14275   cp_parser_require_keyword (parser, RID_ASM, RT_ASM);
14276   /* See if the next token is `volatile'.  */
14277   if (cp_parser_allow_gnu_extensions_p (parser)
14278       && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE))
14279     {
14280       /* Remember that we saw the `volatile' keyword.  */
14281       volatile_p = true;
14282       /* Consume the token.  */
14283       cp_lexer_consume_token (parser->lexer);
14284     }
14285   if (cp_parser_allow_gnu_extensions_p (parser)
14286       && parser->in_function_body
14287       && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO))
14288     {
14289       /* Remember that we saw the `goto' keyword.  */
14290       goto_p = true;
14291       /* Consume the token.  */
14292       cp_lexer_consume_token (parser->lexer);
14293     }
14294   /* Look for the opening `('.  */
14295   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
14296     return;
14297   /* Look for the string.  */
14298   string = cp_parser_string_literal (parser, false, false);
14299   if (string == error_mark_node)
14300     {
14301       cp_parser_skip_to_closing_parenthesis (parser, true, false,
14302                                              /*consume_paren=*/true);
14303       return;
14304     }
14305
14306   /* If we're allowing GNU extensions, check for the extended assembly
14307      syntax.  Unfortunately, the `:' tokens need not be separated by
14308      a space in C, and so, for compatibility, we tolerate that here
14309      too.  Doing that means that we have to treat the `::' operator as
14310      two `:' tokens.  */
14311   if (cp_parser_allow_gnu_extensions_p (parser)
14312       && parser->in_function_body
14313       && (cp_lexer_next_token_is (parser->lexer, CPP_COLON)
14314           || cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)))
14315     {
14316       bool inputs_p = false;
14317       bool clobbers_p = false;
14318       bool labels_p = false;
14319
14320       /* The extended syntax was used.  */
14321       extended_p = true;
14322
14323       /* Look for outputs.  */
14324       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14325         {
14326           /* Consume the `:'.  */
14327           cp_lexer_consume_token (parser->lexer);
14328           /* Parse the output-operands.  */
14329           if (cp_lexer_next_token_is_not (parser->lexer,
14330                                           CPP_COLON)
14331               && cp_lexer_next_token_is_not (parser->lexer,
14332                                              CPP_SCOPE)
14333               && cp_lexer_next_token_is_not (parser->lexer,
14334                                              CPP_CLOSE_PAREN)
14335               && !goto_p)
14336             outputs = cp_parser_asm_operand_list (parser);
14337
14338             if (outputs == error_mark_node)
14339               invalid_outputs_p = true;
14340         }
14341       /* If the next token is `::', there are no outputs, and the
14342          next token is the beginning of the inputs.  */
14343       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14344         /* The inputs are coming next.  */
14345         inputs_p = true;
14346
14347       /* Look for inputs.  */
14348       if (inputs_p
14349           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14350         {
14351           /* Consume the `:' or `::'.  */
14352           cp_lexer_consume_token (parser->lexer);
14353           /* Parse the output-operands.  */
14354           if (cp_lexer_next_token_is_not (parser->lexer,
14355                                           CPP_COLON)
14356               && cp_lexer_next_token_is_not (parser->lexer,
14357                                              CPP_SCOPE)
14358               && cp_lexer_next_token_is_not (parser->lexer,
14359                                              CPP_CLOSE_PAREN))
14360             inputs = cp_parser_asm_operand_list (parser);
14361
14362             if (inputs == error_mark_node)
14363               invalid_inputs_p = true;
14364         }
14365       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14366         /* The clobbers are coming next.  */
14367         clobbers_p = true;
14368
14369       /* Look for clobbers.  */
14370       if (clobbers_p
14371           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14372         {
14373           clobbers_p = true;
14374           /* Consume the `:' or `::'.  */
14375           cp_lexer_consume_token (parser->lexer);
14376           /* Parse the clobbers.  */
14377           if (cp_lexer_next_token_is_not (parser->lexer,
14378                                           CPP_COLON)
14379               && cp_lexer_next_token_is_not (parser->lexer,
14380                                              CPP_CLOSE_PAREN))
14381             clobbers = cp_parser_asm_clobber_list (parser);
14382         }
14383       else if (goto_p
14384                && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14385         /* The labels are coming next.  */
14386         labels_p = true;
14387
14388       /* Look for labels.  */
14389       if (labels_p
14390           || (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_COLON)))
14391         {
14392           labels_p = true;
14393           /* Consume the `:' or `::'.  */
14394           cp_lexer_consume_token (parser->lexer);
14395           /* Parse the labels.  */
14396           labels = cp_parser_asm_label_list (parser);
14397         }
14398
14399       if (goto_p && !labels_p)
14400         missing = clobbers_p ? RT_COLON : RT_COLON_SCOPE;
14401     }
14402   else if (goto_p)
14403     missing = RT_COLON_SCOPE;
14404
14405   /* Look for the closing `)'.  */
14406   if (!cp_parser_require (parser, missing ? CPP_COLON : CPP_CLOSE_PAREN,
14407                           missing ? missing : RT_CLOSE_PAREN))
14408     cp_parser_skip_to_closing_parenthesis (parser, true, false,
14409                                            /*consume_paren=*/true);
14410   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14411
14412   if (!invalid_inputs_p && !invalid_outputs_p)
14413     {
14414       /* Create the ASM_EXPR.  */
14415       if (parser->in_function_body)
14416         {
14417           asm_stmt = finish_asm_stmt (volatile_p, string, outputs,
14418                                       inputs, clobbers, labels);
14419           /* If the extended syntax was not used, mark the ASM_EXPR.  */
14420           if (!extended_p)
14421             {
14422               tree temp = asm_stmt;
14423               if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
14424                 temp = TREE_OPERAND (temp, 0);
14425
14426               ASM_INPUT_P (temp) = 1;
14427             }
14428         }
14429       else
14430         cgraph_add_asm_node (string);
14431     }
14432 }
14433
14434 /* Declarators [gram.dcl.decl] */
14435
14436 /* Parse an init-declarator.
14437
14438    init-declarator:
14439      declarator initializer [opt]
14440
14441    GNU Extension:
14442
14443    init-declarator:
14444      declarator asm-specification [opt] attributes [opt] initializer [opt]
14445
14446    function-definition:
14447      decl-specifier-seq [opt] declarator ctor-initializer [opt]
14448        function-body
14449      decl-specifier-seq [opt] declarator function-try-block
14450
14451    GNU Extension:
14452
14453    function-definition:
14454      __extension__ function-definition
14455
14456    The DECL_SPECIFIERS apply to this declarator.  Returns a
14457    representation of the entity declared.  If MEMBER_P is TRUE, then
14458    this declarator appears in a class scope.  The new DECL created by
14459    this declarator is returned.
14460
14461    The CHECKS are access checks that should be performed once we know
14462    what entity is being declared (and, therefore, what classes have
14463    befriended it).
14464
14465    If FUNCTION_DEFINITION_ALLOWED_P then we handle the declarator and
14466    for a function-definition here as well.  If the declarator is a
14467    declarator for a function-definition, *FUNCTION_DEFINITION_P will
14468    be TRUE upon return.  By that point, the function-definition will
14469    have been completely parsed.
14470
14471    FUNCTION_DEFINITION_P may be NULL if FUNCTION_DEFINITION_ALLOWED_P
14472    is FALSE.
14473
14474    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
14475    parsed declaration if it is an uninitialized single declarator not followed
14476    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
14477    if present, will not be consumed.  If returned, this declarator will be
14478    created with SD_INITIALIZED but will not call cp_finish_decl.  */
14479
14480 static tree
14481 cp_parser_init_declarator (cp_parser* parser,
14482                            cp_decl_specifier_seq *decl_specifiers,
14483                            VEC (deferred_access_check,gc)* checks,
14484                            bool function_definition_allowed_p,
14485                            bool member_p,
14486                            int declares_class_or_enum,
14487                            bool* function_definition_p,
14488                            tree* maybe_range_for_decl)
14489 {
14490   cp_token *token = NULL, *asm_spec_start_token = NULL,
14491            *attributes_start_token = NULL;
14492   cp_declarator *declarator;
14493   tree prefix_attributes;
14494   tree attributes;
14495   tree asm_specification;
14496   tree initializer;
14497   tree decl = NULL_TREE;
14498   tree scope;
14499   int is_initialized;
14500   /* Only valid if IS_INITIALIZED is true.  In that case, CPP_EQ if
14501      initialized with "= ..", CPP_OPEN_PAREN if initialized with
14502      "(...)".  */
14503   enum cpp_ttype initialization_kind;
14504   bool is_direct_init = false;
14505   bool is_non_constant_init;
14506   int ctor_dtor_or_conv_p;
14507   bool friend_p;
14508   tree pushed_scope = NULL_TREE;
14509   bool range_for_decl_p = false;
14510
14511   /* Gather the attributes that were provided with the
14512      decl-specifiers.  */
14513   prefix_attributes = decl_specifiers->attributes;
14514
14515   /* Assume that this is not the declarator for a function
14516      definition.  */
14517   if (function_definition_p)
14518     *function_definition_p = false;
14519
14520   /* Defer access checks while parsing the declarator; we cannot know
14521      what names are accessible until we know what is being
14522      declared.  */
14523   resume_deferring_access_checks ();
14524
14525   /* Parse the declarator.  */
14526   token = cp_lexer_peek_token (parser->lexer);
14527   declarator
14528     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
14529                             &ctor_dtor_or_conv_p,
14530                             /*parenthesized_p=*/NULL,
14531                             member_p);
14532   /* Gather up the deferred checks.  */
14533   stop_deferring_access_checks ();
14534
14535   /* If the DECLARATOR was erroneous, there's no need to go
14536      further.  */
14537   if (declarator == cp_error_declarator)
14538     return error_mark_node;
14539
14540   /* Check that the number of template-parameter-lists is OK.  */
14541   if (!cp_parser_check_declarator_template_parameters (parser, declarator,
14542                                                        token->location))
14543     return error_mark_node;
14544
14545   if (declares_class_or_enum & 2)
14546     cp_parser_check_for_definition_in_return_type (declarator,
14547                                                    decl_specifiers->type,
14548                                                    decl_specifiers->type_location);
14549
14550   /* Figure out what scope the entity declared by the DECLARATOR is
14551      located in.  `grokdeclarator' sometimes changes the scope, so
14552      we compute it now.  */
14553   scope = get_scope_of_declarator (declarator);
14554
14555   /* Perform any lookups in the declared type which were thought to be
14556      dependent, but are not in the scope of the declarator.  */
14557   decl_specifiers->type
14558     = maybe_update_decl_type (decl_specifiers->type, scope);
14559
14560   /* If we're allowing GNU extensions, look for an asm-specification
14561      and attributes.  */
14562   if (cp_parser_allow_gnu_extensions_p (parser))
14563     {
14564       /* Look for an asm-specification.  */
14565       asm_spec_start_token = cp_lexer_peek_token (parser->lexer);
14566       asm_specification = cp_parser_asm_specification_opt (parser);
14567       /* And attributes.  */
14568       attributes_start_token = cp_lexer_peek_token (parser->lexer);
14569       attributes = cp_parser_attributes_opt (parser);
14570     }
14571   else
14572     {
14573       asm_specification = NULL_TREE;
14574       attributes = NULL_TREE;
14575     }
14576
14577   /* Peek at the next token.  */
14578   token = cp_lexer_peek_token (parser->lexer);
14579   /* Check to see if the token indicates the start of a
14580      function-definition.  */
14581   if (function_declarator_p (declarator)
14582       && cp_parser_token_starts_function_definition_p (token))
14583     {
14584       if (!function_definition_allowed_p)
14585         {
14586           /* If a function-definition should not appear here, issue an
14587              error message.  */
14588           cp_parser_error (parser,
14589                            "a function-definition is not allowed here");
14590           return error_mark_node;
14591         }
14592       else
14593         {
14594           location_t func_brace_location
14595             = cp_lexer_peek_token (parser->lexer)->location;
14596
14597           /* Neither attributes nor an asm-specification are allowed
14598              on a function-definition.  */
14599           if (asm_specification)
14600             error_at (asm_spec_start_token->location,
14601                       "an asm-specification is not allowed "
14602                       "on a function-definition");
14603           if (attributes)
14604             error_at (attributes_start_token->location,
14605                       "attributes are not allowed on a function-definition");
14606           /* This is a function-definition.  */
14607           *function_definition_p = true;
14608
14609           /* Parse the function definition.  */
14610           if (member_p)
14611             decl = cp_parser_save_member_function_body (parser,
14612                                                         decl_specifiers,
14613                                                         declarator,
14614                                                         prefix_attributes);
14615           else
14616             decl
14617               = (cp_parser_function_definition_from_specifiers_and_declarator
14618                  (parser, decl_specifiers, prefix_attributes, declarator));
14619
14620           if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
14621             {
14622               /* This is where the prologue starts...  */
14623               DECL_STRUCT_FUNCTION (decl)->function_start_locus
14624                 = func_brace_location;
14625             }
14626
14627           return decl;
14628         }
14629     }
14630
14631   /* [dcl.dcl]
14632
14633      Only in function declarations for constructors, destructors, and
14634      type conversions can the decl-specifier-seq be omitted.
14635
14636      We explicitly postpone this check past the point where we handle
14637      function-definitions because we tolerate function-definitions
14638      that are missing their return types in some modes.  */
14639   if (!decl_specifiers->any_specifiers_p && ctor_dtor_or_conv_p <= 0)
14640     {
14641       cp_parser_error (parser,
14642                        "expected constructor, destructor, or type conversion");
14643       return error_mark_node;
14644     }
14645
14646   /* An `=' or an `(', or an '{' in C++0x, indicates an initializer.  */
14647   if (token->type == CPP_EQ
14648       || token->type == CPP_OPEN_PAREN
14649       || token->type == CPP_OPEN_BRACE)
14650     {
14651       is_initialized = SD_INITIALIZED;
14652       initialization_kind = token->type;
14653       if (maybe_range_for_decl)
14654         *maybe_range_for_decl = error_mark_node;
14655
14656       if (token->type == CPP_EQ
14657           && function_declarator_p (declarator))
14658         {
14659           cp_token *t2 = cp_lexer_peek_nth_token (parser->lexer, 2);
14660           if (t2->keyword == RID_DEFAULT)
14661             is_initialized = SD_DEFAULTED;
14662           else if (t2->keyword == RID_DELETE)
14663             is_initialized = SD_DELETED;
14664         }
14665     }
14666   else
14667     {
14668       /* If the init-declarator isn't initialized and isn't followed by a
14669          `,' or `;', it's not a valid init-declarator.  */
14670       if (token->type != CPP_COMMA
14671           && token->type != CPP_SEMICOLON)
14672         {
14673           if (maybe_range_for_decl && *maybe_range_for_decl != error_mark_node)
14674             range_for_decl_p = true;
14675           else
14676             {
14677               cp_parser_error (parser, "expected initializer");
14678               return error_mark_node;
14679             }
14680         }
14681       is_initialized = SD_UNINITIALIZED;
14682       initialization_kind = CPP_EOF;
14683     }
14684
14685   /* Because start_decl has side-effects, we should only call it if we
14686      know we're going ahead.  By this point, we know that we cannot
14687      possibly be looking at any other construct.  */
14688   cp_parser_commit_to_tentative_parse (parser);
14689
14690   /* If the decl specifiers were bad, issue an error now that we're
14691      sure this was intended to be a declarator.  Then continue
14692      declaring the variable(s), as int, to try to cut down on further
14693      errors.  */
14694   if (decl_specifiers->any_specifiers_p
14695       && decl_specifiers->type == error_mark_node)
14696     {
14697       cp_parser_error (parser, "invalid type in declaration");
14698       decl_specifiers->type = integer_type_node;
14699     }
14700
14701   /* Check to see whether or not this declaration is a friend.  */
14702   friend_p = cp_parser_friend_p (decl_specifiers);
14703
14704   /* Enter the newly declared entry in the symbol table.  If we're
14705      processing a declaration in a class-specifier, we wait until
14706      after processing the initializer.  */
14707   if (!member_p)
14708     {
14709       if (parser->in_unbraced_linkage_specification_p)
14710         decl_specifiers->storage_class = sc_extern;
14711       decl = start_decl (declarator, decl_specifiers,
14712                          range_for_decl_p? SD_INITIALIZED : is_initialized,
14713                          attributes, prefix_attributes,
14714                          &pushed_scope);
14715       /* Adjust location of decl if declarator->id_loc is more appropriate:
14716          set, and decl wasn't merged with another decl, in which case its
14717          location would be different from input_location, and more accurate.  */
14718       if (DECL_P (decl)
14719           && declarator->id_loc != UNKNOWN_LOCATION
14720           && DECL_SOURCE_LOCATION (decl) == input_location)
14721         DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
14722     }
14723   else if (scope)
14724     /* Enter the SCOPE.  That way unqualified names appearing in the
14725        initializer will be looked up in SCOPE.  */
14726     pushed_scope = push_scope (scope);
14727
14728   /* Perform deferred access control checks, now that we know in which
14729      SCOPE the declared entity resides.  */
14730   if (!member_p && decl)
14731     {
14732       tree saved_current_function_decl = NULL_TREE;
14733
14734       /* If the entity being declared is a function, pretend that we
14735          are in its scope.  If it is a `friend', it may have access to
14736          things that would not otherwise be accessible.  */
14737       if (TREE_CODE (decl) == FUNCTION_DECL)
14738         {
14739           saved_current_function_decl = current_function_decl;
14740           current_function_decl = decl;
14741         }
14742
14743       /* Perform access checks for template parameters.  */
14744       cp_parser_perform_template_parameter_access_checks (checks);
14745
14746       /* Perform the access control checks for the declarator and the
14747          decl-specifiers.  */
14748       perform_deferred_access_checks ();
14749
14750       /* Restore the saved value.  */
14751       if (TREE_CODE (decl) == FUNCTION_DECL)
14752         current_function_decl = saved_current_function_decl;
14753     }
14754
14755   /* Parse the initializer.  */
14756   initializer = NULL_TREE;
14757   is_direct_init = false;
14758   is_non_constant_init = true;
14759   if (is_initialized)
14760     {
14761       if (function_declarator_p (declarator))
14762         {
14763           cp_token *initializer_start_token = cp_lexer_peek_token (parser->lexer);
14764            if (initialization_kind == CPP_EQ)
14765              initializer = cp_parser_pure_specifier (parser);
14766            else
14767              {
14768                /* If the declaration was erroneous, we don't really
14769                   know what the user intended, so just silently
14770                   consume the initializer.  */
14771                if (decl != error_mark_node)
14772                  error_at (initializer_start_token->location,
14773                            "initializer provided for function");
14774                cp_parser_skip_to_closing_parenthesis (parser,
14775                                                       /*recovering=*/true,
14776                                                       /*or_comma=*/false,
14777                                                       /*consume_paren=*/true);
14778              }
14779         }
14780       else
14781         {
14782           /* We want to record the extra mangling scope for in-class
14783              initializers of class members and initializers of static data
14784              member templates.  The former is a C++0x feature which isn't
14785              implemented yet, and I expect it will involve deferring
14786              parsing of the initializer until end of class as with default
14787              arguments.  So right here we only handle the latter.  */
14788           if (!member_p && processing_template_decl)
14789             start_lambda_scope (decl);
14790           initializer = cp_parser_initializer (parser,
14791                                                &is_direct_init,
14792                                                &is_non_constant_init);
14793           if (!member_p && processing_template_decl)
14794             finish_lambda_scope ();
14795         }
14796     }
14797
14798   /* The old parser allows attributes to appear after a parenthesized
14799      initializer.  Mark Mitchell proposed removing this functionality
14800      on the GCC mailing lists on 2002-08-13.  This parser accepts the
14801      attributes -- but ignores them.  */
14802   if (cp_parser_allow_gnu_extensions_p (parser)
14803       && initialization_kind == CPP_OPEN_PAREN)
14804     if (cp_parser_attributes_opt (parser))
14805       warning (OPT_Wattributes,
14806                "attributes after parenthesized initializer ignored");
14807
14808   /* For an in-class declaration, use `grokfield' to create the
14809      declaration.  */
14810   if (member_p)
14811     {
14812       if (pushed_scope)
14813         {
14814           pop_scope (pushed_scope);
14815           pushed_scope = NULL_TREE;
14816         }
14817       decl = grokfield (declarator, decl_specifiers,
14818                         initializer, !is_non_constant_init,
14819                         /*asmspec=*/NULL_TREE,
14820                         prefix_attributes);
14821       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
14822         cp_parser_save_default_args (parser, decl);
14823     }
14824
14825   /* Finish processing the declaration.  But, skip member
14826      declarations.  */
14827   if (!member_p && decl && decl != error_mark_node && !range_for_decl_p)
14828     {
14829       cp_finish_decl (decl,
14830                       initializer, !is_non_constant_init,
14831                       asm_specification,
14832                       /* If the initializer is in parentheses, then this is
14833                          a direct-initialization, which means that an
14834                          `explicit' constructor is OK.  Otherwise, an
14835                          `explicit' constructor cannot be used.  */
14836                       ((is_direct_init || !is_initialized)
14837                        ? LOOKUP_NORMAL : LOOKUP_IMPLICIT));
14838     }
14839   else if ((cxx_dialect != cxx98) && friend_p
14840            && decl && TREE_CODE (decl) == FUNCTION_DECL)
14841     /* Core issue #226 (C++0x only): A default template-argument
14842        shall not be specified in a friend class template
14843        declaration. */
14844     check_default_tmpl_args (decl, current_template_parms, /*is_primary=*/1, 
14845                              /*is_partial=*/0, /*is_friend_decl=*/1);
14846
14847   if (!friend_p && pushed_scope)
14848     pop_scope (pushed_scope);
14849
14850   return decl;
14851 }
14852
14853 /* Parse a declarator.
14854
14855    declarator:
14856      direct-declarator
14857      ptr-operator declarator
14858
14859    abstract-declarator:
14860      ptr-operator abstract-declarator [opt]
14861      direct-abstract-declarator
14862
14863    GNU Extensions:
14864
14865    declarator:
14866      attributes [opt] direct-declarator
14867      attributes [opt] ptr-operator declarator
14868
14869    abstract-declarator:
14870      attributes [opt] ptr-operator abstract-declarator [opt]
14871      attributes [opt] direct-abstract-declarator
14872
14873    If CTOR_DTOR_OR_CONV_P is not NULL, *CTOR_DTOR_OR_CONV_P is used to
14874    detect constructor, destructor or conversion operators. It is set
14875    to -1 if the declarator is a name, and +1 if it is a
14876    function. Otherwise it is set to zero. Usually you just want to
14877    test for >0, but internally the negative value is used.
14878
14879    (The reason for CTOR_DTOR_OR_CONV_P is that a declaration must have
14880    a decl-specifier-seq unless it declares a constructor, destructor,
14881    or conversion.  It might seem that we could check this condition in
14882    semantic analysis, rather than parsing, but that makes it difficult
14883    to handle something like `f()'.  We want to notice that there are
14884    no decl-specifiers, and therefore realize that this is an
14885    expression, not a declaration.)
14886
14887    If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
14888    the declarator is a direct-declarator of the form "(...)".
14889
14890    MEMBER_P is true iff this declarator is a member-declarator.  */
14891
14892 static cp_declarator *
14893 cp_parser_declarator (cp_parser* parser,
14894                       cp_parser_declarator_kind dcl_kind,
14895                       int* ctor_dtor_or_conv_p,
14896                       bool* parenthesized_p,
14897                       bool member_p)
14898 {
14899   cp_declarator *declarator;
14900   enum tree_code code;
14901   cp_cv_quals cv_quals;
14902   tree class_type;
14903   tree attributes = NULL_TREE;
14904
14905   /* Assume this is not a constructor, destructor, or type-conversion
14906      operator.  */
14907   if (ctor_dtor_or_conv_p)
14908     *ctor_dtor_or_conv_p = 0;
14909
14910   if (cp_parser_allow_gnu_extensions_p (parser))
14911     attributes = cp_parser_attributes_opt (parser);
14912
14913   /* Check for the ptr-operator production.  */
14914   cp_parser_parse_tentatively (parser);
14915   /* Parse the ptr-operator.  */
14916   code = cp_parser_ptr_operator (parser,
14917                                  &class_type,
14918                                  &cv_quals);
14919   /* If that worked, then we have a ptr-operator.  */
14920   if (cp_parser_parse_definitely (parser))
14921     {
14922       /* If a ptr-operator was found, then this declarator was not
14923          parenthesized.  */
14924       if (parenthesized_p)
14925         *parenthesized_p = true;
14926       /* The dependent declarator is optional if we are parsing an
14927          abstract-declarator.  */
14928       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED)
14929         cp_parser_parse_tentatively (parser);
14930
14931       /* Parse the dependent declarator.  */
14932       declarator = cp_parser_declarator (parser, dcl_kind,
14933                                          /*ctor_dtor_or_conv_p=*/NULL,
14934                                          /*parenthesized_p=*/NULL,
14935                                          /*member_p=*/false);
14936
14937       /* If we are parsing an abstract-declarator, we must handle the
14938          case where the dependent declarator is absent.  */
14939       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED
14940           && !cp_parser_parse_definitely (parser))
14941         declarator = NULL;
14942
14943       declarator = cp_parser_make_indirect_declarator
14944         (code, class_type, cv_quals, declarator);
14945     }
14946   /* Everything else is a direct-declarator.  */
14947   else
14948     {
14949       if (parenthesized_p)
14950         *parenthesized_p = cp_lexer_next_token_is (parser->lexer,
14951                                                    CPP_OPEN_PAREN);
14952       declarator = cp_parser_direct_declarator (parser, dcl_kind,
14953                                                 ctor_dtor_or_conv_p,
14954                                                 member_p);
14955     }
14956
14957   if (attributes && declarator && declarator != cp_error_declarator)
14958     declarator->attributes = attributes;
14959
14960   return declarator;
14961 }
14962
14963 /* Parse a direct-declarator or direct-abstract-declarator.
14964
14965    direct-declarator:
14966      declarator-id
14967      direct-declarator ( parameter-declaration-clause )
14968        cv-qualifier-seq [opt]
14969        exception-specification [opt]
14970      direct-declarator [ constant-expression [opt] ]
14971      ( declarator )
14972
14973    direct-abstract-declarator:
14974      direct-abstract-declarator [opt]
14975        ( parameter-declaration-clause )
14976        cv-qualifier-seq [opt]
14977        exception-specification [opt]
14978      direct-abstract-declarator [opt] [ constant-expression [opt] ]
14979      ( abstract-declarator )
14980
14981    Returns a representation of the declarator.  DCL_KIND is
14982    CP_PARSER_DECLARATOR_ABSTRACT, if we are parsing a
14983    direct-abstract-declarator.  It is CP_PARSER_DECLARATOR_NAMED, if
14984    we are parsing a direct-declarator.  It is
14985    CP_PARSER_DECLARATOR_EITHER, if we can accept either - in the case
14986    of ambiguity we prefer an abstract declarator, as per
14987    [dcl.ambig.res].  CTOR_DTOR_OR_CONV_P and MEMBER_P are as for
14988    cp_parser_declarator.  */
14989
14990 static cp_declarator *
14991 cp_parser_direct_declarator (cp_parser* parser,
14992                              cp_parser_declarator_kind dcl_kind,
14993                              int* ctor_dtor_or_conv_p,
14994                              bool member_p)
14995 {
14996   cp_token *token;
14997   cp_declarator *declarator = NULL;
14998   tree scope = NULL_TREE;
14999   bool saved_default_arg_ok_p = parser->default_arg_ok_p;
15000   bool saved_in_declarator_p = parser->in_declarator_p;
15001   bool first = true;
15002   tree pushed_scope = NULL_TREE;
15003
15004   while (true)
15005     {
15006       /* Peek at the next token.  */
15007       token = cp_lexer_peek_token (parser->lexer);
15008       if (token->type == CPP_OPEN_PAREN)
15009         {
15010           /* This is either a parameter-declaration-clause, or a
15011              parenthesized declarator. When we know we are parsing a
15012              named declarator, it must be a parenthesized declarator
15013              if FIRST is true. For instance, `(int)' is a
15014              parameter-declaration-clause, with an omitted
15015              direct-abstract-declarator. But `((*))', is a
15016              parenthesized abstract declarator. Finally, when T is a
15017              template parameter `(T)' is a
15018              parameter-declaration-clause, and not a parenthesized
15019              named declarator.
15020
15021              We first try and parse a parameter-declaration-clause,
15022              and then try a nested declarator (if FIRST is true).
15023
15024              It is not an error for it not to be a
15025              parameter-declaration-clause, even when FIRST is
15026              false. Consider,
15027
15028                int i (int);
15029                int i (3);
15030
15031              The first is the declaration of a function while the
15032              second is the definition of a variable, including its
15033              initializer.
15034
15035              Having seen only the parenthesis, we cannot know which of
15036              these two alternatives should be selected.  Even more
15037              complex are examples like:
15038
15039                int i (int (a));
15040                int i (int (3));
15041
15042              The former is a function-declaration; the latter is a
15043              variable initialization.
15044
15045              Thus again, we try a parameter-declaration-clause, and if
15046              that fails, we back out and return.  */
15047
15048           if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
15049             {
15050               tree params;
15051               unsigned saved_num_template_parameter_lists;
15052               bool is_declarator = false;
15053               tree t;
15054
15055               /* In a member-declarator, the only valid interpretation
15056                  of a parenthesis is the start of a
15057                  parameter-declaration-clause.  (It is invalid to
15058                  initialize a static data member with a parenthesized
15059                  initializer; only the "=" form of initialization is
15060                  permitted.)  */
15061               if (!member_p)
15062                 cp_parser_parse_tentatively (parser);
15063
15064               /* Consume the `('.  */
15065               cp_lexer_consume_token (parser->lexer);
15066               if (first)
15067                 {
15068                   /* If this is going to be an abstract declarator, we're
15069                      in a declarator and we can't have default args.  */
15070                   parser->default_arg_ok_p = false;
15071                   parser->in_declarator_p = true;
15072                 }
15073
15074               /* Inside the function parameter list, surrounding
15075                  template-parameter-lists do not apply.  */
15076               saved_num_template_parameter_lists
15077                 = parser->num_template_parameter_lists;
15078               parser->num_template_parameter_lists = 0;
15079
15080               begin_scope (sk_function_parms, NULL_TREE);
15081
15082               /* Parse the parameter-declaration-clause.  */
15083               params = cp_parser_parameter_declaration_clause (parser);
15084
15085               parser->num_template_parameter_lists
15086                 = saved_num_template_parameter_lists;
15087
15088               /* Consume the `)'.  */
15089               cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
15090
15091               /* If all went well, parse the cv-qualifier-seq and the
15092                  exception-specification.  */
15093               if (member_p || cp_parser_parse_definitely (parser))
15094                 {
15095                   cp_cv_quals cv_quals;
15096                   cp_virt_specifiers virt_specifiers;
15097                   tree exception_specification;
15098                   tree late_return;
15099
15100                   is_declarator = true;
15101
15102                   if (ctor_dtor_or_conv_p)
15103                     *ctor_dtor_or_conv_p = *ctor_dtor_or_conv_p < 0;
15104                   first = false;
15105
15106                   /* Parse the cv-qualifier-seq.  */
15107                   cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15108                   /* And the exception-specification.  */
15109                   exception_specification
15110                     = cp_parser_exception_specification_opt (parser);
15111                   /* Parse the virt-specifier-seq.  */
15112                   virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
15113
15114                   late_return = (cp_parser_late_return_type_opt
15115                                  (parser, member_p ? cv_quals : -1));
15116
15117                   /* Create the function-declarator.  */
15118                   declarator = make_call_declarator (declarator,
15119                                                      params,
15120                                                      cv_quals,
15121                                                      virt_specifiers,
15122                                                      exception_specification,
15123                                                      late_return);
15124                   /* Any subsequent parameter lists are to do with
15125                      return type, so are not those of the declared
15126                      function.  */
15127                   parser->default_arg_ok_p = false;
15128                 }
15129
15130               /* Remove the function parms from scope.  */
15131               for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
15132                 pop_binding (DECL_NAME (t), t);
15133               leave_scope();
15134
15135               if (is_declarator)
15136                 /* Repeat the main loop.  */
15137                 continue;
15138             }
15139
15140           /* If this is the first, we can try a parenthesized
15141              declarator.  */
15142           if (first)
15143             {
15144               bool saved_in_type_id_in_expr_p;
15145
15146               parser->default_arg_ok_p = saved_default_arg_ok_p;
15147               parser->in_declarator_p = saved_in_declarator_p;
15148
15149               /* Consume the `('.  */
15150               cp_lexer_consume_token (parser->lexer);
15151               /* Parse the nested declarator.  */
15152               saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
15153               parser->in_type_id_in_expr_p = true;
15154               declarator
15155                 = cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
15156                                         /*parenthesized_p=*/NULL,
15157                                         member_p);
15158               parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
15159               first = false;
15160               /* Expect a `)'.  */
15161               if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
15162                 declarator = cp_error_declarator;
15163               if (declarator == cp_error_declarator)
15164                 break;
15165
15166               goto handle_declarator;
15167             }
15168           /* Otherwise, we must be done.  */
15169           else
15170             break;
15171         }
15172       else if ((!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
15173                && token->type == CPP_OPEN_SQUARE)
15174         {
15175           /* Parse an array-declarator.  */
15176           tree bounds;
15177
15178           if (ctor_dtor_or_conv_p)
15179             *ctor_dtor_or_conv_p = 0;
15180
15181           first = false;
15182           parser->default_arg_ok_p = false;
15183           parser->in_declarator_p = true;
15184           /* Consume the `['.  */
15185           cp_lexer_consume_token (parser->lexer);
15186           /* Peek at the next token.  */
15187           token = cp_lexer_peek_token (parser->lexer);
15188           /* If the next token is `]', then there is no
15189              constant-expression.  */
15190           if (token->type != CPP_CLOSE_SQUARE)
15191             {
15192               bool non_constant_p;
15193
15194               bounds
15195                 = cp_parser_constant_expression (parser,
15196                                                  /*allow_non_constant=*/true,
15197                                                  &non_constant_p);
15198               if (!non_constant_p)
15199                 /* OK */;
15200               /* Normally, the array bound must be an integral constant
15201                  expression.  However, as an extension, we allow VLAs
15202                  in function scopes as long as they aren't part of a
15203                  parameter declaration.  */
15204               else if (!parser->in_function_body
15205                        || current_binding_level->kind == sk_function_parms)
15206                 {
15207                   cp_parser_error (parser,
15208                                    "array bound is not an integer constant");
15209                   bounds = error_mark_node;
15210                 }
15211               else if (processing_template_decl && !error_operand_p (bounds))
15212                 {
15213                   /* Remember this wasn't a constant-expression.  */
15214                   bounds = build_nop (TREE_TYPE (bounds), bounds);
15215                   TREE_SIDE_EFFECTS (bounds) = 1;
15216                 }
15217             }
15218           else
15219             bounds = NULL_TREE;
15220           /* Look for the closing `]'.  */
15221           if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
15222             {
15223               declarator = cp_error_declarator;
15224               break;
15225             }
15226
15227           declarator = make_array_declarator (declarator, bounds);
15228         }
15229       else if (first && dcl_kind != CP_PARSER_DECLARATOR_ABSTRACT)
15230         {
15231           {
15232             tree qualifying_scope;
15233             tree unqualified_name;
15234             special_function_kind sfk;
15235             bool abstract_ok;
15236             bool pack_expansion_p = false;
15237             cp_token *declarator_id_start_token;
15238
15239             /* Parse a declarator-id */
15240             abstract_ok = (dcl_kind == CP_PARSER_DECLARATOR_EITHER);
15241             if (abstract_ok)
15242               {
15243                 cp_parser_parse_tentatively (parser);
15244
15245                 /* If we see an ellipsis, we should be looking at a
15246                    parameter pack. */
15247                 if (token->type == CPP_ELLIPSIS)
15248                   {
15249                     /* Consume the `...' */
15250                     cp_lexer_consume_token (parser->lexer);
15251
15252                     pack_expansion_p = true;
15253                   }
15254               }
15255
15256             declarator_id_start_token = cp_lexer_peek_token (parser->lexer);
15257             unqualified_name
15258               = cp_parser_declarator_id (parser, /*optional_p=*/abstract_ok);
15259             qualifying_scope = parser->scope;
15260             if (abstract_ok)
15261               {
15262                 bool okay = false;
15263
15264                 if (!unqualified_name && pack_expansion_p)
15265                   {
15266                     /* Check whether an error occurred. */
15267                     okay = !cp_parser_error_occurred (parser);
15268
15269                     /* We already consumed the ellipsis to mark a
15270                        parameter pack, but we have no way to report it,
15271                        so abort the tentative parse. We will be exiting
15272                        immediately anyway. */
15273                     cp_parser_abort_tentative_parse (parser);
15274                   }
15275                 else
15276                   okay = cp_parser_parse_definitely (parser);
15277
15278                 if (!okay)
15279                   unqualified_name = error_mark_node;
15280                 else if (unqualified_name
15281                          && (qualifying_scope
15282                              || (TREE_CODE (unqualified_name)
15283                                  != IDENTIFIER_NODE)))
15284                   {
15285                     cp_parser_error (parser, "expected unqualified-id");
15286                     unqualified_name = error_mark_node;
15287                   }
15288               }
15289
15290             if (!unqualified_name)
15291               return NULL;
15292             if (unqualified_name == error_mark_node)
15293               {
15294                 declarator = cp_error_declarator;
15295                 pack_expansion_p = false;
15296                 declarator->parameter_pack_p = false;
15297                 break;
15298               }
15299
15300             if (qualifying_scope && at_namespace_scope_p ()
15301                 && TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
15302               {
15303                 /* In the declaration of a member of a template class
15304                    outside of the class itself, the SCOPE will sometimes
15305                    be a TYPENAME_TYPE.  For example, given:
15306
15307                    template <typename T>
15308                    int S<T>::R::i = 3;
15309
15310                    the SCOPE will be a TYPENAME_TYPE for `S<T>::R'.  In
15311                    this context, we must resolve S<T>::R to an ordinary
15312                    type, rather than a typename type.
15313
15314                    The reason we normally avoid resolving TYPENAME_TYPEs
15315                    is that a specialization of `S' might render
15316                    `S<T>::R' not a type.  However, if `S' is
15317                    specialized, then this `i' will not be used, so there
15318                    is no harm in resolving the types here.  */
15319                 tree type;
15320
15321                 /* Resolve the TYPENAME_TYPE.  */
15322                 type = resolve_typename_type (qualifying_scope,
15323                                               /*only_current_p=*/false);
15324                 /* If that failed, the declarator is invalid.  */
15325                 if (TREE_CODE (type) == TYPENAME_TYPE)
15326                   {
15327                     if (typedef_variant_p (type))
15328                       error_at (declarator_id_start_token->location,
15329                                 "cannot define member of dependent typedef "
15330                                 "%qT", type);
15331                     else
15332                       error_at (declarator_id_start_token->location,
15333                                 "%<%T::%E%> is not a type",
15334                                 TYPE_CONTEXT (qualifying_scope),
15335                                 TYPE_IDENTIFIER (qualifying_scope));
15336                   }
15337                 qualifying_scope = type;
15338               }
15339
15340             sfk = sfk_none;
15341
15342             if (unqualified_name)
15343               {
15344                 tree class_type;
15345
15346                 if (qualifying_scope
15347                     && CLASS_TYPE_P (qualifying_scope))
15348                   class_type = qualifying_scope;
15349                 else
15350                   class_type = current_class_type;
15351
15352                 if (TREE_CODE (unqualified_name) == TYPE_DECL)
15353                   {
15354                     tree name_type = TREE_TYPE (unqualified_name);
15355                     if (class_type && same_type_p (name_type, class_type))
15356                       {
15357                         if (qualifying_scope
15358                             && CLASSTYPE_USE_TEMPLATE (name_type))
15359                           {
15360                             error_at (declarator_id_start_token->location,
15361                                       "invalid use of constructor as a template");
15362                             inform (declarator_id_start_token->location,
15363                                     "use %<%T::%D%> instead of %<%T::%D%> to "
15364                                     "name the constructor in a qualified name",
15365                                     class_type,
15366                                     DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
15367                                     class_type, name_type);
15368                             declarator = cp_error_declarator;
15369                             break;
15370                           }
15371                         else
15372                           unqualified_name = constructor_name (class_type);
15373                       }
15374                     else
15375                       {
15376                         /* We do not attempt to print the declarator
15377                            here because we do not have enough
15378                            information about its original syntactic
15379                            form.  */
15380                         cp_parser_error (parser, "invalid declarator");
15381                         declarator = cp_error_declarator;
15382                         break;
15383                       }
15384                   }
15385
15386                 if (class_type)
15387                   {
15388                     if (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
15389                       sfk = sfk_destructor;
15390                     else if (IDENTIFIER_TYPENAME_P (unqualified_name))
15391                       sfk = sfk_conversion;
15392                     else if (/* There's no way to declare a constructor
15393                                 for an anonymous type, even if the type
15394                                 got a name for linkage purposes.  */
15395                              !TYPE_WAS_ANONYMOUS (class_type)
15396                              && constructor_name_p (unqualified_name,
15397                                                     class_type))
15398                       {
15399                         unqualified_name = constructor_name (class_type);
15400                         sfk = sfk_constructor;
15401                       }
15402                     else if (is_overloaded_fn (unqualified_name)
15403                              && DECL_CONSTRUCTOR_P (get_first_fn
15404                                                     (unqualified_name)))
15405                       sfk = sfk_constructor;
15406
15407                     if (ctor_dtor_or_conv_p && sfk != sfk_none)
15408                       *ctor_dtor_or_conv_p = -1;
15409                   }
15410               }
15411             declarator = make_id_declarator (qualifying_scope,
15412                                              unqualified_name,
15413                                              sfk);
15414             declarator->id_loc = token->location;
15415             declarator->parameter_pack_p = pack_expansion_p;
15416
15417             if (pack_expansion_p)
15418               maybe_warn_variadic_templates ();
15419           }
15420
15421         handle_declarator:;
15422           scope = get_scope_of_declarator (declarator);
15423           if (scope)
15424             /* Any names that appear after the declarator-id for a
15425                member are looked up in the containing scope.  */
15426             pushed_scope = push_scope (scope);
15427           parser->in_declarator_p = true;
15428           if ((ctor_dtor_or_conv_p && *ctor_dtor_or_conv_p)
15429               || (declarator && declarator->kind == cdk_id))
15430             /* Default args are only allowed on function
15431                declarations.  */
15432             parser->default_arg_ok_p = saved_default_arg_ok_p;
15433           else
15434             parser->default_arg_ok_p = false;
15435
15436           first = false;
15437         }
15438       /* We're done.  */
15439       else
15440         break;
15441     }
15442
15443   /* For an abstract declarator, we might wind up with nothing at this
15444      point.  That's an error; the declarator is not optional.  */
15445   if (!declarator)
15446     cp_parser_error (parser, "expected declarator");
15447
15448   /* If we entered a scope, we must exit it now.  */
15449   if (pushed_scope)
15450     pop_scope (pushed_scope);
15451
15452   parser->default_arg_ok_p = saved_default_arg_ok_p;
15453   parser->in_declarator_p = saved_in_declarator_p;
15454
15455   return declarator;
15456 }
15457
15458 /* Parse a ptr-operator.
15459
15460    ptr-operator:
15461      * cv-qualifier-seq [opt]
15462      &
15463      :: [opt] nested-name-specifier * cv-qualifier-seq [opt]
15464
15465    GNU Extension:
15466
15467    ptr-operator:
15468      & cv-qualifier-seq [opt]
15469
15470    Returns INDIRECT_REF if a pointer, or pointer-to-member, was used.
15471    Returns ADDR_EXPR if a reference was used, or NON_LVALUE_EXPR for
15472    an rvalue reference. In the case of a pointer-to-member, *TYPE is
15473    filled in with the TYPE containing the member.  *CV_QUALS is
15474    filled in with the cv-qualifier-seq, or TYPE_UNQUALIFIED, if there
15475    are no cv-qualifiers.  Returns ERROR_MARK if an error occurred.
15476    Note that the tree codes returned by this function have nothing
15477    to do with the types of trees that will be eventually be created
15478    to represent the pointer or reference type being parsed. They are
15479    just constants with suggestive names. */
15480 static enum tree_code
15481 cp_parser_ptr_operator (cp_parser* parser,
15482                         tree* type,
15483                         cp_cv_quals *cv_quals)
15484 {
15485   enum tree_code code = ERROR_MARK;
15486   cp_token *token;
15487
15488   /* Assume that it's not a pointer-to-member.  */
15489   *type = NULL_TREE;
15490   /* And that there are no cv-qualifiers.  */
15491   *cv_quals = TYPE_UNQUALIFIED;
15492
15493   /* Peek at the next token.  */
15494   token = cp_lexer_peek_token (parser->lexer);
15495
15496   /* If it's a `*', `&' or `&&' we have a pointer or reference.  */
15497   if (token->type == CPP_MULT)
15498     code = INDIRECT_REF;
15499   else if (token->type == CPP_AND)
15500     code = ADDR_EXPR;
15501   else if ((cxx_dialect != cxx98) &&
15502            token->type == CPP_AND_AND) /* C++0x only */
15503     code = NON_LVALUE_EXPR;
15504
15505   if (code != ERROR_MARK)
15506     {
15507       /* Consume the `*', `&' or `&&'.  */
15508       cp_lexer_consume_token (parser->lexer);
15509
15510       /* A `*' can be followed by a cv-qualifier-seq, and so can a
15511          `&', if we are allowing GNU extensions.  (The only qualifier
15512          that can legally appear after `&' is `restrict', but that is
15513          enforced during semantic analysis.  */
15514       if (code == INDIRECT_REF
15515           || cp_parser_allow_gnu_extensions_p (parser))
15516         *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15517     }
15518   else
15519     {
15520       /* Try the pointer-to-member case.  */
15521       cp_parser_parse_tentatively (parser);
15522       /* Look for the optional `::' operator.  */
15523       cp_parser_global_scope_opt (parser,
15524                                   /*current_scope_valid_p=*/false);
15525       /* Look for the nested-name specifier.  */
15526       token = cp_lexer_peek_token (parser->lexer);
15527       cp_parser_nested_name_specifier (parser,
15528                                        /*typename_keyword_p=*/false,
15529                                        /*check_dependency_p=*/true,
15530                                        /*type_p=*/false,
15531                                        /*is_declaration=*/false);
15532       /* If we found it, and the next token is a `*', then we are
15533          indeed looking at a pointer-to-member operator.  */
15534       if (!cp_parser_error_occurred (parser)
15535           && cp_parser_require (parser, CPP_MULT, RT_MULT))
15536         {
15537           /* Indicate that the `*' operator was used.  */
15538           code = INDIRECT_REF;
15539
15540           if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
15541             error_at (token->location, "%qD is a namespace", parser->scope);
15542           else
15543             {
15544               /* The type of which the member is a member is given by the
15545                  current SCOPE.  */
15546               *type = parser->scope;
15547               /* The next name will not be qualified.  */
15548               parser->scope = NULL_TREE;
15549               parser->qualifying_scope = NULL_TREE;
15550               parser->object_scope = NULL_TREE;
15551               /* Look for the optional cv-qualifier-seq.  */
15552               *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15553             }
15554         }
15555       /* If that didn't work we don't have a ptr-operator.  */
15556       if (!cp_parser_parse_definitely (parser))
15557         cp_parser_error (parser, "expected ptr-operator");
15558     }
15559
15560   return code;
15561 }
15562
15563 /* Parse an (optional) cv-qualifier-seq.
15564
15565    cv-qualifier-seq:
15566      cv-qualifier cv-qualifier-seq [opt]
15567
15568    cv-qualifier:
15569      const
15570      volatile
15571
15572    GNU Extension:
15573
15574    cv-qualifier:
15575      __restrict__
15576
15577    Returns a bitmask representing the cv-qualifiers.  */
15578
15579 static cp_cv_quals
15580 cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
15581 {
15582   cp_cv_quals cv_quals = TYPE_UNQUALIFIED;
15583
15584   while (true)
15585     {
15586       cp_token *token;
15587       cp_cv_quals cv_qualifier;
15588
15589       /* Peek at the next token.  */
15590       token = cp_lexer_peek_token (parser->lexer);
15591       /* See if it's a cv-qualifier.  */
15592       switch (token->keyword)
15593         {
15594         case RID_CONST:
15595           cv_qualifier = TYPE_QUAL_CONST;
15596           break;
15597
15598         case RID_VOLATILE:
15599           cv_qualifier = TYPE_QUAL_VOLATILE;
15600           break;
15601
15602         case RID_RESTRICT:
15603           cv_qualifier = TYPE_QUAL_RESTRICT;
15604           break;
15605
15606         default:
15607           cv_qualifier = TYPE_UNQUALIFIED;
15608           break;
15609         }
15610
15611       if (!cv_qualifier)
15612         break;
15613
15614       if (cv_quals & cv_qualifier)
15615         {
15616           error_at (token->location, "duplicate cv-qualifier");
15617           cp_lexer_purge_token (parser->lexer);
15618         }
15619       else
15620         {
15621           cp_lexer_consume_token (parser->lexer);
15622           cv_quals |= cv_qualifier;
15623         }
15624     }
15625
15626   return cv_quals;
15627 }
15628
15629 /* Parse an (optional) virt-specifier-seq.
15630
15631    virt-specifier-seq:
15632      virt-specifier virt-specifier-seq [opt]
15633
15634    virt-specifier:
15635      override
15636      final
15637
15638    Returns a bitmask representing the virt-specifiers.  */
15639
15640 static cp_virt_specifiers
15641 cp_parser_virt_specifier_seq_opt (cp_parser* parser)
15642 {
15643   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
15644
15645   while (true)
15646     {
15647       cp_token *token;
15648       cp_virt_specifiers virt_specifier;
15649
15650       /* Peek at the next token.  */
15651       token = cp_lexer_peek_token (parser->lexer);
15652       /* See if it's a virt-specifier-qualifier.  */
15653       if (token->type != CPP_NAME)
15654         break;
15655       if (!strcmp (IDENTIFIER_POINTER(token->u.value), "override"))
15656         {
15657           maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
15658           virt_specifier = VIRT_SPEC_OVERRIDE;
15659         }
15660       else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "final"))
15661         {
15662           maybe_warn_cpp0x (CPP0X_OVERRIDE_CONTROLS);
15663           virt_specifier = VIRT_SPEC_FINAL;
15664         }
15665       else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "__final"))
15666         {
15667           virt_specifier = VIRT_SPEC_FINAL;
15668         }
15669       else
15670         break;
15671
15672       if (virt_specifiers & virt_specifier)
15673         {
15674           error_at (token->location, "duplicate virt-specifier");
15675           cp_lexer_purge_token (parser->lexer);
15676         }
15677       else
15678         {
15679           cp_lexer_consume_token (parser->lexer);
15680           virt_specifiers |= virt_specifier;
15681         }
15682     }
15683   return virt_specifiers;
15684 }
15685
15686 /* Parse a late-specified return type, if any.  This is not a separate
15687    non-terminal, but part of a function declarator, which looks like
15688
15689    -> trailing-type-specifier-seq abstract-declarator(opt)
15690
15691    Returns the type indicated by the type-id.
15692
15693    QUALS is either a bitmask of cv_qualifiers or -1 for a non-member
15694    function.  */
15695
15696 static tree
15697 cp_parser_late_return_type_opt (cp_parser* parser, cp_cv_quals quals)
15698 {
15699   cp_token *token;
15700   tree type;
15701
15702   /* Peek at the next token.  */
15703   token = cp_lexer_peek_token (parser->lexer);
15704   /* A late-specified return type is indicated by an initial '->'. */
15705   if (token->type != CPP_DEREF)
15706     return NULL_TREE;
15707
15708   /* Consume the ->.  */
15709   cp_lexer_consume_token (parser->lexer);
15710
15711   if (quals >= 0)
15712     {
15713       /* DR 1207: 'this' is in scope in the trailing return type.  */
15714       tree this_parm = build_this_parm (current_class_type, quals);
15715       gcc_assert (current_class_ptr == NULL_TREE);
15716       current_class_ref
15717         = cp_build_indirect_ref (this_parm, RO_NULL, tf_warning_or_error);
15718       /* Set this second to avoid shortcut in cp_build_indirect_ref.  */
15719       current_class_ptr = this_parm;
15720     }
15721
15722   type = cp_parser_trailing_type_id (parser);
15723
15724   if (quals >= 0)
15725     current_class_ptr = current_class_ref = NULL_TREE;
15726
15727   return type;
15728 }
15729
15730 /* Parse a declarator-id.
15731
15732    declarator-id:
15733      id-expression
15734      :: [opt] nested-name-specifier [opt] type-name
15735
15736    In the `id-expression' case, the value returned is as for
15737    cp_parser_id_expression if the id-expression was an unqualified-id.
15738    If the id-expression was a qualified-id, then a SCOPE_REF is
15739    returned.  The first operand is the scope (either a NAMESPACE_DECL
15740    or TREE_TYPE), but the second is still just a representation of an
15741    unqualified-id.  */
15742
15743 static tree
15744 cp_parser_declarator_id (cp_parser* parser, bool optional_p)
15745 {
15746   tree id;
15747   /* The expression must be an id-expression.  Assume that qualified
15748      names are the names of types so that:
15749
15750        template <class T>
15751        int S<T>::R::i = 3;
15752
15753      will work; we must treat `S<T>::R' as the name of a type.
15754      Similarly, assume that qualified names are templates, where
15755      required, so that:
15756
15757        template <class T>
15758        int S<T>::R<T>::i = 3;
15759
15760      will work, too.  */
15761   id = cp_parser_id_expression (parser,
15762                                 /*template_keyword_p=*/false,
15763                                 /*check_dependency_p=*/false,
15764                                 /*template_p=*/NULL,
15765                                 /*declarator_p=*/true,
15766                                 optional_p);
15767   if (id && BASELINK_P (id))
15768     id = BASELINK_FUNCTIONS (id);
15769   return id;
15770 }
15771
15772 /* Parse a type-id.
15773
15774    type-id:
15775      type-specifier-seq abstract-declarator [opt]
15776
15777    Returns the TYPE specified.  */
15778
15779 static tree
15780 cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg,
15781                      bool is_trailing_return)
15782 {
15783   cp_decl_specifier_seq type_specifier_seq;
15784   cp_declarator *abstract_declarator;
15785
15786   /* Parse the type-specifier-seq.  */
15787   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
15788                                 is_trailing_return,
15789                                 &type_specifier_seq);
15790   if (type_specifier_seq.type == error_mark_node)
15791     return error_mark_node;
15792
15793   /* There might or might not be an abstract declarator.  */
15794   cp_parser_parse_tentatively (parser);
15795   /* Look for the declarator.  */
15796   abstract_declarator
15797     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_ABSTRACT, NULL,
15798                             /*parenthesized_p=*/NULL,
15799                             /*member_p=*/false);
15800   /* Check to see if there really was a declarator.  */
15801   if (!cp_parser_parse_definitely (parser))
15802     abstract_declarator = NULL;
15803
15804   if (type_specifier_seq.type
15805       && type_uses_auto (type_specifier_seq.type))
15806     {
15807       /* A type-id with type 'auto' is only ok if the abstract declarator
15808          is a function declarator with a late-specified return type.  */
15809       if (abstract_declarator
15810           && abstract_declarator->kind == cdk_function
15811           && abstract_declarator->u.function.late_return_type)
15812         /* OK */;
15813       else
15814         {
15815           error ("invalid use of %<auto%>");
15816           return error_mark_node;
15817         }
15818     }
15819   
15820   return groktypename (&type_specifier_seq, abstract_declarator,
15821                        is_template_arg);
15822 }
15823
15824 static tree cp_parser_type_id (cp_parser *parser)
15825 {
15826   return cp_parser_type_id_1 (parser, false, false);
15827 }
15828
15829 static tree cp_parser_template_type_arg (cp_parser *parser)
15830 {
15831   tree r;
15832   const char *saved_message = parser->type_definition_forbidden_message;
15833   parser->type_definition_forbidden_message
15834     = G_("types may not be defined in template arguments");
15835   r = cp_parser_type_id_1 (parser, true, false);
15836   parser->type_definition_forbidden_message = saved_message;
15837   return r;
15838 }
15839
15840 static tree cp_parser_trailing_type_id (cp_parser *parser)
15841 {
15842   return cp_parser_type_id_1 (parser, false, true);
15843 }
15844
15845 /* Parse a type-specifier-seq.
15846
15847    type-specifier-seq:
15848      type-specifier type-specifier-seq [opt]
15849
15850    GNU extension:
15851
15852    type-specifier-seq:
15853      attributes type-specifier-seq [opt]
15854
15855    If IS_DECLARATION is true, we are at the start of a "condition" or
15856    exception-declaration, so we might be followed by a declarator-id.
15857
15858    If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
15859    i.e. we've just seen "->".
15860
15861    Sets *TYPE_SPECIFIER_SEQ to represent the sequence.  */
15862
15863 static void
15864 cp_parser_type_specifier_seq (cp_parser* parser,
15865                               bool is_declaration,
15866                               bool is_trailing_return,
15867                               cp_decl_specifier_seq *type_specifier_seq)
15868 {
15869   bool seen_type_specifier = false;
15870   cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
15871   cp_token *start_token = NULL;
15872
15873   /* Clear the TYPE_SPECIFIER_SEQ.  */
15874   clear_decl_specs (type_specifier_seq);
15875
15876   /* In the context of a trailing return type, enum E { } is an
15877      elaborated-type-specifier followed by a function-body, not an
15878      enum-specifier.  */
15879   if (is_trailing_return)
15880     flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
15881
15882   /* Parse the type-specifiers and attributes.  */
15883   while (true)
15884     {
15885       tree type_specifier;
15886       bool is_cv_qualifier;
15887
15888       /* Check for attributes first.  */
15889       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
15890         {
15891           type_specifier_seq->attributes =
15892             chainon (type_specifier_seq->attributes,
15893                      cp_parser_attributes_opt (parser));
15894           continue;
15895         }
15896
15897       /* record the token of the beginning of the type specifier seq,
15898          for error reporting purposes*/
15899      if (!start_token)
15900        start_token = cp_lexer_peek_token (parser->lexer);
15901
15902       /* Look for the type-specifier.  */
15903       type_specifier = cp_parser_type_specifier (parser,
15904                                                  flags,
15905                                                  type_specifier_seq,
15906                                                  /*is_declaration=*/false,
15907                                                  NULL,
15908                                                  &is_cv_qualifier);
15909       if (!type_specifier)
15910         {
15911           /* If the first type-specifier could not be found, this is not a
15912              type-specifier-seq at all.  */
15913           if (!seen_type_specifier)
15914             {
15915               cp_parser_error (parser, "expected type-specifier");
15916               type_specifier_seq->type = error_mark_node;
15917               return;
15918             }
15919           /* If subsequent type-specifiers could not be found, the
15920              type-specifier-seq is complete.  */
15921           break;
15922         }
15923
15924       seen_type_specifier = true;
15925       /* The standard says that a condition can be:
15926
15927             type-specifier-seq declarator = assignment-expression
15928
15929          However, given:
15930
15931            struct S {};
15932            if (int S = ...)
15933
15934          we should treat the "S" as a declarator, not as a
15935          type-specifier.  The standard doesn't say that explicitly for
15936          type-specifier-seq, but it does say that for
15937          decl-specifier-seq in an ordinary declaration.  Perhaps it
15938          would be clearer just to allow a decl-specifier-seq here, and
15939          then add a semantic restriction that if any decl-specifiers
15940          that are not type-specifiers appear, the program is invalid.  */
15941       if (is_declaration && !is_cv_qualifier)
15942         flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
15943     }
15944
15945   cp_parser_check_decl_spec (type_specifier_seq, start_token->location);
15946 }
15947
15948 /* Parse a parameter-declaration-clause.
15949
15950    parameter-declaration-clause:
15951      parameter-declaration-list [opt] ... [opt]
15952      parameter-declaration-list , ...
15953
15954    Returns a representation for the parameter declarations.  A return
15955    value of NULL indicates a parameter-declaration-clause consisting
15956    only of an ellipsis.  */
15957
15958 static tree
15959 cp_parser_parameter_declaration_clause (cp_parser* parser)
15960 {
15961   tree parameters;
15962   cp_token *token;
15963   bool ellipsis_p;
15964   bool is_error;
15965
15966   /* Peek at the next token.  */
15967   token = cp_lexer_peek_token (parser->lexer);
15968   /* Check for trivial parameter-declaration-clauses.  */
15969   if (token->type == CPP_ELLIPSIS)
15970     {
15971       /* Consume the `...' token.  */
15972       cp_lexer_consume_token (parser->lexer);
15973       return NULL_TREE;
15974     }
15975   else if (token->type == CPP_CLOSE_PAREN)
15976     /* There are no parameters.  */
15977     {
15978 #ifndef NO_IMPLICIT_EXTERN_C
15979       if (in_system_header && current_class_type == NULL
15980           && current_lang_name == lang_name_c)
15981         return NULL_TREE;
15982       else
15983 #endif
15984         return void_list_node;
15985     }
15986   /* Check for `(void)', too, which is a special case.  */
15987   else if (token->keyword == RID_VOID
15988            && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
15989                == CPP_CLOSE_PAREN))
15990     {
15991       /* Consume the `void' token.  */
15992       cp_lexer_consume_token (parser->lexer);
15993       /* There are no parameters.  */
15994       return void_list_node;
15995     }
15996
15997   /* Parse the parameter-declaration-list.  */
15998   parameters = cp_parser_parameter_declaration_list (parser, &is_error);
15999   /* If a parse error occurred while parsing the
16000      parameter-declaration-list, then the entire
16001      parameter-declaration-clause is erroneous.  */
16002   if (is_error)
16003     return NULL;
16004
16005   /* Peek at the next token.  */
16006   token = cp_lexer_peek_token (parser->lexer);
16007   /* If it's a `,', the clause should terminate with an ellipsis.  */
16008   if (token->type == CPP_COMMA)
16009     {
16010       /* Consume the `,'.  */
16011       cp_lexer_consume_token (parser->lexer);
16012       /* Expect an ellipsis.  */
16013       ellipsis_p
16014         = (cp_parser_require (parser, CPP_ELLIPSIS, RT_ELLIPSIS) != NULL);
16015     }
16016   /* It might also be `...' if the optional trailing `,' was
16017      omitted.  */
16018   else if (token->type == CPP_ELLIPSIS)
16019     {
16020       /* Consume the `...' token.  */
16021       cp_lexer_consume_token (parser->lexer);
16022       /* And remember that we saw it.  */
16023       ellipsis_p = true;
16024     }
16025   else
16026     ellipsis_p = false;
16027
16028   /* Finish the parameter list.  */
16029   if (!ellipsis_p)
16030     parameters = chainon (parameters, void_list_node);
16031
16032   return parameters;
16033 }
16034
16035 /* Parse a parameter-declaration-list.
16036
16037    parameter-declaration-list:
16038      parameter-declaration
16039      parameter-declaration-list , parameter-declaration
16040
16041    Returns a representation of the parameter-declaration-list, as for
16042    cp_parser_parameter_declaration_clause.  However, the
16043    `void_list_node' is never appended to the list.  Upon return,
16044    *IS_ERROR will be true iff an error occurred.  */
16045
16046 static tree
16047 cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
16048 {
16049   tree parameters = NULL_TREE;
16050   tree *tail = &parameters; 
16051   bool saved_in_unbraced_linkage_specification_p;
16052   int index = 0;
16053
16054   /* Assume all will go well.  */
16055   *is_error = false;
16056   /* The special considerations that apply to a function within an
16057      unbraced linkage specifications do not apply to the parameters
16058      to the function.  */
16059   saved_in_unbraced_linkage_specification_p 
16060     = parser->in_unbraced_linkage_specification_p;
16061   parser->in_unbraced_linkage_specification_p = false;
16062
16063   /* Look for more parameters.  */
16064   while (true)
16065     {
16066       cp_parameter_declarator *parameter;
16067       tree decl = error_mark_node;
16068       bool parenthesized_p = false;
16069       /* Parse the parameter.  */
16070       parameter
16071         = cp_parser_parameter_declaration (parser,
16072                                            /*template_parm_p=*/false,
16073                                            &parenthesized_p);
16074
16075       /* We don't know yet if the enclosing context is deprecated, so wait
16076          and warn in grokparms if appropriate.  */
16077       deprecated_state = DEPRECATED_SUPPRESS;
16078
16079       if (parameter)
16080         decl = grokdeclarator (parameter->declarator,
16081                                &parameter->decl_specifiers,
16082                                PARM,
16083                                parameter->default_argument != NULL_TREE,
16084                                &parameter->decl_specifiers.attributes);
16085
16086       deprecated_state = DEPRECATED_NORMAL;
16087
16088       /* If a parse error occurred parsing the parameter declaration,
16089          then the entire parameter-declaration-list is erroneous.  */
16090       if (decl == error_mark_node)
16091         {
16092           *is_error = true;
16093           parameters = error_mark_node;
16094           break;
16095         }
16096
16097       if (parameter->decl_specifiers.attributes)
16098         cplus_decl_attributes (&decl,
16099                                parameter->decl_specifiers.attributes,
16100                                0);
16101       if (DECL_NAME (decl))
16102         decl = pushdecl (decl);
16103
16104       if (decl != error_mark_node)
16105         {
16106           retrofit_lang_decl (decl);
16107           DECL_PARM_INDEX (decl) = ++index;
16108           DECL_PARM_LEVEL (decl) = function_parm_depth ();
16109         }
16110
16111       /* Add the new parameter to the list.  */
16112       *tail = build_tree_list (parameter->default_argument, decl);
16113       tail = &TREE_CHAIN (*tail);
16114
16115       /* Peek at the next token.  */
16116       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
16117           || cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
16118           /* These are for Objective-C++ */
16119           || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
16120           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
16121         /* The parameter-declaration-list is complete.  */
16122         break;
16123       else if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
16124         {
16125           cp_token *token;
16126
16127           /* Peek at the next token.  */
16128           token = cp_lexer_peek_nth_token (parser->lexer, 2);
16129           /* If it's an ellipsis, then the list is complete.  */
16130           if (token->type == CPP_ELLIPSIS)
16131             break;
16132           /* Otherwise, there must be more parameters.  Consume the
16133              `,'.  */
16134           cp_lexer_consume_token (parser->lexer);
16135           /* When parsing something like:
16136
16137                 int i(float f, double d)
16138
16139              we can tell after seeing the declaration for "f" that we
16140              are not looking at an initialization of a variable "i",
16141              but rather at the declaration of a function "i".
16142
16143              Due to the fact that the parsing of template arguments
16144              (as specified to a template-id) requires backtracking we
16145              cannot use this technique when inside a template argument
16146              list.  */
16147           if (!parser->in_template_argument_list_p
16148               && !parser->in_type_id_in_expr_p
16149               && cp_parser_uncommitted_to_tentative_parse_p (parser)
16150               /* However, a parameter-declaration of the form
16151                  "foat(f)" (which is a valid declaration of a
16152                  parameter "f") can also be interpreted as an
16153                  expression (the conversion of "f" to "float").  */
16154               && !parenthesized_p)
16155             cp_parser_commit_to_tentative_parse (parser);
16156         }
16157       else
16158         {
16159           cp_parser_error (parser, "expected %<,%> or %<...%>");
16160           if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
16161             cp_parser_skip_to_closing_parenthesis (parser,
16162                                                    /*recovering=*/true,
16163                                                    /*or_comma=*/false,
16164                                                    /*consume_paren=*/false);
16165           break;
16166         }
16167     }
16168
16169   parser->in_unbraced_linkage_specification_p
16170     = saved_in_unbraced_linkage_specification_p;
16171
16172   return parameters;
16173 }
16174
16175 /* Parse a parameter declaration.
16176
16177    parameter-declaration:
16178      decl-specifier-seq ... [opt] declarator
16179      decl-specifier-seq declarator = assignment-expression
16180      decl-specifier-seq ... [opt] abstract-declarator [opt]
16181      decl-specifier-seq abstract-declarator [opt] = assignment-expression
16182
16183    If TEMPLATE_PARM_P is TRUE, then this parameter-declaration
16184    declares a template parameter.  (In that case, a non-nested `>'
16185    token encountered during the parsing of the assignment-expression
16186    is not interpreted as a greater-than operator.)
16187
16188    Returns a representation of the parameter, or NULL if an error
16189    occurs.  If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to
16190    true iff the declarator is of the form "(p)".  */
16191
16192 static cp_parameter_declarator *
16193 cp_parser_parameter_declaration (cp_parser *parser,
16194                                  bool template_parm_p,
16195                                  bool *parenthesized_p)
16196 {
16197   int declares_class_or_enum;
16198   cp_decl_specifier_seq decl_specifiers;
16199   cp_declarator *declarator;
16200   tree default_argument;
16201   cp_token *token = NULL, *declarator_token_start = NULL;
16202   const char *saved_message;
16203
16204   /* In a template parameter, `>' is not an operator.
16205
16206      [temp.param]
16207
16208      When parsing a default template-argument for a non-type
16209      template-parameter, the first non-nested `>' is taken as the end
16210      of the template parameter-list rather than a greater-than
16211      operator.  */
16212
16213   /* Type definitions may not appear in parameter types.  */
16214   saved_message = parser->type_definition_forbidden_message;
16215   parser->type_definition_forbidden_message
16216     = G_("types may not be defined in parameter types");
16217
16218   /* Parse the declaration-specifiers.  */
16219   cp_parser_decl_specifier_seq (parser,
16220                                 CP_PARSER_FLAGS_NONE,
16221                                 &decl_specifiers,
16222                                 &declares_class_or_enum);
16223
16224   /* Complain about missing 'typename' or other invalid type names.  */
16225   if (!decl_specifiers.any_type_specifiers_p)
16226     cp_parser_parse_and_diagnose_invalid_type_name (parser);
16227
16228   /* If an error occurred, there's no reason to attempt to parse the
16229      rest of the declaration.  */
16230   if (cp_parser_error_occurred (parser))
16231     {
16232       parser->type_definition_forbidden_message = saved_message;
16233       return NULL;
16234     }
16235
16236   /* Peek at the next token.  */
16237   token = cp_lexer_peek_token (parser->lexer);
16238
16239   /* If the next token is a `)', `,', `=', `>', or `...', then there
16240      is no declarator. However, when variadic templates are enabled,
16241      there may be a declarator following `...'.  */
16242   if (token->type == CPP_CLOSE_PAREN
16243       || token->type == CPP_COMMA
16244       || token->type == CPP_EQ
16245       || token->type == CPP_GREATER)
16246     {
16247       declarator = NULL;
16248       if (parenthesized_p)
16249         *parenthesized_p = false;
16250     }
16251   /* Otherwise, there should be a declarator.  */
16252   else
16253     {
16254       bool saved_default_arg_ok_p = parser->default_arg_ok_p;
16255       parser->default_arg_ok_p = false;
16256
16257       /* After seeing a decl-specifier-seq, if the next token is not a
16258          "(", there is no possibility that the code is a valid
16259          expression.  Therefore, if parsing tentatively, we commit at
16260          this point.  */
16261       if (!parser->in_template_argument_list_p
16262           /* In an expression context, having seen:
16263
16264                (int((char ...
16265
16266              we cannot be sure whether we are looking at a
16267              function-type (taking a "char" as a parameter) or a cast
16268              of some object of type "char" to "int".  */
16269           && !parser->in_type_id_in_expr_p
16270           && cp_parser_uncommitted_to_tentative_parse_p (parser)
16271           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
16272           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
16273         cp_parser_commit_to_tentative_parse (parser);
16274       /* Parse the declarator.  */
16275       declarator_token_start = token;
16276       declarator = cp_parser_declarator (parser,
16277                                          CP_PARSER_DECLARATOR_EITHER,
16278                                          /*ctor_dtor_or_conv_p=*/NULL,
16279                                          parenthesized_p,
16280                                          /*member_p=*/false);
16281       parser->default_arg_ok_p = saved_default_arg_ok_p;
16282       /* After the declarator, allow more attributes.  */
16283       decl_specifiers.attributes
16284         = chainon (decl_specifiers.attributes,
16285                    cp_parser_attributes_opt (parser));
16286     }
16287
16288   /* If the next token is an ellipsis, and we have not seen a
16289      declarator name, and the type of the declarator contains parameter
16290      packs but it is not a TYPE_PACK_EXPANSION, then we actually have
16291      a parameter pack expansion expression. Otherwise, leave the
16292      ellipsis for a C-style variadic function. */
16293   token = cp_lexer_peek_token (parser->lexer);
16294   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16295     {
16296       tree type = decl_specifiers.type;
16297
16298       if (type && DECL_P (type))
16299         type = TREE_TYPE (type);
16300
16301       if (type
16302           && TREE_CODE (type) != TYPE_PACK_EXPANSION
16303           && declarator_can_be_parameter_pack (declarator)
16304           && (!declarator || !declarator->parameter_pack_p)
16305           && uses_parameter_packs (type))
16306         {
16307           /* Consume the `...'. */
16308           cp_lexer_consume_token (parser->lexer);
16309           maybe_warn_variadic_templates ();
16310           
16311           /* Build a pack expansion type */
16312           if (declarator)
16313             declarator->parameter_pack_p = true;
16314           else
16315             decl_specifiers.type = make_pack_expansion (type);
16316         }
16317     }
16318
16319   /* The restriction on defining new types applies only to the type
16320      of the parameter, not to the default argument.  */
16321   parser->type_definition_forbidden_message = saved_message;
16322
16323   /* If the next token is `=', then process a default argument.  */
16324   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
16325     {
16326       /* Consume the `='.  */
16327       cp_lexer_consume_token (parser->lexer);
16328
16329       /* If we are defining a class, then the tokens that make up the
16330          default argument must be saved and processed later.  */
16331       if (!template_parm_p && at_class_scope_p ()
16332           && TYPE_BEING_DEFINED (current_class_type)
16333           && !LAMBDA_TYPE_P (current_class_type))
16334         {
16335           unsigned depth = 0;
16336           int maybe_template_id = 0;
16337           cp_token *first_token;
16338           cp_token *token;
16339
16340           /* Add tokens until we have processed the entire default
16341              argument.  We add the range [first_token, token).  */
16342           first_token = cp_lexer_peek_token (parser->lexer);
16343           while (true)
16344             {
16345               bool done = false;
16346
16347               /* Peek at the next token.  */
16348               token = cp_lexer_peek_token (parser->lexer);
16349               /* What we do depends on what token we have.  */
16350               switch (token->type)
16351                 {
16352                   /* In valid code, a default argument must be
16353                      immediately followed by a `,' `)', or `...'.  */
16354                 case CPP_COMMA:
16355                   if (depth == 0 && maybe_template_id)
16356                     {
16357                       /* If we've seen a '<', we might be in a
16358                          template-argument-list.  Until Core issue 325 is
16359                          resolved, we don't know how this situation ought
16360                          to be handled, so try to DTRT.  We check whether
16361                          what comes after the comma is a valid parameter
16362                          declaration list.  If it is, then the comma ends
16363                          the default argument; otherwise the default
16364                          argument continues.  */
16365                       bool error = false;
16366                       tree t;
16367
16368                       /* Set ITALP so cp_parser_parameter_declaration_list
16369                          doesn't decide to commit to this parse.  */
16370                       bool saved_italp = parser->in_template_argument_list_p;
16371                       parser->in_template_argument_list_p = true;
16372
16373                       cp_parser_parse_tentatively (parser);
16374                       cp_lexer_consume_token (parser->lexer);
16375                       begin_scope (sk_function_parms, NULL_TREE);
16376                       cp_parser_parameter_declaration_list (parser, &error);
16377                       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
16378                         pop_binding (DECL_NAME (t), t);
16379                       leave_scope ();
16380                       if (!cp_parser_error_occurred (parser) && !error)
16381                         done = true;
16382                       cp_parser_abort_tentative_parse (parser);
16383
16384                       parser->in_template_argument_list_p = saved_italp;
16385                       break;
16386                     }
16387                 case CPP_CLOSE_PAREN:
16388                 case CPP_ELLIPSIS:
16389                   /* If we run into a non-nested `;', `}', or `]',
16390                      then the code is invalid -- but the default
16391                      argument is certainly over.  */
16392                 case CPP_SEMICOLON:
16393                 case CPP_CLOSE_BRACE:
16394                 case CPP_CLOSE_SQUARE:
16395                   if (depth == 0)
16396                     done = true;
16397                   /* Update DEPTH, if necessary.  */
16398                   else if (token->type == CPP_CLOSE_PAREN
16399                            || token->type == CPP_CLOSE_BRACE
16400                            || token->type == CPP_CLOSE_SQUARE)
16401                     --depth;
16402                   break;
16403
16404                 case CPP_OPEN_PAREN:
16405                 case CPP_OPEN_SQUARE:
16406                 case CPP_OPEN_BRACE:
16407                   ++depth;
16408                   break;
16409
16410                 case CPP_LESS:
16411                   if (depth == 0)
16412                     /* This might be the comparison operator, or it might
16413                        start a template argument list.  */
16414                     ++maybe_template_id;
16415                   break;
16416
16417                 case CPP_RSHIFT:
16418                   if (cxx_dialect == cxx98)
16419                     break;
16420                   /* Fall through for C++0x, which treats the `>>'
16421                      operator like two `>' tokens in certain
16422                      cases.  */
16423
16424                 case CPP_GREATER:
16425                   if (depth == 0)
16426                     {
16427                       /* This might be an operator, or it might close a
16428                          template argument list.  But if a previous '<'
16429                          started a template argument list, this will have
16430                          closed it, so we can't be in one anymore.  */
16431                       maybe_template_id -= 1 + (token->type == CPP_RSHIFT);
16432                       if (maybe_template_id < 0)
16433                         maybe_template_id = 0;
16434                     }
16435                   break;
16436
16437                   /* If we run out of tokens, issue an error message.  */
16438                 case CPP_EOF:
16439                 case CPP_PRAGMA_EOL:
16440                   error_at (token->location, "file ends in default argument");
16441                   done = true;
16442                   break;
16443
16444                 case CPP_NAME:
16445                 case CPP_SCOPE:
16446                   /* In these cases, we should look for template-ids.
16447                      For example, if the default argument is
16448                      `X<int, double>()', we need to do name lookup to
16449                      figure out whether or not `X' is a template; if
16450                      so, the `,' does not end the default argument.
16451
16452                      That is not yet done.  */
16453                   break;
16454
16455                 default:
16456                   break;
16457                 }
16458
16459               /* If we've reached the end, stop.  */
16460               if (done)
16461                 break;
16462
16463               /* Add the token to the token block.  */
16464               token = cp_lexer_consume_token (parser->lexer);
16465             }
16466
16467           /* Create a DEFAULT_ARG to represent the unparsed default
16468              argument.  */
16469           default_argument = make_node (DEFAULT_ARG);
16470           DEFARG_TOKENS (default_argument)
16471             = cp_token_cache_new (first_token, token);
16472           DEFARG_INSTANTIATIONS (default_argument) = NULL;
16473         }
16474       /* Outside of a class definition, we can just parse the
16475          assignment-expression.  */
16476       else
16477         {
16478           token = cp_lexer_peek_token (parser->lexer);
16479           default_argument 
16480             = cp_parser_default_argument (parser, template_parm_p);
16481         }
16482
16483       if (!parser->default_arg_ok_p)
16484         {
16485           if (flag_permissive)
16486             warning (0, "deprecated use of default argument for parameter of non-function");
16487           else
16488             {
16489               error_at (token->location,
16490                         "default arguments are only "
16491                         "permitted for function parameters");
16492               default_argument = NULL_TREE;
16493             }
16494         }
16495       else if ((declarator && declarator->parameter_pack_p)
16496                || (decl_specifiers.type
16497                    && PACK_EXPANSION_P (decl_specifiers.type)))
16498         {
16499           /* Find the name of the parameter pack.  */     
16500           cp_declarator *id_declarator = declarator;
16501           while (id_declarator && id_declarator->kind != cdk_id)
16502             id_declarator = id_declarator->declarator;
16503           
16504           if (id_declarator && id_declarator->kind == cdk_id)
16505             error_at (declarator_token_start->location,
16506                       template_parm_p 
16507                       ? "template parameter pack %qD"
16508                       " cannot have a default argument"
16509                       : "parameter pack %qD cannot have a default argument",
16510                       id_declarator->u.id.unqualified_name);
16511           else
16512             error_at (declarator_token_start->location,
16513                       template_parm_p 
16514                       ? "template parameter pack cannot have a default argument"
16515                       : "parameter pack cannot have a default argument");
16516           
16517           default_argument = NULL_TREE;
16518         }
16519     }
16520   else
16521     default_argument = NULL_TREE;
16522
16523   return make_parameter_declarator (&decl_specifiers,
16524                                     declarator,
16525                                     default_argument);
16526 }
16527
16528 /* Parse a default argument and return it.
16529
16530    TEMPLATE_PARM_P is true if this is a default argument for a
16531    non-type template parameter.  */
16532 static tree
16533 cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
16534 {
16535   tree default_argument = NULL_TREE;
16536   bool saved_greater_than_is_operator_p;
16537   bool saved_local_variables_forbidden_p;
16538   bool non_constant_p;
16539
16540   /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
16541      set correctly.  */
16542   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
16543   parser->greater_than_is_operator_p = !template_parm_p;
16544   /* Local variable names (and the `this' keyword) may not
16545      appear in a default argument.  */
16546   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
16547   parser->local_variables_forbidden_p = true;
16548   /* Parse the assignment-expression.  */
16549   if (template_parm_p)
16550     push_deferring_access_checks (dk_no_deferred);
16551   default_argument
16552     = cp_parser_initializer_clause (parser, &non_constant_p);
16553   if (BRACE_ENCLOSED_INITIALIZER_P (default_argument))
16554     maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
16555   if (template_parm_p)
16556     pop_deferring_access_checks ();
16557   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
16558   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
16559
16560   return default_argument;
16561 }
16562
16563 /* Parse a function-body.
16564
16565    function-body:
16566      compound_statement  */
16567
16568 static void
16569 cp_parser_function_body (cp_parser *parser)
16570 {
16571   cp_parser_compound_statement (parser, NULL, false, true);
16572 }
16573
16574 /* Parse a ctor-initializer-opt followed by a function-body.  Return
16575    true if a ctor-initializer was present.  */
16576
16577 static bool
16578 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
16579 {
16580   tree body, list;
16581   bool ctor_initializer_p;
16582   const bool check_body_p =
16583      DECL_CONSTRUCTOR_P (current_function_decl)
16584      && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
16585   tree last = NULL;
16586
16587   /* Begin the function body.  */
16588   body = begin_function_body ();
16589   /* Parse the optional ctor-initializer.  */
16590   ctor_initializer_p = cp_parser_ctor_initializer_opt (parser);
16591
16592   /* If we're parsing a constexpr constructor definition, we need
16593      to check that the constructor body is indeed empty.  However,
16594      before we get to cp_parser_function_body lot of junk has been
16595      generated, so we can't just check that we have an empty block.
16596      Rather we take a snapshot of the outermost block, and check whether
16597      cp_parser_function_body changed its state.  */
16598   if (check_body_p)
16599     {
16600       list = body;
16601       if (TREE_CODE (list) == BIND_EXPR)
16602         list = BIND_EXPR_BODY (list);
16603       if (TREE_CODE (list) == STATEMENT_LIST
16604           && STATEMENT_LIST_TAIL (list) != NULL)
16605         last = STATEMENT_LIST_TAIL (list)->stmt;
16606     }
16607   /* Parse the function-body.  */
16608   cp_parser_function_body (parser);
16609   if (check_body_p)
16610     check_constexpr_ctor_body (last, list);
16611   /* Finish the function body.  */
16612   finish_function_body (body);
16613
16614   return ctor_initializer_p;
16615 }
16616
16617 /* Parse an initializer.
16618
16619    initializer:
16620      = initializer-clause
16621      ( expression-list )
16622
16623    Returns an expression representing the initializer.  If no
16624    initializer is present, NULL_TREE is returned.
16625
16626    *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
16627    production is used, and TRUE otherwise.  *IS_DIRECT_INIT is
16628    set to TRUE if there is no initializer present.  If there is an
16629    initializer, and it is not a constant-expression, *NON_CONSTANT_P
16630    is set to true; otherwise it is set to false.  */
16631
16632 static tree
16633 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
16634                        bool* non_constant_p)
16635 {
16636   cp_token *token;
16637   tree init;
16638
16639   /* Peek at the next token.  */
16640   token = cp_lexer_peek_token (parser->lexer);
16641
16642   /* Let our caller know whether or not this initializer was
16643      parenthesized.  */
16644   *is_direct_init = (token->type != CPP_EQ);
16645   /* Assume that the initializer is constant.  */
16646   *non_constant_p = false;
16647
16648   if (token->type == CPP_EQ)
16649     {
16650       /* Consume the `='.  */
16651       cp_lexer_consume_token (parser->lexer);
16652       /* Parse the initializer-clause.  */
16653       init = cp_parser_initializer_clause (parser, non_constant_p);
16654     }
16655   else if (token->type == CPP_OPEN_PAREN)
16656     {
16657       VEC(tree,gc) *vec;
16658       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
16659                                                      /*cast_p=*/false,
16660                                                      /*allow_expansion_p=*/true,
16661                                                      non_constant_p);
16662       if (vec == NULL)
16663         return error_mark_node;
16664       init = build_tree_list_vec (vec);
16665       release_tree_vector (vec);
16666     }
16667   else if (token->type == CPP_OPEN_BRACE)
16668     {
16669       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
16670       init = cp_parser_braced_list (parser, non_constant_p);
16671       CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
16672     }
16673   else
16674     {
16675       /* Anything else is an error.  */
16676       cp_parser_error (parser, "expected initializer");
16677       init = error_mark_node;
16678     }
16679
16680   return init;
16681 }
16682
16683 /* Parse an initializer-clause.
16684
16685    initializer-clause:
16686      assignment-expression
16687      braced-init-list
16688
16689    Returns an expression representing the initializer.
16690
16691    If the `assignment-expression' production is used the value
16692    returned is simply a representation for the expression.
16693
16694    Otherwise, calls cp_parser_braced_list.  */
16695
16696 static tree
16697 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
16698 {
16699   tree initializer;
16700
16701   /* Assume the expression is constant.  */
16702   *non_constant_p = false;
16703
16704   /* If it is not a `{', then we are looking at an
16705      assignment-expression.  */
16706   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
16707     {
16708       initializer
16709         = cp_parser_constant_expression (parser,
16710                                         /*allow_non_constant_p=*/true,
16711                                         non_constant_p);
16712     }
16713   else
16714     initializer = cp_parser_braced_list (parser, non_constant_p);
16715
16716   return initializer;
16717 }
16718
16719 /* Parse a brace-enclosed initializer list.
16720
16721    braced-init-list:
16722      { initializer-list , [opt] }
16723      { }
16724
16725    Returns a CONSTRUCTOR.  The CONSTRUCTOR_ELTS will be
16726    the elements of the initializer-list (or NULL, if the last
16727    production is used).  The TREE_TYPE for the CONSTRUCTOR will be
16728    NULL_TREE.  There is no way to detect whether or not the optional
16729    trailing `,' was provided.  NON_CONSTANT_P is as for
16730    cp_parser_initializer.  */     
16731
16732 static tree
16733 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
16734 {
16735   tree initializer;
16736
16737   /* Consume the `{' token.  */
16738   cp_lexer_consume_token (parser->lexer);
16739   /* Create a CONSTRUCTOR to represent the braced-initializer.  */
16740   initializer = make_node (CONSTRUCTOR);
16741   /* If it's not a `}', then there is a non-trivial initializer.  */
16742   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
16743     {
16744       /* Parse the initializer list.  */
16745       CONSTRUCTOR_ELTS (initializer)
16746         = cp_parser_initializer_list (parser, non_constant_p);
16747       /* A trailing `,' token is allowed.  */
16748       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
16749         cp_lexer_consume_token (parser->lexer);
16750     }
16751   /* Now, there should be a trailing `}'.  */
16752   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16753   TREE_TYPE (initializer) = init_list_type_node;
16754   return initializer;
16755 }
16756
16757 /* Parse an initializer-list.
16758
16759    initializer-list:
16760      initializer-clause ... [opt]
16761      initializer-list , initializer-clause ... [opt]
16762
16763    GNU Extension:
16764
16765    initializer-list:
16766      designation initializer-clause ...[opt]
16767      initializer-list , designation initializer-clause ...[opt]
16768
16769    designation:
16770      . identifier =
16771      identifier :
16772      [ constant-expression ] =
16773
16774    Returns a VEC of constructor_elt.  The VALUE of each elt is an expression
16775    for the initializer.  If the INDEX of the elt is non-NULL, it is the
16776    IDENTIFIER_NODE naming the field to initialize.  NON_CONSTANT_P is
16777    as for cp_parser_initializer.  */
16778
16779 static VEC(constructor_elt,gc) *
16780 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
16781 {
16782   VEC(constructor_elt,gc) *v = NULL;
16783
16784   /* Assume all of the expressions are constant.  */
16785   *non_constant_p = false;
16786
16787   /* Parse the rest of the list.  */
16788   while (true)
16789     {
16790       cp_token *token;
16791       tree designator;
16792       tree initializer;
16793       bool clause_non_constant_p;
16794
16795       /* If the next token is an identifier and the following one is a
16796          colon, we are looking at the GNU designated-initializer
16797          syntax.  */
16798       if (cp_parser_allow_gnu_extensions_p (parser)
16799           && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
16800           && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
16801         {
16802           /* Warn the user that they are using an extension.  */
16803           pedwarn (input_location, OPT_pedantic, 
16804                    "ISO C++ does not allow designated initializers");
16805           /* Consume the identifier.  */
16806           designator = cp_lexer_consume_token (parser->lexer)->u.value;
16807           /* Consume the `:'.  */
16808           cp_lexer_consume_token (parser->lexer);
16809         }
16810       /* Also handle the C99 syntax, '. id ='.  */
16811       else if (cp_parser_allow_gnu_extensions_p (parser)
16812                && cp_lexer_next_token_is (parser->lexer, CPP_DOT)
16813                && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
16814                && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ)
16815         {
16816           /* Warn the user that they are using an extension.  */
16817           pedwarn (input_location, OPT_pedantic,
16818                    "ISO C++ does not allow C99 designated initializers");
16819           /* Consume the `.'.  */
16820           cp_lexer_consume_token (parser->lexer);
16821           /* Consume the identifier.  */
16822           designator = cp_lexer_consume_token (parser->lexer)->u.value;
16823           /* Consume the `='.  */
16824           cp_lexer_consume_token (parser->lexer);
16825         }
16826       /* Also handle C99 array designators, '[ const ] ='.  */
16827       else if (cp_parser_allow_gnu_extensions_p (parser)
16828                && !c_dialect_objc ()
16829                && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
16830         {
16831           cp_lexer_consume_token (parser->lexer);
16832           designator = cp_parser_constant_expression (parser, false, NULL);
16833           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
16834           cp_parser_require (parser, CPP_EQ, RT_EQ);
16835         }
16836       else
16837         designator = NULL_TREE;
16838
16839       /* Parse the initializer.  */
16840       initializer = cp_parser_initializer_clause (parser,
16841                                                   &clause_non_constant_p);
16842       /* If any clause is non-constant, so is the entire initializer.  */
16843       if (clause_non_constant_p)
16844         *non_constant_p = true;
16845
16846       /* If we have an ellipsis, this is an initializer pack
16847          expansion.  */
16848       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16849         {
16850           /* Consume the `...'.  */
16851           cp_lexer_consume_token (parser->lexer);
16852
16853           /* Turn the initializer into an initializer expansion.  */
16854           initializer = make_pack_expansion (initializer);
16855         }
16856
16857       /* Add it to the vector.  */
16858       CONSTRUCTOR_APPEND_ELT (v, designator, initializer);
16859
16860       /* If the next token is not a comma, we have reached the end of
16861          the list.  */
16862       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
16863         break;
16864
16865       /* Peek at the next token.  */
16866       token = cp_lexer_peek_nth_token (parser->lexer, 2);
16867       /* If the next token is a `}', then we're still done.  An
16868          initializer-clause can have a trailing `,' after the
16869          initializer-list and before the closing `}'.  */
16870       if (token->type == CPP_CLOSE_BRACE)
16871         break;
16872
16873       /* Consume the `,' token.  */
16874       cp_lexer_consume_token (parser->lexer);
16875     }
16876
16877   return v;
16878 }
16879
16880 /* Classes [gram.class] */
16881
16882 /* Parse a class-name.
16883
16884    class-name:
16885      identifier
16886      template-id
16887
16888    TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
16889    to indicate that names looked up in dependent types should be
16890    assumed to be types.  TEMPLATE_KEYWORD_P is true iff the `template'
16891    keyword has been used to indicate that the name that appears next
16892    is a template.  TAG_TYPE indicates the explicit tag given before
16893    the type name, if any.  If CHECK_DEPENDENCY_P is FALSE, names are
16894    looked up in dependent scopes.  If CLASS_HEAD_P is TRUE, this class
16895    is the class being defined in a class-head.
16896
16897    Returns the TYPE_DECL representing the class.  */
16898
16899 static tree
16900 cp_parser_class_name (cp_parser *parser,
16901                       bool typename_keyword_p,
16902                       bool template_keyword_p,
16903                       enum tag_types tag_type,
16904                       bool check_dependency_p,
16905                       bool class_head_p,
16906                       bool is_declaration)
16907 {
16908   tree decl;
16909   tree scope;
16910   bool typename_p;
16911   cp_token *token;
16912   tree identifier = NULL_TREE;
16913
16914   /* All class-names start with an identifier.  */
16915   token = cp_lexer_peek_token (parser->lexer);
16916   if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
16917     {
16918       cp_parser_error (parser, "expected class-name");
16919       return error_mark_node;
16920     }
16921
16922   /* PARSER->SCOPE can be cleared when parsing the template-arguments
16923      to a template-id, so we save it here.  */
16924   scope = parser->scope;
16925   if (scope == error_mark_node)
16926     return error_mark_node;
16927
16928   /* Any name names a type if we're following the `typename' keyword
16929      in a qualified name where the enclosing scope is type-dependent.  */
16930   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
16931                 && dependent_type_p (scope));
16932   /* Handle the common case (an identifier, but not a template-id)
16933      efficiently.  */
16934   if (token->type == CPP_NAME
16935       && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
16936     {
16937       cp_token *identifier_token;
16938       bool ambiguous_p;
16939
16940       /* Look for the identifier.  */
16941       identifier_token = cp_lexer_peek_token (parser->lexer);
16942       ambiguous_p = identifier_token->ambiguous_p;
16943       identifier = cp_parser_identifier (parser);
16944       /* If the next token isn't an identifier, we are certainly not
16945          looking at a class-name.  */
16946       if (identifier == error_mark_node)
16947         decl = error_mark_node;
16948       /* If we know this is a type-name, there's no need to look it
16949          up.  */
16950       else if (typename_p)
16951         decl = identifier;
16952       else
16953         {
16954           tree ambiguous_decls;
16955           /* If we already know that this lookup is ambiguous, then
16956              we've already issued an error message; there's no reason
16957              to check again.  */
16958           if (ambiguous_p)
16959             {
16960               cp_parser_simulate_error (parser);
16961               return error_mark_node;
16962             }
16963           /* If the next token is a `::', then the name must be a type
16964              name.
16965
16966              [basic.lookup.qual]
16967
16968              During the lookup for a name preceding the :: scope
16969              resolution operator, object, function, and enumerator
16970              names are ignored.  */
16971           if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16972             tag_type = typename_type;
16973           /* Look up the name.  */
16974           decl = cp_parser_lookup_name (parser, identifier,
16975                                         tag_type,
16976                                         /*is_template=*/false,
16977                                         /*is_namespace=*/false,
16978                                         check_dependency_p,
16979                                         &ambiguous_decls,
16980                                         identifier_token->location);
16981           if (ambiguous_decls)
16982             {
16983               if (cp_parser_parsing_tentatively (parser))
16984                 cp_parser_simulate_error (parser);
16985               return error_mark_node;
16986             }
16987         }
16988     }
16989   else
16990     {
16991       /* Try a template-id.  */
16992       decl = cp_parser_template_id (parser, template_keyword_p,
16993                                     check_dependency_p,
16994                                     is_declaration);
16995       if (decl == error_mark_node)
16996         return error_mark_node;
16997     }
16998
16999   decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
17000
17001   /* If this is a typename, create a TYPENAME_TYPE.  */
17002   if (typename_p && decl != error_mark_node)
17003     {
17004       decl = make_typename_type (scope, decl, typename_type,
17005                                  /*complain=*/tf_error);
17006       if (decl != error_mark_node)
17007         decl = TYPE_NAME (decl);
17008     }
17009
17010   /* Check to see that it is really the name of a class.  */
17011   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
17012       && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
17013       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
17014     /* Situations like this:
17015
17016          template <typename T> struct A {
17017            typename T::template X<int>::I i;
17018          };
17019
17020        are problematic.  Is `T::template X<int>' a class-name?  The
17021        standard does not seem to be definitive, but there is no other
17022        valid interpretation of the following `::'.  Therefore, those
17023        names are considered class-names.  */
17024     {
17025       decl = make_typename_type (scope, decl, tag_type, tf_error);
17026       if (decl != error_mark_node)
17027         decl = TYPE_NAME (decl);
17028     }
17029   else if (TREE_CODE (decl) != TYPE_DECL
17030            || TREE_TYPE (decl) == error_mark_node
17031            || !MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
17032            /* In Objective-C 2.0, a classname followed by '.' starts a
17033               dot-syntax expression, and it's not a type-name.  */
17034            || (c_dialect_objc ()
17035                && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT 
17036                && objc_is_class_name (decl)))
17037     decl = error_mark_node;
17038
17039   if (decl == error_mark_node)
17040     cp_parser_error (parser, "expected class-name");
17041   else if (identifier && !parser->scope)
17042     maybe_note_name_used_in_class (identifier, decl);
17043
17044   return decl;
17045 }
17046
17047 /* Parse a class-specifier.
17048
17049    class-specifier:
17050      class-head { member-specification [opt] }
17051
17052    Returns the TREE_TYPE representing the class.  */
17053
17054 static tree
17055 cp_parser_class_specifier_1 (cp_parser* parser)
17056 {
17057   tree type;
17058   tree attributes = NULL_TREE;
17059   bool nested_name_specifier_p;
17060   unsigned saved_num_template_parameter_lists;
17061   bool saved_in_function_body;
17062   unsigned char in_statement;
17063   bool in_switch_statement_p;
17064   bool saved_in_unbraced_linkage_specification_p;
17065   tree old_scope = NULL_TREE;
17066   tree scope = NULL_TREE;
17067   tree bases;
17068   cp_token *closing_brace;
17069
17070   push_deferring_access_checks (dk_no_deferred);
17071
17072   /* Parse the class-head.  */
17073   type = cp_parser_class_head (parser,
17074                                &nested_name_specifier_p,
17075                                &attributes,
17076                                &bases);
17077   /* If the class-head was a semantic disaster, skip the entire body
17078      of the class.  */
17079   if (!type)
17080     {
17081       cp_parser_skip_to_end_of_block_or_statement (parser);
17082       pop_deferring_access_checks ();
17083       return error_mark_node;
17084     }
17085
17086   /* Look for the `{'.  */
17087   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
17088     {
17089       pop_deferring_access_checks ();
17090       return error_mark_node;
17091     }
17092
17093   /* Process the base classes. If they're invalid, skip the 
17094      entire class body.  */
17095   if (!xref_basetypes (type, bases))
17096     {
17097       /* Consuming the closing brace yields better error messages
17098          later on.  */
17099       if (cp_parser_skip_to_closing_brace (parser))
17100         cp_lexer_consume_token (parser->lexer);
17101       pop_deferring_access_checks ();
17102       return error_mark_node;
17103     }
17104
17105   /* Issue an error message if type-definitions are forbidden here.  */
17106   cp_parser_check_type_definition (parser);
17107   /* Remember that we are defining one more class.  */
17108   ++parser->num_classes_being_defined;
17109   /* Inside the class, surrounding template-parameter-lists do not
17110      apply.  */
17111   saved_num_template_parameter_lists
17112     = parser->num_template_parameter_lists;
17113   parser->num_template_parameter_lists = 0;
17114   /* We are not in a function body.  */
17115   saved_in_function_body = parser->in_function_body;
17116   parser->in_function_body = false;
17117   /* Or in a loop.  */
17118   in_statement = parser->in_statement;
17119   parser->in_statement = 0;
17120   /* Or in a switch.  */
17121   in_switch_statement_p = parser->in_switch_statement_p;
17122   parser->in_switch_statement_p = false;
17123   /* We are not immediately inside an extern "lang" block.  */
17124   saved_in_unbraced_linkage_specification_p
17125     = parser->in_unbraced_linkage_specification_p;
17126   parser->in_unbraced_linkage_specification_p = false;
17127
17128   /* Start the class.  */
17129   if (nested_name_specifier_p)
17130     {
17131       scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
17132       old_scope = push_inner_scope (scope);
17133     }
17134   type = begin_class_definition (type, attributes);
17135
17136   if (type == error_mark_node)
17137     /* If the type is erroneous, skip the entire body of the class.  */
17138     cp_parser_skip_to_closing_brace (parser);
17139   else
17140     /* Parse the member-specification.  */
17141     cp_parser_member_specification_opt (parser);
17142
17143   /* Look for the trailing `}'.  */
17144   closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
17145   /* Look for trailing attributes to apply to this class.  */
17146   if (cp_parser_allow_gnu_extensions_p (parser))
17147     attributes = cp_parser_attributes_opt (parser);
17148   if (type != error_mark_node)
17149     type = finish_struct (type, attributes);
17150   if (nested_name_specifier_p)
17151     pop_inner_scope (old_scope, scope);
17152
17153   /* We've finished a type definition.  Check for the common syntax
17154      error of forgetting a semicolon after the definition.  We need to
17155      be careful, as we can't just check for not-a-semicolon and be done
17156      with it; the user might have typed:
17157
17158      class X { } c = ...;
17159      class X { } *p = ...;
17160
17161      and so forth.  Instead, enumerate all the possible tokens that
17162      might follow this production; if we don't see one of them, then
17163      complain and silently insert the semicolon.  */
17164   {
17165     cp_token *token = cp_lexer_peek_token (parser->lexer);
17166     bool want_semicolon = true;
17167
17168     switch (token->type)
17169       {
17170       case CPP_NAME:
17171       case CPP_SEMICOLON:
17172       case CPP_MULT:
17173       case CPP_AND:
17174       case CPP_OPEN_PAREN:
17175       case CPP_CLOSE_PAREN:
17176       case CPP_COMMA:
17177         want_semicolon = false;
17178         break;
17179
17180         /* While it's legal for type qualifiers and storage class
17181            specifiers to follow type definitions in the grammar, only
17182            compiler testsuites contain code like that.  Assume that if
17183            we see such code, then what we're really seeing is a case
17184            like:
17185
17186            class X { }
17187            const <type> var = ...;
17188
17189            or
17190
17191            class Y { }
17192            static <type> func (...) ...
17193
17194            i.e. the qualifier or specifier applies to the next
17195            declaration.  To do so, however, we need to look ahead one
17196            more token to see if *that* token is a type specifier.
17197
17198            This code could be improved to handle:
17199
17200            class Z { }
17201            static const <type> var = ...;  */
17202       case CPP_KEYWORD:
17203         if (keyword_is_decl_specifier (token->keyword))
17204           {
17205             cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
17206
17207             /* Handling user-defined types here would be nice, but very
17208                tricky.  */
17209             want_semicolon
17210               = (lookahead->type == CPP_KEYWORD
17211                  && keyword_begins_type_specifier (lookahead->keyword));
17212           }
17213         break;
17214       default:
17215         break;
17216       }
17217
17218     /* If we don't have a type, then something is very wrong and we
17219        shouldn't try to do anything clever.  Likewise for not seeing the
17220        closing brace.  */
17221     if (closing_brace && TYPE_P (type) && want_semicolon)
17222       {
17223         cp_token_position prev
17224           = cp_lexer_previous_token_position (parser->lexer);
17225         cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
17226         location_t loc = prev_token->location;
17227
17228         if (CLASSTYPE_DECLARED_CLASS (type))
17229           error_at (loc, "expected %<;%> after class definition");
17230         else if (TREE_CODE (type) == RECORD_TYPE)
17231           error_at (loc, "expected %<;%> after struct definition");
17232         else if (TREE_CODE (type) == UNION_TYPE)
17233           error_at (loc, "expected %<;%> after union definition");
17234         else
17235           gcc_unreachable ();
17236
17237         /* Unget one token and smash it to look as though we encountered
17238            a semicolon in the input stream.  */
17239         cp_lexer_set_token_position (parser->lexer, prev);
17240         token = cp_lexer_peek_token (parser->lexer);
17241         token->type = CPP_SEMICOLON;
17242         token->keyword = RID_MAX;
17243       }
17244   }
17245
17246   /* If this class is not itself within the scope of another class,
17247      then we need to parse the bodies of all of the queued function
17248      definitions.  Note that the queued functions defined in a class
17249      are not always processed immediately following the
17250      class-specifier for that class.  Consider:
17251
17252        struct A {
17253          struct B { void f() { sizeof (A); } };
17254        };
17255
17256      If `f' were processed before the processing of `A' were
17257      completed, there would be no way to compute the size of `A'.
17258      Note that the nesting we are interested in here is lexical --
17259      not the semantic nesting given by TYPE_CONTEXT.  In particular,
17260      for:
17261
17262        struct A { struct B; };
17263        struct A::B { void f() { } };
17264
17265      there is no need to delay the parsing of `A::B::f'.  */
17266   if (--parser->num_classes_being_defined == 0)
17267     {
17268       tree fn;
17269       tree class_type = NULL_TREE;
17270       tree pushed_scope = NULL_TREE;
17271       unsigned ix;
17272       cp_default_arg_entry *e;
17273
17274       /* In a first pass, parse default arguments to the functions.
17275          Then, in a second pass, parse the bodies of the functions.
17276          This two-phased approach handles cases like:
17277
17278             struct S {
17279               void f() { g(); }
17280               void g(int i = 3);
17281             };
17282
17283          */
17284       FOR_EACH_VEC_ELT (cp_default_arg_entry, unparsed_funs_with_default_args,
17285                         ix, e)
17286         {
17287           fn = e->decl;
17288           /* If there are default arguments that have not yet been processed,
17289              take care of them now.  */
17290           if (class_type != e->class_type)
17291             {
17292               if (pushed_scope)
17293                 pop_scope (pushed_scope);
17294               class_type = e->class_type;
17295               pushed_scope = push_scope (class_type);
17296             }
17297           /* Make sure that any template parameters are in scope.  */
17298           maybe_begin_member_template_processing (fn);
17299           /* Parse the default argument expressions.  */
17300           cp_parser_late_parsing_default_args (parser, fn);
17301           /* Remove any template parameters from the symbol table.  */
17302           maybe_end_member_template_processing ();
17303         }
17304       if (pushed_scope)
17305         pop_scope (pushed_scope);
17306       VEC_truncate (cp_default_arg_entry, unparsed_funs_with_default_args, 0);
17307       /* Now parse the body of the functions.  */
17308       FOR_EACH_VEC_ELT (tree, unparsed_funs_with_definitions, ix, fn)
17309         cp_parser_late_parsing_for_member (parser, fn);
17310       VEC_truncate (tree, unparsed_funs_with_definitions, 0);
17311     }
17312
17313   /* Put back any saved access checks.  */
17314   pop_deferring_access_checks ();
17315
17316   /* Restore saved state.  */
17317   parser->in_switch_statement_p = in_switch_statement_p;
17318   parser->in_statement = in_statement;
17319   parser->in_function_body = saved_in_function_body;
17320   parser->num_template_parameter_lists
17321     = saved_num_template_parameter_lists;
17322   parser->in_unbraced_linkage_specification_p
17323     = saved_in_unbraced_linkage_specification_p;
17324
17325   return type;
17326 }
17327
17328 static tree
17329 cp_parser_class_specifier (cp_parser* parser)
17330 {
17331   tree ret;
17332   timevar_push (TV_PARSE_STRUCT);
17333   ret = cp_parser_class_specifier_1 (parser);
17334   timevar_pop (TV_PARSE_STRUCT);
17335   return ret;
17336 }
17337
17338 /* Parse a class-head.
17339
17340    class-head:
17341      class-key identifier [opt] base-clause [opt]
17342      class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
17343      class-key nested-name-specifier [opt] template-id
17344        base-clause [opt]
17345
17346    class-virt-specifier:
17347      final
17348
17349    GNU Extensions:
17350      class-key attributes identifier [opt] base-clause [opt]
17351      class-key attributes nested-name-specifier identifier base-clause [opt]
17352      class-key attributes nested-name-specifier [opt] template-id
17353        base-clause [opt]
17354
17355    Upon return BASES is initialized to the list of base classes (or
17356    NULL, if there are none) in the same form returned by
17357    cp_parser_base_clause.
17358
17359    Returns the TYPE of the indicated class.  Sets
17360    *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
17361    involving a nested-name-specifier was used, and FALSE otherwise.
17362
17363    Returns error_mark_node if this is not a class-head.
17364
17365    Returns NULL_TREE if the class-head is syntactically valid, but
17366    semantically invalid in a way that means we should skip the entire
17367    body of the class.  */
17368
17369 static tree
17370 cp_parser_class_head (cp_parser* parser,
17371                       bool* nested_name_specifier_p,
17372                       tree *attributes_p,
17373                       tree *bases)
17374 {
17375   tree nested_name_specifier;
17376   enum tag_types class_key;
17377   tree id = NULL_TREE;
17378   tree type = NULL_TREE;
17379   tree attributes;
17380   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
17381   bool template_id_p = false;
17382   bool qualified_p = false;
17383   bool invalid_nested_name_p = false;
17384   bool invalid_explicit_specialization_p = false;
17385   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17386   tree pushed_scope = NULL_TREE;
17387   unsigned num_templates;
17388   cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
17389   /* Assume no nested-name-specifier will be present.  */
17390   *nested_name_specifier_p = false;
17391   /* Assume no template parameter lists will be used in defining the
17392      type.  */
17393   num_templates = 0;
17394   parser->colon_corrects_to_scope_p = false;
17395
17396   *bases = NULL_TREE;
17397
17398   /* Look for the class-key.  */
17399   class_key = cp_parser_class_key (parser);
17400   if (class_key == none_type)
17401     return error_mark_node;
17402
17403   /* Parse the attributes.  */
17404   attributes = cp_parser_attributes_opt (parser);
17405
17406   /* If the next token is `::', that is invalid -- but sometimes
17407      people do try to write:
17408
17409        struct ::S {};
17410
17411      Handle this gracefully by accepting the extra qualifier, and then
17412      issuing an error about it later if this really is a
17413      class-head.  If it turns out just to be an elaborated type
17414      specifier, remain silent.  */
17415   if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
17416     qualified_p = true;
17417
17418   push_deferring_access_checks (dk_no_check);
17419
17420   /* Determine the name of the class.  Begin by looking for an
17421      optional nested-name-specifier.  */
17422   nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
17423   nested_name_specifier
17424     = cp_parser_nested_name_specifier_opt (parser,
17425                                            /*typename_keyword_p=*/false,
17426                                            /*check_dependency_p=*/false,
17427                                            /*type_p=*/false,
17428                                            /*is_declaration=*/false);
17429   /* If there was a nested-name-specifier, then there *must* be an
17430      identifier.  */
17431   if (nested_name_specifier)
17432     {
17433       type_start_token = cp_lexer_peek_token (parser->lexer);
17434       /* Although the grammar says `identifier', it really means
17435          `class-name' or `template-name'.  You are only allowed to
17436          define a class that has already been declared with this
17437          syntax.
17438
17439          The proposed resolution for Core Issue 180 says that wherever
17440          you see `class T::X' you should treat `X' as a type-name.
17441
17442          It is OK to define an inaccessible class; for example:
17443
17444            class A { class B; };
17445            class A::B {};
17446
17447          We do not know if we will see a class-name, or a
17448          template-name.  We look for a class-name first, in case the
17449          class-name is a template-id; if we looked for the
17450          template-name first we would stop after the template-name.  */
17451       cp_parser_parse_tentatively (parser);
17452       type = cp_parser_class_name (parser,
17453                                    /*typename_keyword_p=*/false,
17454                                    /*template_keyword_p=*/false,
17455                                    class_type,
17456                                    /*check_dependency_p=*/false,
17457                                    /*class_head_p=*/true,
17458                                    /*is_declaration=*/false);
17459       /* If that didn't work, ignore the nested-name-specifier.  */
17460       if (!cp_parser_parse_definitely (parser))
17461         {
17462           invalid_nested_name_p = true;
17463           type_start_token = cp_lexer_peek_token (parser->lexer);
17464           id = cp_parser_identifier (parser);
17465           if (id == error_mark_node)
17466             id = NULL_TREE;
17467         }
17468       /* If we could not find a corresponding TYPE, treat this
17469          declaration like an unqualified declaration.  */
17470       if (type == error_mark_node)
17471         nested_name_specifier = NULL_TREE;
17472       /* Otherwise, count the number of templates used in TYPE and its
17473          containing scopes.  */
17474       else
17475         {
17476           tree scope;
17477
17478           for (scope = TREE_TYPE (type);
17479                scope && TREE_CODE (scope) != NAMESPACE_DECL;
17480                scope = (TYPE_P (scope)
17481                         ? TYPE_CONTEXT (scope)
17482                         : DECL_CONTEXT (scope)))
17483             if (TYPE_P (scope)
17484                 && CLASS_TYPE_P (scope)
17485                 && CLASSTYPE_TEMPLATE_INFO (scope)
17486                 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
17487                 && !CLASSTYPE_TEMPLATE_SPECIALIZATION (scope))
17488               ++num_templates;
17489         }
17490     }
17491   /* Otherwise, the identifier is optional.  */
17492   else
17493     {
17494       /* We don't know whether what comes next is a template-id,
17495          an identifier, or nothing at all.  */
17496       cp_parser_parse_tentatively (parser);
17497       /* Check for a template-id.  */
17498       type_start_token = cp_lexer_peek_token (parser->lexer);
17499       id = cp_parser_template_id (parser,
17500                                   /*template_keyword_p=*/false,
17501                                   /*check_dependency_p=*/true,
17502                                   /*is_declaration=*/true);
17503       /* If that didn't work, it could still be an identifier.  */
17504       if (!cp_parser_parse_definitely (parser))
17505         {
17506           if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
17507             {
17508               type_start_token = cp_lexer_peek_token (parser->lexer);
17509               id = cp_parser_identifier (parser);
17510             }
17511           else
17512             id = NULL_TREE;
17513         }
17514       else
17515         {
17516           template_id_p = true;
17517           ++num_templates;
17518         }
17519     }
17520
17521   pop_deferring_access_checks ();
17522
17523   if (id)
17524     {
17525       cp_parser_check_for_invalid_template_id (parser, id,
17526                                                type_start_token->location);
17527       virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
17528     }
17529
17530   /* If it's not a `:' or a `{' then we can't really be looking at a
17531      class-head, since a class-head only appears as part of a
17532      class-specifier.  We have to detect this situation before calling
17533      xref_tag, since that has irreversible side-effects.  */
17534   if (!cp_parser_next_token_starts_class_definition_p (parser))
17535     {
17536       cp_parser_error (parser, "expected %<{%> or %<:%>");
17537       type = error_mark_node;
17538       goto out;
17539     }
17540
17541   /* At this point, we're going ahead with the class-specifier, even
17542      if some other problem occurs.  */
17543   cp_parser_commit_to_tentative_parse (parser);
17544   if (virt_specifiers & VIRT_SPEC_OVERRIDE)
17545     {
17546       cp_parser_error (parser,
17547                        "cannot specify %<override%> for a class");
17548       type = error_mark_node;
17549       goto out;
17550     }
17551   /* Issue the error about the overly-qualified name now.  */
17552   if (qualified_p)
17553     {
17554       cp_parser_error (parser,
17555                        "global qualification of class name is invalid");
17556       type = error_mark_node;
17557       goto out;
17558     }
17559   else if (invalid_nested_name_p)
17560     {
17561       cp_parser_error (parser,
17562                        "qualified name does not name a class");
17563       type = error_mark_node;
17564       goto out;
17565     }
17566   else if (nested_name_specifier)
17567     {
17568       tree scope;
17569
17570       /* Reject typedef-names in class heads.  */
17571       if (!DECL_IMPLICIT_TYPEDEF_P (type))
17572         {
17573           error_at (type_start_token->location,
17574                     "invalid class name in declaration of %qD",
17575                     type);
17576           type = NULL_TREE;
17577           goto done;
17578         }
17579
17580       /* Figure out in what scope the declaration is being placed.  */
17581       scope = current_scope ();
17582       /* If that scope does not contain the scope in which the
17583          class was originally declared, the program is invalid.  */
17584       if (scope && !is_ancestor (scope, nested_name_specifier))
17585         {
17586           if (at_namespace_scope_p ())
17587             error_at (type_start_token->location,
17588                       "declaration of %qD in namespace %qD which does not "
17589                       "enclose %qD",
17590                       type, scope, nested_name_specifier);
17591           else
17592             error_at (type_start_token->location,
17593                       "declaration of %qD in %qD which does not enclose %qD",
17594                       type, scope, nested_name_specifier);
17595           type = NULL_TREE;
17596           goto done;
17597         }
17598       /* [dcl.meaning]
17599
17600          A declarator-id shall not be qualified except for the
17601          definition of a ... nested class outside of its class
17602          ... [or] the definition or explicit instantiation of a
17603          class member of a namespace outside of its namespace.  */
17604       if (scope == nested_name_specifier)
17605         {
17606           permerror (nested_name_specifier_token_start->location,
17607                      "extra qualification not allowed");
17608           nested_name_specifier = NULL_TREE;
17609           num_templates = 0;
17610         }
17611     }
17612   /* An explicit-specialization must be preceded by "template <>".  If
17613      it is not, try to recover gracefully.  */
17614   if (at_namespace_scope_p ()
17615       && parser->num_template_parameter_lists == 0
17616       && template_id_p)
17617     {
17618       error_at (type_start_token->location,
17619                 "an explicit specialization must be preceded by %<template <>%>");
17620       invalid_explicit_specialization_p = true;
17621       /* Take the same action that would have been taken by
17622          cp_parser_explicit_specialization.  */
17623       ++parser->num_template_parameter_lists;
17624       begin_specialization ();
17625     }
17626   /* There must be no "return" statements between this point and the
17627      end of this function; set "type "to the correct return value and
17628      use "goto done;" to return.  */
17629   /* Make sure that the right number of template parameters were
17630      present.  */
17631   if (!cp_parser_check_template_parameters (parser, num_templates,
17632                                             type_start_token->location,
17633                                             /*declarator=*/NULL))
17634     {
17635       /* If something went wrong, there is no point in even trying to
17636          process the class-definition.  */
17637       type = NULL_TREE;
17638       goto done;
17639     }
17640
17641   /* Look up the type.  */
17642   if (template_id_p)
17643     {
17644       if (TREE_CODE (id) == TEMPLATE_ID_EXPR
17645           && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
17646               || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
17647         {
17648           error_at (type_start_token->location,
17649                     "function template %qD redeclared as a class template", id);
17650           type = error_mark_node;
17651         }
17652       else
17653         {
17654           type = TREE_TYPE (id);
17655           type = maybe_process_partial_specialization (type);
17656         }
17657       if (nested_name_specifier)
17658         pushed_scope = push_scope (nested_name_specifier);
17659     }
17660   else if (nested_name_specifier)
17661     {
17662       tree class_type;
17663
17664       /* Given:
17665
17666             template <typename T> struct S { struct T };
17667             template <typename T> struct S<T>::T { };
17668
17669          we will get a TYPENAME_TYPE when processing the definition of
17670          `S::T'.  We need to resolve it to the actual type before we
17671          try to define it.  */
17672       if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
17673         {
17674           class_type = resolve_typename_type (TREE_TYPE (type),
17675                                               /*only_current_p=*/false);
17676           if (TREE_CODE (class_type) != TYPENAME_TYPE)
17677             type = TYPE_NAME (class_type);
17678           else
17679             {
17680               cp_parser_error (parser, "could not resolve typename type");
17681               type = error_mark_node;
17682             }
17683         }
17684
17685       if (maybe_process_partial_specialization (TREE_TYPE (type))
17686           == error_mark_node)
17687         {
17688           type = NULL_TREE;
17689           goto done;
17690         }
17691
17692       class_type = current_class_type;
17693       /* Enter the scope indicated by the nested-name-specifier.  */
17694       pushed_scope = push_scope (nested_name_specifier);
17695       /* Get the canonical version of this type.  */
17696       type = TYPE_MAIN_DECL (TREE_TYPE (type));
17697       if (PROCESSING_REAL_TEMPLATE_DECL_P ()
17698           && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
17699         {
17700           type = push_template_decl (type);
17701           if (type == error_mark_node)
17702             {
17703               type = NULL_TREE;
17704               goto done;
17705             }
17706         }
17707
17708       type = TREE_TYPE (type);
17709       *nested_name_specifier_p = true;
17710     }
17711   else      /* The name is not a nested name.  */
17712     {
17713       /* If the class was unnamed, create a dummy name.  */
17714       if (!id)
17715         id = make_anon_name ();
17716       type = xref_tag (class_key, id, /*tag_scope=*/ts_current,
17717                        parser->num_template_parameter_lists);
17718     }
17719
17720   /* Indicate whether this class was declared as a `class' or as a
17721      `struct'.  */
17722   if (TREE_CODE (type) == RECORD_TYPE)
17723     CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
17724   cp_parser_check_class_key (class_key, type);
17725
17726   /* If this type was already complete, and we see another definition,
17727      that's an error.  */
17728   if (type != error_mark_node && COMPLETE_TYPE_P (type))
17729     {
17730       error_at (type_start_token->location, "redefinition of %q#T",
17731                 type);
17732       error_at (type_start_token->location, "previous definition of %q+#T",
17733                 type);
17734       type = NULL_TREE;
17735       goto done;
17736     }
17737   else if (type == error_mark_node)
17738     type = NULL_TREE;
17739
17740   /* We will have entered the scope containing the class; the names of
17741      base classes should be looked up in that context.  For example:
17742
17743        struct A { struct B {}; struct C; };
17744        struct A::C : B {};
17745
17746      is valid.  */
17747
17748   /* Get the list of base-classes, if there is one.  */
17749   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
17750     *bases = cp_parser_base_clause (parser);
17751
17752  done:
17753   /* Leave the scope given by the nested-name-specifier.  We will
17754      enter the class scope itself while processing the members.  */
17755   if (pushed_scope)
17756     pop_scope (pushed_scope);
17757
17758   if (invalid_explicit_specialization_p)
17759     {
17760       end_specialization ();
17761       --parser->num_template_parameter_lists;
17762     }
17763
17764   if (type)
17765     DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
17766   *attributes_p = attributes;
17767   if (type && (virt_specifiers & VIRT_SPEC_FINAL))
17768     CLASSTYPE_FINAL (type) = 1;
17769  out:
17770   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
17771   return type;
17772 }
17773
17774 /* Parse a class-key.
17775
17776    class-key:
17777      class
17778      struct
17779      union
17780
17781    Returns the kind of class-key specified, or none_type to indicate
17782    error.  */
17783
17784 static enum tag_types
17785 cp_parser_class_key (cp_parser* parser)
17786 {
17787   cp_token *token;
17788   enum tag_types tag_type;
17789
17790   /* Look for the class-key.  */
17791   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
17792   if (!token)
17793     return none_type;
17794
17795   /* Check to see if the TOKEN is a class-key.  */
17796   tag_type = cp_parser_token_is_class_key (token);
17797   if (!tag_type)
17798     cp_parser_error (parser, "expected class-key");
17799   return tag_type;
17800 }
17801
17802 /* Parse an (optional) member-specification.
17803
17804    member-specification:
17805      member-declaration member-specification [opt]
17806      access-specifier : member-specification [opt]  */
17807
17808 static void
17809 cp_parser_member_specification_opt (cp_parser* parser)
17810 {
17811   while (true)
17812     {
17813       cp_token *token;
17814       enum rid keyword;
17815
17816       /* Peek at the next token.  */
17817       token = cp_lexer_peek_token (parser->lexer);
17818       /* If it's a `}', or EOF then we've seen all the members.  */
17819       if (token->type == CPP_CLOSE_BRACE
17820           || token->type == CPP_EOF
17821           || token->type == CPP_PRAGMA_EOL)
17822         break;
17823
17824       /* See if this token is a keyword.  */
17825       keyword = token->keyword;
17826       switch (keyword)
17827         {
17828         case RID_PUBLIC:
17829         case RID_PROTECTED:
17830         case RID_PRIVATE:
17831           /* Consume the access-specifier.  */
17832           cp_lexer_consume_token (parser->lexer);
17833           /* Remember which access-specifier is active.  */
17834           current_access_specifier = token->u.value;
17835           /* Look for the `:'.  */
17836           cp_parser_require (parser, CPP_COLON, RT_COLON);
17837           break;
17838
17839         default:
17840           /* Accept #pragmas at class scope.  */
17841           if (token->type == CPP_PRAGMA)
17842             {
17843               cp_parser_pragma (parser, pragma_external);
17844               break;
17845             }
17846
17847           /* Otherwise, the next construction must be a
17848              member-declaration.  */
17849           cp_parser_member_declaration (parser);
17850         }
17851     }
17852 }
17853
17854 /* Parse a member-declaration.
17855
17856    member-declaration:
17857      decl-specifier-seq [opt] member-declarator-list [opt] ;
17858      function-definition ; [opt]
17859      :: [opt] nested-name-specifier template [opt] unqualified-id ;
17860      using-declaration
17861      template-declaration
17862
17863    member-declarator-list:
17864      member-declarator
17865      member-declarator-list , member-declarator
17866
17867    member-declarator:
17868      declarator pure-specifier [opt]
17869      declarator constant-initializer [opt]
17870      identifier [opt] : constant-expression
17871
17872    GNU Extensions:
17873
17874    member-declaration:
17875      __extension__ member-declaration
17876
17877    member-declarator:
17878      declarator attributes [opt] pure-specifier [opt]
17879      declarator attributes [opt] constant-initializer [opt]
17880      identifier [opt] attributes [opt] : constant-expression  
17881
17882    C++0x Extensions:
17883
17884    member-declaration:
17885      static_assert-declaration  */
17886
17887 static void
17888 cp_parser_member_declaration (cp_parser* parser)
17889 {
17890   cp_decl_specifier_seq decl_specifiers;
17891   tree prefix_attributes;
17892   tree decl;
17893   int declares_class_or_enum;
17894   bool friend_p;
17895   cp_token *token = NULL;
17896   cp_token *decl_spec_token_start = NULL;
17897   cp_token *initializer_token_start = NULL;
17898   int saved_pedantic;
17899   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17900
17901   /* Check for the `__extension__' keyword.  */
17902   if (cp_parser_extension_opt (parser, &saved_pedantic))
17903     {
17904       /* Recurse.  */
17905       cp_parser_member_declaration (parser);
17906       /* Restore the old value of the PEDANTIC flag.  */
17907       pedantic = saved_pedantic;
17908
17909       return;
17910     }
17911
17912   /* Check for a template-declaration.  */
17913   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
17914     {
17915       /* An explicit specialization here is an error condition, and we
17916          expect the specialization handler to detect and report this.  */
17917       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
17918           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
17919         cp_parser_explicit_specialization (parser);
17920       else
17921         cp_parser_template_declaration (parser, /*member_p=*/true);
17922
17923       return;
17924     }
17925
17926   /* Check for a using-declaration.  */
17927   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
17928     {
17929       /* Parse the using-declaration.  */
17930       cp_parser_using_declaration (parser,
17931                                    /*access_declaration_p=*/false);
17932       return;
17933     }
17934
17935   /* Check for @defs.  */
17936   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
17937     {
17938       tree ivar, member;
17939       tree ivar_chains = cp_parser_objc_defs_expression (parser);
17940       ivar = ivar_chains;
17941       while (ivar)
17942         {
17943           member = ivar;
17944           ivar = TREE_CHAIN (member);
17945           TREE_CHAIN (member) = NULL_TREE;
17946           finish_member_declaration (member);
17947         }
17948       return;
17949     }
17950
17951   /* If the next token is `static_assert' we have a static assertion.  */
17952   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
17953     {
17954       cp_parser_static_assert (parser, /*member_p=*/true);
17955       return;
17956     }
17957
17958   parser->colon_corrects_to_scope_p = false;
17959
17960   if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
17961     goto out;
17962
17963   /* Parse the decl-specifier-seq.  */
17964   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
17965   cp_parser_decl_specifier_seq (parser,
17966                                 CP_PARSER_FLAGS_OPTIONAL,
17967                                 &decl_specifiers,
17968                                 &declares_class_or_enum);
17969   prefix_attributes = decl_specifiers.attributes;
17970   decl_specifiers.attributes = NULL_TREE;
17971   /* Check for an invalid type-name.  */
17972   if (!decl_specifiers.any_type_specifiers_p
17973       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
17974     goto out;
17975   /* If there is no declarator, then the decl-specifier-seq should
17976      specify a type.  */
17977   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
17978     {
17979       /* If there was no decl-specifier-seq, and the next token is a
17980          `;', then we have something like:
17981
17982            struct S { ; };
17983
17984          [class.mem]
17985
17986          Each member-declaration shall declare at least one member
17987          name of the class.  */
17988       if (!decl_specifiers.any_specifiers_p)
17989         {
17990           cp_token *token = cp_lexer_peek_token (parser->lexer);
17991           if (!in_system_header_at (token->location))
17992             pedwarn (token->location, OPT_pedantic, "extra %<;%>");
17993         }
17994       else
17995         {
17996           tree type;
17997
17998           /* See if this declaration is a friend.  */
17999           friend_p = cp_parser_friend_p (&decl_specifiers);
18000           /* If there were decl-specifiers, check to see if there was
18001              a class-declaration.  */
18002           type = check_tag_decl (&decl_specifiers);
18003           /* Nested classes have already been added to the class, but
18004              a `friend' needs to be explicitly registered.  */
18005           if (friend_p)
18006             {
18007               /* If the `friend' keyword was present, the friend must
18008                  be introduced with a class-key.  */
18009                if (!declares_class_or_enum && cxx_dialect < cxx0x)
18010                  pedwarn (decl_spec_token_start->location, OPT_pedantic,
18011                           "in C++03 a class-key must be used "
18012                           "when declaring a friend");
18013                /* In this case:
18014
18015                     template <typename T> struct A {
18016                       friend struct A<T>::B;
18017                     };
18018
18019                   A<T>::B will be represented by a TYPENAME_TYPE, and
18020                   therefore not recognized by check_tag_decl.  */
18021                if (!type)
18022                  {
18023                    type = decl_specifiers.type;
18024                    if (type && TREE_CODE (type) == TYPE_DECL)
18025                      type = TREE_TYPE (type);
18026                  }
18027                if (!type || !TYPE_P (type))
18028                  error_at (decl_spec_token_start->location,
18029                            "friend declaration does not name a class or "
18030                            "function");
18031                else
18032                  make_friend_class (current_class_type, type,
18033                                     /*complain=*/true);
18034             }
18035           /* If there is no TYPE, an error message will already have
18036              been issued.  */
18037           else if (!type || type == error_mark_node)
18038             ;
18039           /* An anonymous aggregate has to be handled specially; such
18040              a declaration really declares a data member (with a
18041              particular type), as opposed to a nested class.  */
18042           else if (ANON_AGGR_TYPE_P (type))
18043             {
18044               /* Remove constructors and such from TYPE, now that we
18045                  know it is an anonymous aggregate.  */
18046               fixup_anonymous_aggr (type);
18047               /* And make the corresponding data member.  */
18048               decl = build_decl (decl_spec_token_start->location,
18049                                  FIELD_DECL, NULL_TREE, type);
18050               /* Add it to the class.  */
18051               finish_member_declaration (decl);
18052             }
18053           else
18054             cp_parser_check_access_in_redeclaration
18055                                               (TYPE_NAME (type),
18056                                                decl_spec_token_start->location);
18057         }
18058     }
18059   else
18060     {
18061       bool assume_semicolon = false;
18062
18063       /* See if these declarations will be friends.  */
18064       friend_p = cp_parser_friend_p (&decl_specifiers);
18065
18066       /* Keep going until we hit the `;' at the end of the
18067          declaration.  */
18068       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
18069         {
18070           tree attributes = NULL_TREE;
18071           tree first_attribute;
18072
18073           /* Peek at the next token.  */
18074           token = cp_lexer_peek_token (parser->lexer);
18075
18076           /* Check for a bitfield declaration.  */
18077           if (token->type == CPP_COLON
18078               || (token->type == CPP_NAME
18079                   && cp_lexer_peek_nth_token (parser->lexer, 2)->type
18080                   == CPP_COLON))
18081             {
18082               tree identifier;
18083               tree width;
18084
18085               /* Get the name of the bitfield.  Note that we cannot just
18086                  check TOKEN here because it may have been invalidated by
18087                  the call to cp_lexer_peek_nth_token above.  */
18088               if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
18089                 identifier = cp_parser_identifier (parser);
18090               else
18091                 identifier = NULL_TREE;
18092
18093               /* Consume the `:' token.  */
18094               cp_lexer_consume_token (parser->lexer);
18095               /* Get the width of the bitfield.  */
18096               width
18097                 = cp_parser_constant_expression (parser,
18098                                                  /*allow_non_constant=*/false,
18099                                                  NULL);
18100
18101               /* Look for attributes that apply to the bitfield.  */
18102               attributes = cp_parser_attributes_opt (parser);
18103               /* Remember which attributes are prefix attributes and
18104                  which are not.  */
18105               first_attribute = attributes;
18106               /* Combine the attributes.  */
18107               attributes = chainon (prefix_attributes, attributes);
18108
18109               /* Create the bitfield declaration.  */
18110               decl = grokbitfield (identifier
18111                                    ? make_id_declarator (NULL_TREE,
18112                                                          identifier,
18113                                                          sfk_none)
18114                                    : NULL,
18115                                    &decl_specifiers,
18116                                    width,
18117                                    attributes);
18118             }
18119           else
18120             {
18121               cp_declarator *declarator;
18122               tree initializer;
18123               tree asm_specification;
18124               int ctor_dtor_or_conv_p;
18125
18126               /* Parse the declarator.  */
18127               declarator
18128                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
18129                                         &ctor_dtor_or_conv_p,
18130                                         /*parenthesized_p=*/NULL,
18131                                         /*member_p=*/true);
18132
18133               /* If something went wrong parsing the declarator, make sure
18134                  that we at least consume some tokens.  */
18135               if (declarator == cp_error_declarator)
18136                 {
18137                   /* Skip to the end of the statement.  */
18138                   cp_parser_skip_to_end_of_statement (parser);
18139                   /* If the next token is not a semicolon, that is
18140                      probably because we just skipped over the body of
18141                      a function.  So, we consume a semicolon if
18142                      present, but do not issue an error message if it
18143                      is not present.  */
18144                   if (cp_lexer_next_token_is (parser->lexer,
18145                                               CPP_SEMICOLON))
18146                     cp_lexer_consume_token (parser->lexer);
18147                   goto out;
18148                 }
18149
18150               if (declares_class_or_enum & 2)
18151                 cp_parser_check_for_definition_in_return_type
18152                                             (declarator, decl_specifiers.type,
18153                                              decl_specifiers.type_location);
18154
18155               /* Look for an asm-specification.  */
18156               asm_specification = cp_parser_asm_specification_opt (parser);
18157               /* Look for attributes that apply to the declaration.  */
18158               attributes = cp_parser_attributes_opt (parser);
18159               /* Remember which attributes are prefix attributes and
18160                  which are not.  */
18161               first_attribute = attributes;
18162               /* Combine the attributes.  */
18163               attributes = chainon (prefix_attributes, attributes);
18164
18165               /* If it's an `=', then we have a constant-initializer or a
18166                  pure-specifier.  It is not correct to parse the
18167                  initializer before registering the member declaration
18168                  since the member declaration should be in scope while
18169                  its initializer is processed.  However, the rest of the
18170                  front end does not yet provide an interface that allows
18171                  us to handle this correctly.  */
18172               if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
18173                 {
18174                   /* In [class.mem]:
18175
18176                      A pure-specifier shall be used only in the declaration of
18177                      a virtual function.
18178
18179                      A member-declarator can contain a constant-initializer
18180                      only if it declares a static member of integral or
18181                      enumeration type.
18182
18183                      Therefore, if the DECLARATOR is for a function, we look
18184                      for a pure-specifier; otherwise, we look for a
18185                      constant-initializer.  When we call `grokfield', it will
18186                      perform more stringent semantics checks.  */
18187                   initializer_token_start = cp_lexer_peek_token (parser->lexer);
18188                   if (function_declarator_p (declarator))
18189                     initializer = cp_parser_pure_specifier (parser);
18190                   else if (cxx_dialect >= cxx0x)
18191                     {
18192                       bool nonconst;
18193                       /* Don't require a constant rvalue in C++11, since we
18194                          might want a reference constant.  We'll enforce
18195                          constancy later.  */
18196                       cp_lexer_consume_token (parser->lexer);
18197                       /* Parse the initializer.  */
18198                       initializer = cp_parser_initializer_clause (parser,
18199                                                                   &nonconst);
18200                     }
18201                   else
18202                     /* Parse the initializer.  */
18203                     initializer = cp_parser_constant_initializer (parser);
18204                 }
18205               /* Otherwise, there is no initializer.  */
18206               else
18207                 initializer = NULL_TREE;
18208
18209               /* See if we are probably looking at a function
18210                  definition.  We are certainly not looking at a
18211                  member-declarator.  Calling `grokfield' has
18212                  side-effects, so we must not do it unless we are sure
18213                  that we are looking at a member-declarator.  */
18214               if (cp_parser_token_starts_function_definition_p
18215                   (cp_lexer_peek_token (parser->lexer)))
18216                 {
18217                   /* The grammar does not allow a pure-specifier to be
18218                      used when a member function is defined.  (It is
18219                      possible that this fact is an oversight in the
18220                      standard, since a pure function may be defined
18221                      outside of the class-specifier.  */
18222                   if (initializer)
18223                     error_at (initializer_token_start->location,
18224                               "pure-specifier on function-definition");
18225                   decl = cp_parser_save_member_function_body (parser,
18226                                                               &decl_specifiers,
18227                                                               declarator,
18228                                                               attributes);
18229                   /* If the member was not a friend, declare it here.  */
18230                   if (!friend_p)
18231                     finish_member_declaration (decl);
18232                   /* Peek at the next token.  */
18233                   token = cp_lexer_peek_token (parser->lexer);
18234                   /* If the next token is a semicolon, consume it.  */
18235                   if (token->type == CPP_SEMICOLON)
18236                     cp_lexer_consume_token (parser->lexer);
18237                   goto out;
18238                 }
18239               else
18240                 if (declarator->kind == cdk_function)
18241                   declarator->id_loc = token->location;
18242                 /* Create the declaration.  */
18243                 decl = grokfield (declarator, &decl_specifiers,
18244                                   initializer, /*init_const_expr_p=*/true,
18245                                   asm_specification,
18246                                   attributes);
18247             }
18248
18249           /* Reset PREFIX_ATTRIBUTES.  */
18250           while (attributes && TREE_CHAIN (attributes) != first_attribute)
18251             attributes = TREE_CHAIN (attributes);
18252           if (attributes)
18253             TREE_CHAIN (attributes) = NULL_TREE;
18254
18255           /* If there is any qualification still in effect, clear it
18256              now; we will be starting fresh with the next declarator.  */
18257           parser->scope = NULL_TREE;
18258           parser->qualifying_scope = NULL_TREE;
18259           parser->object_scope = NULL_TREE;
18260           /* If it's a `,', then there are more declarators.  */
18261           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18262             cp_lexer_consume_token (parser->lexer);
18263           /* If the next token isn't a `;', then we have a parse error.  */
18264           else if (cp_lexer_next_token_is_not (parser->lexer,
18265                                                CPP_SEMICOLON))
18266             {
18267               /* The next token might be a ways away from where the
18268                  actual semicolon is missing.  Find the previous token
18269                  and use that for our error position.  */
18270               cp_token *token = cp_lexer_previous_token (parser->lexer);
18271               error_at (token->location,
18272                         "expected %<;%> at end of member declaration");
18273
18274               /* Assume that the user meant to provide a semicolon.  If
18275                  we were to cp_parser_skip_to_end_of_statement, we might
18276                  skip to a semicolon inside a member function definition
18277                  and issue nonsensical error messages.  */
18278               assume_semicolon = true;
18279             }
18280
18281           if (decl)
18282             {
18283               /* Add DECL to the list of members.  */
18284               if (!friend_p)
18285                 finish_member_declaration (decl);
18286
18287               if (TREE_CODE (decl) == FUNCTION_DECL)
18288                 cp_parser_save_default_args (parser, decl);
18289             }
18290
18291           if (assume_semicolon)
18292             goto out;
18293         }
18294     }
18295
18296   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18297  out:
18298   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
18299 }
18300
18301 /* Parse a pure-specifier.
18302
18303    pure-specifier:
18304      = 0
18305
18306    Returns INTEGER_ZERO_NODE if a pure specifier is found.
18307    Otherwise, ERROR_MARK_NODE is returned.  */
18308
18309 static tree
18310 cp_parser_pure_specifier (cp_parser* parser)
18311 {
18312   cp_token *token;
18313
18314   /* Look for the `=' token.  */
18315   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18316     return error_mark_node;
18317   /* Look for the `0' token.  */
18318   token = cp_lexer_peek_token (parser->lexer);
18319
18320   if (token->type == CPP_EOF
18321       || token->type == CPP_PRAGMA_EOL)
18322     return error_mark_node;
18323
18324   cp_lexer_consume_token (parser->lexer);
18325
18326   /* Accept = default or = delete in c++0x mode.  */
18327   if (token->keyword == RID_DEFAULT
18328       || token->keyword == RID_DELETE)
18329     {
18330       maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
18331       return token->u.value;
18332     }
18333
18334   /* c_lex_with_flags marks a single digit '0' with PURE_ZERO.  */
18335   if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
18336     {
18337       cp_parser_error (parser,
18338                        "invalid pure specifier (only %<= 0%> is allowed)");
18339       cp_parser_skip_to_end_of_statement (parser);
18340       return error_mark_node;
18341     }
18342   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
18343     {
18344       error_at (token->location, "templates may not be %<virtual%>");
18345       return error_mark_node;
18346     }
18347
18348   return integer_zero_node;
18349 }
18350
18351 /* Parse a constant-initializer.
18352
18353    constant-initializer:
18354      = constant-expression
18355
18356    Returns a representation of the constant-expression.  */
18357
18358 static tree
18359 cp_parser_constant_initializer (cp_parser* parser)
18360 {
18361   /* Look for the `=' token.  */
18362   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18363     return error_mark_node;
18364
18365   /* It is invalid to write:
18366
18367        struct S { static const int i = { 7 }; };
18368
18369      */
18370   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18371     {
18372       cp_parser_error (parser,
18373                        "a brace-enclosed initializer is not allowed here");
18374       /* Consume the opening brace.  */
18375       cp_lexer_consume_token (parser->lexer);
18376       /* Skip the initializer.  */
18377       cp_parser_skip_to_closing_brace (parser);
18378       /* Look for the trailing `}'.  */
18379       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
18380
18381       return error_mark_node;
18382     }
18383
18384   return cp_parser_constant_expression (parser,
18385                                         /*allow_non_constant=*/false,
18386                                         NULL);
18387 }
18388
18389 /* Derived classes [gram.class.derived] */
18390
18391 /* Parse a base-clause.
18392
18393    base-clause:
18394      : base-specifier-list
18395
18396    base-specifier-list:
18397      base-specifier ... [opt]
18398      base-specifier-list , base-specifier ... [opt]
18399
18400    Returns a TREE_LIST representing the base-classes, in the order in
18401    which they were declared.  The representation of each node is as
18402    described by cp_parser_base_specifier.
18403
18404    In the case that no bases are specified, this function will return
18405    NULL_TREE, not ERROR_MARK_NODE.  */
18406
18407 static tree
18408 cp_parser_base_clause (cp_parser* parser)
18409 {
18410   tree bases = NULL_TREE;
18411
18412   /* Look for the `:' that begins the list.  */
18413   cp_parser_require (parser, CPP_COLON, RT_COLON);
18414
18415   /* Scan the base-specifier-list.  */
18416   while (true)
18417     {
18418       cp_token *token;
18419       tree base;
18420       bool pack_expansion_p = false;
18421
18422       /* Look for the base-specifier.  */
18423       base = cp_parser_base_specifier (parser);
18424       /* Look for the (optional) ellipsis. */
18425       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18426         {
18427           /* Consume the `...'. */
18428           cp_lexer_consume_token (parser->lexer);
18429
18430           pack_expansion_p = true;
18431         }
18432
18433       /* Add BASE to the front of the list.  */
18434       if (base && base != error_mark_node)
18435         {
18436           if (pack_expansion_p)
18437             /* Make this a pack expansion type. */
18438             TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
18439
18440           if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
18441             {
18442               TREE_CHAIN (base) = bases;
18443               bases = base;
18444             }
18445         }
18446       /* Peek at the next token.  */
18447       token = cp_lexer_peek_token (parser->lexer);
18448       /* If it's not a comma, then the list is complete.  */
18449       if (token->type != CPP_COMMA)
18450         break;
18451       /* Consume the `,'.  */
18452       cp_lexer_consume_token (parser->lexer);
18453     }
18454
18455   /* PARSER->SCOPE may still be non-NULL at this point, if the last
18456      base class had a qualified name.  However, the next name that
18457      appears is certainly not qualified.  */
18458   parser->scope = NULL_TREE;
18459   parser->qualifying_scope = NULL_TREE;
18460   parser->object_scope = NULL_TREE;
18461
18462   return nreverse (bases);
18463 }
18464
18465 /* Parse a base-specifier.
18466
18467    base-specifier:
18468      :: [opt] nested-name-specifier [opt] class-name
18469      virtual access-specifier [opt] :: [opt] nested-name-specifier
18470        [opt] class-name
18471      access-specifier virtual [opt] :: [opt] nested-name-specifier
18472        [opt] class-name
18473
18474    Returns a TREE_LIST.  The TREE_PURPOSE will be one of
18475    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
18476    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
18477    (or the ERROR_MARK_NODE) indicating the type that was specified.  */
18478
18479 static tree
18480 cp_parser_base_specifier (cp_parser* parser)
18481 {
18482   cp_token *token;
18483   bool done = false;
18484   bool virtual_p = false;
18485   bool duplicate_virtual_error_issued_p = false;
18486   bool duplicate_access_error_issued_p = false;
18487   bool class_scope_p, template_p;
18488   tree access = access_default_node;
18489   tree type;
18490
18491   /* Process the optional `virtual' and `access-specifier'.  */
18492   while (!done)
18493     {
18494       /* Peek at the next token.  */
18495       token = cp_lexer_peek_token (parser->lexer);
18496       /* Process `virtual'.  */
18497       switch (token->keyword)
18498         {
18499         case RID_VIRTUAL:
18500           /* If `virtual' appears more than once, issue an error.  */
18501           if (virtual_p && !duplicate_virtual_error_issued_p)
18502             {
18503               cp_parser_error (parser,
18504                                "%<virtual%> specified more than once in base-specified");
18505               duplicate_virtual_error_issued_p = true;
18506             }
18507
18508           virtual_p = true;
18509
18510           /* Consume the `virtual' token.  */
18511           cp_lexer_consume_token (parser->lexer);
18512
18513           break;
18514
18515         case RID_PUBLIC:
18516         case RID_PROTECTED:
18517         case RID_PRIVATE:
18518           /* If more than one access specifier appears, issue an
18519              error.  */
18520           if (access != access_default_node
18521               && !duplicate_access_error_issued_p)
18522             {
18523               cp_parser_error (parser,
18524                                "more than one access specifier in base-specified");
18525               duplicate_access_error_issued_p = true;
18526             }
18527
18528           access = ridpointers[(int) token->keyword];
18529
18530           /* Consume the access-specifier.  */
18531           cp_lexer_consume_token (parser->lexer);
18532
18533           break;
18534
18535         default:
18536           done = true;
18537           break;
18538         }
18539     }
18540   /* It is not uncommon to see programs mechanically, erroneously, use
18541      the 'typename' keyword to denote (dependent) qualified types
18542      as base classes.  */
18543   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
18544     {
18545       token = cp_lexer_peek_token (parser->lexer);
18546       if (!processing_template_decl)
18547         error_at (token->location,
18548                   "keyword %<typename%> not allowed outside of templates");
18549       else
18550         error_at (token->location,
18551                   "keyword %<typename%> not allowed in this context "
18552                   "(the base class is implicitly a type)");
18553       cp_lexer_consume_token (parser->lexer);
18554     }
18555
18556   /* Look for the optional `::' operator.  */
18557   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
18558   /* Look for the nested-name-specifier.  The simplest way to
18559      implement:
18560
18561        [temp.res]
18562
18563        The keyword `typename' is not permitted in a base-specifier or
18564        mem-initializer; in these contexts a qualified name that
18565        depends on a template-parameter is implicitly assumed to be a
18566        type name.
18567
18568      is to pretend that we have seen the `typename' keyword at this
18569      point.  */
18570   cp_parser_nested_name_specifier_opt (parser,
18571                                        /*typename_keyword_p=*/true,
18572                                        /*check_dependency_p=*/true,
18573                                        typename_type,
18574                                        /*is_declaration=*/true);
18575   /* If the base class is given by a qualified name, assume that names
18576      we see are type names or templates, as appropriate.  */
18577   class_scope_p = (parser->scope && TYPE_P (parser->scope));
18578   template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
18579
18580   if (!parser->scope
18581       && cp_lexer_next_token_is_decltype (parser->lexer))
18582     /* DR 950 allows decltype as a base-specifier.  */
18583     type = cp_parser_decltype (parser);
18584   else
18585     {
18586       /* Otherwise, look for the class-name.  */
18587       type = cp_parser_class_name (parser,
18588                                    class_scope_p,
18589                                    template_p,
18590                                    typename_type,
18591                                    /*check_dependency_p=*/true,
18592                                    /*class_head_p=*/false,
18593                                    /*is_declaration=*/true);
18594       type = TREE_TYPE (type);
18595     }
18596
18597   if (type == error_mark_node)
18598     return error_mark_node;
18599
18600   return finish_base_specifier (type, access, virtual_p);
18601 }
18602
18603 /* Exception handling [gram.exception] */
18604
18605 /* Parse an (optional) exception-specification.
18606
18607    exception-specification:
18608      throw ( type-id-list [opt] )
18609
18610    Returns a TREE_LIST representing the exception-specification.  The
18611    TREE_VALUE of each node is a type.  */
18612
18613 static tree
18614 cp_parser_exception_specification_opt (cp_parser* parser)
18615 {
18616   cp_token *token;
18617   tree type_id_list;
18618   const char *saved_message;
18619
18620   /* Peek at the next token.  */
18621   token = cp_lexer_peek_token (parser->lexer);
18622
18623   /* Is it a noexcept-specification?  */
18624   if (cp_parser_is_keyword (token, RID_NOEXCEPT))
18625     {
18626       tree expr;
18627       cp_lexer_consume_token (parser->lexer);
18628
18629       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
18630         {
18631           cp_lexer_consume_token (parser->lexer);
18632
18633           /* Types may not be defined in an exception-specification.  */
18634           saved_message = parser->type_definition_forbidden_message;
18635           parser->type_definition_forbidden_message
18636             = G_("types may not be defined in an exception-specification");
18637
18638           expr = cp_parser_constant_expression (parser, false, NULL);
18639
18640           /* Restore the saved message.  */
18641           parser->type_definition_forbidden_message = saved_message;
18642
18643           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18644         }
18645       else
18646         expr = boolean_true_node;
18647
18648       return build_noexcept_spec (expr, tf_warning_or_error);
18649     }
18650
18651   /* If it's not `throw', then there's no exception-specification.  */
18652   if (!cp_parser_is_keyword (token, RID_THROW))
18653     return NULL_TREE;
18654
18655 #if 0
18656   /* Enable this once a lot of code has transitioned to noexcept?  */
18657   if (cxx_dialect == cxx0x && !in_system_header)
18658     warning (OPT_Wdeprecated, "dynamic exception specifications are "
18659              "deprecated in C++0x; use %<noexcept%> instead");
18660 #endif
18661
18662   /* Consume the `throw'.  */
18663   cp_lexer_consume_token (parser->lexer);
18664
18665   /* Look for the `('.  */
18666   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18667
18668   /* Peek at the next token.  */
18669   token = cp_lexer_peek_token (parser->lexer);
18670   /* If it's not a `)', then there is a type-id-list.  */
18671   if (token->type != CPP_CLOSE_PAREN)
18672     {
18673       /* Types may not be defined in an exception-specification.  */
18674       saved_message = parser->type_definition_forbidden_message;
18675       parser->type_definition_forbidden_message
18676         = G_("types may not be defined in an exception-specification");
18677       /* Parse the type-id-list.  */
18678       type_id_list = cp_parser_type_id_list (parser);
18679       /* Restore the saved message.  */
18680       parser->type_definition_forbidden_message = saved_message;
18681     }
18682   else
18683     type_id_list = empty_except_spec;
18684
18685   /* Look for the `)'.  */
18686   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18687
18688   return type_id_list;
18689 }
18690
18691 /* Parse an (optional) type-id-list.
18692
18693    type-id-list:
18694      type-id ... [opt]
18695      type-id-list , type-id ... [opt]
18696
18697    Returns a TREE_LIST.  The TREE_VALUE of each node is a TYPE,
18698    in the order that the types were presented.  */
18699
18700 static tree
18701 cp_parser_type_id_list (cp_parser* parser)
18702 {
18703   tree types = NULL_TREE;
18704
18705   while (true)
18706     {
18707       cp_token *token;
18708       tree type;
18709
18710       /* Get the next type-id.  */
18711       type = cp_parser_type_id (parser);
18712       /* Parse the optional ellipsis. */
18713       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18714         {
18715           /* Consume the `...'. */
18716           cp_lexer_consume_token (parser->lexer);
18717
18718           /* Turn the type into a pack expansion expression. */
18719           type = make_pack_expansion (type);
18720         }
18721       /* Add it to the list.  */
18722       types = add_exception_specifier (types, type, /*complain=*/1);
18723       /* Peek at the next token.  */
18724       token = cp_lexer_peek_token (parser->lexer);
18725       /* If it is not a `,', we are done.  */
18726       if (token->type != CPP_COMMA)
18727         break;
18728       /* Consume the `,'.  */
18729       cp_lexer_consume_token (parser->lexer);
18730     }
18731
18732   return nreverse (types);
18733 }
18734
18735 /* Parse a try-block.
18736
18737    try-block:
18738      try compound-statement handler-seq  */
18739
18740 static tree
18741 cp_parser_try_block (cp_parser* parser)
18742 {
18743   tree try_block;
18744
18745   cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
18746   try_block = begin_try_block ();
18747   cp_parser_compound_statement (parser, NULL, true, false);
18748   finish_try_block (try_block);
18749   cp_parser_handler_seq (parser);
18750   finish_handler_sequence (try_block);
18751
18752   return try_block;
18753 }
18754
18755 /* Parse a function-try-block.
18756
18757    function-try-block:
18758      try ctor-initializer [opt] function-body handler-seq  */
18759
18760 static bool
18761 cp_parser_function_try_block (cp_parser* parser)
18762 {
18763   tree compound_stmt;
18764   tree try_block;
18765   bool ctor_initializer_p;
18766
18767   /* Look for the `try' keyword.  */
18768   if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
18769     return false;
18770   /* Let the rest of the front end know where we are.  */
18771   try_block = begin_function_try_block (&compound_stmt);
18772   /* Parse the function-body.  */
18773   ctor_initializer_p
18774     = cp_parser_ctor_initializer_opt_and_function_body (parser);
18775   /* We're done with the `try' part.  */
18776   finish_function_try_block (try_block);
18777   /* Parse the handlers.  */
18778   cp_parser_handler_seq (parser);
18779   /* We're done with the handlers.  */
18780   finish_function_handler_sequence (try_block, compound_stmt);
18781
18782   return ctor_initializer_p;
18783 }
18784
18785 /* Parse a handler-seq.
18786
18787    handler-seq:
18788      handler handler-seq [opt]  */
18789
18790 static void
18791 cp_parser_handler_seq (cp_parser* parser)
18792 {
18793   while (true)
18794     {
18795       cp_token *token;
18796
18797       /* Parse the handler.  */
18798       cp_parser_handler (parser);
18799       /* Peek at the next token.  */
18800       token = cp_lexer_peek_token (parser->lexer);
18801       /* If it's not `catch' then there are no more handlers.  */
18802       if (!cp_parser_is_keyword (token, RID_CATCH))
18803         break;
18804     }
18805 }
18806
18807 /* Parse a handler.
18808
18809    handler:
18810      catch ( exception-declaration ) compound-statement  */
18811
18812 static void
18813 cp_parser_handler (cp_parser* parser)
18814 {
18815   tree handler;
18816   tree declaration;
18817
18818   cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
18819   handler = begin_handler ();
18820   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18821   declaration = cp_parser_exception_declaration (parser);
18822   finish_handler_parms (declaration, handler);
18823   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18824   cp_parser_compound_statement (parser, NULL, false, false);
18825   finish_handler (handler);
18826 }
18827
18828 /* Parse an exception-declaration.
18829
18830    exception-declaration:
18831      type-specifier-seq declarator
18832      type-specifier-seq abstract-declarator
18833      type-specifier-seq
18834      ...
18835
18836    Returns a VAR_DECL for the declaration, or NULL_TREE if the
18837    ellipsis variant is used.  */
18838
18839 static tree
18840 cp_parser_exception_declaration (cp_parser* parser)
18841 {
18842   cp_decl_specifier_seq type_specifiers;
18843   cp_declarator *declarator;
18844   const char *saved_message;
18845
18846   /* If it's an ellipsis, it's easy to handle.  */
18847   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18848     {
18849       /* Consume the `...' token.  */
18850       cp_lexer_consume_token (parser->lexer);
18851       return NULL_TREE;
18852     }
18853
18854   /* Types may not be defined in exception-declarations.  */
18855   saved_message = parser->type_definition_forbidden_message;
18856   parser->type_definition_forbidden_message
18857     = G_("types may not be defined in exception-declarations");
18858
18859   /* Parse the type-specifier-seq.  */
18860   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
18861                                 /*is_trailing_return=*/false,
18862                                 &type_specifiers);
18863   /* If it's a `)', then there is no declarator.  */
18864   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
18865     declarator = NULL;
18866   else
18867     declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
18868                                        /*ctor_dtor_or_conv_p=*/NULL,
18869                                        /*parenthesized_p=*/NULL,
18870                                        /*member_p=*/false);
18871
18872   /* Restore the saved message.  */
18873   parser->type_definition_forbidden_message = saved_message;
18874
18875   if (!type_specifiers.any_specifiers_p)
18876     return error_mark_node;
18877
18878   return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
18879 }
18880
18881 /* Parse a throw-expression.
18882
18883    throw-expression:
18884      throw assignment-expression [opt]
18885
18886    Returns a THROW_EXPR representing the throw-expression.  */
18887
18888 static tree
18889 cp_parser_throw_expression (cp_parser* parser)
18890 {
18891   tree expression;
18892   cp_token* token;
18893
18894   cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
18895   token = cp_lexer_peek_token (parser->lexer);
18896   /* Figure out whether or not there is an assignment-expression
18897      following the "throw" keyword.  */
18898   if (token->type == CPP_COMMA
18899       || token->type == CPP_SEMICOLON
18900       || token->type == CPP_CLOSE_PAREN
18901       || token->type == CPP_CLOSE_SQUARE
18902       || token->type == CPP_CLOSE_BRACE
18903       || token->type == CPP_COLON)
18904     expression = NULL_TREE;
18905   else
18906     expression = cp_parser_assignment_expression (parser,
18907                                                   /*cast_p=*/false, NULL);
18908
18909   return build_throw (expression);
18910 }
18911
18912 /* GNU Extensions */
18913
18914 /* Parse an (optional) asm-specification.
18915
18916    asm-specification:
18917      asm ( string-literal )
18918
18919    If the asm-specification is present, returns a STRING_CST
18920    corresponding to the string-literal.  Otherwise, returns
18921    NULL_TREE.  */
18922
18923 static tree
18924 cp_parser_asm_specification_opt (cp_parser* parser)
18925 {
18926   cp_token *token;
18927   tree asm_specification;
18928
18929   /* Peek at the next token.  */
18930   token = cp_lexer_peek_token (parser->lexer);
18931   /* If the next token isn't the `asm' keyword, then there's no
18932      asm-specification.  */
18933   if (!cp_parser_is_keyword (token, RID_ASM))
18934     return NULL_TREE;
18935
18936   /* Consume the `asm' token.  */
18937   cp_lexer_consume_token (parser->lexer);
18938   /* Look for the `('.  */
18939   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18940
18941   /* Look for the string-literal.  */
18942   asm_specification = cp_parser_string_literal (parser, false, false);
18943
18944   /* Look for the `)'.  */
18945   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18946
18947   return asm_specification;
18948 }
18949
18950 /* Parse an asm-operand-list.
18951
18952    asm-operand-list:
18953      asm-operand
18954      asm-operand-list , asm-operand
18955
18956    asm-operand:
18957      string-literal ( expression )
18958      [ string-literal ] string-literal ( expression )
18959
18960    Returns a TREE_LIST representing the operands.  The TREE_VALUE of
18961    each node is the expression.  The TREE_PURPOSE is itself a
18962    TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
18963    string-literal (or NULL_TREE if not present) and whose TREE_VALUE
18964    is a STRING_CST for the string literal before the parenthesis. Returns
18965    ERROR_MARK_NODE if any of the operands are invalid.  */
18966
18967 static tree
18968 cp_parser_asm_operand_list (cp_parser* parser)
18969 {
18970   tree asm_operands = NULL_TREE;
18971   bool invalid_operands = false;
18972
18973   while (true)
18974     {
18975       tree string_literal;
18976       tree expression;
18977       tree name;
18978
18979       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
18980         {
18981           /* Consume the `[' token.  */
18982           cp_lexer_consume_token (parser->lexer);
18983           /* Read the operand name.  */
18984           name = cp_parser_identifier (parser);
18985           if (name != error_mark_node)
18986             name = build_string (IDENTIFIER_LENGTH (name),
18987                                  IDENTIFIER_POINTER (name));
18988           /* Look for the closing `]'.  */
18989           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
18990         }
18991       else
18992         name = NULL_TREE;
18993       /* Look for the string-literal.  */
18994       string_literal = cp_parser_string_literal (parser, false, false);
18995
18996       /* Look for the `('.  */
18997       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18998       /* Parse the expression.  */
18999       expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
19000       /* Look for the `)'.  */
19001       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
19002
19003       if (name == error_mark_node 
19004           || string_literal == error_mark_node 
19005           || expression == error_mark_node)
19006         invalid_operands = true;
19007
19008       /* Add this operand to the list.  */
19009       asm_operands = tree_cons (build_tree_list (name, string_literal),
19010                                 expression,
19011                                 asm_operands);
19012       /* If the next token is not a `,', there are no more
19013          operands.  */
19014       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19015         break;
19016       /* Consume the `,'.  */
19017       cp_lexer_consume_token (parser->lexer);
19018     }
19019
19020   return invalid_operands ? error_mark_node : nreverse (asm_operands);
19021 }
19022
19023 /* Parse an asm-clobber-list.
19024
19025    asm-clobber-list:
19026      string-literal
19027      asm-clobber-list , string-literal
19028
19029    Returns a TREE_LIST, indicating the clobbers in the order that they
19030    appeared.  The TREE_VALUE of each node is a STRING_CST.  */
19031
19032 static tree
19033 cp_parser_asm_clobber_list (cp_parser* parser)
19034 {
19035   tree clobbers = NULL_TREE;
19036
19037   while (true)
19038     {
19039       tree string_literal;
19040
19041       /* Look for the string literal.  */
19042       string_literal = cp_parser_string_literal (parser, false, false);
19043       /* Add it to the list.  */
19044       clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
19045       /* If the next token is not a `,', then the list is
19046          complete.  */
19047       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19048         break;
19049       /* Consume the `,' token.  */
19050       cp_lexer_consume_token (parser->lexer);
19051     }
19052
19053   return clobbers;
19054 }
19055
19056 /* Parse an asm-label-list.
19057
19058    asm-label-list:
19059      identifier
19060      asm-label-list , identifier
19061
19062    Returns a TREE_LIST, indicating the labels in the order that they
19063    appeared.  The TREE_VALUE of each node is a label.  */
19064
19065 static tree
19066 cp_parser_asm_label_list (cp_parser* parser)
19067 {
19068   tree labels = NULL_TREE;
19069
19070   while (true)
19071     {
19072       tree identifier, label, name;
19073
19074       /* Look for the identifier.  */
19075       identifier = cp_parser_identifier (parser);
19076       if (!error_operand_p (identifier))
19077         {
19078           label = lookup_label (identifier);
19079           if (TREE_CODE (label) == LABEL_DECL)
19080             {
19081               TREE_USED (label) = 1;
19082               check_goto (label);
19083               name = build_string (IDENTIFIER_LENGTH (identifier),
19084                                    IDENTIFIER_POINTER (identifier));
19085               labels = tree_cons (name, label, labels);
19086             }
19087         }
19088       /* If the next token is not a `,', then the list is
19089          complete.  */
19090       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19091         break;
19092       /* Consume the `,' token.  */
19093       cp_lexer_consume_token (parser->lexer);
19094     }
19095
19096   return nreverse (labels);
19097 }
19098
19099 /* Parse an (optional) series of attributes.
19100
19101    attributes:
19102      attributes attribute
19103
19104    attribute:
19105      __attribute__ (( attribute-list [opt] ))
19106
19107    The return value is as for cp_parser_attribute_list.  */
19108
19109 static tree
19110 cp_parser_attributes_opt (cp_parser* parser)
19111 {
19112   tree attributes = NULL_TREE;
19113
19114   while (true)
19115     {
19116       cp_token *token;
19117       tree attribute_list;
19118
19119       /* Peek at the next token.  */
19120       token = cp_lexer_peek_token (parser->lexer);
19121       /* If it's not `__attribute__', then we're done.  */
19122       if (token->keyword != RID_ATTRIBUTE)
19123         break;
19124
19125       /* Consume the `__attribute__' keyword.  */
19126       cp_lexer_consume_token (parser->lexer);
19127       /* Look for the two `(' tokens.  */
19128       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
19129       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
19130
19131       /* Peek at the next token.  */
19132       token = cp_lexer_peek_token (parser->lexer);
19133       if (token->type != CPP_CLOSE_PAREN)
19134         /* Parse the attribute-list.  */
19135         attribute_list = cp_parser_attribute_list (parser);
19136       else
19137         /* If the next token is a `)', then there is no attribute
19138            list.  */
19139         attribute_list = NULL;
19140
19141       /* Look for the two `)' tokens.  */
19142       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
19143       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
19144
19145       /* Add these new attributes to the list.  */
19146       attributes = chainon (attributes, attribute_list);
19147     }
19148
19149   return attributes;
19150 }
19151
19152 /* Parse an attribute-list.
19153
19154    attribute-list:
19155      attribute
19156      attribute-list , attribute
19157
19158    attribute:
19159      identifier
19160      identifier ( identifier )
19161      identifier ( identifier , expression-list )
19162      identifier ( expression-list )
19163
19164    Returns a TREE_LIST, or NULL_TREE on error.  Each node corresponds
19165    to an attribute.  The TREE_PURPOSE of each node is the identifier
19166    indicating which attribute is in use.  The TREE_VALUE represents
19167    the arguments, if any.  */
19168
19169 static tree
19170 cp_parser_attribute_list (cp_parser* parser)
19171 {
19172   tree attribute_list = NULL_TREE;
19173   bool save_translate_strings_p = parser->translate_strings_p;
19174
19175   parser->translate_strings_p = false;
19176   while (true)
19177     {
19178       cp_token *token;
19179       tree identifier;
19180       tree attribute;
19181
19182       /* Look for the identifier.  We also allow keywords here; for
19183          example `__attribute__ ((const))' is legal.  */
19184       token = cp_lexer_peek_token (parser->lexer);
19185       if (token->type == CPP_NAME
19186           || token->type == CPP_KEYWORD)
19187         {
19188           tree arguments = NULL_TREE;
19189
19190           /* Consume the token.  */
19191           token = cp_lexer_consume_token (parser->lexer);
19192
19193           /* Save away the identifier that indicates which attribute
19194              this is.  */
19195           identifier = (token->type == CPP_KEYWORD) 
19196             /* For keywords, use the canonical spelling, not the
19197                parsed identifier.  */
19198             ? ridpointers[(int) token->keyword]
19199             : token->u.value;
19200           
19201           attribute = build_tree_list (identifier, NULL_TREE);
19202
19203           /* Peek at the next token.  */
19204           token = cp_lexer_peek_token (parser->lexer);
19205           /* If it's an `(', then parse the attribute arguments.  */
19206           if (token->type == CPP_OPEN_PAREN)
19207             {
19208               VEC(tree,gc) *vec;
19209               int attr_flag = (attribute_takes_identifier_p (identifier)
19210                                ? id_attr : normal_attr);
19211               vec = cp_parser_parenthesized_expression_list
19212                     (parser, attr_flag, /*cast_p=*/false,
19213                      /*allow_expansion_p=*/false,
19214                      /*non_constant_p=*/NULL);
19215               if (vec == NULL)
19216                 arguments = error_mark_node;
19217               else
19218                 {
19219                   arguments = build_tree_list_vec (vec);
19220                   release_tree_vector (vec);
19221                 }
19222               /* Save the arguments away.  */
19223               TREE_VALUE (attribute) = arguments;
19224             }
19225
19226           if (arguments != error_mark_node)
19227             {
19228               /* Add this attribute to the list.  */
19229               TREE_CHAIN (attribute) = attribute_list;
19230               attribute_list = attribute;
19231             }
19232
19233           token = cp_lexer_peek_token (parser->lexer);
19234         }
19235       /* Now, look for more attributes.  If the next token isn't a
19236          `,', we're done.  */
19237       if (token->type != CPP_COMMA)
19238         break;
19239
19240       /* Consume the comma and keep going.  */
19241       cp_lexer_consume_token (parser->lexer);
19242     }
19243   parser->translate_strings_p = save_translate_strings_p;
19244
19245   /* We built up the list in reverse order.  */
19246   return nreverse (attribute_list);
19247 }
19248
19249 /* Parse an optional `__extension__' keyword.  Returns TRUE if it is
19250    present, and FALSE otherwise.  *SAVED_PEDANTIC is set to the
19251    current value of the PEDANTIC flag, regardless of whether or not
19252    the `__extension__' keyword is present.  The caller is responsible
19253    for restoring the value of the PEDANTIC flag.  */
19254
19255 static bool
19256 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
19257 {
19258   /* Save the old value of the PEDANTIC flag.  */
19259   *saved_pedantic = pedantic;
19260
19261   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
19262     {
19263       /* Consume the `__extension__' token.  */
19264       cp_lexer_consume_token (parser->lexer);
19265       /* We're not being pedantic while the `__extension__' keyword is
19266          in effect.  */
19267       pedantic = 0;
19268
19269       return true;
19270     }
19271
19272   return false;
19273 }
19274
19275 /* Parse a label declaration.
19276
19277    label-declaration:
19278      __label__ label-declarator-seq ;
19279
19280    label-declarator-seq:
19281      identifier , label-declarator-seq
19282      identifier  */
19283
19284 static void
19285 cp_parser_label_declaration (cp_parser* parser)
19286 {
19287   /* Look for the `__label__' keyword.  */
19288   cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
19289
19290   while (true)
19291     {
19292       tree identifier;
19293
19294       /* Look for an identifier.  */
19295       identifier = cp_parser_identifier (parser);
19296       /* If we failed, stop.  */
19297       if (identifier == error_mark_node)
19298         break;
19299       /* Declare it as a label.  */
19300       finish_label_decl (identifier);
19301       /* If the next token is a `;', stop.  */
19302       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
19303         break;
19304       /* Look for the `,' separating the label declarations.  */
19305       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
19306     }
19307
19308   /* Look for the final `;'.  */
19309   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19310 }
19311
19312 /* Support Functions */
19313
19314 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
19315    NAME should have one of the representations used for an
19316    id-expression.  If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
19317    is returned.  If PARSER->SCOPE is a dependent type, then a
19318    SCOPE_REF is returned.
19319
19320    If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
19321    returned; the name was already resolved when the TEMPLATE_ID_EXPR
19322    was formed.  Abstractly, such entities should not be passed to this
19323    function, because they do not need to be looked up, but it is
19324    simpler to check for this special case here, rather than at the
19325    call-sites.
19326
19327    In cases not explicitly covered above, this function returns a
19328    DECL, OVERLOAD, or baselink representing the result of the lookup.
19329    If there was no entity with the indicated NAME, the ERROR_MARK_NODE
19330    is returned.
19331
19332    If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
19333    (e.g., "struct") that was used.  In that case bindings that do not
19334    refer to types are ignored.
19335
19336    If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
19337    ignored.
19338
19339    If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
19340    are ignored.
19341
19342    If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
19343    types.
19344
19345    If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
19346    TREE_LIST of candidates if name-lookup results in an ambiguity, and
19347    NULL_TREE otherwise.  */
19348
19349 static tree
19350 cp_parser_lookup_name (cp_parser *parser, tree name,
19351                        enum tag_types tag_type,
19352                        bool is_template,
19353                        bool is_namespace,
19354                        bool check_dependency,
19355                        tree *ambiguous_decls,
19356                        location_t name_location)
19357 {
19358   int flags = 0;
19359   tree decl;
19360   tree object_type = parser->context->object_type;
19361
19362   if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
19363     flags |= LOOKUP_COMPLAIN;
19364
19365   /* Assume that the lookup will be unambiguous.  */
19366   if (ambiguous_decls)
19367     *ambiguous_decls = NULL_TREE;
19368
19369   /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
19370      no longer valid.  Note that if we are parsing tentatively, and
19371      the parse fails, OBJECT_TYPE will be automatically restored.  */
19372   parser->context->object_type = NULL_TREE;
19373
19374   if (name == error_mark_node)
19375     return error_mark_node;
19376
19377   /* A template-id has already been resolved; there is no lookup to
19378      do.  */
19379   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
19380     return name;
19381   if (BASELINK_P (name))
19382     {
19383       gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
19384                   == TEMPLATE_ID_EXPR);
19385       return name;
19386     }
19387
19388   /* A BIT_NOT_EXPR is used to represent a destructor.  By this point,
19389      it should already have been checked to make sure that the name
19390      used matches the type being destroyed.  */
19391   if (TREE_CODE (name) == BIT_NOT_EXPR)
19392     {
19393       tree type;
19394
19395       /* Figure out to which type this destructor applies.  */
19396       if (parser->scope)
19397         type = parser->scope;
19398       else if (object_type)
19399         type = object_type;
19400       else
19401         type = current_class_type;
19402       /* If that's not a class type, there is no destructor.  */
19403       if (!type || !CLASS_TYPE_P (type))
19404         return error_mark_node;
19405       if (CLASSTYPE_LAZY_DESTRUCTOR (type))
19406         lazily_declare_fn (sfk_destructor, type);
19407       if (!CLASSTYPE_DESTRUCTORS (type))
19408           return error_mark_node;
19409       /* If it was a class type, return the destructor.  */
19410       return CLASSTYPE_DESTRUCTORS (type);
19411     }
19412
19413   /* By this point, the NAME should be an ordinary identifier.  If
19414      the id-expression was a qualified name, the qualifying scope is
19415      stored in PARSER->SCOPE at this point.  */
19416   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
19417
19418   /* Perform the lookup.  */
19419   if (parser->scope)
19420     {
19421       bool dependent_p;
19422
19423       if (parser->scope == error_mark_node)
19424         return error_mark_node;
19425
19426       /* If the SCOPE is dependent, the lookup must be deferred until
19427          the template is instantiated -- unless we are explicitly
19428          looking up names in uninstantiated templates.  Even then, we
19429          cannot look up the name if the scope is not a class type; it
19430          might, for example, be a template type parameter.  */
19431       dependent_p = (TYPE_P (parser->scope)
19432                      && dependent_scope_p (parser->scope));
19433       if ((check_dependency || !CLASS_TYPE_P (parser->scope))
19434           && dependent_p)
19435         /* Defer lookup.  */
19436         decl = error_mark_node;
19437       else
19438         {
19439           tree pushed_scope = NULL_TREE;
19440
19441           /* If PARSER->SCOPE is a dependent type, then it must be a
19442              class type, and we must not be checking dependencies;
19443              otherwise, we would have processed this lookup above.  So
19444              that PARSER->SCOPE is not considered a dependent base by
19445              lookup_member, we must enter the scope here.  */
19446           if (dependent_p)
19447             pushed_scope = push_scope (parser->scope);
19448
19449           /* If the PARSER->SCOPE is a template specialization, it
19450              may be instantiated during name lookup.  In that case,
19451              errors may be issued.  Even if we rollback the current
19452              tentative parse, those errors are valid.  */
19453           decl = lookup_qualified_name (parser->scope, name,
19454                                         tag_type != none_type,
19455                                         /*complain=*/true);
19456
19457           /* 3.4.3.1: In a lookup in which the constructor is an acceptable
19458              lookup result and the nested-name-specifier nominates a class C:
19459                * if the name specified after the nested-name-specifier, when
19460                looked up in C, is the injected-class-name of C (Clause 9), or
19461                * if the name specified after the nested-name-specifier is the
19462                same as the identifier or the simple-template-id's template-
19463                name in the last component of the nested-name-specifier,
19464              the name is instead considered to name the constructor of
19465              class C. [ Note: for example, the constructor is not an
19466              acceptable lookup result in an elaborated-type-specifier so
19467              the constructor would not be used in place of the
19468              injected-class-name. --end note ] Such a constructor name
19469              shall be used only in the declarator-id of a declaration that
19470              names a constructor or in a using-declaration.  */
19471           if (tag_type == none_type
19472               && DECL_SELF_REFERENCE_P (decl)
19473               && same_type_p (DECL_CONTEXT (decl), parser->scope))
19474             decl = lookup_qualified_name (parser->scope, ctor_identifier,
19475                                           tag_type != none_type,
19476                                           /*complain=*/true);
19477
19478           /* If we have a single function from a using decl, pull it out.  */
19479           if (TREE_CODE (decl) == OVERLOAD
19480               && !really_overloaded_fn (decl))
19481             decl = OVL_FUNCTION (decl);
19482
19483           if (pushed_scope)
19484             pop_scope (pushed_scope);
19485         }
19486
19487       /* If the scope is a dependent type and either we deferred lookup or
19488          we did lookup but didn't find the name, rememeber the name.  */
19489       if (decl == error_mark_node && TYPE_P (parser->scope)
19490           && dependent_type_p (parser->scope))
19491         {
19492           if (tag_type)
19493             {
19494               tree type;
19495
19496               /* The resolution to Core Issue 180 says that `struct
19497                  A::B' should be considered a type-name, even if `A'
19498                  is dependent.  */
19499               type = make_typename_type (parser->scope, name, tag_type,
19500                                          /*complain=*/tf_error);
19501               decl = TYPE_NAME (type);
19502             }
19503           else if (is_template
19504                    && (cp_parser_next_token_ends_template_argument_p (parser)
19505                        || cp_lexer_next_token_is (parser->lexer,
19506                                                   CPP_CLOSE_PAREN)))
19507             decl = make_unbound_class_template (parser->scope,
19508                                                 name, NULL_TREE,
19509                                                 /*complain=*/tf_error);
19510           else
19511             decl = build_qualified_name (/*type=*/NULL_TREE,
19512                                          parser->scope, name,
19513                                          is_template);
19514         }
19515       parser->qualifying_scope = parser->scope;
19516       parser->object_scope = NULL_TREE;
19517     }
19518   else if (object_type)
19519     {
19520       tree object_decl = NULL_TREE;
19521       /* Look up the name in the scope of the OBJECT_TYPE, unless the
19522          OBJECT_TYPE is not a class.  */
19523       if (CLASS_TYPE_P (object_type))
19524         /* If the OBJECT_TYPE is a template specialization, it may
19525            be instantiated during name lookup.  In that case, errors
19526            may be issued.  Even if we rollback the current tentative
19527            parse, those errors are valid.  */
19528         object_decl = lookup_member (object_type,
19529                                      name,
19530                                      /*protect=*/0,
19531                                      tag_type != none_type);
19532       /* Look it up in the enclosing context, too.  */
19533       decl = lookup_name_real (name, tag_type != none_type,
19534                                /*nonclass=*/0,
19535                                /*block_p=*/true, is_namespace, flags);
19536       parser->object_scope = object_type;
19537       parser->qualifying_scope = NULL_TREE;
19538       if (object_decl)
19539         decl = object_decl;
19540     }
19541   else
19542     {
19543       decl = lookup_name_real (name, tag_type != none_type,
19544                                /*nonclass=*/0,
19545                                /*block_p=*/true, is_namespace, flags);
19546       parser->qualifying_scope = NULL_TREE;
19547       parser->object_scope = NULL_TREE;
19548     }
19549
19550   /* If the lookup failed, let our caller know.  */
19551   if (!decl || decl == error_mark_node)
19552     return error_mark_node;
19553
19554   /* Pull out the template from an injected-class-name (or multiple).  */
19555   if (is_template)
19556     decl = maybe_get_template_decl_from_type_decl (decl);
19557
19558   /* If it's a TREE_LIST, the result of the lookup was ambiguous.  */
19559   if (TREE_CODE (decl) == TREE_LIST)
19560     {
19561       if (ambiguous_decls)
19562         *ambiguous_decls = decl;
19563       /* The error message we have to print is too complicated for
19564          cp_parser_error, so we incorporate its actions directly.  */
19565       if (!cp_parser_simulate_error (parser))
19566         {
19567           error_at (name_location, "reference to %qD is ambiguous",
19568                     name);
19569           print_candidates (decl);
19570         }
19571       return error_mark_node;
19572     }
19573
19574   gcc_assert (DECL_P (decl)
19575               || TREE_CODE (decl) == OVERLOAD
19576               || TREE_CODE (decl) == SCOPE_REF
19577               || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
19578               || BASELINK_P (decl));
19579
19580   /* If we have resolved the name of a member declaration, check to
19581      see if the declaration is accessible.  When the name resolves to
19582      set of overloaded functions, accessibility is checked when
19583      overload resolution is done.
19584
19585      During an explicit instantiation, access is not checked at all,
19586      as per [temp.explicit].  */
19587   if (DECL_P (decl))
19588     check_accessibility_of_qualified_id (decl, object_type, parser->scope);
19589
19590   maybe_record_typedef_use (decl);
19591
19592   return decl;
19593 }
19594
19595 /* Like cp_parser_lookup_name, but for use in the typical case where
19596    CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
19597    IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE.  */
19598
19599 static tree
19600 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
19601 {
19602   return cp_parser_lookup_name (parser, name,
19603                                 none_type,
19604                                 /*is_template=*/false,
19605                                 /*is_namespace=*/false,
19606                                 /*check_dependency=*/true,
19607                                 /*ambiguous_decls=*/NULL,
19608                                 location);
19609 }
19610
19611 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
19612    the current context, return the TYPE_DECL.  If TAG_NAME_P is
19613    true, the DECL indicates the class being defined in a class-head,
19614    or declared in an elaborated-type-specifier.
19615
19616    Otherwise, return DECL.  */
19617
19618 static tree
19619 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
19620 {
19621   /* If the TEMPLATE_DECL is being declared as part of a class-head,
19622      the translation from TEMPLATE_DECL to TYPE_DECL occurs:
19623
19624        struct A {
19625          template <typename T> struct B;
19626        };
19627
19628        template <typename T> struct A::B {};
19629
19630      Similarly, in an elaborated-type-specifier:
19631
19632        namespace N { struct X{}; }
19633
19634        struct A {
19635          template <typename T> friend struct N::X;
19636        };
19637
19638      However, if the DECL refers to a class type, and we are in
19639      the scope of the class, then the name lookup automatically
19640      finds the TYPE_DECL created by build_self_reference rather
19641      than a TEMPLATE_DECL.  For example, in:
19642
19643        template <class T> struct S {
19644          S s;
19645        };
19646
19647      there is no need to handle such case.  */
19648
19649   if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
19650     return DECL_TEMPLATE_RESULT (decl);
19651
19652   return decl;
19653 }
19654
19655 /* If too many, or too few, template-parameter lists apply to the
19656    declarator, issue an error message.  Returns TRUE if all went well,
19657    and FALSE otherwise.  */
19658
19659 static bool
19660 cp_parser_check_declarator_template_parameters (cp_parser* parser,
19661                                                 cp_declarator *declarator,
19662                                                 location_t declarator_location)
19663 {
19664   unsigned num_templates;
19665
19666   /* We haven't seen any classes that involve template parameters yet.  */
19667   num_templates = 0;
19668
19669   switch (declarator->kind)
19670     {
19671     case cdk_id:
19672       if (declarator->u.id.qualifying_scope)
19673         {
19674           tree scope;
19675
19676           scope = declarator->u.id.qualifying_scope;
19677
19678           while (scope && CLASS_TYPE_P (scope))
19679             {
19680               /* You're supposed to have one `template <...>'
19681                  for every template class, but you don't need one
19682                  for a full specialization.  For example:
19683
19684                  template <class T> struct S{};
19685                  template <> struct S<int> { void f(); };
19686                  void S<int>::f () {}
19687
19688                  is correct; there shouldn't be a `template <>' for
19689                  the definition of `S<int>::f'.  */
19690               if (!CLASSTYPE_TEMPLATE_INFO (scope))
19691                 /* If SCOPE does not have template information of any
19692                    kind, then it is not a template, nor is it nested
19693                    within a template.  */
19694                 break;
19695               if (explicit_class_specialization_p (scope))
19696                 break;
19697               if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope)))
19698                 ++num_templates;
19699
19700               scope = TYPE_CONTEXT (scope);
19701             }
19702         }
19703       else if (TREE_CODE (declarator->u.id.unqualified_name)
19704                == TEMPLATE_ID_EXPR)
19705         /* If the DECLARATOR has the form `X<y>' then it uses one
19706            additional level of template parameters.  */
19707         ++num_templates;
19708
19709       return cp_parser_check_template_parameters 
19710         (parser, num_templates, declarator_location, declarator);
19711
19712
19713     case cdk_function:
19714     case cdk_array:
19715     case cdk_pointer:
19716     case cdk_reference:
19717     case cdk_ptrmem:
19718       return (cp_parser_check_declarator_template_parameters
19719               (parser, declarator->declarator, declarator_location));
19720
19721     case cdk_error:
19722       return true;
19723
19724     default:
19725       gcc_unreachable ();
19726     }
19727   return false;
19728 }
19729
19730 /* NUM_TEMPLATES were used in the current declaration.  If that is
19731    invalid, return FALSE and issue an error messages.  Otherwise,
19732    return TRUE.  If DECLARATOR is non-NULL, then we are checking a
19733    declarator and we can print more accurate diagnostics.  */
19734
19735 static bool
19736 cp_parser_check_template_parameters (cp_parser* parser,
19737                                      unsigned num_templates,
19738                                      location_t location,
19739                                      cp_declarator *declarator)
19740 {
19741   /* If there are the same number of template classes and parameter
19742      lists, that's OK.  */
19743   if (parser->num_template_parameter_lists == num_templates)
19744     return true;
19745   /* If there are more, but only one more, then we are referring to a
19746      member template.  That's OK too.  */
19747   if (parser->num_template_parameter_lists == num_templates + 1)
19748     return true;
19749   /* If there are more template classes than parameter lists, we have
19750      something like:
19751
19752        template <class T> void S<T>::R<T>::f ();  */
19753   if (parser->num_template_parameter_lists < num_templates)
19754     {
19755       if (declarator && !current_function_decl)
19756         error_at (location, "specializing member %<%T::%E%> "
19757                   "requires %<template<>%> syntax", 
19758                   declarator->u.id.qualifying_scope,
19759                   declarator->u.id.unqualified_name);
19760       else if (declarator)
19761         error_at (location, "invalid declaration of %<%T::%E%>",
19762                   declarator->u.id.qualifying_scope,
19763                   declarator->u.id.unqualified_name);
19764       else 
19765         error_at (location, "too few template-parameter-lists");
19766       return false;
19767     }
19768   /* Otherwise, there are too many template parameter lists.  We have
19769      something like:
19770
19771      template <class T> template <class U> void S::f();  */
19772   error_at (location, "too many template-parameter-lists");
19773   return false;
19774 }
19775
19776 /* Parse an optional `::' token indicating that the following name is
19777    from the global namespace.  If so, PARSER->SCOPE is set to the
19778    GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
19779    unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
19780    Returns the new value of PARSER->SCOPE, if the `::' token is
19781    present, and NULL_TREE otherwise.  */
19782
19783 static tree
19784 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
19785 {
19786   cp_token *token;
19787
19788   /* Peek at the next token.  */
19789   token = cp_lexer_peek_token (parser->lexer);
19790   /* If we're looking at a `::' token then we're starting from the
19791      global namespace, not our current location.  */
19792   if (token->type == CPP_SCOPE)
19793     {
19794       /* Consume the `::' token.  */
19795       cp_lexer_consume_token (parser->lexer);
19796       /* Set the SCOPE so that we know where to start the lookup.  */
19797       parser->scope = global_namespace;
19798       parser->qualifying_scope = global_namespace;
19799       parser->object_scope = NULL_TREE;
19800
19801       return parser->scope;
19802     }
19803   else if (!current_scope_valid_p)
19804     {
19805       parser->scope = NULL_TREE;
19806       parser->qualifying_scope = NULL_TREE;
19807       parser->object_scope = NULL_TREE;
19808     }
19809
19810   return NULL_TREE;
19811 }
19812
19813 /* Returns TRUE if the upcoming token sequence is the start of a
19814    constructor declarator.  If FRIEND_P is true, the declarator is
19815    preceded by the `friend' specifier.  */
19816
19817 static bool
19818 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
19819 {
19820   bool constructor_p;
19821   tree nested_name_specifier;
19822   cp_token *next_token;
19823
19824   /* The common case is that this is not a constructor declarator, so
19825      try to avoid doing lots of work if at all possible.  It's not
19826      valid declare a constructor at function scope.  */
19827   if (parser->in_function_body)
19828     return false;
19829   /* And only certain tokens can begin a constructor declarator.  */
19830   next_token = cp_lexer_peek_token (parser->lexer);
19831   if (next_token->type != CPP_NAME
19832       && next_token->type != CPP_SCOPE
19833       && next_token->type != CPP_NESTED_NAME_SPECIFIER
19834       && next_token->type != CPP_TEMPLATE_ID)
19835     return false;
19836
19837   /* Parse tentatively; we are going to roll back all of the tokens
19838      consumed here.  */
19839   cp_parser_parse_tentatively (parser);
19840   /* Assume that we are looking at a constructor declarator.  */
19841   constructor_p = true;
19842
19843   /* Look for the optional `::' operator.  */
19844   cp_parser_global_scope_opt (parser,
19845                               /*current_scope_valid_p=*/false);
19846   /* Look for the nested-name-specifier.  */
19847   nested_name_specifier
19848     = (cp_parser_nested_name_specifier_opt (parser,
19849                                             /*typename_keyword_p=*/false,
19850                                             /*check_dependency_p=*/false,
19851                                             /*type_p=*/false,
19852                                             /*is_declaration=*/false));
19853   /* Outside of a class-specifier, there must be a
19854      nested-name-specifier.  */
19855   if (!nested_name_specifier &&
19856       (!at_class_scope_p () || !TYPE_BEING_DEFINED (current_class_type)
19857        || friend_p))
19858     constructor_p = false;
19859   else if (nested_name_specifier == error_mark_node)
19860     constructor_p = false;
19861
19862   /* If we have a class scope, this is easy; DR 147 says that S::S always
19863      names the constructor, and no other qualified name could.  */
19864   if (constructor_p && nested_name_specifier
19865       && CLASS_TYPE_P (nested_name_specifier))
19866     {
19867       tree id = cp_parser_unqualified_id (parser,
19868                                           /*template_keyword_p=*/false,
19869                                           /*check_dependency_p=*/false,
19870                                           /*declarator_p=*/true,
19871                                           /*optional_p=*/false);
19872       if (is_overloaded_fn (id))
19873         id = DECL_NAME (get_first_fn (id));
19874       if (!constructor_name_p (id, nested_name_specifier))
19875         constructor_p = false;
19876     }
19877   /* If we still think that this might be a constructor-declarator,
19878      look for a class-name.  */
19879   else if (constructor_p)
19880     {
19881       /* If we have:
19882
19883            template <typename T> struct S {
19884              S();
19885            };
19886
19887          we must recognize that the nested `S' names a class.  */
19888       tree type_decl;
19889       type_decl = cp_parser_class_name (parser,
19890                                         /*typename_keyword_p=*/false,
19891                                         /*template_keyword_p=*/false,
19892                                         none_type,
19893                                         /*check_dependency_p=*/false,
19894                                         /*class_head_p=*/false,
19895                                         /*is_declaration=*/false);
19896       /* If there was no class-name, then this is not a constructor.  */
19897       constructor_p = !cp_parser_error_occurred (parser);
19898
19899       /* If we're still considering a constructor, we have to see a `(',
19900          to begin the parameter-declaration-clause, followed by either a
19901          `)', an `...', or a decl-specifier.  We need to check for a
19902          type-specifier to avoid being fooled into thinking that:
19903
19904            S (f) (int);
19905
19906          is a constructor.  (It is actually a function named `f' that
19907          takes one parameter (of type `int') and returns a value of type
19908          `S'.  */
19909       if (constructor_p
19910           && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
19911         constructor_p = false;
19912
19913       if (constructor_p
19914           && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
19915           && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
19916           /* A parameter declaration begins with a decl-specifier,
19917              which is either the "attribute" keyword, a storage class
19918              specifier, or (usually) a type-specifier.  */
19919           && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
19920         {
19921           tree type;
19922           tree pushed_scope = NULL_TREE;
19923           unsigned saved_num_template_parameter_lists;
19924
19925           /* Names appearing in the type-specifier should be looked up
19926              in the scope of the class.  */
19927           if (current_class_type)
19928             type = NULL_TREE;
19929           else
19930             {
19931               type = TREE_TYPE (type_decl);
19932               if (TREE_CODE (type) == TYPENAME_TYPE)
19933                 {
19934                   type = resolve_typename_type (type,
19935                                                 /*only_current_p=*/false);
19936                   if (TREE_CODE (type) == TYPENAME_TYPE)
19937                     {
19938                       cp_parser_abort_tentative_parse (parser);
19939                       return false;
19940                     }
19941                 }
19942               pushed_scope = push_scope (type);
19943             }
19944
19945           /* Inside the constructor parameter list, surrounding
19946              template-parameter-lists do not apply.  */
19947           saved_num_template_parameter_lists
19948             = parser->num_template_parameter_lists;
19949           parser->num_template_parameter_lists = 0;
19950
19951           /* Look for the type-specifier.  */
19952           cp_parser_type_specifier (parser,
19953                                     CP_PARSER_FLAGS_NONE,
19954                                     /*decl_specs=*/NULL,
19955                                     /*is_declarator=*/true,
19956                                     /*declares_class_or_enum=*/NULL,
19957                                     /*is_cv_qualifier=*/NULL);
19958
19959           parser->num_template_parameter_lists
19960             = saved_num_template_parameter_lists;
19961
19962           /* Leave the scope of the class.  */
19963           if (pushed_scope)
19964             pop_scope (pushed_scope);
19965
19966           constructor_p = !cp_parser_error_occurred (parser);
19967         }
19968     }
19969
19970   /* We did not really want to consume any tokens.  */
19971   cp_parser_abort_tentative_parse (parser);
19972
19973   return constructor_p;
19974 }
19975
19976 /* Parse the definition of the function given by the DECL_SPECIFIERS,
19977    ATTRIBUTES, and DECLARATOR.  The access checks have been deferred;
19978    they must be performed once we are in the scope of the function.
19979
19980    Returns the function defined.  */
19981
19982 static tree
19983 cp_parser_function_definition_from_specifiers_and_declarator
19984   (cp_parser* parser,
19985    cp_decl_specifier_seq *decl_specifiers,
19986    tree attributes,
19987    const cp_declarator *declarator)
19988 {
19989   tree fn;
19990   bool success_p;
19991
19992   /* Begin the function-definition.  */
19993   success_p = start_function (decl_specifiers, declarator, attributes);
19994
19995   /* The things we're about to see are not directly qualified by any
19996      template headers we've seen thus far.  */
19997   reset_specialization ();
19998
19999   /* If there were names looked up in the decl-specifier-seq that we
20000      did not check, check them now.  We must wait until we are in the
20001      scope of the function to perform the checks, since the function
20002      might be a friend.  */
20003   perform_deferred_access_checks ();
20004
20005   if (!success_p)
20006     {
20007       /* Skip the entire function.  */
20008       cp_parser_skip_to_end_of_block_or_statement (parser);
20009       fn = error_mark_node;
20010     }
20011   else if (DECL_INITIAL (current_function_decl) != error_mark_node)
20012     {
20013       /* Seen already, skip it.  An error message has already been output.  */
20014       cp_parser_skip_to_end_of_block_or_statement (parser);
20015       fn = current_function_decl;
20016       current_function_decl = NULL_TREE;
20017       /* If this is a function from a class, pop the nested class.  */
20018       if (current_class_name)
20019         pop_nested_class ();
20020     }
20021   else
20022     {
20023       timevar_id_t tv;
20024       if (DECL_DECLARED_INLINE_P (current_function_decl))
20025         tv = TV_PARSE_INLINE;
20026       else
20027         tv = TV_PARSE_FUNC;
20028       timevar_push (tv);
20029       fn = cp_parser_function_definition_after_declarator (parser,
20030                                                          /*inline_p=*/false);
20031       timevar_pop (tv);
20032     }
20033
20034   return fn;
20035 }
20036
20037 /* Parse the part of a function-definition that follows the
20038    declarator.  INLINE_P is TRUE iff this function is an inline
20039    function defined within a class-specifier.
20040
20041    Returns the function defined.  */
20042
20043 static tree
20044 cp_parser_function_definition_after_declarator (cp_parser* parser,
20045                                                 bool inline_p)
20046 {
20047   tree fn;
20048   bool ctor_initializer_p = false;
20049   bool saved_in_unbraced_linkage_specification_p;
20050   bool saved_in_function_body;
20051   unsigned saved_num_template_parameter_lists;
20052   cp_token *token;
20053
20054   saved_in_function_body = parser->in_function_body;
20055   parser->in_function_body = true;
20056   /* If the next token is `return', then the code may be trying to
20057      make use of the "named return value" extension that G++ used to
20058      support.  */
20059   token = cp_lexer_peek_token (parser->lexer);
20060   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
20061     {
20062       /* Consume the `return' keyword.  */
20063       cp_lexer_consume_token (parser->lexer);
20064       /* Look for the identifier that indicates what value is to be
20065          returned.  */
20066       cp_parser_identifier (parser);
20067       /* Issue an error message.  */
20068       error_at (token->location,
20069                 "named return values are no longer supported");
20070       /* Skip tokens until we reach the start of the function body.  */
20071       while (true)
20072         {
20073           cp_token *token = cp_lexer_peek_token (parser->lexer);
20074           if (token->type == CPP_OPEN_BRACE
20075               || token->type == CPP_EOF
20076               || token->type == CPP_PRAGMA_EOL)
20077             break;
20078           cp_lexer_consume_token (parser->lexer);
20079         }
20080     }
20081   /* The `extern' in `extern "C" void f () { ... }' does not apply to
20082      anything declared inside `f'.  */
20083   saved_in_unbraced_linkage_specification_p
20084     = parser->in_unbraced_linkage_specification_p;
20085   parser->in_unbraced_linkage_specification_p = false;
20086   /* Inside the function, surrounding template-parameter-lists do not
20087      apply.  */
20088   saved_num_template_parameter_lists
20089     = parser->num_template_parameter_lists;
20090   parser->num_template_parameter_lists = 0;
20091
20092   start_lambda_scope (current_function_decl);
20093
20094   /* If the next token is `try', then we are looking at a
20095      function-try-block.  */
20096   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
20097     ctor_initializer_p = cp_parser_function_try_block (parser);
20098   /* A function-try-block includes the function-body, so we only do
20099      this next part if we're not processing a function-try-block.  */
20100   else
20101     ctor_initializer_p
20102       = cp_parser_ctor_initializer_opt_and_function_body (parser);
20103
20104   finish_lambda_scope ();
20105
20106   /* Finish the function.  */
20107   fn = finish_function ((ctor_initializer_p ? 1 : 0) |
20108                         (inline_p ? 2 : 0));
20109   /* Generate code for it, if necessary.  */
20110   expand_or_defer_fn (fn);
20111   /* Restore the saved values.  */
20112   parser->in_unbraced_linkage_specification_p
20113     = saved_in_unbraced_linkage_specification_p;
20114   parser->num_template_parameter_lists
20115     = saved_num_template_parameter_lists;
20116   parser->in_function_body = saved_in_function_body;
20117
20118   return fn;
20119 }
20120
20121 /* Parse a template-declaration, assuming that the `export' (and
20122    `extern') keywords, if present, has already been scanned.  MEMBER_P
20123    is as for cp_parser_template_declaration.  */
20124
20125 static void
20126 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
20127 {
20128   tree decl = NULL_TREE;
20129   VEC (deferred_access_check,gc) *checks;
20130   tree parameter_list;
20131   bool friend_p = false;
20132   bool need_lang_pop;
20133   cp_token *token;
20134
20135   /* Look for the `template' keyword.  */
20136   token = cp_lexer_peek_token (parser->lexer);
20137   if (!cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE))
20138     return;
20139
20140   /* And the `<'.  */
20141   if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
20142     return;
20143   if (at_class_scope_p () && current_function_decl)
20144     {
20145       /* 14.5.2.2 [temp.mem]
20146
20147          A local class shall not have member templates.  */
20148       error_at (token->location,
20149                 "invalid declaration of member template in local class");
20150       cp_parser_skip_to_end_of_block_or_statement (parser);
20151       return;
20152     }
20153   /* [temp]
20154
20155      A template ... shall not have C linkage.  */
20156   if (current_lang_name == lang_name_c)
20157     {
20158       error_at (token->location, "template with C linkage");
20159       /* Give it C++ linkage to avoid confusing other parts of the
20160          front end.  */
20161       push_lang_context (lang_name_cplusplus);
20162       need_lang_pop = true;
20163     }
20164   else
20165     need_lang_pop = false;
20166
20167   /* We cannot perform access checks on the template parameter
20168      declarations until we know what is being declared, just as we
20169      cannot check the decl-specifier list.  */
20170   push_deferring_access_checks (dk_deferred);
20171
20172   /* If the next token is `>', then we have an invalid
20173      specialization.  Rather than complain about an invalid template
20174      parameter, issue an error message here.  */
20175   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
20176     {
20177       cp_parser_error (parser, "invalid explicit specialization");
20178       begin_specialization ();
20179       parameter_list = NULL_TREE;
20180     }
20181   else
20182     {
20183       /* Parse the template parameters.  */
20184       parameter_list = cp_parser_template_parameter_list (parser);
20185       fixup_template_parms ();
20186     }
20187
20188   /* Get the deferred access checks from the parameter list.  These
20189      will be checked once we know what is being declared, as for a
20190      member template the checks must be performed in the scope of the
20191      class containing the member.  */
20192   checks = get_deferred_access_checks ();
20193
20194   /* Look for the `>'.  */
20195   cp_parser_skip_to_end_of_template_parameter_list (parser);
20196   /* We just processed one more parameter list.  */
20197   ++parser->num_template_parameter_lists;
20198   /* If the next token is `template', there are more template
20199      parameters.  */
20200   if (cp_lexer_next_token_is_keyword (parser->lexer,
20201                                       RID_TEMPLATE))
20202     cp_parser_template_declaration_after_export (parser, member_p);
20203   else
20204     {
20205       /* There are no access checks when parsing a template, as we do not
20206          know if a specialization will be a friend.  */
20207       push_deferring_access_checks (dk_no_check);
20208       token = cp_lexer_peek_token (parser->lexer);
20209       decl = cp_parser_single_declaration (parser,
20210                                            checks,
20211                                            member_p,
20212                                            /*explicit_specialization_p=*/false,
20213                                            &friend_p);
20214       pop_deferring_access_checks ();
20215
20216       /* If this is a member template declaration, let the front
20217          end know.  */
20218       if (member_p && !friend_p && decl)
20219         {
20220           if (TREE_CODE (decl) == TYPE_DECL)
20221             cp_parser_check_access_in_redeclaration (decl, token->location);
20222
20223           decl = finish_member_template_decl (decl);
20224         }
20225       else if (friend_p && decl && TREE_CODE (decl) == TYPE_DECL)
20226         make_friend_class (current_class_type, TREE_TYPE (decl),
20227                            /*complain=*/true);
20228     }
20229   /* We are done with the current parameter list.  */
20230   --parser->num_template_parameter_lists;
20231
20232   pop_deferring_access_checks ();
20233
20234   /* Finish up.  */
20235   finish_template_decl (parameter_list);
20236
20237   /* Register member declarations.  */
20238   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
20239     finish_member_declaration (decl);
20240   /* For the erroneous case of a template with C linkage, we pushed an
20241      implicit C++ linkage scope; exit that scope now.  */
20242   if (need_lang_pop)
20243     pop_lang_context ();
20244   /* If DECL is a function template, we must return to parse it later.
20245      (Even though there is no definition, there might be default
20246      arguments that need handling.)  */
20247   if (member_p && decl
20248       && (TREE_CODE (decl) == FUNCTION_DECL
20249           || DECL_FUNCTION_TEMPLATE_P (decl)))
20250     VEC_safe_push (tree, gc, unparsed_funs_with_definitions, decl);
20251 }
20252
20253 /* Perform the deferred access checks from a template-parameter-list.
20254    CHECKS is a TREE_LIST of access checks, as returned by
20255    get_deferred_access_checks.  */
20256
20257 static void
20258 cp_parser_perform_template_parameter_access_checks (VEC (deferred_access_check,gc)* checks)
20259 {
20260   ++processing_template_parmlist;
20261   perform_access_checks (checks);
20262   --processing_template_parmlist;
20263 }
20264
20265 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
20266    `function-definition' sequence.  MEMBER_P is true, this declaration
20267    appears in a class scope.
20268
20269    Returns the DECL for the declared entity.  If FRIEND_P is non-NULL,
20270    *FRIEND_P is set to TRUE iff the declaration is a friend.  */
20271
20272 static tree
20273 cp_parser_single_declaration (cp_parser* parser,
20274                               VEC (deferred_access_check,gc)* checks,
20275                               bool member_p,
20276                               bool explicit_specialization_p,
20277                               bool* friend_p)
20278 {
20279   int declares_class_or_enum;
20280   tree decl = NULL_TREE;
20281   cp_decl_specifier_seq decl_specifiers;
20282   bool function_definition_p = false;
20283   cp_token *decl_spec_token_start;
20284
20285   /* This function is only used when processing a template
20286      declaration.  */
20287   gcc_assert (innermost_scope_kind () == sk_template_parms
20288               || innermost_scope_kind () == sk_template_spec);
20289
20290   /* Defer access checks until we know what is being declared.  */
20291   push_deferring_access_checks (dk_deferred);
20292
20293   /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
20294      alternative.  */
20295   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
20296   cp_parser_decl_specifier_seq (parser,
20297                                 CP_PARSER_FLAGS_OPTIONAL,
20298                                 &decl_specifiers,
20299                                 &declares_class_or_enum);
20300   if (friend_p)
20301     *friend_p = cp_parser_friend_p (&decl_specifiers);
20302
20303   /* There are no template typedefs.  */
20304   if (decl_specifiers.specs[(int) ds_typedef])
20305     {
20306       error_at (decl_spec_token_start->location,
20307                 "template declaration of %<typedef%>");
20308       decl = error_mark_node;
20309     }
20310
20311   /* Gather up the access checks that occurred the
20312      decl-specifier-seq.  */
20313   stop_deferring_access_checks ();
20314
20315   /* Check for the declaration of a template class.  */
20316   if (declares_class_or_enum)
20317     {
20318       if (cp_parser_declares_only_class_p (parser))
20319         {
20320           decl = shadow_tag (&decl_specifiers);
20321
20322           /* In this case:
20323
20324                struct C {
20325                  friend template <typename T> struct A<T>::B;
20326                };
20327
20328              A<T>::B will be represented by a TYPENAME_TYPE, and
20329              therefore not recognized by shadow_tag.  */
20330           if (friend_p && *friend_p
20331               && !decl
20332               && decl_specifiers.type
20333               && TYPE_P (decl_specifiers.type))
20334             decl = decl_specifiers.type;
20335
20336           if (decl && decl != error_mark_node)
20337             decl = TYPE_NAME (decl);
20338           else
20339             decl = error_mark_node;
20340
20341           /* Perform access checks for template parameters.  */
20342           cp_parser_perform_template_parameter_access_checks (checks);
20343         }
20344     }
20345
20346   /* Complain about missing 'typename' or other invalid type names.  */
20347   if (!decl_specifiers.any_type_specifiers_p
20348       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
20349     {
20350       /* cp_parser_parse_and_diagnose_invalid_type_name calls
20351          cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
20352          the rest of this declaration.  */
20353       decl = error_mark_node;
20354       goto out;
20355     }
20356
20357   /* If it's not a template class, try for a template function.  If
20358      the next token is a `;', then this declaration does not declare
20359      anything.  But, if there were errors in the decl-specifiers, then
20360      the error might well have come from an attempted class-specifier.
20361      In that case, there's no need to warn about a missing declarator.  */
20362   if (!decl
20363       && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
20364           || decl_specifiers.type != error_mark_node))
20365     {
20366       decl = cp_parser_init_declarator (parser,
20367                                         &decl_specifiers,
20368                                         checks,
20369                                         /*function_definition_allowed_p=*/true,
20370                                         member_p,
20371                                         declares_class_or_enum,
20372                                         &function_definition_p,
20373                                         NULL);
20374
20375     /* 7.1.1-1 [dcl.stc]
20376
20377        A storage-class-specifier shall not be specified in an explicit
20378        specialization...  */
20379     if (decl
20380         && explicit_specialization_p
20381         && decl_specifiers.storage_class != sc_none)
20382       {
20383         error_at (decl_spec_token_start->location,
20384                   "explicit template specialization cannot have a storage class");
20385         decl = error_mark_node;
20386       }
20387     }
20388
20389   /* Look for a trailing `;' after the declaration.  */
20390   if (!function_definition_p
20391       && (decl == error_mark_node
20392           || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
20393     cp_parser_skip_to_end_of_block_or_statement (parser);
20394
20395  out:
20396   pop_deferring_access_checks ();
20397
20398   /* Clear any current qualification; whatever comes next is the start
20399      of something new.  */
20400   parser->scope = NULL_TREE;
20401   parser->qualifying_scope = NULL_TREE;
20402   parser->object_scope = NULL_TREE;
20403
20404   return decl;
20405 }
20406
20407 /* Parse a cast-expression that is not the operand of a unary "&".  */
20408
20409 static tree
20410 cp_parser_simple_cast_expression (cp_parser *parser)
20411 {
20412   return cp_parser_cast_expression (parser, /*address_p=*/false,
20413                                     /*cast_p=*/false, NULL);
20414 }
20415
20416 /* Parse a functional cast to TYPE.  Returns an expression
20417    representing the cast.  */
20418
20419 static tree
20420 cp_parser_functional_cast (cp_parser* parser, tree type)
20421 {
20422   VEC(tree,gc) *vec;
20423   tree expression_list;
20424   tree cast;
20425   bool nonconst_p;
20426
20427   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
20428     {
20429       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
20430       expression_list = cp_parser_braced_list (parser, &nonconst_p);
20431       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
20432       if (TREE_CODE (type) == TYPE_DECL)
20433         type = TREE_TYPE (type);
20434       return finish_compound_literal (type, expression_list,
20435                                       tf_warning_or_error);
20436     }
20437
20438
20439   vec = cp_parser_parenthesized_expression_list (parser, non_attr,
20440                                                  /*cast_p=*/true,
20441                                                  /*allow_expansion_p=*/true,
20442                                                  /*non_constant_p=*/NULL);
20443   if (vec == NULL)
20444     expression_list = error_mark_node;
20445   else
20446     {
20447       expression_list = build_tree_list_vec (vec);
20448       release_tree_vector (vec);
20449     }
20450
20451   cast = build_functional_cast (type, expression_list,
20452                                 tf_warning_or_error);
20453   /* [expr.const]/1: In an integral constant expression "only type
20454      conversions to integral or enumeration type can be used".  */
20455   if (TREE_CODE (type) == TYPE_DECL)
20456     type = TREE_TYPE (type);
20457   if (cast != error_mark_node
20458       && !cast_valid_in_integral_constant_expression_p (type)
20459       && cp_parser_non_integral_constant_expression (parser,
20460                                                      NIC_CONSTRUCTOR))
20461     return error_mark_node;
20462   return cast;
20463 }
20464
20465 /* Save the tokens that make up the body of a member function defined
20466    in a class-specifier.  The DECL_SPECIFIERS and DECLARATOR have
20467    already been parsed.  The ATTRIBUTES are any GNU "__attribute__"
20468    specifiers applied to the declaration.  Returns the FUNCTION_DECL
20469    for the member function.  */
20470
20471 static tree
20472 cp_parser_save_member_function_body (cp_parser* parser,
20473                                      cp_decl_specifier_seq *decl_specifiers,
20474                                      cp_declarator *declarator,
20475                                      tree attributes)
20476 {
20477   cp_token *first;
20478   cp_token *last;
20479   tree fn;
20480
20481   /* Create the FUNCTION_DECL.  */
20482   fn = grokmethod (decl_specifiers, declarator, attributes);
20483   /* If something went badly wrong, bail out now.  */
20484   if (fn == error_mark_node)
20485     {
20486       /* If there's a function-body, skip it.  */
20487       if (cp_parser_token_starts_function_definition_p
20488           (cp_lexer_peek_token (parser->lexer)))
20489         cp_parser_skip_to_end_of_block_or_statement (parser);
20490       return error_mark_node;
20491     }
20492
20493   /* Remember it, if there default args to post process.  */
20494   cp_parser_save_default_args (parser, fn);
20495
20496   /* Save away the tokens that make up the body of the
20497      function.  */
20498   first = parser->lexer->next_token;
20499   /* We can have braced-init-list mem-initializers before the fn body.  */
20500   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
20501     {
20502       cp_lexer_consume_token (parser->lexer);
20503       while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
20504              && cp_lexer_next_token_is_not_keyword (parser->lexer, RID_TRY))
20505         {
20506           /* cache_group will stop after an un-nested { } pair, too.  */
20507           if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
20508             break;
20509
20510           /* variadic mem-inits have ... after the ')'.  */
20511           if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20512             cp_lexer_consume_token (parser->lexer);
20513         }
20514     }
20515   cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20516   /* Handle function try blocks.  */
20517   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
20518     cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20519   last = parser->lexer->next_token;
20520
20521   /* Save away the inline definition; we will process it when the
20522      class is complete.  */
20523   DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
20524   DECL_PENDING_INLINE_P (fn) = 1;
20525
20526   /* We need to know that this was defined in the class, so that
20527      friend templates are handled correctly.  */
20528   DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
20529
20530   /* Add FN to the queue of functions to be parsed later.  */
20531   VEC_safe_push (tree, gc, unparsed_funs_with_definitions, fn);
20532
20533   return fn;
20534 }
20535
20536 /* Parse a template-argument-list, as well as the trailing ">" (but
20537    not the opening ">").  See cp_parser_template_argument_list for the
20538    return value.  */
20539
20540 static tree
20541 cp_parser_enclosed_template_argument_list (cp_parser* parser)
20542 {
20543   tree arguments;
20544   tree saved_scope;
20545   tree saved_qualifying_scope;
20546   tree saved_object_scope;
20547   bool saved_greater_than_is_operator_p;
20548   int saved_unevaluated_operand;
20549   int saved_inhibit_evaluation_warnings;
20550
20551   /* [temp.names]
20552
20553      When parsing a template-id, the first non-nested `>' is taken as
20554      the end of the template-argument-list rather than a greater-than
20555      operator.  */
20556   saved_greater_than_is_operator_p
20557     = parser->greater_than_is_operator_p;
20558   parser->greater_than_is_operator_p = false;
20559   /* Parsing the argument list may modify SCOPE, so we save it
20560      here.  */
20561   saved_scope = parser->scope;
20562   saved_qualifying_scope = parser->qualifying_scope;
20563   saved_object_scope = parser->object_scope;
20564   /* We need to evaluate the template arguments, even though this
20565      template-id may be nested within a "sizeof".  */
20566   saved_unevaluated_operand = cp_unevaluated_operand;
20567   cp_unevaluated_operand = 0;
20568   saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
20569   c_inhibit_evaluation_warnings = 0;
20570   /* Parse the template-argument-list itself.  */
20571   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
20572       || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20573     arguments = NULL_TREE;
20574   else
20575     arguments = cp_parser_template_argument_list (parser);
20576   /* Look for the `>' that ends the template-argument-list. If we find
20577      a '>>' instead, it's probably just a typo.  */
20578   if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20579     {
20580       if (cxx_dialect != cxx98)
20581         {
20582           /* In C++0x, a `>>' in a template argument list or cast
20583              expression is considered to be two separate `>'
20584              tokens. So, change the current token to a `>', but don't
20585              consume it: it will be consumed later when the outer
20586              template argument list (or cast expression) is parsed.
20587              Note that this replacement of `>' for `>>' is necessary
20588              even if we are parsing tentatively: in the tentative
20589              case, after calling
20590              cp_parser_enclosed_template_argument_list we will always
20591              throw away all of the template arguments and the first
20592              closing `>', either because the template argument list
20593              was erroneous or because we are replacing those tokens
20594              with a CPP_TEMPLATE_ID token.  The second `>' (which will
20595              not have been thrown away) is needed either to close an
20596              outer template argument list or to complete a new-style
20597              cast.  */
20598           cp_token *token = cp_lexer_peek_token (parser->lexer);
20599           token->type = CPP_GREATER;
20600         }
20601       else if (!saved_greater_than_is_operator_p)
20602         {
20603           /* If we're in a nested template argument list, the '>>' has
20604             to be a typo for '> >'. We emit the error message, but we
20605             continue parsing and we push a '>' as next token, so that
20606             the argument list will be parsed correctly.  Note that the
20607             global source location is still on the token before the
20608             '>>', so we need to say explicitly where we want it.  */
20609           cp_token *token = cp_lexer_peek_token (parser->lexer);
20610           error_at (token->location, "%<>>%> should be %<> >%> "
20611                     "within a nested template argument list");
20612
20613           token->type = CPP_GREATER;
20614         }
20615       else
20616         {
20617           /* If this is not a nested template argument list, the '>>'
20618             is a typo for '>'. Emit an error message and continue.
20619             Same deal about the token location, but here we can get it
20620             right by consuming the '>>' before issuing the diagnostic.  */
20621           cp_token *token = cp_lexer_consume_token (parser->lexer);
20622           error_at (token->location,
20623                     "spurious %<>>%>, use %<>%> to terminate "
20624                     "a template argument list");
20625         }
20626     }
20627   else
20628     cp_parser_skip_to_end_of_template_parameter_list (parser);
20629   /* The `>' token might be a greater-than operator again now.  */
20630   parser->greater_than_is_operator_p
20631     = saved_greater_than_is_operator_p;
20632   /* Restore the SAVED_SCOPE.  */
20633   parser->scope = saved_scope;
20634   parser->qualifying_scope = saved_qualifying_scope;
20635   parser->object_scope = saved_object_scope;
20636   cp_unevaluated_operand = saved_unevaluated_operand;
20637   c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
20638
20639   return arguments;
20640 }
20641
20642 /* MEMBER_FUNCTION is a member function, or a friend.  If default
20643    arguments, or the body of the function have not yet been parsed,
20644    parse them now.  */
20645
20646 static void
20647 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
20648 {
20649   timevar_push (TV_PARSE_INMETH);
20650   /* If this member is a template, get the underlying
20651      FUNCTION_DECL.  */
20652   if (DECL_FUNCTION_TEMPLATE_P (member_function))
20653     member_function = DECL_TEMPLATE_RESULT (member_function);
20654
20655   /* There should not be any class definitions in progress at this
20656      point; the bodies of members are only parsed outside of all class
20657      definitions.  */
20658   gcc_assert (parser->num_classes_being_defined == 0);
20659   /* While we're parsing the member functions we might encounter more
20660      classes.  We want to handle them right away, but we don't want
20661      them getting mixed up with functions that are currently in the
20662      queue.  */
20663   push_unparsed_function_queues (parser);
20664
20665   /* Make sure that any template parameters are in scope.  */
20666   maybe_begin_member_template_processing (member_function);
20667
20668   /* If the body of the function has not yet been parsed, parse it
20669      now.  */
20670   if (DECL_PENDING_INLINE_P (member_function))
20671     {
20672       tree function_scope;
20673       cp_token_cache *tokens;
20674
20675       /* The function is no longer pending; we are processing it.  */
20676       tokens = DECL_PENDING_INLINE_INFO (member_function);
20677       DECL_PENDING_INLINE_INFO (member_function) = NULL;
20678       DECL_PENDING_INLINE_P (member_function) = 0;
20679
20680       /* If this is a local class, enter the scope of the containing
20681          function.  */
20682       function_scope = current_function_decl;
20683       if (function_scope)
20684         push_function_context ();
20685
20686       /* Push the body of the function onto the lexer stack.  */
20687       cp_parser_push_lexer_for_tokens (parser, tokens);
20688
20689       /* Let the front end know that we going to be defining this
20690          function.  */
20691       start_preparsed_function (member_function, NULL_TREE,
20692                                 SF_PRE_PARSED | SF_INCLASS_INLINE);
20693
20694       /* Don't do access checking if it is a templated function.  */
20695       if (processing_template_decl)
20696         push_deferring_access_checks (dk_no_check);
20697
20698       /* Now, parse the body of the function.  */
20699       cp_parser_function_definition_after_declarator (parser,
20700                                                       /*inline_p=*/true);
20701
20702       if (processing_template_decl)
20703         pop_deferring_access_checks ();
20704
20705       /* Leave the scope of the containing function.  */
20706       if (function_scope)
20707         pop_function_context ();
20708       cp_parser_pop_lexer (parser);
20709     }
20710
20711   /* Remove any template parameters from the symbol table.  */
20712   maybe_end_member_template_processing ();
20713
20714   /* Restore the queue.  */
20715   pop_unparsed_function_queues (parser);
20716   timevar_pop (TV_PARSE_INMETH);
20717 }
20718
20719 /* If DECL contains any default args, remember it on the unparsed
20720    functions queue.  */
20721
20722 static void
20723 cp_parser_save_default_args (cp_parser* parser, tree decl)
20724 {
20725   tree probe;
20726
20727   for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
20728        probe;
20729        probe = TREE_CHAIN (probe))
20730     if (TREE_PURPOSE (probe))
20731       {
20732         cp_default_arg_entry *entry
20733           = VEC_safe_push (cp_default_arg_entry, gc,
20734                            unparsed_funs_with_default_args, NULL);
20735         entry->class_type = current_class_type;
20736         entry->decl = decl;
20737         break;
20738       }
20739 }
20740
20741 /* FN is a FUNCTION_DECL which may contains a parameter with an
20742    unparsed DEFAULT_ARG.  Parse the default args now.  This function
20743    assumes that the current scope is the scope in which the default
20744    argument should be processed.  */
20745
20746 static void
20747 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
20748 {
20749   bool saved_local_variables_forbidden_p;
20750   bool non_constant_p;
20751   tree parm, parmdecl;
20752
20753   /* While we're parsing the default args, we might (due to the
20754      statement expression extension) encounter more classes.  We want
20755      to handle them right away, but we don't want them getting mixed
20756      up with default args that are currently in the queue.  */
20757   push_unparsed_function_queues (parser);
20758
20759   /* Local variable names (and the `this' keyword) may not appear
20760      in a default argument.  */
20761   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
20762   parser->local_variables_forbidden_p = true;
20763
20764   push_defarg_context (fn);
20765
20766   for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
20767          parmdecl = DECL_ARGUMENTS (fn);
20768        parm && parm != void_list_node;
20769        parm = TREE_CHAIN (parm),
20770          parmdecl = DECL_CHAIN (parmdecl))
20771     {
20772       cp_token_cache *tokens;
20773       tree default_arg = TREE_PURPOSE (parm);
20774       tree parsed_arg;
20775       VEC(tree,gc) *insts;
20776       tree copy;
20777       unsigned ix;
20778
20779       if (!default_arg)
20780         continue;
20781
20782       if (TREE_CODE (default_arg) != DEFAULT_ARG)
20783         /* This can happen for a friend declaration for a function
20784            already declared with default arguments.  */
20785         continue;
20786
20787        /* Push the saved tokens for the default argument onto the parser's
20788           lexer stack.  */
20789       tokens = DEFARG_TOKENS (default_arg);
20790       cp_parser_push_lexer_for_tokens (parser, tokens);
20791
20792       start_lambda_scope (parmdecl);
20793
20794       /* Parse the assignment-expression.  */
20795       parsed_arg = cp_parser_initializer_clause (parser, &non_constant_p);
20796       if (parsed_arg == error_mark_node)
20797         {
20798           cp_parser_pop_lexer (parser);
20799           continue;
20800         }
20801       if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg))
20802         maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
20803
20804       if (!processing_template_decl)
20805         parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg);
20806
20807       TREE_PURPOSE (parm) = parsed_arg;
20808
20809       /* Update any instantiations we've already created.  */
20810       for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
20811            VEC_iterate (tree, insts, ix, copy); ix++)
20812         TREE_PURPOSE (copy) = parsed_arg;
20813
20814       finish_lambda_scope ();
20815
20816       /* If the token stream has not been completely used up, then
20817          there was extra junk after the end of the default
20818          argument.  */
20819       if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
20820         cp_parser_error (parser, "expected %<,%>");
20821
20822       /* Revert to the main lexer.  */
20823       cp_parser_pop_lexer (parser);
20824     }
20825
20826   pop_defarg_context ();
20827
20828   /* Make sure no default arg is missing.  */
20829   check_default_args (fn);
20830
20831   /* Restore the state of local_variables_forbidden_p.  */
20832   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
20833
20834   /* Restore the queue.  */
20835   pop_unparsed_function_queues (parser);
20836 }
20837
20838 /* Parse the operand of `sizeof' (or a similar operator).  Returns
20839    either a TYPE or an expression, depending on the form of the
20840    input.  The KEYWORD indicates which kind of expression we have
20841    encountered.  */
20842
20843 static tree
20844 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
20845 {
20846   tree expr = NULL_TREE;
20847   const char *saved_message;
20848   char *tmp;
20849   bool saved_integral_constant_expression_p;
20850   bool saved_non_integral_constant_expression_p;
20851   bool pack_expansion_p = false;
20852
20853   /* Types cannot be defined in a `sizeof' expression.  Save away the
20854      old message.  */
20855   saved_message = parser->type_definition_forbidden_message;
20856   /* And create the new one.  */
20857   tmp = concat ("types may not be defined in %<",
20858                 IDENTIFIER_POINTER (ridpointers[keyword]),
20859                 "%> expressions", NULL);
20860   parser->type_definition_forbidden_message = tmp;
20861
20862   /* The restrictions on constant-expressions do not apply inside
20863      sizeof expressions.  */
20864   saved_integral_constant_expression_p
20865     = parser->integral_constant_expression_p;
20866   saved_non_integral_constant_expression_p
20867     = parser->non_integral_constant_expression_p;
20868   parser->integral_constant_expression_p = false;
20869
20870   /* If it's a `...', then we are computing the length of a parameter
20871      pack.  */
20872   if (keyword == RID_SIZEOF
20873       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20874     {
20875       /* Consume the `...'.  */
20876       cp_lexer_consume_token (parser->lexer);
20877       maybe_warn_variadic_templates ();
20878
20879       /* Note that this is an expansion.  */
20880       pack_expansion_p = true;
20881     }
20882
20883   /* Do not actually evaluate the expression.  */
20884   ++cp_unevaluated_operand;
20885   ++c_inhibit_evaluation_warnings;
20886   /* If it's a `(', then we might be looking at the type-id
20887      construction.  */
20888   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
20889     {
20890       tree type;
20891       bool saved_in_type_id_in_expr_p;
20892
20893       /* We can't be sure yet whether we're looking at a type-id or an
20894          expression.  */
20895       cp_parser_parse_tentatively (parser);
20896       /* Consume the `('.  */
20897       cp_lexer_consume_token (parser->lexer);
20898       /* Parse the type-id.  */
20899       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
20900       parser->in_type_id_in_expr_p = true;
20901       type = cp_parser_type_id (parser);
20902       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
20903       /* Now, look for the trailing `)'.  */
20904       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
20905       /* If all went well, then we're done.  */
20906       if (cp_parser_parse_definitely (parser))
20907         {
20908           cp_decl_specifier_seq decl_specs;
20909
20910           /* Build a trivial decl-specifier-seq.  */
20911           clear_decl_specs (&decl_specs);
20912           decl_specs.type = type;
20913
20914           /* Call grokdeclarator to figure out what type this is.  */
20915           expr = grokdeclarator (NULL,
20916                                  &decl_specs,
20917                                  TYPENAME,
20918                                  /*initialized=*/0,
20919                                  /*attrlist=*/NULL);
20920         }
20921     }
20922
20923   /* If the type-id production did not work out, then we must be
20924      looking at the unary-expression production.  */
20925   if (!expr)
20926     expr = cp_parser_unary_expression (parser, /*address_p=*/false,
20927                                        /*cast_p=*/false, NULL);
20928
20929   if (pack_expansion_p)
20930     /* Build a pack expansion. */
20931     expr = make_pack_expansion (expr);
20932
20933   /* Go back to evaluating expressions.  */
20934   --cp_unevaluated_operand;
20935   --c_inhibit_evaluation_warnings;
20936
20937   /* Free the message we created.  */
20938   free (tmp);
20939   /* And restore the old one.  */
20940   parser->type_definition_forbidden_message = saved_message;
20941   parser->integral_constant_expression_p
20942     = saved_integral_constant_expression_p;
20943   parser->non_integral_constant_expression_p
20944     = saved_non_integral_constant_expression_p;
20945
20946   return expr;
20947 }
20948
20949 /* If the current declaration has no declarator, return true.  */
20950
20951 static bool
20952 cp_parser_declares_only_class_p (cp_parser *parser)
20953 {
20954   /* If the next token is a `;' or a `,' then there is no
20955      declarator.  */
20956   return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
20957           || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
20958 }
20959
20960 /* Update the DECL_SPECS to reflect the storage class indicated by
20961    KEYWORD.  */
20962
20963 static void
20964 cp_parser_set_storage_class (cp_parser *parser,
20965                              cp_decl_specifier_seq *decl_specs,
20966                              enum rid keyword,
20967                              location_t location)
20968 {
20969   cp_storage_class storage_class;
20970
20971   if (parser->in_unbraced_linkage_specification_p)
20972     {
20973       error_at (location, "invalid use of %qD in linkage specification",
20974                 ridpointers[keyword]);
20975       return;
20976     }
20977   else if (decl_specs->storage_class != sc_none)
20978     {
20979       decl_specs->conflicting_specifiers_p = true;
20980       return;
20981     }
20982
20983   if ((keyword == RID_EXTERN || keyword == RID_STATIC)
20984       && decl_specs->specs[(int) ds_thread])
20985     {
20986       error_at (location, "%<__thread%> before %qD", ridpointers[keyword]);
20987       decl_specs->specs[(int) ds_thread] = 0;
20988     }
20989
20990   switch (keyword)
20991     {
20992     case RID_AUTO:
20993       storage_class = sc_auto;
20994       break;
20995     case RID_REGISTER:
20996       storage_class = sc_register;
20997       break;
20998     case RID_STATIC:
20999       storage_class = sc_static;
21000       break;
21001     case RID_EXTERN:
21002       storage_class = sc_extern;
21003       break;
21004     case RID_MUTABLE:
21005       storage_class = sc_mutable;
21006       break;
21007     default:
21008       gcc_unreachable ();
21009     }
21010   decl_specs->storage_class = storage_class;
21011
21012   /* A storage class specifier cannot be applied alongside a typedef 
21013      specifier. If there is a typedef specifier present then set 
21014      conflicting_specifiers_p which will trigger an error later
21015      on in grokdeclarator. */
21016   if (decl_specs->specs[(int)ds_typedef])
21017     decl_specs->conflicting_specifiers_p = true;
21018 }
21019
21020 /* Update the DECL_SPECS to reflect the TYPE_SPEC.  If TYPE_DEFINITION_P
21021    is true, the type is a class or enum definition.  */
21022
21023 static void
21024 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
21025                               tree type_spec,
21026                               location_t location,
21027                               bool type_definition_p)
21028 {
21029   decl_specs->any_specifiers_p = true;
21030
21031   /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
21032      (with, for example, in "typedef int wchar_t;") we remember that
21033      this is what happened.  In system headers, we ignore these
21034      declarations so that G++ can work with system headers that are not
21035      C++-safe.  */
21036   if (decl_specs->specs[(int) ds_typedef]
21037       && !type_definition_p
21038       && (type_spec == boolean_type_node
21039           || type_spec == char16_type_node
21040           || type_spec == char32_type_node
21041           || type_spec == wchar_type_node)
21042       && (decl_specs->type
21043           || decl_specs->specs[(int) ds_long]
21044           || decl_specs->specs[(int) ds_short]
21045           || decl_specs->specs[(int) ds_unsigned]
21046           || decl_specs->specs[(int) ds_signed]))
21047     {
21048       decl_specs->redefined_builtin_type = type_spec;
21049       if (!decl_specs->type)
21050         {
21051           decl_specs->type = type_spec;
21052           decl_specs->type_definition_p = false;
21053           decl_specs->type_location = location;
21054         }
21055     }
21056   else if (decl_specs->type)
21057     decl_specs->multiple_types_p = true;
21058   else
21059     {
21060       decl_specs->type = type_spec;
21061       decl_specs->type_definition_p = type_definition_p;
21062       decl_specs->redefined_builtin_type = NULL_TREE;
21063       decl_specs->type_location = location;
21064     }
21065 }
21066
21067 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
21068    Returns TRUE iff `friend' appears among the DECL_SPECIFIERS.  */
21069
21070 static bool
21071 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
21072 {
21073   return decl_specifiers->specs[(int) ds_friend] != 0;
21074 }
21075
21076 /* Issue an error message indicating that TOKEN_DESC was expected.
21077    If KEYWORD is true, it indicated this function is called by
21078    cp_parser_require_keword and the required token can only be
21079    a indicated keyword. */
21080
21081 static void
21082 cp_parser_required_error (cp_parser *parser,
21083                           required_token token_desc,
21084                           bool keyword)
21085 {
21086   switch (token_desc)
21087     {
21088       case RT_NEW:
21089         cp_parser_error (parser, "expected %<new%>");
21090         return;
21091       case RT_DELETE:
21092         cp_parser_error (parser, "expected %<delete%>");
21093         return;
21094       case RT_RETURN:
21095         cp_parser_error (parser, "expected %<return%>");
21096         return;
21097       case RT_WHILE:
21098         cp_parser_error (parser, "expected %<while%>");
21099         return;
21100       case RT_EXTERN:
21101         cp_parser_error (parser, "expected %<extern%>");
21102         return;
21103       case RT_STATIC_ASSERT:
21104         cp_parser_error (parser, "expected %<static_assert%>");
21105         return;
21106       case RT_DECLTYPE:
21107         cp_parser_error (parser, "expected %<decltype%>");
21108         return;
21109       case RT_OPERATOR:
21110         cp_parser_error (parser, "expected %<operator%>");
21111         return;
21112       case RT_CLASS:
21113         cp_parser_error (parser, "expected %<class%>");
21114         return;
21115       case RT_TEMPLATE:
21116         cp_parser_error (parser, "expected %<template%>");
21117         return;
21118       case RT_NAMESPACE:
21119         cp_parser_error (parser, "expected %<namespace%>");
21120         return;
21121       case RT_USING:
21122         cp_parser_error (parser, "expected %<using%>");
21123         return;
21124       case RT_ASM:
21125         cp_parser_error (parser, "expected %<asm%>");
21126         return;
21127       case RT_TRY:
21128         cp_parser_error (parser, "expected %<try%>");
21129         return;
21130       case RT_CATCH:
21131         cp_parser_error (parser, "expected %<catch%>");
21132         return;
21133       case RT_THROW:
21134         cp_parser_error (parser, "expected %<throw%>");
21135         return;
21136       case RT_LABEL:
21137         cp_parser_error (parser, "expected %<__label__%>");
21138         return;
21139       case RT_AT_TRY:
21140         cp_parser_error (parser, "expected %<@try%>");
21141         return;
21142       case RT_AT_SYNCHRONIZED:
21143         cp_parser_error (parser, "expected %<@synchronized%>");
21144         return;
21145       case RT_AT_THROW:
21146         cp_parser_error (parser, "expected %<@throw%>");
21147         return;
21148       default:
21149         break;
21150     }
21151   if (!keyword)
21152     {
21153       switch (token_desc)
21154         {
21155           case RT_SEMICOLON:
21156             cp_parser_error (parser, "expected %<;%>");
21157             return;
21158           case RT_OPEN_PAREN:
21159             cp_parser_error (parser, "expected %<(%>");
21160             return;
21161           case RT_CLOSE_BRACE:
21162             cp_parser_error (parser, "expected %<}%>");
21163             return;
21164           case RT_OPEN_BRACE:
21165             cp_parser_error (parser, "expected %<{%>");
21166             return;
21167           case RT_CLOSE_SQUARE:
21168             cp_parser_error (parser, "expected %<]%>");
21169             return;
21170           case RT_OPEN_SQUARE:
21171             cp_parser_error (parser, "expected %<[%>");
21172             return;
21173           case RT_COMMA:
21174             cp_parser_error (parser, "expected %<,%>");
21175             return;
21176           case RT_SCOPE:
21177             cp_parser_error (parser, "expected %<::%>");
21178             return;
21179           case RT_LESS:
21180             cp_parser_error (parser, "expected %<<%>");
21181             return;
21182           case RT_GREATER:
21183             cp_parser_error (parser, "expected %<>%>");
21184             return;
21185           case RT_EQ:
21186             cp_parser_error (parser, "expected %<=%>");
21187             return;
21188           case RT_ELLIPSIS:
21189             cp_parser_error (parser, "expected %<...%>");
21190             return;
21191           case RT_MULT:
21192             cp_parser_error (parser, "expected %<*%>");
21193             return;
21194           case RT_COMPL:
21195             cp_parser_error (parser, "expected %<~%>");
21196             return;
21197           case RT_COLON:
21198             cp_parser_error (parser, "expected %<:%>");
21199             return;
21200           case RT_COLON_SCOPE:
21201             cp_parser_error (parser, "expected %<:%> or %<::%>");
21202             return;
21203           case RT_CLOSE_PAREN:
21204             cp_parser_error (parser, "expected %<)%>");
21205             return;
21206           case RT_COMMA_CLOSE_PAREN:
21207             cp_parser_error (parser, "expected %<,%> or %<)%>");
21208             return;
21209           case RT_PRAGMA_EOL:
21210             cp_parser_error (parser, "expected end of line");
21211             return;
21212           case RT_NAME:
21213             cp_parser_error (parser, "expected identifier");
21214             return;
21215           case RT_SELECT:
21216             cp_parser_error (parser, "expected selection-statement");
21217             return;
21218           case RT_INTERATION:
21219             cp_parser_error (parser, "expected iteration-statement");
21220             return;
21221           case RT_JUMP:
21222             cp_parser_error (parser, "expected jump-statement");
21223             return;
21224           case RT_CLASS_KEY:
21225             cp_parser_error (parser, "expected class-key");
21226             return;
21227           case RT_CLASS_TYPENAME_TEMPLATE:
21228             cp_parser_error (parser,
21229                  "expected %<class%>, %<typename%>, or %<template%>");
21230             return;
21231           default:
21232             gcc_unreachable ();
21233         }
21234     }
21235   else
21236     gcc_unreachable ();
21237 }
21238
21239
21240
21241 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
21242    issue an error message indicating that TOKEN_DESC was expected.
21243
21244    Returns the token consumed, if the token had the appropriate type.
21245    Otherwise, returns NULL.  */
21246
21247 static cp_token *
21248 cp_parser_require (cp_parser* parser,
21249                    enum cpp_ttype type,
21250                    required_token token_desc)
21251 {
21252   if (cp_lexer_next_token_is (parser->lexer, type))
21253     return cp_lexer_consume_token (parser->lexer);
21254   else
21255     {
21256       /* Output the MESSAGE -- unless we're parsing tentatively.  */
21257       if (!cp_parser_simulate_error (parser))
21258         cp_parser_required_error (parser, token_desc, /*keyword=*/false);
21259       return NULL;
21260     }
21261 }
21262
21263 /* An error message is produced if the next token is not '>'.
21264    All further tokens are skipped until the desired token is
21265    found or '{', '}', ';' or an unbalanced ')' or ']'.  */
21266
21267 static void
21268 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
21269 {
21270   /* Current level of '< ... >'.  */
21271   unsigned level = 0;
21272   /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'.  */
21273   unsigned nesting_depth = 0;
21274
21275   /* Are we ready, yet?  If not, issue error message.  */
21276   if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
21277     return;
21278
21279   /* Skip tokens until the desired token is found.  */
21280   while (true)
21281     {
21282       /* Peek at the next token.  */
21283       switch (cp_lexer_peek_token (parser->lexer)->type)
21284         {
21285         case CPP_LESS:
21286           if (!nesting_depth)
21287             ++level;
21288           break;
21289
21290         case CPP_RSHIFT:
21291           if (cxx_dialect == cxx98)
21292             /* C++0x views the `>>' operator as two `>' tokens, but
21293                C++98 does not. */
21294             break;
21295           else if (!nesting_depth && level-- == 0)
21296             {
21297               /* We've hit a `>>' where the first `>' closes the
21298                  template argument list, and the second `>' is
21299                  spurious.  Just consume the `>>' and stop; we've
21300                  already produced at least one error.  */
21301               cp_lexer_consume_token (parser->lexer);
21302               return;
21303             }
21304           /* Fall through for C++0x, so we handle the second `>' in
21305              the `>>'.  */
21306
21307         case CPP_GREATER:
21308           if (!nesting_depth && level-- == 0)
21309             {
21310               /* We've reached the token we want, consume it and stop.  */
21311               cp_lexer_consume_token (parser->lexer);
21312               return;
21313             }
21314           break;
21315
21316         case CPP_OPEN_PAREN:
21317         case CPP_OPEN_SQUARE:
21318           ++nesting_depth;
21319           break;
21320
21321         case CPP_CLOSE_PAREN:
21322         case CPP_CLOSE_SQUARE:
21323           if (nesting_depth-- == 0)
21324             return;
21325           break;
21326
21327         case CPP_EOF:
21328         case CPP_PRAGMA_EOL:
21329         case CPP_SEMICOLON:
21330         case CPP_OPEN_BRACE:
21331         case CPP_CLOSE_BRACE:
21332           /* The '>' was probably forgotten, don't look further.  */
21333           return;
21334
21335         default:
21336           break;
21337         }
21338
21339       /* Consume this token.  */
21340       cp_lexer_consume_token (parser->lexer);
21341     }
21342 }
21343
21344 /* If the next token is the indicated keyword, consume it.  Otherwise,
21345    issue an error message indicating that TOKEN_DESC was expected.
21346
21347    Returns the token consumed, if the token had the appropriate type.
21348    Otherwise, returns NULL.  */
21349
21350 static cp_token *
21351 cp_parser_require_keyword (cp_parser* parser,
21352                            enum rid keyword,
21353                            required_token token_desc)
21354 {
21355   cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
21356
21357   if (token && token->keyword != keyword)
21358     {
21359       cp_parser_required_error (parser, token_desc, /*keyword=*/true); 
21360       return NULL;
21361     }
21362
21363   return token;
21364 }
21365
21366 /* Returns TRUE iff TOKEN is a token that can begin the body of a
21367    function-definition.  */
21368
21369 static bool
21370 cp_parser_token_starts_function_definition_p (cp_token* token)
21371 {
21372   return (/* An ordinary function-body begins with an `{'.  */
21373           token->type == CPP_OPEN_BRACE
21374           /* A ctor-initializer begins with a `:'.  */
21375           || token->type == CPP_COLON
21376           /* A function-try-block begins with `try'.  */
21377           || token->keyword == RID_TRY
21378           /* The named return value extension begins with `return'.  */
21379           || token->keyword == RID_RETURN);
21380 }
21381
21382 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
21383    definition.  */
21384
21385 static bool
21386 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
21387 {
21388   cp_token *token;
21389
21390   token = cp_lexer_peek_token (parser->lexer);
21391   return (token->type == CPP_OPEN_BRACE || token->type == CPP_COLON);
21392 }
21393
21394 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
21395    C++0x) ending a template-argument.  */
21396
21397 static bool
21398 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
21399 {
21400   cp_token *token;
21401
21402   token = cp_lexer_peek_token (parser->lexer);
21403   return (token->type == CPP_COMMA 
21404           || token->type == CPP_GREATER
21405           || token->type == CPP_ELLIPSIS
21406           || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
21407 }
21408
21409 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
21410    (n+1)-th is a ":" (which is a possible digraph typo for "< ::").  */
21411
21412 static bool
21413 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
21414                                                      size_t n)
21415 {
21416   cp_token *token;
21417
21418   token = cp_lexer_peek_nth_token (parser->lexer, n);
21419   if (token->type == CPP_LESS)
21420     return true;
21421   /* Check for the sequence `<::' in the original code. It would be lexed as
21422      `[:', where `[' is a digraph, and there is no whitespace before
21423      `:'.  */
21424   if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
21425     {
21426       cp_token *token2;
21427       token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
21428       if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
21429         return true;
21430     }
21431   return false;
21432 }
21433
21434 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
21435    or none_type otherwise.  */
21436
21437 static enum tag_types
21438 cp_parser_token_is_class_key (cp_token* token)
21439 {
21440   switch (token->keyword)
21441     {
21442     case RID_CLASS:
21443       return class_type;
21444     case RID_STRUCT:
21445       return record_type;
21446     case RID_UNION:
21447       return union_type;
21448
21449     default:
21450       return none_type;
21451     }
21452 }
21453
21454 /* Issue an error message if the CLASS_KEY does not match the TYPE.  */
21455
21456 static void
21457 cp_parser_check_class_key (enum tag_types class_key, tree type)
21458 {
21459   if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
21460     permerror (input_location, "%qs tag used in naming %q#T",
21461             class_key == union_type ? "union"
21462              : class_key == record_type ? "struct" : "class",
21463              type);
21464 }
21465
21466 /* Issue an error message if DECL is redeclared with different
21467    access than its original declaration [class.access.spec/3].
21468    This applies to nested classes and nested class templates.
21469    [class.mem/1].  */
21470
21471 static void
21472 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
21473 {
21474   if (!decl || !CLASS_TYPE_P (TREE_TYPE (decl)))
21475     return;
21476
21477   if ((TREE_PRIVATE (decl)
21478        != (current_access_specifier == access_private_node))
21479       || (TREE_PROTECTED (decl)
21480           != (current_access_specifier == access_protected_node)))
21481     error_at (location, "%qD redeclared with different access", decl);
21482 }
21483
21484 /* Look for the `template' keyword, as a syntactic disambiguator.
21485    Return TRUE iff it is present, in which case it will be
21486    consumed.  */
21487
21488 static bool
21489 cp_parser_optional_template_keyword (cp_parser *parser)
21490 {
21491   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
21492     {
21493       /* The `template' keyword can only be used within templates;
21494          outside templates the parser can always figure out what is a
21495          template and what is not.  */
21496       if (!processing_template_decl)
21497         {
21498           cp_token *token = cp_lexer_peek_token (parser->lexer);
21499           error_at (token->location,
21500                     "%<template%> (as a disambiguator) is only allowed "
21501                     "within templates");
21502           /* If this part of the token stream is rescanned, the same
21503              error message would be generated.  So, we purge the token
21504              from the stream.  */
21505           cp_lexer_purge_token (parser->lexer);
21506           return false;
21507         }
21508       else
21509         {
21510           /* Consume the `template' keyword.  */
21511           cp_lexer_consume_token (parser->lexer);
21512           return true;
21513         }
21514     }
21515
21516   return false;
21517 }
21518
21519 /* The next token is a CPP_NESTED_NAME_SPECIFIER.  Consume the token,
21520    set PARSER->SCOPE, and perform other related actions.  */
21521
21522 static void
21523 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
21524 {
21525   int i;
21526   struct tree_check *check_value;
21527   deferred_access_check *chk;
21528   VEC (deferred_access_check,gc) *checks;
21529
21530   /* Get the stored value.  */
21531   check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
21532   /* Perform any access checks that were deferred.  */
21533   checks = check_value->checks;
21534   if (checks)
21535     {
21536       FOR_EACH_VEC_ELT (deferred_access_check, checks, i, chk)
21537         perform_or_defer_access_check (chk->binfo,
21538                                        chk->decl,
21539                                        chk->diag_decl);
21540     }
21541   /* Set the scope from the stored value.  */
21542   parser->scope = check_value->value;
21543   parser->qualifying_scope = check_value->qualifying_scope;
21544   parser->object_scope = NULL_TREE;
21545 }
21546
21547 /* Consume tokens up through a non-nested END token.  Returns TRUE if we
21548    encounter the end of a block before what we were looking for.  */
21549
21550 static bool
21551 cp_parser_cache_group (cp_parser *parser,
21552                        enum cpp_ttype end,
21553                        unsigned depth)
21554 {
21555   while (true)
21556     {
21557       cp_token *token = cp_lexer_peek_token (parser->lexer);
21558
21559       /* Abort a parenthesized expression if we encounter a semicolon.  */
21560       if ((end == CPP_CLOSE_PAREN || depth == 0)
21561           && token->type == CPP_SEMICOLON)
21562         return true;
21563       /* If we've reached the end of the file, stop.  */
21564       if (token->type == CPP_EOF
21565           || (end != CPP_PRAGMA_EOL
21566               && token->type == CPP_PRAGMA_EOL))
21567         return true;
21568       if (token->type == CPP_CLOSE_BRACE && depth == 0)
21569         /* We've hit the end of an enclosing block, so there's been some
21570            kind of syntax error.  */
21571         return true;
21572
21573       /* Consume the token.  */
21574       cp_lexer_consume_token (parser->lexer);
21575       /* See if it starts a new group.  */
21576       if (token->type == CPP_OPEN_BRACE)
21577         {
21578           cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
21579           /* In theory this should probably check end == '}', but
21580              cp_parser_save_member_function_body needs it to exit
21581              after either '}' or ')' when called with ')'.  */
21582           if (depth == 0)
21583             return false;
21584         }
21585       else if (token->type == CPP_OPEN_PAREN)
21586         {
21587           cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
21588           if (depth == 0 && end == CPP_CLOSE_PAREN)
21589             return false;
21590         }
21591       else if (token->type == CPP_PRAGMA)
21592         cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
21593       else if (token->type == end)
21594         return false;
21595     }
21596 }
21597
21598 /* Begin parsing tentatively.  We always save tokens while parsing
21599    tentatively so that if the tentative parsing fails we can restore the
21600    tokens.  */
21601
21602 static void
21603 cp_parser_parse_tentatively (cp_parser* parser)
21604 {
21605   /* Enter a new parsing context.  */
21606   parser->context = cp_parser_context_new (parser->context);
21607   /* Begin saving tokens.  */
21608   cp_lexer_save_tokens (parser->lexer);
21609   /* In order to avoid repetitive access control error messages,
21610      access checks are queued up until we are no longer parsing
21611      tentatively.  */
21612   push_deferring_access_checks (dk_deferred);
21613 }
21614
21615 /* Commit to the currently active tentative parse.  */
21616
21617 static void
21618 cp_parser_commit_to_tentative_parse (cp_parser* parser)
21619 {
21620   cp_parser_context *context;
21621   cp_lexer *lexer;
21622
21623   /* Mark all of the levels as committed.  */
21624   lexer = parser->lexer;
21625   for (context = parser->context; context->next; context = context->next)
21626     {
21627       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
21628         break;
21629       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
21630       while (!cp_lexer_saving_tokens (lexer))
21631         lexer = lexer->next;
21632       cp_lexer_commit_tokens (lexer);
21633     }
21634 }
21635
21636 /* Abort the currently active tentative parse.  All consumed tokens
21637    will be rolled back, and no diagnostics will be issued.  */
21638
21639 static void
21640 cp_parser_abort_tentative_parse (cp_parser* parser)
21641 {
21642   gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
21643               || errorcount > 0);
21644   cp_parser_simulate_error (parser);
21645   /* Now, pretend that we want to see if the construct was
21646      successfully parsed.  */
21647   cp_parser_parse_definitely (parser);
21648 }
21649
21650 /* Stop parsing tentatively.  If a parse error has occurred, restore the
21651    token stream.  Otherwise, commit to the tokens we have consumed.
21652    Returns true if no error occurred; false otherwise.  */
21653
21654 static bool
21655 cp_parser_parse_definitely (cp_parser* parser)
21656 {
21657   bool error_occurred;
21658   cp_parser_context *context;
21659
21660   /* Remember whether or not an error occurred, since we are about to
21661      destroy that information.  */
21662   error_occurred = cp_parser_error_occurred (parser);
21663   /* Remove the topmost context from the stack.  */
21664   context = parser->context;
21665   parser->context = context->next;
21666   /* If no parse errors occurred, commit to the tentative parse.  */
21667   if (!error_occurred)
21668     {
21669       /* Commit to the tokens read tentatively, unless that was
21670          already done.  */
21671       if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
21672         cp_lexer_commit_tokens (parser->lexer);
21673
21674       pop_to_parent_deferring_access_checks ();
21675     }
21676   /* Otherwise, if errors occurred, roll back our state so that things
21677      are just as they were before we began the tentative parse.  */
21678   else
21679     {
21680       cp_lexer_rollback_tokens (parser->lexer);
21681       pop_deferring_access_checks ();
21682     }
21683   /* Add the context to the front of the free list.  */
21684   context->next = cp_parser_context_free_list;
21685   cp_parser_context_free_list = context;
21686
21687   return !error_occurred;
21688 }
21689
21690 /* Returns true if we are parsing tentatively and are not committed to
21691    this tentative parse.  */
21692
21693 static bool
21694 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
21695 {
21696   return (cp_parser_parsing_tentatively (parser)
21697           && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
21698 }
21699
21700 /* Returns nonzero iff an error has occurred during the most recent
21701    tentative parse.  */
21702
21703 static bool
21704 cp_parser_error_occurred (cp_parser* parser)
21705 {
21706   return (cp_parser_parsing_tentatively (parser)
21707           && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
21708 }
21709
21710 /* Returns nonzero if GNU extensions are allowed.  */
21711
21712 static bool
21713 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
21714 {
21715   return parser->allow_gnu_extensions_p;
21716 }
21717 \f
21718 /* Objective-C++ Productions */
21719
21720
21721 /* Parse an Objective-C expression, which feeds into a primary-expression
21722    above.
21723
21724    objc-expression:
21725      objc-message-expression
21726      objc-string-literal
21727      objc-encode-expression
21728      objc-protocol-expression
21729      objc-selector-expression
21730
21731   Returns a tree representation of the expression.  */
21732
21733 static tree
21734 cp_parser_objc_expression (cp_parser* parser)
21735 {
21736   /* Try to figure out what kind of declaration is present.  */
21737   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
21738
21739   switch (kwd->type)
21740     {
21741     case CPP_OPEN_SQUARE:
21742       return cp_parser_objc_message_expression (parser);
21743
21744     case CPP_OBJC_STRING:
21745       kwd = cp_lexer_consume_token (parser->lexer);
21746       return objc_build_string_object (kwd->u.value);
21747
21748     case CPP_KEYWORD:
21749       switch (kwd->keyword)
21750         {
21751         case RID_AT_ENCODE:
21752           return cp_parser_objc_encode_expression (parser);
21753
21754         case RID_AT_PROTOCOL:
21755           return cp_parser_objc_protocol_expression (parser);
21756
21757         case RID_AT_SELECTOR:
21758           return cp_parser_objc_selector_expression (parser);
21759
21760         default:
21761           break;
21762         }
21763     default:
21764       error_at (kwd->location,
21765                 "misplaced %<@%D%> Objective-C++ construct",
21766                 kwd->u.value);
21767       cp_parser_skip_to_end_of_block_or_statement (parser);
21768     }
21769
21770   return error_mark_node;
21771 }
21772
21773 /* Parse an Objective-C message expression.
21774
21775    objc-message-expression:
21776      [ objc-message-receiver objc-message-args ]
21777
21778    Returns a representation of an Objective-C message.  */
21779
21780 static tree
21781 cp_parser_objc_message_expression (cp_parser* parser)
21782 {
21783   tree receiver, messageargs;
21784
21785   cp_lexer_consume_token (parser->lexer);  /* Eat '['.  */
21786   receiver = cp_parser_objc_message_receiver (parser);
21787   messageargs = cp_parser_objc_message_args (parser);
21788   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
21789
21790   return objc_build_message_expr (receiver, messageargs);
21791 }
21792
21793 /* Parse an objc-message-receiver.
21794
21795    objc-message-receiver:
21796      expression
21797      simple-type-specifier
21798
21799   Returns a representation of the type or expression.  */
21800
21801 static tree
21802 cp_parser_objc_message_receiver (cp_parser* parser)
21803 {
21804   tree rcv;
21805
21806   /* An Objective-C message receiver may be either (1) a type
21807      or (2) an expression.  */
21808   cp_parser_parse_tentatively (parser);
21809   rcv = cp_parser_expression (parser, false, NULL);
21810
21811   if (cp_parser_parse_definitely (parser))
21812     return rcv;
21813
21814   rcv = cp_parser_simple_type_specifier (parser,
21815                                          /*decl_specs=*/NULL,
21816                                          CP_PARSER_FLAGS_NONE);
21817
21818   return objc_get_class_reference (rcv);
21819 }
21820
21821 /* Parse the arguments and selectors comprising an Objective-C message.
21822
21823    objc-message-args:
21824      objc-selector
21825      objc-selector-args
21826      objc-selector-args , objc-comma-args
21827
21828    objc-selector-args:
21829      objc-selector [opt] : assignment-expression
21830      objc-selector-args objc-selector [opt] : assignment-expression
21831
21832    objc-comma-args:
21833      assignment-expression
21834      objc-comma-args , assignment-expression
21835
21836    Returns a TREE_LIST, with TREE_PURPOSE containing a list of
21837    selector arguments and TREE_VALUE containing a list of comma
21838    arguments.  */
21839
21840 static tree
21841 cp_parser_objc_message_args (cp_parser* parser)
21842 {
21843   tree sel_args = NULL_TREE, addl_args = NULL_TREE;
21844   bool maybe_unary_selector_p = true;
21845   cp_token *token = cp_lexer_peek_token (parser->lexer);
21846
21847   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
21848     {
21849       tree selector = NULL_TREE, arg;
21850
21851       if (token->type != CPP_COLON)
21852         selector = cp_parser_objc_selector (parser);
21853
21854       /* Detect if we have a unary selector.  */
21855       if (maybe_unary_selector_p
21856           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
21857         return build_tree_list (selector, NULL_TREE);
21858
21859       maybe_unary_selector_p = false;
21860       cp_parser_require (parser, CPP_COLON, RT_COLON);
21861       arg = cp_parser_assignment_expression (parser, false, NULL);
21862
21863       sel_args
21864         = chainon (sel_args,
21865                    build_tree_list (selector, arg));
21866
21867       token = cp_lexer_peek_token (parser->lexer);
21868     }
21869
21870   /* Handle non-selector arguments, if any. */
21871   while (token->type == CPP_COMMA)
21872     {
21873       tree arg;
21874
21875       cp_lexer_consume_token (parser->lexer);
21876       arg = cp_parser_assignment_expression (parser, false, NULL);
21877
21878       addl_args
21879         = chainon (addl_args,
21880                    build_tree_list (NULL_TREE, arg));
21881
21882       token = cp_lexer_peek_token (parser->lexer);
21883     }
21884
21885   if (sel_args == NULL_TREE && addl_args == NULL_TREE)
21886     {
21887       cp_parser_error (parser, "objective-c++ message argument(s) are expected");
21888       return build_tree_list (error_mark_node, error_mark_node);
21889     }
21890
21891   return build_tree_list (sel_args, addl_args);
21892 }
21893
21894 /* Parse an Objective-C encode expression.
21895
21896    objc-encode-expression:
21897      @encode objc-typename
21898
21899    Returns an encoded representation of the type argument.  */
21900
21901 static tree
21902 cp_parser_objc_encode_expression (cp_parser* parser)
21903 {
21904   tree type;
21905   cp_token *token;
21906
21907   cp_lexer_consume_token (parser->lexer);  /* Eat '@encode'.  */
21908   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21909   token = cp_lexer_peek_token (parser->lexer);
21910   type = complete_type (cp_parser_type_id (parser));
21911   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21912
21913   if (!type)
21914     {
21915       error_at (token->location, 
21916                 "%<@encode%> must specify a type as an argument");
21917       return error_mark_node;
21918     }
21919
21920   /* This happens if we find @encode(T) (where T is a template
21921      typename or something dependent on a template typename) when
21922      parsing a template.  In that case, we can't compile it
21923      immediately, but we rather create an AT_ENCODE_EXPR which will
21924      need to be instantiated when the template is used.
21925   */
21926   if (dependent_type_p (type))
21927     {
21928       tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
21929       TREE_READONLY (value) = 1;
21930       return value;
21931     }
21932
21933   return objc_build_encode_expr (type);
21934 }
21935
21936 /* Parse an Objective-C @defs expression.  */
21937
21938 static tree
21939 cp_parser_objc_defs_expression (cp_parser *parser)
21940 {
21941   tree name;
21942
21943   cp_lexer_consume_token (parser->lexer);  /* Eat '@defs'.  */
21944   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21945   name = cp_parser_identifier (parser);
21946   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21947
21948   return objc_get_class_ivars (name);
21949 }
21950
21951 /* Parse an Objective-C protocol expression.
21952
21953   objc-protocol-expression:
21954     @protocol ( identifier )
21955
21956   Returns a representation of the protocol expression.  */
21957
21958 static tree
21959 cp_parser_objc_protocol_expression (cp_parser* parser)
21960 {
21961   tree proto;
21962
21963   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
21964   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21965   proto = cp_parser_identifier (parser);
21966   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21967
21968   return objc_build_protocol_expr (proto);
21969 }
21970
21971 /* Parse an Objective-C selector expression.
21972
21973    objc-selector-expression:
21974      @selector ( objc-method-signature )
21975
21976    objc-method-signature:
21977      objc-selector
21978      objc-selector-seq
21979
21980    objc-selector-seq:
21981      objc-selector :
21982      objc-selector-seq objc-selector :
21983
21984   Returns a representation of the method selector.  */
21985
21986 static tree
21987 cp_parser_objc_selector_expression (cp_parser* parser)
21988 {
21989   tree sel_seq = NULL_TREE;
21990   bool maybe_unary_selector_p = true;
21991   cp_token *token;
21992   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
21993
21994   cp_lexer_consume_token (parser->lexer);  /* Eat '@selector'.  */
21995   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21996   token = cp_lexer_peek_token (parser->lexer);
21997
21998   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
21999          || token->type == CPP_SCOPE)
22000     {
22001       tree selector = NULL_TREE;
22002
22003       if (token->type != CPP_COLON
22004           || token->type == CPP_SCOPE)
22005         selector = cp_parser_objc_selector (parser);
22006
22007       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
22008           && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
22009         {
22010           /* Detect if we have a unary selector.  */
22011           if (maybe_unary_selector_p)
22012             {
22013               sel_seq = selector;
22014               goto finish_selector;
22015             }
22016           else
22017             {
22018               cp_parser_error (parser, "expected %<:%>");
22019             }
22020         }
22021       maybe_unary_selector_p = false;
22022       token = cp_lexer_consume_token (parser->lexer);
22023
22024       if (token->type == CPP_SCOPE)
22025         {
22026           sel_seq
22027             = chainon (sel_seq,
22028                        build_tree_list (selector, NULL_TREE));
22029           sel_seq
22030             = chainon (sel_seq,
22031                        build_tree_list (NULL_TREE, NULL_TREE));
22032         }
22033       else
22034         sel_seq
22035           = chainon (sel_seq,
22036                      build_tree_list (selector, NULL_TREE));
22037
22038       token = cp_lexer_peek_token (parser->lexer);
22039     }
22040
22041  finish_selector:
22042   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22043
22044   return objc_build_selector_expr (loc, sel_seq);
22045 }
22046
22047 /* Parse a list of identifiers.
22048
22049    objc-identifier-list:
22050      identifier
22051      objc-identifier-list , identifier
22052
22053    Returns a TREE_LIST of identifier nodes.  */
22054
22055 static tree
22056 cp_parser_objc_identifier_list (cp_parser* parser)
22057 {
22058   tree identifier;
22059   tree list;
22060   cp_token *sep;
22061
22062   identifier = cp_parser_identifier (parser);
22063   if (identifier == error_mark_node)
22064     return error_mark_node;      
22065
22066   list = build_tree_list (NULL_TREE, identifier);
22067   sep = cp_lexer_peek_token (parser->lexer);
22068
22069   while (sep->type == CPP_COMMA)
22070     {
22071       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22072       identifier = cp_parser_identifier (parser);
22073       if (identifier == error_mark_node)
22074         return list;
22075
22076       list = chainon (list, build_tree_list (NULL_TREE,
22077                                              identifier));
22078       sep = cp_lexer_peek_token (parser->lexer);
22079     }
22080   
22081   return list;
22082 }
22083
22084 /* Parse an Objective-C alias declaration.
22085
22086    objc-alias-declaration:
22087      @compatibility_alias identifier identifier ;
22088
22089    This function registers the alias mapping with the Objective-C front end.
22090    It returns nothing.  */
22091
22092 static void
22093 cp_parser_objc_alias_declaration (cp_parser* parser)
22094 {
22095   tree alias, orig;
22096
22097   cp_lexer_consume_token (parser->lexer);  /* Eat '@compatibility_alias'.  */
22098   alias = cp_parser_identifier (parser);
22099   orig = cp_parser_identifier (parser);
22100   objc_declare_alias (alias, orig);
22101   cp_parser_consume_semicolon_at_end_of_statement (parser);
22102 }
22103
22104 /* Parse an Objective-C class forward-declaration.
22105
22106    objc-class-declaration:
22107      @class objc-identifier-list ;
22108
22109    The function registers the forward declarations with the Objective-C
22110    front end.  It returns nothing.  */
22111
22112 static void
22113 cp_parser_objc_class_declaration (cp_parser* parser)
22114 {
22115   cp_lexer_consume_token (parser->lexer);  /* Eat '@class'.  */
22116   while (true)
22117     {
22118       tree id;
22119       
22120       id = cp_parser_identifier (parser);
22121       if (id == error_mark_node)
22122         break;
22123       
22124       objc_declare_class (id);
22125
22126       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22127         cp_lexer_consume_token (parser->lexer);
22128       else
22129         break;
22130     }
22131   cp_parser_consume_semicolon_at_end_of_statement (parser);
22132 }
22133
22134 /* Parse a list of Objective-C protocol references.
22135
22136    objc-protocol-refs-opt:
22137      objc-protocol-refs [opt]
22138
22139    objc-protocol-refs:
22140      < objc-identifier-list >
22141
22142    Returns a TREE_LIST of identifiers, if any.  */
22143
22144 static tree
22145 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
22146 {
22147   tree protorefs = NULL_TREE;
22148
22149   if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
22150     {
22151       cp_lexer_consume_token (parser->lexer);  /* Eat '<'.  */
22152       protorefs = cp_parser_objc_identifier_list (parser);
22153       cp_parser_require (parser, CPP_GREATER, RT_GREATER);
22154     }
22155
22156   return protorefs;
22157 }
22158
22159 /* Parse a Objective-C visibility specification.  */
22160
22161 static void
22162 cp_parser_objc_visibility_spec (cp_parser* parser)
22163 {
22164   cp_token *vis = cp_lexer_peek_token (parser->lexer);
22165
22166   switch (vis->keyword)
22167     {
22168     case RID_AT_PRIVATE:
22169       objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
22170       break;
22171     case RID_AT_PROTECTED:
22172       objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
22173       break;
22174     case RID_AT_PUBLIC:
22175       objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
22176       break;
22177     case RID_AT_PACKAGE:
22178       objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
22179       break;
22180     default:
22181       return;
22182     }
22183
22184   /* Eat '@private'/'@protected'/'@public'.  */
22185   cp_lexer_consume_token (parser->lexer);
22186 }
22187
22188 /* Parse an Objective-C method type.  Return 'true' if it is a class
22189    (+) method, and 'false' if it is an instance (-) method.  */
22190
22191 static inline bool
22192 cp_parser_objc_method_type (cp_parser* parser)
22193 {
22194   if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
22195     return true;
22196   else
22197     return false;
22198 }
22199
22200 /* Parse an Objective-C protocol qualifier.  */
22201
22202 static tree
22203 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
22204 {
22205   tree quals = NULL_TREE, node;
22206   cp_token *token = cp_lexer_peek_token (parser->lexer);
22207
22208   node = token->u.value;
22209
22210   while (node && TREE_CODE (node) == IDENTIFIER_NODE
22211          && (node == ridpointers [(int) RID_IN]
22212              || node == ridpointers [(int) RID_OUT]
22213              || node == ridpointers [(int) RID_INOUT]
22214              || node == ridpointers [(int) RID_BYCOPY]
22215              || node == ridpointers [(int) RID_BYREF]
22216              || node == ridpointers [(int) RID_ONEWAY]))
22217     {
22218       quals = tree_cons (NULL_TREE, node, quals);
22219       cp_lexer_consume_token (parser->lexer);
22220       token = cp_lexer_peek_token (parser->lexer);
22221       node = token->u.value;
22222     }
22223
22224   return quals;
22225 }
22226
22227 /* Parse an Objective-C typename.  */
22228
22229 static tree
22230 cp_parser_objc_typename (cp_parser* parser)
22231 {
22232   tree type_name = NULL_TREE;
22233
22234   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
22235     {
22236       tree proto_quals, cp_type = NULL_TREE;
22237
22238       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22239       proto_quals = cp_parser_objc_protocol_qualifiers (parser);
22240
22241       /* An ObjC type name may consist of just protocol qualifiers, in which
22242          case the type shall default to 'id'.  */
22243       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
22244         {
22245           cp_type = cp_parser_type_id (parser);
22246           
22247           /* If the type could not be parsed, an error has already
22248              been produced.  For error recovery, behave as if it had
22249              not been specified, which will use the default type
22250              'id'.  */
22251           if (cp_type == error_mark_node)
22252             {
22253               cp_type = NULL_TREE;
22254               /* We need to skip to the closing parenthesis as
22255                  cp_parser_type_id() does not seem to do it for
22256                  us.  */
22257               cp_parser_skip_to_closing_parenthesis (parser,
22258                                                      /*recovering=*/true,
22259                                                      /*or_comma=*/false,
22260                                                      /*consume_paren=*/false);
22261             }
22262         }
22263
22264       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22265       type_name = build_tree_list (proto_quals, cp_type);
22266     }
22267
22268   return type_name;
22269 }
22270
22271 /* Check to see if TYPE refers to an Objective-C selector name.  */
22272
22273 static bool
22274 cp_parser_objc_selector_p (enum cpp_ttype type)
22275 {
22276   return (type == CPP_NAME || type == CPP_KEYWORD
22277           || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
22278           || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
22279           || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
22280           || type == CPP_XOR || type == CPP_XOR_EQ);
22281 }
22282
22283 /* Parse an Objective-C selector.  */
22284
22285 static tree
22286 cp_parser_objc_selector (cp_parser* parser)
22287 {
22288   cp_token *token = cp_lexer_consume_token (parser->lexer);
22289
22290   if (!cp_parser_objc_selector_p (token->type))
22291     {
22292       error_at (token->location, "invalid Objective-C++ selector name");
22293       return error_mark_node;
22294     }
22295
22296   /* C++ operator names are allowed to appear in ObjC selectors.  */
22297   switch (token->type)
22298     {
22299     case CPP_AND_AND: return get_identifier ("and");
22300     case CPP_AND_EQ: return get_identifier ("and_eq");
22301     case CPP_AND: return get_identifier ("bitand");
22302     case CPP_OR: return get_identifier ("bitor");
22303     case CPP_COMPL: return get_identifier ("compl");
22304     case CPP_NOT: return get_identifier ("not");
22305     case CPP_NOT_EQ: return get_identifier ("not_eq");
22306     case CPP_OR_OR: return get_identifier ("or");
22307     case CPP_OR_EQ: return get_identifier ("or_eq");
22308     case CPP_XOR: return get_identifier ("xor");
22309     case CPP_XOR_EQ: return get_identifier ("xor_eq");
22310     default: return token->u.value;
22311     }
22312 }
22313
22314 /* Parse an Objective-C params list.  */
22315
22316 static tree
22317 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
22318 {
22319   tree params = NULL_TREE;
22320   bool maybe_unary_selector_p = true;
22321   cp_token *token = cp_lexer_peek_token (parser->lexer);
22322
22323   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
22324     {
22325       tree selector = NULL_TREE, type_name, identifier;
22326       tree parm_attr = NULL_TREE;
22327
22328       if (token->keyword == RID_ATTRIBUTE)
22329         break;
22330
22331       if (token->type != CPP_COLON)
22332         selector = cp_parser_objc_selector (parser);
22333
22334       /* Detect if we have a unary selector.  */
22335       if (maybe_unary_selector_p
22336           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
22337         {
22338           params = selector; /* Might be followed by attributes.  */
22339           break;
22340         }
22341
22342       maybe_unary_selector_p = false;
22343       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
22344         {
22345           /* Something went quite wrong.  There should be a colon
22346              here, but there is not.  Stop parsing parameters.  */
22347           break;
22348         }
22349       type_name = cp_parser_objc_typename (parser);
22350       /* New ObjC allows attributes on parameters too.  */
22351       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
22352         parm_attr = cp_parser_attributes_opt (parser);
22353       identifier = cp_parser_identifier (parser);
22354
22355       params
22356         = chainon (params,
22357                    objc_build_keyword_decl (selector,
22358                                             type_name,
22359                                             identifier,
22360                                             parm_attr));
22361
22362       token = cp_lexer_peek_token (parser->lexer);
22363     }
22364
22365   if (params == NULL_TREE)
22366     {
22367       cp_parser_error (parser, "objective-c++ method declaration is expected");
22368       return error_mark_node;
22369     }
22370
22371   /* We allow tail attributes for the method.  */
22372   if (token->keyword == RID_ATTRIBUTE)
22373     {
22374       *attributes = cp_parser_attributes_opt (parser);
22375       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22376           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22377         return params;
22378       cp_parser_error (parser, 
22379                        "method attributes must be specified at the end");
22380       return error_mark_node;
22381     }
22382
22383   if (params == NULL_TREE)
22384     {
22385       cp_parser_error (parser, "objective-c++ method declaration is expected");
22386       return error_mark_node;
22387     }
22388   return params;
22389 }
22390
22391 /* Parse the non-keyword Objective-C params.  */
22392
22393 static tree
22394 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp, 
22395                                        tree* attributes)
22396 {
22397   tree params = make_node (TREE_LIST);
22398   cp_token *token = cp_lexer_peek_token (parser->lexer);
22399   *ellipsisp = false;  /* Initially, assume no ellipsis.  */
22400
22401   while (token->type == CPP_COMMA)
22402     {
22403       cp_parameter_declarator *parmdecl;
22404       tree parm;
22405
22406       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22407       token = cp_lexer_peek_token (parser->lexer);
22408
22409       if (token->type == CPP_ELLIPSIS)
22410         {
22411           cp_lexer_consume_token (parser->lexer);  /* Eat '...'.  */
22412           *ellipsisp = true;
22413           token = cp_lexer_peek_token (parser->lexer);
22414           break;
22415         }
22416
22417       /* TODO: parse attributes for tail parameters.  */
22418       parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
22419       parm = grokdeclarator (parmdecl->declarator,
22420                              &parmdecl->decl_specifiers,
22421                              PARM, /*initialized=*/0,
22422                              /*attrlist=*/NULL);
22423
22424       chainon (params, build_tree_list (NULL_TREE, parm));
22425       token = cp_lexer_peek_token (parser->lexer);
22426     }
22427
22428   /* We allow tail attributes for the method.  */
22429   if (token->keyword == RID_ATTRIBUTE)
22430     {
22431       if (*attributes == NULL_TREE)
22432         {
22433           *attributes = cp_parser_attributes_opt (parser);
22434           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22435               || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22436             return params;
22437         }
22438       else        
22439         /* We have an error, but parse the attributes, so that we can 
22440            carry on.  */
22441         *attributes = cp_parser_attributes_opt (parser);
22442
22443       cp_parser_error (parser, 
22444                        "method attributes must be specified at the end");
22445       return error_mark_node;
22446     }
22447
22448   return params;
22449 }
22450
22451 /* Parse a linkage specification, a pragma, an extra semicolon or a block.  */
22452
22453 static void
22454 cp_parser_objc_interstitial_code (cp_parser* parser)
22455 {
22456   cp_token *token = cp_lexer_peek_token (parser->lexer);
22457
22458   /* If the next token is `extern' and the following token is a string
22459      literal, then we have a linkage specification.  */
22460   if (token->keyword == RID_EXTERN
22461       && cp_parser_is_string_literal (cp_lexer_peek_nth_token (parser->lexer, 2)))
22462     cp_parser_linkage_specification (parser);
22463   /* Handle #pragma, if any.  */
22464   else if (token->type == CPP_PRAGMA)
22465     cp_parser_pragma (parser, pragma_external);
22466   /* Allow stray semicolons.  */
22467   else if (token->type == CPP_SEMICOLON)
22468     cp_lexer_consume_token (parser->lexer);
22469   /* Mark methods as optional or required, when building protocols.  */
22470   else if (token->keyword == RID_AT_OPTIONAL)
22471     {
22472       cp_lexer_consume_token (parser->lexer);
22473       objc_set_method_opt (true);
22474     }
22475   else if (token->keyword == RID_AT_REQUIRED)
22476     {
22477       cp_lexer_consume_token (parser->lexer);
22478       objc_set_method_opt (false);
22479     }
22480   else if (token->keyword == RID_NAMESPACE)
22481     cp_parser_namespace_definition (parser);
22482   /* Other stray characters must generate errors.  */
22483   else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
22484     {
22485       cp_lexer_consume_token (parser->lexer);
22486       error ("stray %qs between Objective-C++ methods",
22487              token->type == CPP_OPEN_BRACE ? "{" : "}");
22488     }
22489   /* Finally, try to parse a block-declaration, or a function-definition.  */
22490   else
22491     cp_parser_block_declaration (parser, /*statement_p=*/false);
22492 }
22493
22494 /* Parse a method signature.  */
22495
22496 static tree
22497 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
22498 {
22499   tree rettype, kwdparms, optparms;
22500   bool ellipsis = false;
22501   bool is_class_method;
22502
22503   is_class_method = cp_parser_objc_method_type (parser);
22504   rettype = cp_parser_objc_typename (parser);
22505   *attributes = NULL_TREE;
22506   kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
22507   if (kwdparms == error_mark_node)
22508     return error_mark_node;
22509   optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
22510   if (optparms == error_mark_node)
22511     return error_mark_node;
22512
22513   return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
22514 }
22515
22516 static bool
22517 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
22518 {
22519   tree tattr;  
22520   cp_lexer_save_tokens (parser->lexer);
22521   tattr = cp_parser_attributes_opt (parser);
22522   gcc_assert (tattr) ;
22523   
22524   /* If the attributes are followed by a method introducer, this is not allowed.
22525      Dump the attributes and flag the situation.  */
22526   if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
22527       || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
22528     return true;
22529
22530   /* Otherwise, the attributes introduce some interstitial code, possibly so
22531      rewind to allow that check.  */
22532   cp_lexer_rollback_tokens (parser->lexer);
22533   return false;  
22534 }
22535
22536 /* Parse an Objective-C method prototype list.  */
22537
22538 static void
22539 cp_parser_objc_method_prototype_list (cp_parser* parser)
22540 {
22541   cp_token *token = cp_lexer_peek_token (parser->lexer);
22542
22543   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22544     {
22545       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22546         {
22547           tree attributes, sig;
22548           bool is_class_method;
22549           if (token->type == CPP_PLUS)
22550             is_class_method = true;
22551           else
22552             is_class_method = false;
22553           sig = cp_parser_objc_method_signature (parser, &attributes);
22554           if (sig == error_mark_node)
22555             {
22556               cp_parser_skip_to_end_of_block_or_statement (parser);
22557               token = cp_lexer_peek_token (parser->lexer);
22558               continue;
22559             }
22560           objc_add_method_declaration (is_class_method, sig, attributes);
22561           cp_parser_consume_semicolon_at_end_of_statement (parser);
22562         }
22563       else if (token->keyword == RID_AT_PROPERTY)
22564         cp_parser_objc_at_property_declaration (parser);
22565       else if (token->keyword == RID_ATTRIBUTE 
22566                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22567         warning_at (cp_lexer_peek_token (parser->lexer)->location, 
22568                     OPT_Wattributes, 
22569                     "prefix attributes are ignored for methods");
22570       else
22571         /* Allow for interspersed non-ObjC++ code.  */
22572         cp_parser_objc_interstitial_code (parser);
22573
22574       token = cp_lexer_peek_token (parser->lexer);
22575     }
22576
22577   if (token->type != CPP_EOF)
22578     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22579   else
22580     cp_parser_error (parser, "expected %<@end%>");
22581
22582   objc_finish_interface ();
22583 }
22584
22585 /* Parse an Objective-C method definition list.  */
22586
22587 static void
22588 cp_parser_objc_method_definition_list (cp_parser* parser)
22589 {
22590   cp_token *token = cp_lexer_peek_token (parser->lexer);
22591
22592   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22593     {
22594       tree meth;
22595
22596       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22597         {
22598           cp_token *ptk;
22599           tree sig, attribute;
22600           bool is_class_method;
22601           if (token->type == CPP_PLUS)
22602             is_class_method = true;
22603           else
22604             is_class_method = false;
22605           push_deferring_access_checks (dk_deferred);
22606           sig = cp_parser_objc_method_signature (parser, &attribute);
22607           if (sig == error_mark_node)
22608             {
22609               cp_parser_skip_to_end_of_block_or_statement (parser);
22610               token = cp_lexer_peek_token (parser->lexer);
22611               continue;
22612             }
22613           objc_start_method_definition (is_class_method, sig, attribute,
22614                                         NULL_TREE);
22615
22616           /* For historical reasons, we accept an optional semicolon.  */
22617           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22618             cp_lexer_consume_token (parser->lexer);
22619
22620           ptk = cp_lexer_peek_token (parser->lexer);
22621           if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS 
22622                 || ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
22623             {
22624               perform_deferred_access_checks ();
22625               stop_deferring_access_checks ();
22626               meth = cp_parser_function_definition_after_declarator (parser,
22627                                                                      false);
22628               pop_deferring_access_checks ();
22629               objc_finish_method_definition (meth);
22630             }
22631         }
22632       /* The following case will be removed once @synthesize is
22633          completely implemented.  */
22634       else if (token->keyword == RID_AT_PROPERTY)
22635         cp_parser_objc_at_property_declaration (parser);
22636       else if (token->keyword == RID_AT_SYNTHESIZE)
22637         cp_parser_objc_at_synthesize_declaration (parser);
22638       else if (token->keyword == RID_AT_DYNAMIC)
22639         cp_parser_objc_at_dynamic_declaration (parser);
22640       else if (token->keyword == RID_ATTRIBUTE 
22641                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22642         warning_at (token->location, OPT_Wattributes,
22643                     "prefix attributes are ignored for methods");
22644       else
22645         /* Allow for interspersed non-ObjC++ code.  */
22646         cp_parser_objc_interstitial_code (parser);
22647
22648       token = cp_lexer_peek_token (parser->lexer);
22649     }
22650
22651   if (token->type != CPP_EOF)
22652     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22653   else
22654     cp_parser_error (parser, "expected %<@end%>");
22655
22656   objc_finish_implementation ();
22657 }
22658
22659 /* Parse Objective-C ivars.  */
22660
22661 static void
22662 cp_parser_objc_class_ivars (cp_parser* parser)
22663 {
22664   cp_token *token = cp_lexer_peek_token (parser->lexer);
22665
22666   if (token->type != CPP_OPEN_BRACE)
22667     return;     /* No ivars specified.  */
22668
22669   cp_lexer_consume_token (parser->lexer);  /* Eat '{'.  */
22670   token = cp_lexer_peek_token (parser->lexer);
22671
22672   while (token->type != CPP_CLOSE_BRACE 
22673         && token->keyword != RID_AT_END && token->type != CPP_EOF)
22674     {
22675       cp_decl_specifier_seq declspecs;
22676       int decl_class_or_enum_p;
22677       tree prefix_attributes;
22678
22679       cp_parser_objc_visibility_spec (parser);
22680
22681       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
22682         break;
22683
22684       cp_parser_decl_specifier_seq (parser,
22685                                     CP_PARSER_FLAGS_OPTIONAL,
22686                                     &declspecs,
22687                                     &decl_class_or_enum_p);
22688
22689       /* auto, register, static, extern, mutable.  */
22690       if (declspecs.storage_class != sc_none)
22691         {
22692           cp_parser_error (parser, "invalid type for instance variable");         
22693           declspecs.storage_class = sc_none;
22694         }
22695
22696       /* __thread.  */
22697       if (declspecs.specs[(int) ds_thread])
22698         {
22699           cp_parser_error (parser, "invalid type for instance variable");
22700           declspecs.specs[(int) ds_thread] = 0;
22701         }
22702       
22703       /* typedef.  */
22704       if (declspecs.specs[(int) ds_typedef])
22705         {
22706           cp_parser_error (parser, "invalid type for instance variable");
22707           declspecs.specs[(int) ds_typedef] = 0;
22708         }
22709
22710       prefix_attributes = declspecs.attributes;
22711       declspecs.attributes = NULL_TREE;
22712
22713       /* Keep going until we hit the `;' at the end of the
22714          declaration.  */
22715       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22716         {
22717           tree width = NULL_TREE, attributes, first_attribute, decl;
22718           cp_declarator *declarator = NULL;
22719           int ctor_dtor_or_conv_p;
22720
22721           /* Check for a (possibly unnamed) bitfield declaration.  */
22722           token = cp_lexer_peek_token (parser->lexer);
22723           if (token->type == CPP_COLON)
22724             goto eat_colon;
22725
22726           if (token->type == CPP_NAME
22727               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
22728                   == CPP_COLON))
22729             {
22730               /* Get the name of the bitfield.  */
22731               declarator = make_id_declarator (NULL_TREE,
22732                                                cp_parser_identifier (parser),
22733                                                sfk_none);
22734
22735              eat_colon:
22736               cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22737               /* Get the width of the bitfield.  */
22738               width
22739                 = cp_parser_constant_expression (parser,
22740                                                  /*allow_non_constant=*/false,
22741                                                  NULL);
22742             }
22743           else
22744             {
22745               /* Parse the declarator.  */
22746               declarator
22747                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
22748                                         &ctor_dtor_or_conv_p,
22749                                         /*parenthesized_p=*/NULL,
22750                                         /*member_p=*/false);
22751             }
22752
22753           /* Look for attributes that apply to the ivar.  */
22754           attributes = cp_parser_attributes_opt (parser);
22755           /* Remember which attributes are prefix attributes and
22756              which are not.  */
22757           first_attribute = attributes;
22758           /* Combine the attributes.  */
22759           attributes = chainon (prefix_attributes, attributes);
22760
22761           if (width)
22762               /* Create the bitfield declaration.  */
22763               decl = grokbitfield (declarator, &declspecs,
22764                                    width,
22765                                    attributes);
22766           else
22767             decl = grokfield (declarator, &declspecs,
22768                               NULL_TREE, /*init_const_expr_p=*/false,
22769                               NULL_TREE, attributes);
22770
22771           /* Add the instance variable.  */
22772           if (decl != error_mark_node && decl != NULL_TREE)
22773             objc_add_instance_variable (decl);
22774
22775           /* Reset PREFIX_ATTRIBUTES.  */
22776           while (attributes && TREE_CHAIN (attributes) != first_attribute)
22777             attributes = TREE_CHAIN (attributes);
22778           if (attributes)
22779             TREE_CHAIN (attributes) = NULL_TREE;
22780
22781           token = cp_lexer_peek_token (parser->lexer);
22782
22783           if (token->type == CPP_COMMA)
22784             {
22785               cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22786               continue;
22787             }
22788           break;
22789         }
22790
22791       cp_parser_consume_semicolon_at_end_of_statement (parser);
22792       token = cp_lexer_peek_token (parser->lexer);
22793     }
22794
22795   if (token->keyword == RID_AT_END)
22796     cp_parser_error (parser, "expected %<}%>");
22797
22798   /* Do not consume the RID_AT_END, so it will be read again as terminating
22799      the @interface of @implementation.  */ 
22800   if (token->keyword != RID_AT_END && token->type != CPP_EOF)
22801     cp_lexer_consume_token (parser->lexer);  /* Eat '}'.  */
22802     
22803   /* For historical reasons, we accept an optional semicolon.  */
22804   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22805     cp_lexer_consume_token (parser->lexer);
22806 }
22807
22808 /* Parse an Objective-C protocol declaration.  */
22809
22810 static void
22811 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
22812 {
22813   tree proto, protorefs;
22814   cp_token *tok;
22815
22816   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
22817   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
22818     {
22819       tok = cp_lexer_peek_token (parser->lexer);
22820       error_at (tok->location, "identifier expected after %<@protocol%>");
22821       cp_parser_consume_semicolon_at_end_of_statement (parser);
22822       return;
22823     }
22824
22825   /* See if we have a forward declaration or a definition.  */
22826   tok = cp_lexer_peek_nth_token (parser->lexer, 2);
22827
22828   /* Try a forward declaration first.  */
22829   if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
22830     {
22831       while (true)
22832         {
22833           tree id;
22834           
22835           id = cp_parser_identifier (parser);
22836           if (id == error_mark_node)
22837             break;
22838           
22839           objc_declare_protocol (id, attributes);
22840           
22841           if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22842             cp_lexer_consume_token (parser->lexer);
22843           else
22844             break;
22845         }
22846       cp_parser_consume_semicolon_at_end_of_statement (parser);
22847     }
22848
22849   /* Ok, we got a full-fledged definition (or at least should).  */
22850   else
22851     {
22852       proto = cp_parser_identifier (parser);
22853       protorefs = cp_parser_objc_protocol_refs_opt (parser);
22854       objc_start_protocol (proto, protorefs, attributes);
22855       cp_parser_objc_method_prototype_list (parser);
22856     }
22857 }
22858
22859 /* Parse an Objective-C superclass or category.  */
22860
22861 static void
22862 cp_parser_objc_superclass_or_category (cp_parser *parser, 
22863                                        bool iface_p,
22864                                        tree *super,
22865                                        tree *categ, bool *is_class_extension)
22866 {
22867   cp_token *next = cp_lexer_peek_token (parser->lexer);
22868
22869   *super = *categ = NULL_TREE;
22870   *is_class_extension = false;
22871   if (next->type == CPP_COLON)
22872     {
22873       cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22874       *super = cp_parser_identifier (parser);
22875     }
22876   else if (next->type == CPP_OPEN_PAREN)
22877     {
22878       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22879
22880       /* If there is no category name, and this is an @interface, we
22881          have a class extension.  */
22882       if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22883         {
22884           *categ = NULL_TREE;
22885           *is_class_extension = true;
22886         }
22887       else
22888         *categ = cp_parser_identifier (parser);
22889
22890       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22891     }
22892 }
22893
22894 /* Parse an Objective-C class interface.  */
22895
22896 static void
22897 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
22898 {
22899   tree name, super, categ, protos;
22900   bool is_class_extension;
22901
22902   cp_lexer_consume_token (parser->lexer);  /* Eat '@interface'.  */
22903   name = cp_parser_identifier (parser);
22904   if (name == error_mark_node)
22905     {
22906       /* It's hard to recover because even if valid @interface stuff
22907          is to follow, we can't compile it (or validate it) if we
22908          don't even know which class it refers to.  Let's assume this
22909          was a stray '@interface' token in the stream and skip it.
22910       */
22911       return;
22912     }
22913   cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
22914                                          &is_class_extension);
22915   protos = cp_parser_objc_protocol_refs_opt (parser);
22916
22917   /* We have either a class or a category on our hands.  */
22918   if (categ || is_class_extension)
22919     objc_start_category_interface (name, categ, protos, attributes);
22920   else
22921     {
22922       objc_start_class_interface (name, super, protos, attributes);
22923       /* Handle instance variable declarations, if any.  */
22924       cp_parser_objc_class_ivars (parser);
22925       objc_continue_interface ();
22926     }
22927
22928   cp_parser_objc_method_prototype_list (parser);
22929 }
22930
22931 /* Parse an Objective-C class implementation.  */
22932
22933 static void
22934 cp_parser_objc_class_implementation (cp_parser* parser)
22935 {
22936   tree name, super, categ;
22937   bool is_class_extension;
22938
22939   cp_lexer_consume_token (parser->lexer);  /* Eat '@implementation'.  */
22940   name = cp_parser_identifier (parser);
22941   if (name == error_mark_node)
22942     {
22943       /* It's hard to recover because even if valid @implementation
22944          stuff is to follow, we can't compile it (or validate it) if
22945          we don't even know which class it refers to.  Let's assume
22946          this was a stray '@implementation' token in the stream and
22947          skip it.
22948       */
22949       return;
22950     }
22951   cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
22952                                          &is_class_extension);
22953
22954   /* We have either a class or a category on our hands.  */
22955   if (categ)
22956     objc_start_category_implementation (name, categ);
22957   else
22958     {
22959       objc_start_class_implementation (name, super);
22960       /* Handle instance variable declarations, if any.  */
22961       cp_parser_objc_class_ivars (parser);
22962       objc_continue_implementation ();
22963     }
22964
22965   cp_parser_objc_method_definition_list (parser);
22966 }
22967
22968 /* Consume the @end token and finish off the implementation.  */
22969
22970 static void
22971 cp_parser_objc_end_implementation (cp_parser* parser)
22972 {
22973   cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22974   objc_finish_implementation ();
22975 }
22976
22977 /* Parse an Objective-C declaration.  */
22978
22979 static void
22980 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
22981 {
22982   /* Try to figure out what kind of declaration is present.  */
22983   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22984
22985   if (attributes)
22986     switch (kwd->keyword)
22987       {
22988         case RID_AT_ALIAS:
22989         case RID_AT_CLASS:
22990         case RID_AT_END:
22991           error_at (kwd->location, "attributes may not be specified before"
22992                     " the %<@%D%> Objective-C++ keyword",
22993                     kwd->u.value);
22994           attributes = NULL;
22995           break;
22996         case RID_AT_IMPLEMENTATION:
22997           warning_at (kwd->location, OPT_Wattributes,
22998                       "prefix attributes are ignored before %<@%D%>",
22999                       kwd->u.value);
23000           attributes = NULL;
23001         default:
23002           break;
23003       }
23004
23005   switch (kwd->keyword)
23006     {
23007     case RID_AT_ALIAS:
23008       cp_parser_objc_alias_declaration (parser);
23009       break;
23010     case RID_AT_CLASS:
23011       cp_parser_objc_class_declaration (parser);
23012       break;
23013     case RID_AT_PROTOCOL:
23014       cp_parser_objc_protocol_declaration (parser, attributes);
23015       break;
23016     case RID_AT_INTERFACE:
23017       cp_parser_objc_class_interface (parser, attributes);
23018       break;
23019     case RID_AT_IMPLEMENTATION:
23020       cp_parser_objc_class_implementation (parser);
23021       break;
23022     case RID_AT_END:
23023       cp_parser_objc_end_implementation (parser);
23024       break;
23025     default:
23026       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
23027                 kwd->u.value);
23028       cp_parser_skip_to_end_of_block_or_statement (parser);
23029     }
23030 }
23031
23032 /* Parse an Objective-C try-catch-finally statement.
23033
23034    objc-try-catch-finally-stmt:
23035      @try compound-statement objc-catch-clause-seq [opt]
23036        objc-finally-clause [opt]
23037
23038    objc-catch-clause-seq:
23039      objc-catch-clause objc-catch-clause-seq [opt]
23040
23041    objc-catch-clause:
23042      @catch ( objc-exception-declaration ) compound-statement
23043
23044    objc-finally-clause:
23045      @finally compound-statement
23046
23047    objc-exception-declaration:
23048      parameter-declaration
23049      '...'
23050
23051    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
23052
23053    Returns NULL_TREE.
23054
23055    PS: This function is identical to c_parser_objc_try_catch_finally_statement
23056    for C.  Keep them in sync.  */   
23057
23058 static tree
23059 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
23060 {
23061   location_t location;
23062   tree stmt;
23063
23064   cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
23065   location = cp_lexer_peek_token (parser->lexer)->location;
23066   objc_maybe_warn_exceptions (location);
23067   /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
23068      node, lest it get absorbed into the surrounding block.  */
23069   stmt = push_stmt_list ();
23070   cp_parser_compound_statement (parser, NULL, false, false);
23071   objc_begin_try_stmt (location, pop_stmt_list (stmt));
23072
23073   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
23074     {
23075       cp_parameter_declarator *parm;
23076       tree parameter_declaration = error_mark_node;
23077       bool seen_open_paren = false;
23078
23079       cp_lexer_consume_token (parser->lexer);
23080       if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23081         seen_open_paren = true;
23082       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
23083         {
23084           /* We have "@catch (...)" (where the '...' are literally
23085              what is in the code).  Skip the '...'.
23086              parameter_declaration is set to NULL_TREE, and
23087              objc_being_catch_clauses() knows that that means
23088              '...'.  */
23089           cp_lexer_consume_token (parser->lexer);
23090           parameter_declaration = NULL_TREE;
23091         }
23092       else
23093         {
23094           /* We have "@catch (NSException *exception)" or something
23095              like that.  Parse the parameter declaration.  */
23096           parm = cp_parser_parameter_declaration (parser, false, NULL);
23097           if (parm == NULL)
23098             parameter_declaration = error_mark_node;
23099           else
23100             parameter_declaration = grokdeclarator (parm->declarator,
23101                                                     &parm->decl_specifiers,
23102                                                     PARM, /*initialized=*/0,
23103                                                     /*attrlist=*/NULL);
23104         }
23105       if (seen_open_paren)
23106         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
23107       else
23108         {
23109           /* If there was no open parenthesis, we are recovering from
23110              an error, and we are trying to figure out what mistake
23111              the user has made.  */
23112
23113           /* If there is an immediate closing parenthesis, the user
23114              probably forgot the opening one (ie, they typed "@catch
23115              NSException *e)".  Parse the closing parenthesis and keep
23116              going.  */
23117           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
23118             cp_lexer_consume_token (parser->lexer);
23119           
23120           /* If these is no immediate closing parenthesis, the user
23121              probably doesn't know that parenthesis are required at
23122              all (ie, they typed "@catch NSException *e").  So, just
23123              forget about the closing parenthesis and keep going.  */
23124         }
23125       objc_begin_catch_clause (parameter_declaration);
23126       cp_parser_compound_statement (parser, NULL, false, false);
23127       objc_finish_catch_clause ();
23128     }
23129   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
23130     {
23131       cp_lexer_consume_token (parser->lexer);
23132       location = cp_lexer_peek_token (parser->lexer)->location;
23133       /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
23134          node, lest it get absorbed into the surrounding block.  */
23135       stmt = push_stmt_list ();
23136       cp_parser_compound_statement (parser, NULL, false, false);
23137       objc_build_finally_clause (location, pop_stmt_list (stmt));
23138     }
23139
23140   return objc_finish_try_stmt ();
23141 }
23142
23143 /* Parse an Objective-C synchronized statement.
23144
23145    objc-synchronized-stmt:
23146      @synchronized ( expression ) compound-statement
23147
23148    Returns NULL_TREE.  */
23149
23150 static tree
23151 cp_parser_objc_synchronized_statement (cp_parser *parser)
23152 {
23153   location_t location;
23154   tree lock, stmt;
23155
23156   cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
23157
23158   location = cp_lexer_peek_token (parser->lexer)->location;
23159   objc_maybe_warn_exceptions (location);
23160   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
23161   lock = cp_parser_expression (parser, false, NULL);
23162   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
23163
23164   /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
23165      node, lest it get absorbed into the surrounding block.  */
23166   stmt = push_stmt_list ();
23167   cp_parser_compound_statement (parser, NULL, false, false);
23168
23169   return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
23170 }
23171
23172 /* Parse an Objective-C throw statement.
23173
23174    objc-throw-stmt:
23175      @throw assignment-expression [opt] ;
23176
23177    Returns a constructed '@throw' statement.  */
23178
23179 static tree
23180 cp_parser_objc_throw_statement (cp_parser *parser)
23181 {
23182   tree expr = NULL_TREE;
23183   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
23184
23185   cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
23186
23187   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23188     expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
23189
23190   cp_parser_consume_semicolon_at_end_of_statement (parser);
23191
23192   return objc_build_throw_stmt (loc, expr);
23193 }
23194
23195 /* Parse an Objective-C statement.  */
23196
23197 static tree
23198 cp_parser_objc_statement (cp_parser * parser)
23199 {
23200   /* Try to figure out what kind of declaration is present.  */
23201   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
23202
23203   switch (kwd->keyword)
23204     {
23205     case RID_AT_TRY:
23206       return cp_parser_objc_try_catch_finally_statement (parser);
23207     case RID_AT_SYNCHRONIZED:
23208       return cp_parser_objc_synchronized_statement (parser);
23209     case RID_AT_THROW:
23210       return cp_parser_objc_throw_statement (parser);
23211     default:
23212       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
23213                kwd->u.value);
23214       cp_parser_skip_to_end_of_block_or_statement (parser);
23215     }
23216
23217   return error_mark_node;
23218 }
23219
23220 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to 
23221    look ahead to see if an objc keyword follows the attributes.  This
23222    is to detect the use of prefix attributes on ObjC @interface and 
23223    @protocol.  */
23224
23225 static bool
23226 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
23227 {
23228   cp_lexer_save_tokens (parser->lexer);
23229   *attrib = cp_parser_attributes_opt (parser);
23230   gcc_assert (*attrib);
23231   if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
23232     {
23233       cp_lexer_commit_tokens (parser->lexer);
23234       return true;
23235     }
23236   cp_lexer_rollback_tokens (parser->lexer);
23237   return false;  
23238 }
23239
23240 /* This routine is a minimal replacement for
23241    c_parser_struct_declaration () used when parsing the list of
23242    types/names or ObjC++ properties.  For example, when parsing the
23243    code
23244
23245    @property (readonly) int a, b, c;
23246
23247    this function is responsible for parsing "int a, int b, int c" and
23248    returning the declarations as CHAIN of DECLs.
23249
23250    TODO: Share this code with cp_parser_objc_class_ivars.  It's very
23251    similar parsing.  */
23252 static tree
23253 cp_parser_objc_struct_declaration (cp_parser *parser)
23254 {
23255   tree decls = NULL_TREE;
23256   cp_decl_specifier_seq declspecs;
23257   int decl_class_or_enum_p;
23258   tree prefix_attributes;
23259
23260   cp_parser_decl_specifier_seq (parser,
23261                                 CP_PARSER_FLAGS_NONE,
23262                                 &declspecs,
23263                                 &decl_class_or_enum_p);
23264
23265   if (declspecs.type == error_mark_node)
23266     return error_mark_node;
23267
23268   /* auto, register, static, extern, mutable.  */
23269   if (declspecs.storage_class != sc_none)
23270     {
23271       cp_parser_error (parser, "invalid type for property");
23272       declspecs.storage_class = sc_none;
23273     }
23274   
23275   /* __thread.  */
23276   if (declspecs.specs[(int) ds_thread])
23277     {
23278       cp_parser_error (parser, "invalid type for property");
23279       declspecs.specs[(int) ds_thread] = 0;
23280     }
23281   
23282   /* typedef.  */
23283   if (declspecs.specs[(int) ds_typedef])
23284     {
23285       cp_parser_error (parser, "invalid type for property");
23286       declspecs.specs[(int) ds_typedef] = 0;
23287     }
23288
23289   prefix_attributes = declspecs.attributes;
23290   declspecs.attributes = NULL_TREE;
23291
23292   /* Keep going until we hit the `;' at the end of the declaration. */
23293   while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23294     {
23295       tree attributes, first_attribute, decl;
23296       cp_declarator *declarator;
23297       cp_token *token;
23298
23299       /* Parse the declarator.  */
23300       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
23301                                          NULL, NULL, false);
23302
23303       /* Look for attributes that apply to the ivar.  */
23304       attributes = cp_parser_attributes_opt (parser);
23305       /* Remember which attributes are prefix attributes and
23306          which are not.  */
23307       first_attribute = attributes;
23308       /* Combine the attributes.  */
23309       attributes = chainon (prefix_attributes, attributes);
23310       
23311       decl = grokfield (declarator, &declspecs,
23312                         NULL_TREE, /*init_const_expr_p=*/false,
23313                         NULL_TREE, attributes);
23314
23315       if (decl == error_mark_node || decl == NULL_TREE)
23316         return error_mark_node;
23317       
23318       /* Reset PREFIX_ATTRIBUTES.  */
23319       while (attributes && TREE_CHAIN (attributes) != first_attribute)
23320         attributes = TREE_CHAIN (attributes);
23321       if (attributes)
23322         TREE_CHAIN (attributes) = NULL_TREE;
23323
23324       DECL_CHAIN (decl) = decls;
23325       decls = decl;
23326
23327       token = cp_lexer_peek_token (parser->lexer);
23328       if (token->type == CPP_COMMA)
23329         {
23330           cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
23331           continue;
23332         }
23333       else
23334         break;
23335     }
23336   return decls;
23337 }
23338
23339 /* Parse an Objective-C @property declaration.  The syntax is:
23340
23341    objc-property-declaration:
23342      '@property' objc-property-attributes[opt] struct-declaration ;
23343
23344    objc-property-attributes:
23345     '(' objc-property-attribute-list ')'
23346
23347    objc-property-attribute-list:
23348      objc-property-attribute
23349      objc-property-attribute-list, objc-property-attribute
23350
23351    objc-property-attribute
23352      'getter' = identifier
23353      'setter' = identifier
23354      'readonly'
23355      'readwrite'
23356      'assign'
23357      'retain'
23358      'copy'
23359      'nonatomic'
23360
23361   For example:
23362     @property NSString *name;
23363     @property (readonly) id object;
23364     @property (retain, nonatomic, getter=getTheName) id name;
23365     @property int a, b, c;
23366
23367    PS: This function is identical to
23368    c_parser_objc_at_property_declaration for C.  Keep them in sync.  */
23369 static void 
23370 cp_parser_objc_at_property_declaration (cp_parser *parser)
23371 {
23372   /* The following variables hold the attributes of the properties as
23373      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
23374      seen.  When we see an attribute, we set them to 'true' (if they
23375      are boolean properties) or to the identifier (if they have an
23376      argument, ie, for getter and setter).  Note that here we only
23377      parse the list of attributes, check the syntax and accumulate the
23378      attributes that we find.  objc_add_property_declaration() will
23379      then process the information.  */
23380   bool property_assign = false;
23381   bool property_copy = false;
23382   tree property_getter_ident = NULL_TREE;
23383   bool property_nonatomic = false;
23384   bool property_readonly = false;
23385   bool property_readwrite = false;
23386   bool property_retain = false;
23387   tree property_setter_ident = NULL_TREE;
23388
23389   /* 'properties' is the list of properties that we read.  Usually a
23390      single one, but maybe more (eg, in "@property int a, b, c;" there
23391      are three).  */
23392   tree properties;
23393   location_t loc;
23394
23395   loc = cp_lexer_peek_token (parser->lexer)->location;
23396
23397   cp_lexer_consume_token (parser->lexer);  /* Eat '@property'.  */
23398
23399   /* Parse the optional attribute list...  */
23400   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
23401     {
23402       /* Eat the '('.  */
23403       cp_lexer_consume_token (parser->lexer);
23404
23405       while (true)
23406         {
23407           bool syntax_error = false;
23408           cp_token *token = cp_lexer_peek_token (parser->lexer);
23409           enum rid keyword;
23410
23411           if (token->type != CPP_NAME)
23412             {
23413               cp_parser_error (parser, "expected identifier");
23414               break;
23415             }
23416           keyword = C_RID_CODE (token->u.value);
23417           cp_lexer_consume_token (parser->lexer);
23418           switch (keyword)
23419             {
23420             case RID_ASSIGN:    property_assign = true;    break;
23421             case RID_COPY:      property_copy = true;      break;
23422             case RID_NONATOMIC: property_nonatomic = true; break;
23423             case RID_READONLY:  property_readonly = true;  break;
23424             case RID_READWRITE: property_readwrite = true; break;
23425             case RID_RETAIN:    property_retain = true;    break;
23426
23427             case RID_GETTER:
23428             case RID_SETTER:
23429               if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
23430                 {
23431                   if (keyword == RID_GETTER)
23432                     cp_parser_error (parser,
23433                                      "missing %<=%> (after %<getter%> attribute)");
23434                   else
23435                     cp_parser_error (parser,
23436                                      "missing %<=%> (after %<setter%> attribute)");
23437                   syntax_error = true;
23438                   break;
23439                 }
23440               cp_lexer_consume_token (parser->lexer); /* eat the = */
23441               if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
23442                 {
23443                   cp_parser_error (parser, "expected identifier");
23444                   syntax_error = true;
23445                   break;
23446                 }
23447               if (keyword == RID_SETTER)
23448                 {
23449                   if (property_setter_ident != NULL_TREE)
23450                     {
23451                       cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
23452                       cp_lexer_consume_token (parser->lexer);
23453                     }
23454                   else
23455                     property_setter_ident = cp_parser_objc_selector (parser);
23456                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
23457                     cp_parser_error (parser, "setter name must terminate with %<:%>");
23458                   else
23459                     cp_lexer_consume_token (parser->lexer);
23460                 }
23461               else
23462                 {
23463                   if (property_getter_ident != NULL_TREE)
23464                     {
23465                       cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
23466                       cp_lexer_consume_token (parser->lexer);
23467                     }
23468                   else
23469                     property_getter_ident = cp_parser_objc_selector (parser);
23470                 }
23471               break;
23472             default:
23473               cp_parser_error (parser, "unknown property attribute");
23474               syntax_error = true;
23475               break;
23476             }
23477
23478           if (syntax_error)
23479             break;
23480
23481           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23482             cp_lexer_consume_token (parser->lexer);
23483           else
23484             break;
23485         }
23486
23487       /* FIXME: "@property (setter, assign);" will generate a spurious
23488          "error: expected â€˜)’ before â€˜,’ token".  This is because
23489          cp_parser_require, unlike the C counterpart, will produce an
23490          error even if we are in error recovery.  */
23491       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23492         {
23493           cp_parser_skip_to_closing_parenthesis (parser,
23494                                                  /*recovering=*/true,
23495                                                  /*or_comma=*/false,
23496                                                  /*consume_paren=*/true);
23497         }
23498     }
23499
23500   /* ... and the property declaration(s).  */
23501   properties = cp_parser_objc_struct_declaration (parser);
23502
23503   if (properties == error_mark_node)
23504     {
23505       cp_parser_skip_to_end_of_statement (parser);
23506       /* If the next token is now a `;', consume it.  */
23507       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23508         cp_lexer_consume_token (parser->lexer);
23509       return;
23510     }
23511
23512   if (properties == NULL_TREE)
23513     cp_parser_error (parser, "expected identifier");
23514   else
23515     {
23516       /* Comma-separated properties are chained together in
23517          reverse order; add them one by one.  */
23518       properties = nreverse (properties);
23519       
23520       for (; properties; properties = TREE_CHAIN (properties))
23521         objc_add_property_declaration (loc, copy_node (properties),
23522                                        property_readonly, property_readwrite,
23523                                        property_assign, property_retain,
23524                                        property_copy, property_nonatomic,
23525                                        property_getter_ident, property_setter_ident);
23526     }
23527   
23528   cp_parser_consume_semicolon_at_end_of_statement (parser);
23529 }
23530
23531 /* Parse an Objective-C++ @synthesize declaration.  The syntax is:
23532
23533    objc-synthesize-declaration:
23534      @synthesize objc-synthesize-identifier-list ;
23535
23536    objc-synthesize-identifier-list:
23537      objc-synthesize-identifier
23538      objc-synthesize-identifier-list, objc-synthesize-identifier
23539
23540    objc-synthesize-identifier
23541      identifier
23542      identifier = identifier
23543
23544   For example:
23545     @synthesize MyProperty;
23546     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
23547
23548   PS: This function is identical to c_parser_objc_at_synthesize_declaration
23549   for C.  Keep them in sync.
23550 */
23551 static void 
23552 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
23553 {
23554   tree list = NULL_TREE;
23555   location_t loc;
23556   loc = cp_lexer_peek_token (parser->lexer)->location;
23557
23558   cp_lexer_consume_token (parser->lexer);  /* Eat '@synthesize'.  */
23559   while (true)
23560     {
23561       tree property, ivar;
23562       property = cp_parser_identifier (parser);
23563       if (property == error_mark_node)
23564         {
23565           cp_parser_consume_semicolon_at_end_of_statement (parser);
23566           return;
23567         }
23568       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
23569         {
23570           cp_lexer_consume_token (parser->lexer);
23571           ivar = cp_parser_identifier (parser);
23572           if (ivar == error_mark_node)
23573             {
23574               cp_parser_consume_semicolon_at_end_of_statement (parser);
23575               return;
23576             }
23577         }
23578       else
23579         ivar = NULL_TREE;
23580       list = chainon (list, build_tree_list (ivar, property));
23581       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23582         cp_lexer_consume_token (parser->lexer);
23583       else
23584         break;
23585     }
23586   cp_parser_consume_semicolon_at_end_of_statement (parser);
23587   objc_add_synthesize_declaration (loc, list);
23588 }
23589
23590 /* Parse an Objective-C++ @dynamic declaration.  The syntax is:
23591
23592    objc-dynamic-declaration:
23593      @dynamic identifier-list ;
23594
23595    For example:
23596      @dynamic MyProperty;
23597      @dynamic MyProperty, AnotherProperty;
23598
23599   PS: This function is identical to c_parser_objc_at_dynamic_declaration
23600   for C.  Keep them in sync.
23601 */
23602 static void 
23603 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
23604 {
23605   tree list = NULL_TREE;
23606   location_t loc;
23607   loc = cp_lexer_peek_token (parser->lexer)->location;
23608
23609   cp_lexer_consume_token (parser->lexer);  /* Eat '@dynamic'.  */
23610   while (true)
23611     {
23612       tree property;
23613       property = cp_parser_identifier (parser);
23614       if (property == error_mark_node)
23615         {
23616           cp_parser_consume_semicolon_at_end_of_statement (parser);
23617           return;
23618         }
23619       list = chainon (list, build_tree_list (NULL, property));
23620       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23621         cp_lexer_consume_token (parser->lexer);
23622       else
23623         break;
23624     }
23625   cp_parser_consume_semicolon_at_end_of_statement (parser);
23626   objc_add_dynamic_declaration (loc, list);
23627 }
23628
23629 \f
23630 /* OpenMP 2.5 parsing routines.  */
23631
23632 /* Returns name of the next clause.
23633    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
23634    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
23635    returned and the token is consumed.  */
23636
23637 static pragma_omp_clause
23638 cp_parser_omp_clause_name (cp_parser *parser)
23639 {
23640   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
23641
23642   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
23643     result = PRAGMA_OMP_CLAUSE_IF;
23644   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
23645     result = PRAGMA_OMP_CLAUSE_DEFAULT;
23646   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
23647     result = PRAGMA_OMP_CLAUSE_PRIVATE;
23648   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23649     {
23650       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23651       const char *p = IDENTIFIER_POINTER (id);
23652
23653       switch (p[0])
23654         {
23655         case 'c':
23656           if (!strcmp ("collapse", p))
23657             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
23658           else if (!strcmp ("copyin", p))
23659             result = PRAGMA_OMP_CLAUSE_COPYIN;
23660           else if (!strcmp ("copyprivate", p))
23661             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
23662           break;
23663         case 'f':
23664           if (!strcmp ("final", p))
23665             result = PRAGMA_OMP_CLAUSE_FINAL;
23666           else if (!strcmp ("firstprivate", p))
23667             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
23668           break;
23669         case 'l':
23670           if (!strcmp ("lastprivate", p))
23671             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
23672           break;
23673         case 'm':
23674           if (!strcmp ("mergeable", p))
23675             result = PRAGMA_OMP_CLAUSE_MERGEABLE;
23676           break;
23677         case 'n':
23678           if (!strcmp ("nowait", p))
23679             result = PRAGMA_OMP_CLAUSE_NOWAIT;
23680           else if (!strcmp ("num_threads", p))
23681             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
23682           break;
23683         case 'o':
23684           if (!strcmp ("ordered", p))
23685             result = PRAGMA_OMP_CLAUSE_ORDERED;
23686           break;
23687         case 'r':
23688           if (!strcmp ("reduction", p))
23689             result = PRAGMA_OMP_CLAUSE_REDUCTION;
23690           break;
23691         case 's':
23692           if (!strcmp ("schedule", p))
23693             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
23694           else if (!strcmp ("shared", p))
23695             result = PRAGMA_OMP_CLAUSE_SHARED;
23696           break;
23697         case 'u':
23698           if (!strcmp ("untied", p))
23699             result = PRAGMA_OMP_CLAUSE_UNTIED;
23700           break;
23701         }
23702     }
23703
23704   if (result != PRAGMA_OMP_CLAUSE_NONE)
23705     cp_lexer_consume_token (parser->lexer);
23706
23707   return result;
23708 }
23709
23710 /* Validate that a clause of the given type does not already exist.  */
23711
23712 static void
23713 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
23714                            const char *name, location_t location)
23715 {
23716   tree c;
23717
23718   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
23719     if (OMP_CLAUSE_CODE (c) == code)
23720       {
23721         error_at (location, "too many %qs clauses", name);
23722         break;
23723       }
23724 }
23725
23726 /* OpenMP 2.5:
23727    variable-list:
23728      identifier
23729      variable-list , identifier
23730
23731    In addition, we match a closing parenthesis.  An opening parenthesis
23732    will have been consumed by the caller.
23733
23734    If KIND is nonzero, create the appropriate node and install the decl
23735    in OMP_CLAUSE_DECL and add the node to the head of the list.
23736
23737    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
23738    return the list created.  */
23739
23740 static tree
23741 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
23742                                 tree list)
23743 {
23744   cp_token *token;
23745   while (1)
23746     {
23747       tree name, decl;
23748
23749       token = cp_lexer_peek_token (parser->lexer);
23750       name = cp_parser_id_expression (parser, /*template_p=*/false,
23751                                       /*check_dependency_p=*/true,
23752                                       /*template_p=*/NULL,
23753                                       /*declarator_p=*/false,
23754                                       /*optional_p=*/false);
23755       if (name == error_mark_node)
23756         goto skip_comma;
23757
23758       decl = cp_parser_lookup_name_simple (parser, name, token->location);
23759       if (decl == error_mark_node)
23760         cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
23761                                      token->location);
23762       else if (kind != 0)
23763         {
23764           tree u = build_omp_clause (token->location, kind);
23765           OMP_CLAUSE_DECL (u) = decl;
23766           OMP_CLAUSE_CHAIN (u) = list;
23767           list = u;
23768         }
23769       else
23770         list = tree_cons (decl, NULL_TREE, list);
23771
23772     get_comma:
23773       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
23774         break;
23775       cp_lexer_consume_token (parser->lexer);
23776     }
23777
23778   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23779     {
23780       int ending;
23781
23782       /* Try to resync to an unnested comma.  Copied from
23783          cp_parser_parenthesized_expression_list.  */
23784     skip_comma:
23785       ending = cp_parser_skip_to_closing_parenthesis (parser,
23786                                                       /*recovering=*/true,
23787                                                       /*or_comma=*/true,
23788                                                       /*consume_paren=*/true);
23789       if (ending < 0)
23790         goto get_comma;
23791     }
23792
23793   return list;
23794 }
23795
23796 /* Similarly, but expect leading and trailing parenthesis.  This is a very
23797    common case for omp clauses.  */
23798
23799 static tree
23800 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
23801 {
23802   if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23803     return cp_parser_omp_var_list_no_open (parser, kind, list);
23804   return list;
23805 }
23806
23807 /* OpenMP 3.0:
23808    collapse ( constant-expression ) */
23809
23810 static tree
23811 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
23812 {
23813   tree c, num;
23814   location_t loc;
23815   HOST_WIDE_INT n;
23816
23817   loc = cp_lexer_peek_token (parser->lexer)->location;
23818   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23819     return list;
23820
23821   num = cp_parser_constant_expression (parser, false, NULL);
23822
23823   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23824     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23825                                            /*or_comma=*/false,
23826                                            /*consume_paren=*/true);
23827
23828   if (num == error_mark_node)
23829     return list;
23830   num = fold_non_dependent_expr (num);
23831   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
23832       || !host_integerp (num, 0)
23833       || (n = tree_low_cst (num, 0)) <= 0
23834       || (int) n != n)
23835     {
23836       error_at (loc, "collapse argument needs positive constant integer expression");
23837       return list;
23838     }
23839
23840   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
23841   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
23842   OMP_CLAUSE_CHAIN (c) = list;
23843   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
23844
23845   return c;
23846 }
23847
23848 /* OpenMP 2.5:
23849    default ( shared | none ) */
23850
23851 static tree
23852 cp_parser_omp_clause_default (cp_parser *parser, tree list, location_t location)
23853 {
23854   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
23855   tree c;
23856
23857   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23858     return list;
23859   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23860     {
23861       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23862       const char *p = IDENTIFIER_POINTER (id);
23863
23864       switch (p[0])
23865         {
23866         case 'n':
23867           if (strcmp ("none", p) != 0)
23868             goto invalid_kind;
23869           kind = OMP_CLAUSE_DEFAULT_NONE;
23870           break;
23871
23872         case 's':
23873           if (strcmp ("shared", p) != 0)
23874             goto invalid_kind;
23875           kind = OMP_CLAUSE_DEFAULT_SHARED;
23876           break;
23877
23878         default:
23879           goto invalid_kind;
23880         }
23881
23882       cp_lexer_consume_token (parser->lexer);
23883     }
23884   else
23885     {
23886     invalid_kind:
23887       cp_parser_error (parser, "expected %<none%> or %<shared%>");
23888     }
23889
23890   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23891     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23892                                            /*or_comma=*/false,
23893                                            /*consume_paren=*/true);
23894
23895   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
23896     return list;
23897
23898   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
23899   c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
23900   OMP_CLAUSE_CHAIN (c) = list;
23901   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
23902
23903   return c;
23904 }
23905
23906 /* OpenMP 3.1:
23907    final ( expression ) */
23908
23909 static tree
23910 cp_parser_omp_clause_final (cp_parser *parser, tree list, location_t location)
23911 {
23912   tree t, c;
23913
23914   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23915     return list;
23916
23917   t = cp_parser_condition (parser);
23918
23919   if (t == error_mark_node
23920       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23921     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23922                                            /*or_comma=*/false,
23923                                            /*consume_paren=*/true);
23924
23925   check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final", location);
23926
23927   c = build_omp_clause (location, OMP_CLAUSE_FINAL);
23928   OMP_CLAUSE_FINAL_EXPR (c) = t;
23929   OMP_CLAUSE_CHAIN (c) = list;
23930
23931   return c;
23932 }
23933
23934 /* OpenMP 2.5:
23935    if ( expression ) */
23936
23937 static tree
23938 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
23939 {
23940   tree t, c;
23941
23942   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23943     return list;
23944
23945   t = cp_parser_condition (parser);
23946
23947   if (t == error_mark_node
23948       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23949     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23950                                            /*or_comma=*/false,
23951                                            /*consume_paren=*/true);
23952
23953   check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if", location);
23954
23955   c = build_omp_clause (location, OMP_CLAUSE_IF);
23956   OMP_CLAUSE_IF_EXPR (c) = t;
23957   OMP_CLAUSE_CHAIN (c) = list;
23958
23959   return c;
23960 }
23961
23962 /* OpenMP 3.1:
23963    mergeable */
23964
23965 static tree
23966 cp_parser_omp_clause_mergeable (cp_parser *parser ATTRIBUTE_UNUSED,
23967                                 tree list, location_t location)
23968 {
23969   tree c;
23970
23971   check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable",
23972                              location);
23973
23974   c = build_omp_clause (location, OMP_CLAUSE_MERGEABLE);
23975   OMP_CLAUSE_CHAIN (c) = list;
23976   return c;
23977 }
23978
23979 /* OpenMP 2.5:
23980    nowait */
23981
23982 static tree
23983 cp_parser_omp_clause_nowait (cp_parser *parser ATTRIBUTE_UNUSED,
23984                              tree list, location_t location)
23985 {
23986   tree c;
23987
23988   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
23989
23990   c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
23991   OMP_CLAUSE_CHAIN (c) = list;
23992   return c;
23993 }
23994
23995 /* OpenMP 2.5:
23996    num_threads ( expression ) */
23997
23998 static tree
23999 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
24000                                   location_t location)
24001 {
24002   tree t, c;
24003
24004   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24005     return list;
24006
24007   t = cp_parser_expression (parser, false, NULL);
24008
24009   if (t == error_mark_node
24010       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24011     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24012                                            /*or_comma=*/false,
24013                                            /*consume_paren=*/true);
24014
24015   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
24016                              "num_threads", location);
24017
24018   c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
24019   OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
24020   OMP_CLAUSE_CHAIN (c) = list;
24021
24022   return c;
24023 }
24024
24025 /* OpenMP 2.5:
24026    ordered */
24027
24028 static tree
24029 cp_parser_omp_clause_ordered (cp_parser *parser ATTRIBUTE_UNUSED,
24030                               tree list, location_t location)
24031 {
24032   tree c;
24033
24034   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
24035                              "ordered", location);
24036
24037   c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
24038   OMP_CLAUSE_CHAIN (c) = list;
24039   return c;
24040 }
24041
24042 /* OpenMP 2.5:
24043    reduction ( reduction-operator : variable-list )
24044
24045    reduction-operator:
24046      One of: + * - & ^ | && ||
24047
24048    OpenMP 3.1:
24049
24050    reduction-operator:
24051      One of: + * - & ^ | && || min max  */
24052
24053 static tree
24054 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
24055 {
24056   enum tree_code code;
24057   tree nlist, c;
24058
24059   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24060     return list;
24061
24062   switch (cp_lexer_peek_token (parser->lexer)->type)
24063     {
24064     case CPP_PLUS:
24065       code = PLUS_EXPR;
24066       break;
24067     case CPP_MULT:
24068       code = MULT_EXPR;
24069       break;
24070     case CPP_MINUS:
24071       code = MINUS_EXPR;
24072       break;
24073     case CPP_AND:
24074       code = BIT_AND_EXPR;
24075       break;
24076     case CPP_XOR:
24077       code = BIT_XOR_EXPR;
24078       break;
24079     case CPP_OR:
24080       code = BIT_IOR_EXPR;
24081       break;
24082     case CPP_AND_AND:
24083       code = TRUTH_ANDIF_EXPR;
24084       break;
24085     case CPP_OR_OR:
24086       code = TRUTH_ORIF_EXPR;
24087       break;
24088     case CPP_NAME:
24089       {
24090         tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24091         const char *p = IDENTIFIER_POINTER (id);
24092
24093         if (strcmp (p, "min") == 0)
24094           {
24095             code = MIN_EXPR;
24096             break;
24097           }
24098         if (strcmp (p, "max") == 0)
24099           {
24100             code = MAX_EXPR;
24101             break;
24102           }
24103       }
24104       /* FALLTHROUGH */
24105     default:
24106       cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
24107                                "%<|%>, %<&&%>, %<||%>, %<min%> or %<max%>");
24108     resync_fail:
24109       cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24110                                              /*or_comma=*/false,
24111                                              /*consume_paren=*/true);
24112       return list;
24113     }
24114   cp_lexer_consume_token (parser->lexer);
24115
24116   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
24117     goto resync_fail;
24118
24119   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list);
24120   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
24121     OMP_CLAUSE_REDUCTION_CODE (c) = code;
24122
24123   return nlist;
24124 }
24125
24126 /* OpenMP 2.5:
24127    schedule ( schedule-kind )
24128    schedule ( schedule-kind , expression )
24129
24130    schedule-kind:
24131      static | dynamic | guided | runtime | auto  */
24132
24133 static tree
24134 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
24135 {
24136   tree c, t;
24137
24138   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24139     return list;
24140
24141   c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
24142
24143   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24144     {
24145       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24146       const char *p = IDENTIFIER_POINTER (id);
24147
24148       switch (p[0])
24149         {
24150         case 'd':
24151           if (strcmp ("dynamic", p) != 0)
24152             goto invalid_kind;
24153           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
24154           break;
24155
24156         case 'g':
24157           if (strcmp ("guided", p) != 0)
24158             goto invalid_kind;
24159           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
24160           break;
24161
24162         case 'r':
24163           if (strcmp ("runtime", p) != 0)
24164             goto invalid_kind;
24165           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
24166           break;
24167
24168         default:
24169           goto invalid_kind;
24170         }
24171     }
24172   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
24173     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
24174   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
24175     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
24176   else
24177     goto invalid_kind;
24178   cp_lexer_consume_token (parser->lexer);
24179
24180   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
24181     {
24182       cp_token *token;
24183       cp_lexer_consume_token (parser->lexer);
24184
24185       token = cp_lexer_peek_token (parser->lexer);
24186       t = cp_parser_assignment_expression (parser, false, NULL);
24187
24188       if (t == error_mark_node)
24189         goto resync_fail;
24190       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
24191         error_at (token->location, "schedule %<runtime%> does not take "
24192                   "a %<chunk_size%> parameter");
24193       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
24194         error_at (token->location, "schedule %<auto%> does not take "
24195                   "a %<chunk_size%> parameter");
24196       else
24197         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
24198
24199       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24200         goto resync_fail;
24201     }
24202   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
24203     goto resync_fail;
24204
24205   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
24206   OMP_CLAUSE_CHAIN (c) = list;
24207   return c;
24208
24209  invalid_kind:
24210   cp_parser_error (parser, "invalid schedule kind");
24211  resync_fail:
24212   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24213                                          /*or_comma=*/false,
24214                                          /*consume_paren=*/true);
24215   return list;
24216 }
24217
24218 /* OpenMP 3.0:
24219    untied */
24220
24221 static tree
24222 cp_parser_omp_clause_untied (cp_parser *parser ATTRIBUTE_UNUSED,
24223                              tree list, location_t location)
24224 {
24225   tree c;
24226
24227   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
24228
24229   c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
24230   OMP_CLAUSE_CHAIN (c) = list;
24231   return c;
24232 }
24233
24234 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
24235    is a bitmask in MASK.  Return the list of clauses found; the result
24236    of clause default goes in *pdefault.  */
24237
24238 static tree
24239 cp_parser_omp_all_clauses (cp_parser *parser, unsigned int mask,
24240                            const char *where, cp_token *pragma_tok)
24241 {
24242   tree clauses = NULL;
24243   bool first = true;
24244   cp_token *token = NULL;
24245
24246   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
24247     {
24248       pragma_omp_clause c_kind;
24249       const char *c_name;
24250       tree prev = clauses;
24251
24252       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
24253         cp_lexer_consume_token (parser->lexer);
24254
24255       token = cp_lexer_peek_token (parser->lexer);
24256       c_kind = cp_parser_omp_clause_name (parser);
24257       first = false;
24258
24259       switch (c_kind)
24260         {
24261         case PRAGMA_OMP_CLAUSE_COLLAPSE:
24262           clauses = cp_parser_omp_clause_collapse (parser, clauses,
24263                                                    token->location);
24264           c_name = "collapse";
24265           break;
24266         case PRAGMA_OMP_CLAUSE_COPYIN:
24267           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
24268           c_name = "copyin";
24269           break;
24270         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
24271           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
24272                                             clauses);
24273           c_name = "copyprivate";
24274           break;
24275         case PRAGMA_OMP_CLAUSE_DEFAULT:
24276           clauses = cp_parser_omp_clause_default (parser, clauses,
24277                                                   token->location);
24278           c_name = "default";
24279           break;
24280         case PRAGMA_OMP_CLAUSE_FINAL:
24281           clauses = cp_parser_omp_clause_final (parser, clauses, token->location);
24282           c_name = "final";
24283           break;
24284         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
24285           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
24286                                             clauses);
24287           c_name = "firstprivate";
24288           break;
24289         case PRAGMA_OMP_CLAUSE_IF:
24290           clauses = cp_parser_omp_clause_if (parser, clauses, token->location);
24291           c_name = "if";
24292           break;
24293         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
24294           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
24295                                             clauses);
24296           c_name = "lastprivate";
24297           break;
24298         case PRAGMA_OMP_CLAUSE_MERGEABLE:
24299           clauses = cp_parser_omp_clause_mergeable (parser, clauses,
24300                                                     token->location);
24301           c_name = "mergeable";
24302           break;
24303         case PRAGMA_OMP_CLAUSE_NOWAIT:
24304           clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
24305           c_name = "nowait";
24306           break;
24307         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
24308           clauses = cp_parser_omp_clause_num_threads (parser, clauses,
24309                                                       token->location);
24310           c_name = "num_threads";
24311           break;
24312         case PRAGMA_OMP_CLAUSE_ORDERED:
24313           clauses = cp_parser_omp_clause_ordered (parser, clauses,
24314                                                   token->location);
24315           c_name = "ordered";
24316           break;
24317         case PRAGMA_OMP_CLAUSE_PRIVATE:
24318           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
24319                                             clauses);
24320           c_name = "private";
24321           break;
24322         case PRAGMA_OMP_CLAUSE_REDUCTION:
24323           clauses = cp_parser_omp_clause_reduction (parser, clauses);
24324           c_name = "reduction";
24325           break;
24326         case PRAGMA_OMP_CLAUSE_SCHEDULE:
24327           clauses = cp_parser_omp_clause_schedule (parser, clauses,
24328                                                    token->location);
24329           c_name = "schedule";
24330           break;
24331         case PRAGMA_OMP_CLAUSE_SHARED:
24332           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
24333                                             clauses);
24334           c_name = "shared";
24335           break;
24336         case PRAGMA_OMP_CLAUSE_UNTIED:
24337           clauses = cp_parser_omp_clause_untied (parser, clauses,
24338                                                  token->location);
24339           c_name = "nowait";
24340           break;
24341         default:
24342           cp_parser_error (parser, "expected %<#pragma omp%> clause");
24343           goto saw_error;
24344         }
24345
24346       if (((mask >> c_kind) & 1) == 0)
24347         {
24348           /* Remove the invalid clause(s) from the list to avoid
24349              confusing the rest of the compiler.  */
24350           clauses = prev;
24351           error_at (token->location, "%qs is not valid for %qs", c_name, where);
24352         }
24353     }
24354  saw_error:
24355   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
24356   return finish_omp_clauses (clauses);
24357 }
24358
24359 /* OpenMP 2.5:
24360    structured-block:
24361      statement
24362
24363    In practice, we're also interested in adding the statement to an
24364    outer node.  So it is convenient if we work around the fact that
24365    cp_parser_statement calls add_stmt.  */
24366
24367 static unsigned
24368 cp_parser_begin_omp_structured_block (cp_parser *parser)
24369 {
24370   unsigned save = parser->in_statement;
24371
24372   /* Only move the values to IN_OMP_BLOCK if they weren't false.
24373      This preserves the "not within loop or switch" style error messages
24374      for nonsense cases like
24375         void foo() {
24376         #pragma omp single
24377           break;
24378         }
24379   */
24380   if (parser->in_statement)
24381     parser->in_statement = IN_OMP_BLOCK;
24382
24383   return save;
24384 }
24385
24386 static void
24387 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
24388 {
24389   parser->in_statement = save;
24390 }
24391
24392 static tree
24393 cp_parser_omp_structured_block (cp_parser *parser)
24394 {
24395   tree stmt = begin_omp_structured_block ();
24396   unsigned int save = cp_parser_begin_omp_structured_block (parser);
24397
24398   cp_parser_statement (parser, NULL_TREE, false, NULL);
24399
24400   cp_parser_end_omp_structured_block (parser, save);
24401   return finish_omp_structured_block (stmt);
24402 }
24403
24404 /* OpenMP 2.5:
24405    # pragma omp atomic new-line
24406      expression-stmt
24407
24408    expression-stmt:
24409      x binop= expr | x++ | ++x | x-- | --x
24410    binop:
24411      +, *, -, /, &, ^, |, <<, >>
24412
24413   where x is an lvalue expression with scalar type.
24414
24415    OpenMP 3.1:
24416    # pragma omp atomic new-line
24417      update-stmt
24418
24419    # pragma omp atomic read new-line
24420      read-stmt
24421
24422    # pragma omp atomic write new-line
24423      write-stmt
24424
24425    # pragma omp atomic update new-line
24426      update-stmt
24427
24428    # pragma omp atomic capture new-line
24429      capture-stmt
24430
24431    # pragma omp atomic capture new-line
24432      capture-block
24433
24434    read-stmt:
24435      v = x
24436    write-stmt:
24437      x = expr
24438    update-stmt:
24439      expression-stmt | x = x binop expr
24440    capture-stmt:
24441      v = x binop= expr | v = x++ | v = ++x | v = x-- | v = --x
24442    capture-block:
24443      { v = x; update-stmt; } | { update-stmt; v = x; }
24444
24445   where x and v are lvalue expressions with scalar type.  */
24446
24447 static void
24448 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
24449 {
24450   tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE, lhs1 = NULL_TREE;
24451   tree rhs1 = NULL_TREE, orig_lhs;
24452   enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
24453   bool structured_block = false;
24454
24455   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24456     {
24457       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24458       const char *p = IDENTIFIER_POINTER (id);
24459
24460       if (!strcmp (p, "read"))
24461         code = OMP_ATOMIC_READ;
24462       else if (!strcmp (p, "write"))
24463         code = NOP_EXPR;
24464       else if (!strcmp (p, "update"))
24465         code = OMP_ATOMIC;
24466       else if (!strcmp (p, "capture"))
24467         code = OMP_ATOMIC_CAPTURE_NEW;
24468       else
24469         p = NULL;
24470       if (p)
24471         cp_lexer_consume_token (parser->lexer);
24472     }
24473   cp_parser_require_pragma_eol (parser, pragma_tok);
24474
24475   switch (code)
24476     {
24477     case OMP_ATOMIC_READ:
24478     case NOP_EXPR: /* atomic write */
24479       v = cp_parser_unary_expression (parser, /*address_p=*/false,
24480                                       /*cast_p=*/false, NULL);
24481       if (v == error_mark_node)
24482         goto saw_error;
24483       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24484         goto saw_error;
24485       if (code == NOP_EXPR)
24486         lhs = cp_parser_expression (parser, /*cast_p=*/false, NULL);
24487       else
24488         lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24489                                           /*cast_p=*/false, NULL);
24490       if (lhs == error_mark_node)
24491         goto saw_error;
24492       if (code == NOP_EXPR)
24493         {
24494           /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
24495              opcode.  */
24496           code = OMP_ATOMIC;
24497           rhs = lhs;
24498           lhs = v;
24499           v = NULL_TREE;
24500         }
24501       goto done;
24502     case OMP_ATOMIC_CAPTURE_NEW:
24503       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
24504         {
24505           cp_lexer_consume_token (parser->lexer);
24506           structured_block = true;
24507         }
24508       else
24509         {
24510           v = cp_parser_unary_expression (parser, /*address_p=*/false,
24511                                           /*cast_p=*/false, NULL);
24512           if (v == error_mark_node)
24513             goto saw_error;
24514           if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24515             goto saw_error;
24516         }
24517     default:
24518       break;
24519     }
24520
24521 restart:
24522   lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24523                                     /*cast_p=*/false, NULL);
24524   orig_lhs = lhs;
24525   switch (TREE_CODE (lhs))
24526     {
24527     case ERROR_MARK:
24528       goto saw_error;
24529
24530     case POSTINCREMENT_EXPR:
24531       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
24532         code = OMP_ATOMIC_CAPTURE_OLD;
24533       /* FALLTHROUGH */
24534     case PREINCREMENT_EXPR:
24535       lhs = TREE_OPERAND (lhs, 0);
24536       opcode = PLUS_EXPR;
24537       rhs = integer_one_node;
24538       break;
24539
24540     case POSTDECREMENT_EXPR:
24541       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
24542         code = OMP_ATOMIC_CAPTURE_OLD;
24543       /* FALLTHROUGH */
24544     case PREDECREMENT_EXPR:
24545       lhs = TREE_OPERAND (lhs, 0);
24546       opcode = MINUS_EXPR;
24547       rhs = integer_one_node;
24548       break;
24549
24550     case COMPOUND_EXPR:
24551       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
24552          && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
24553          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
24554          && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
24555          && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
24556                                              (TREE_OPERAND (lhs, 1), 0), 0)))
24557             == BOOLEAN_TYPE)
24558        /* Undo effects of boolean_increment for post {in,de}crement.  */
24559        lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
24560       /* FALLTHRU */
24561     case MODIFY_EXPR:
24562       if (TREE_CODE (lhs) == MODIFY_EXPR
24563          && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
24564         {
24565           /* Undo effects of boolean_increment.  */
24566           if (integer_onep (TREE_OPERAND (lhs, 1)))
24567             {
24568               /* This is pre or post increment.  */
24569               rhs = TREE_OPERAND (lhs, 1);
24570               lhs = TREE_OPERAND (lhs, 0);
24571               opcode = NOP_EXPR;
24572               if (code == OMP_ATOMIC_CAPTURE_NEW
24573                   && !structured_block
24574                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
24575                 code = OMP_ATOMIC_CAPTURE_OLD;
24576               break;
24577             }
24578         }
24579       /* FALLTHRU */
24580     default:
24581       switch (cp_lexer_peek_token (parser->lexer)->type)
24582         {
24583         case CPP_MULT_EQ:
24584           opcode = MULT_EXPR;
24585           break;
24586         case CPP_DIV_EQ:
24587           opcode = TRUNC_DIV_EXPR;
24588           break;
24589         case CPP_PLUS_EQ:
24590           opcode = PLUS_EXPR;
24591           break;
24592         case CPP_MINUS_EQ:
24593           opcode = MINUS_EXPR;
24594           break;
24595         case CPP_LSHIFT_EQ:
24596           opcode = LSHIFT_EXPR;
24597           break;
24598         case CPP_RSHIFT_EQ:
24599           opcode = RSHIFT_EXPR;
24600           break;
24601         case CPP_AND_EQ:
24602           opcode = BIT_AND_EXPR;
24603           break;
24604         case CPP_OR_EQ:
24605           opcode = BIT_IOR_EXPR;
24606           break;
24607         case CPP_XOR_EQ:
24608           opcode = BIT_XOR_EXPR;
24609           break;
24610         case CPP_EQ:
24611           if (structured_block || code == OMP_ATOMIC)
24612             {
24613               enum cp_parser_prec oprec;
24614               cp_token *token;
24615               cp_lexer_consume_token (parser->lexer);
24616               rhs1 = cp_parser_unary_expression (parser, /*address_p=*/false,
24617                                                  /*cast_p=*/false, NULL);
24618               if (rhs1 == error_mark_node)
24619                 goto saw_error;
24620               token = cp_lexer_peek_token (parser->lexer);
24621               switch (token->type)
24622                 {
24623                 case CPP_SEMICOLON:
24624                   if (code == OMP_ATOMIC_CAPTURE_NEW)
24625                     {
24626                       code = OMP_ATOMIC_CAPTURE_OLD;
24627                       v = lhs;
24628                       lhs = NULL_TREE;
24629                       lhs1 = rhs1;
24630                       rhs1 = NULL_TREE;
24631                       cp_lexer_consume_token (parser->lexer);
24632                       goto restart;
24633                     }
24634                   cp_parser_error (parser,
24635                                    "invalid form of %<#pragma omp atomic%>");
24636                   goto saw_error;
24637                 case CPP_MULT:
24638                   opcode = MULT_EXPR;
24639                   break;
24640                 case CPP_DIV:
24641                   opcode = TRUNC_DIV_EXPR;
24642                   break;
24643                 case CPP_PLUS:
24644                   opcode = PLUS_EXPR;
24645                   break;
24646                 case CPP_MINUS:
24647                   opcode = MINUS_EXPR;
24648                   break;
24649                 case CPP_LSHIFT:
24650                   opcode = LSHIFT_EXPR;
24651                   break;
24652                 case CPP_RSHIFT:
24653                   opcode = RSHIFT_EXPR;
24654                   break;
24655                 case CPP_AND:
24656                   opcode = BIT_AND_EXPR;
24657                   break;
24658                 case CPP_OR:
24659                   opcode = BIT_IOR_EXPR;
24660                   break;
24661                 case CPP_XOR:
24662                   opcode = BIT_XOR_EXPR;
24663                   break;
24664                 default:
24665                   cp_parser_error (parser,
24666                                    "invalid operator for %<#pragma omp atomic%>");
24667                   goto saw_error;
24668                 }
24669               oprec = TOKEN_PRECEDENCE (token);
24670               gcc_assert (oprec != PREC_NOT_OPERATOR);
24671               if (commutative_tree_code (opcode))
24672                 oprec = (enum cp_parser_prec) (oprec - 1);
24673               cp_lexer_consume_token (parser->lexer);
24674               rhs = cp_parser_binary_expression (parser, false, false,
24675                                                  oprec, NULL);
24676               if (rhs == error_mark_node)
24677                 goto saw_error;
24678               goto stmt_done;
24679             }
24680           /* FALLTHROUGH */
24681         default:
24682           cp_parser_error (parser,
24683                            "invalid operator for %<#pragma omp atomic%>");
24684           goto saw_error;
24685         }
24686       cp_lexer_consume_token (parser->lexer);
24687
24688       rhs = cp_parser_expression (parser, false, NULL);
24689       if (rhs == error_mark_node)
24690         goto saw_error;
24691       break;
24692     }
24693 stmt_done:
24694   if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
24695     {
24696       if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
24697         goto saw_error;
24698       v = cp_parser_unary_expression (parser, /*address_p=*/false,
24699                                       /*cast_p=*/false, NULL);
24700       if (v == error_mark_node)
24701         goto saw_error;
24702       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24703         goto saw_error;
24704       lhs1 = cp_parser_unary_expression (parser, /*address_p=*/false,
24705                                          /*cast_p=*/false, NULL);
24706       if (lhs1 == error_mark_node)
24707         goto saw_error;
24708     }
24709   if (structured_block)
24710     {
24711       cp_parser_consume_semicolon_at_end_of_statement (parser);
24712       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
24713     }
24714 done:
24715   finish_omp_atomic (code, opcode, lhs, rhs, v, lhs1, rhs1);
24716   if (!structured_block)
24717     cp_parser_consume_semicolon_at_end_of_statement (parser);
24718   return;
24719
24720  saw_error:
24721   cp_parser_skip_to_end_of_block_or_statement (parser);
24722   if (structured_block)
24723     {
24724       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24725         cp_lexer_consume_token (parser->lexer);
24726       else if (code == OMP_ATOMIC_CAPTURE_NEW)
24727         {
24728           cp_parser_skip_to_end_of_block_or_statement (parser);
24729           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24730             cp_lexer_consume_token (parser->lexer);
24731         }
24732     }
24733 }
24734
24735
24736 /* OpenMP 2.5:
24737    # pragma omp barrier new-line  */
24738
24739 static void
24740 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
24741 {
24742   cp_parser_require_pragma_eol (parser, pragma_tok);
24743   finish_omp_barrier ();
24744 }
24745
24746 /* OpenMP 2.5:
24747    # pragma omp critical [(name)] new-line
24748      structured-block  */
24749
24750 static tree
24751 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok)
24752 {
24753   tree stmt, name = NULL;
24754
24755   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24756     {
24757       cp_lexer_consume_token (parser->lexer);
24758
24759       name = cp_parser_identifier (parser);
24760
24761       if (name == error_mark_node
24762           || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24763         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24764                                                /*or_comma=*/false,
24765                                                /*consume_paren=*/true);
24766       if (name == error_mark_node)
24767         name = NULL;
24768     }
24769   cp_parser_require_pragma_eol (parser, pragma_tok);
24770
24771   stmt = cp_parser_omp_structured_block (parser);
24772   return c_finish_omp_critical (input_location, stmt, name);
24773 }
24774
24775 /* OpenMP 2.5:
24776    # pragma omp flush flush-vars[opt] new-line
24777
24778    flush-vars:
24779      ( variable-list ) */
24780
24781 static void
24782 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
24783 {
24784   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24785     (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
24786   cp_parser_require_pragma_eol (parser, pragma_tok);
24787
24788   finish_omp_flush ();
24789 }
24790
24791 /* Helper function, to parse omp for increment expression.  */
24792
24793 static tree
24794 cp_parser_omp_for_cond (cp_parser *parser, tree decl)
24795 {
24796   tree cond = cp_parser_binary_expression (parser, false, true,
24797                                            PREC_NOT_OPERATOR, NULL);
24798   if (cond == error_mark_node
24799       || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24800     {
24801       cp_parser_skip_to_end_of_statement (parser);
24802       return error_mark_node;
24803     }
24804
24805   switch (TREE_CODE (cond))
24806     {
24807     case GT_EXPR:
24808     case GE_EXPR:
24809     case LT_EXPR:
24810     case LE_EXPR:
24811       break;
24812     default:
24813       return error_mark_node;
24814     }
24815
24816   /* If decl is an iterator, preserve LHS and RHS of the relational
24817      expr until finish_omp_for.  */
24818   if (decl
24819       && (type_dependent_expression_p (decl)
24820           || CLASS_TYPE_P (TREE_TYPE (decl))))
24821     return cond;
24822
24823   return build_x_binary_op (TREE_CODE (cond),
24824                             TREE_OPERAND (cond, 0), ERROR_MARK,
24825                             TREE_OPERAND (cond, 1), ERROR_MARK,
24826                             /*overload=*/NULL, tf_warning_or_error);
24827 }
24828
24829 /* Helper function, to parse omp for increment expression.  */
24830
24831 static tree
24832 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
24833 {
24834   cp_token *token = cp_lexer_peek_token (parser->lexer);
24835   enum tree_code op;
24836   tree lhs, rhs;
24837   cp_id_kind idk;
24838   bool decl_first;
24839
24840   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24841     {
24842       op = (token->type == CPP_PLUS_PLUS
24843             ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
24844       cp_lexer_consume_token (parser->lexer);
24845       lhs = cp_parser_cast_expression (parser, false, false, NULL);
24846       if (lhs != decl)
24847         return error_mark_node;
24848       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24849     }
24850
24851   lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
24852   if (lhs != decl)
24853     return error_mark_node;
24854
24855   token = cp_lexer_peek_token (parser->lexer);
24856   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24857     {
24858       op = (token->type == CPP_PLUS_PLUS
24859             ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
24860       cp_lexer_consume_token (parser->lexer);
24861       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24862     }
24863
24864   op = cp_parser_assignment_operator_opt (parser);
24865   if (op == ERROR_MARK)
24866     return error_mark_node;
24867
24868   if (op != NOP_EXPR)
24869     {
24870       rhs = cp_parser_assignment_expression (parser, false, NULL);
24871       rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
24872       return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24873     }
24874
24875   lhs = cp_parser_binary_expression (parser, false, false,
24876                                      PREC_ADDITIVE_EXPRESSION, NULL);
24877   token = cp_lexer_peek_token (parser->lexer);
24878   decl_first = lhs == decl;
24879   if (decl_first)
24880     lhs = NULL_TREE;
24881   if (token->type != CPP_PLUS
24882       && token->type != CPP_MINUS)
24883     return error_mark_node;
24884
24885   do
24886     {
24887       op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
24888       cp_lexer_consume_token (parser->lexer);
24889       rhs = cp_parser_binary_expression (parser, false, false,
24890                                          PREC_ADDITIVE_EXPRESSION, NULL);
24891       token = cp_lexer_peek_token (parser->lexer);
24892       if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
24893         {
24894           if (lhs == NULL_TREE)
24895             {
24896               if (op == PLUS_EXPR)
24897                 lhs = rhs;
24898               else
24899                 lhs = build_x_unary_op (NEGATE_EXPR, rhs, tf_warning_or_error);
24900             }
24901           else
24902             lhs = build_x_binary_op (op, lhs, ERROR_MARK, rhs, ERROR_MARK,
24903                                      NULL, tf_warning_or_error);
24904         }
24905     }
24906   while (token->type == CPP_PLUS || token->type == CPP_MINUS);
24907
24908   if (!decl_first)
24909     {
24910       if (rhs != decl || op == MINUS_EXPR)
24911         return error_mark_node;
24912       rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
24913     }
24914   else
24915     rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
24916
24917   return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24918 }
24919
24920 /* Parse the restricted form of the for statement allowed by OpenMP.  */
24921
24922 static tree
24923 cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses)
24924 {
24925   tree init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
24926   tree real_decl, initv, condv, incrv, declv;
24927   tree this_pre_body, cl;
24928   location_t loc_first;
24929   bool collapse_err = false;
24930   int i, collapse = 1, nbraces = 0;
24931   VEC(tree,gc) *for_block = make_tree_vector ();
24932
24933   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
24934     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
24935       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
24936
24937   gcc_assert (collapse >= 1);
24938
24939   declv = make_tree_vec (collapse);
24940   initv = make_tree_vec (collapse);
24941   condv = make_tree_vec (collapse);
24942   incrv = make_tree_vec (collapse);
24943
24944   loc_first = cp_lexer_peek_token (parser->lexer)->location;
24945
24946   for (i = 0; i < collapse; i++)
24947     {
24948       int bracecount = 0;
24949       bool add_private_clause = false;
24950       location_t loc;
24951
24952       if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24953         {
24954           cp_parser_error (parser, "for statement expected");
24955           return NULL;
24956         }
24957       loc = cp_lexer_consume_token (parser->lexer)->location;
24958
24959       if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24960         return NULL;
24961
24962       init = decl = real_decl = NULL;
24963       this_pre_body = push_stmt_list ();
24964       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24965         {
24966           /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
24967
24968              init-expr:
24969                        var = lb
24970                        integer-type var = lb
24971                        random-access-iterator-type var = lb
24972                        pointer-type var = lb
24973           */
24974           cp_decl_specifier_seq type_specifiers;
24975
24976           /* First, try to parse as an initialized declaration.  See
24977              cp_parser_condition, from whence the bulk of this is copied.  */
24978
24979           cp_parser_parse_tentatively (parser);
24980           cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
24981                                         /*is_trailing_return=*/false,
24982                                         &type_specifiers);
24983           if (cp_parser_parse_definitely (parser))
24984             {
24985               /* If parsing a type specifier seq succeeded, then this
24986                  MUST be a initialized declaration.  */
24987               tree asm_specification, attributes;
24988               cp_declarator *declarator;
24989
24990               declarator = cp_parser_declarator (parser,
24991                                                  CP_PARSER_DECLARATOR_NAMED,
24992                                                  /*ctor_dtor_or_conv_p=*/NULL,
24993                                                  /*parenthesized_p=*/NULL,
24994                                                  /*member_p=*/false);
24995               attributes = cp_parser_attributes_opt (parser);
24996               asm_specification = cp_parser_asm_specification_opt (parser);
24997
24998               if (declarator == cp_error_declarator) 
24999                 cp_parser_skip_to_end_of_statement (parser);
25000
25001               else 
25002                 {
25003                   tree pushed_scope, auto_node;
25004
25005                   decl = start_decl (declarator, &type_specifiers,
25006                                      SD_INITIALIZED, attributes,
25007                                      /*prefix_attributes=*/NULL_TREE,
25008                                      &pushed_scope);
25009
25010                   auto_node = type_uses_auto (TREE_TYPE (decl));
25011                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
25012                     {
25013                       if (cp_lexer_next_token_is (parser->lexer, 
25014                                                   CPP_OPEN_PAREN))
25015                         error ("parenthesized initialization is not allowed in "
25016                                "OpenMP %<for%> loop");
25017                       else
25018                         /* Trigger an error.  */
25019                         cp_parser_require (parser, CPP_EQ, RT_EQ);
25020
25021                       init = error_mark_node;
25022                       cp_parser_skip_to_end_of_statement (parser);
25023                     }
25024                   else if (CLASS_TYPE_P (TREE_TYPE (decl))
25025                            || type_dependent_expression_p (decl)
25026                            || auto_node)
25027                     {
25028                       bool is_direct_init, is_non_constant_init;
25029
25030                       init = cp_parser_initializer (parser,
25031                                                     &is_direct_init,
25032                                                     &is_non_constant_init);
25033
25034                       if (auto_node)
25035                         {
25036                           TREE_TYPE (decl)
25037                             = do_auto_deduction (TREE_TYPE (decl), init,
25038                                                  auto_node);
25039
25040                           if (!CLASS_TYPE_P (TREE_TYPE (decl))
25041                               && !type_dependent_expression_p (decl))
25042                             goto non_class;
25043                         }
25044                       
25045                       cp_finish_decl (decl, init, !is_non_constant_init,
25046                                       asm_specification,
25047                                       LOOKUP_ONLYCONVERTING);
25048                       if (CLASS_TYPE_P (TREE_TYPE (decl)))
25049                         {
25050                           VEC_safe_push (tree, gc, for_block, this_pre_body);
25051                           init = NULL_TREE;
25052                         }
25053                       else
25054                         init = pop_stmt_list (this_pre_body);
25055                       this_pre_body = NULL_TREE;
25056                     }
25057                   else
25058                     {
25059                       /* Consume '='.  */
25060                       cp_lexer_consume_token (parser->lexer);
25061                       init = cp_parser_assignment_expression (parser, false, NULL);
25062
25063                     non_class:
25064                       if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
25065                         init = error_mark_node;
25066                       else
25067                         cp_finish_decl (decl, NULL_TREE,
25068                                         /*init_const_expr_p=*/false,
25069                                         asm_specification,
25070                                         LOOKUP_ONLYCONVERTING);
25071                     }
25072
25073                   if (pushed_scope)
25074                     pop_scope (pushed_scope);
25075                 }
25076             }
25077           else 
25078             {
25079               cp_id_kind idk;
25080               /* If parsing a type specifier sequence failed, then
25081                  this MUST be a simple expression.  */
25082               cp_parser_parse_tentatively (parser);
25083               decl = cp_parser_primary_expression (parser, false, false,
25084                                                    false, &idk);
25085               if (!cp_parser_error_occurred (parser)
25086                   && decl
25087                   && DECL_P (decl)
25088                   && CLASS_TYPE_P (TREE_TYPE (decl)))
25089                 {
25090                   tree rhs;
25091
25092                   cp_parser_parse_definitely (parser);
25093                   cp_parser_require (parser, CPP_EQ, RT_EQ);
25094                   rhs = cp_parser_assignment_expression (parser, false, NULL);
25095                   finish_expr_stmt (build_x_modify_expr (decl, NOP_EXPR,
25096                                                          rhs,
25097                                                          tf_warning_or_error));
25098                   add_private_clause = true;
25099                 }
25100               else
25101                 {
25102                   decl = NULL;
25103                   cp_parser_abort_tentative_parse (parser);
25104                   init = cp_parser_expression (parser, false, NULL);
25105                   if (init)
25106                     {
25107                       if (TREE_CODE (init) == MODIFY_EXPR
25108                           || TREE_CODE (init) == MODOP_EXPR)
25109                         real_decl = TREE_OPERAND (init, 0);
25110                     }
25111                 }
25112             }
25113         }
25114       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
25115       if (this_pre_body)
25116         {
25117           this_pre_body = pop_stmt_list (this_pre_body);
25118           if (pre_body)
25119             {
25120               tree t = pre_body;
25121               pre_body = push_stmt_list ();
25122               add_stmt (t);
25123               add_stmt (this_pre_body);
25124               pre_body = pop_stmt_list (pre_body);
25125             }
25126           else
25127             pre_body = this_pre_body;
25128         }
25129
25130       if (decl)
25131         real_decl = decl;
25132       if (par_clauses != NULL && real_decl != NULL_TREE)
25133         {
25134           tree *c;
25135           for (c = par_clauses; *c ; )
25136             if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
25137                 && OMP_CLAUSE_DECL (*c) == real_decl)
25138               {
25139                 error_at (loc, "iteration variable %qD"
25140                           " should not be firstprivate", real_decl);
25141                 *c = OMP_CLAUSE_CHAIN (*c);
25142               }
25143             else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
25144                      && OMP_CLAUSE_DECL (*c) == real_decl)
25145               {
25146                 /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
25147                    change it to shared (decl) in OMP_PARALLEL_CLAUSES.  */
25148                 tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
25149                 OMP_CLAUSE_DECL (l) = real_decl;
25150                 OMP_CLAUSE_CHAIN (l) = clauses;
25151                 CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
25152                 clauses = l;
25153                 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
25154                 CP_OMP_CLAUSE_INFO (*c) = NULL;
25155                 add_private_clause = false;
25156               }
25157             else
25158               {
25159                 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
25160                     && OMP_CLAUSE_DECL (*c) == real_decl)
25161                   add_private_clause = false;
25162                 c = &OMP_CLAUSE_CHAIN (*c);
25163               }
25164         }
25165
25166       if (add_private_clause)
25167         {
25168           tree c;
25169           for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
25170             {
25171               if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
25172                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
25173                   && OMP_CLAUSE_DECL (c) == decl)
25174                 break;
25175               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
25176                        && OMP_CLAUSE_DECL (c) == decl)
25177                 error_at (loc, "iteration variable %qD "
25178                           "should not be firstprivate",
25179                           decl);
25180               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
25181                        && OMP_CLAUSE_DECL (c) == decl)
25182                 error_at (loc, "iteration variable %qD should not be reduction",
25183                           decl);
25184             }
25185           if (c == NULL)
25186             {
25187               c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
25188               OMP_CLAUSE_DECL (c) = decl;
25189               c = finish_omp_clauses (c);
25190               if (c)
25191                 {
25192                   OMP_CLAUSE_CHAIN (c) = clauses;
25193                   clauses = c;
25194                 }
25195             }
25196         }
25197
25198       cond = NULL;
25199       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
25200         cond = cp_parser_omp_for_cond (parser, decl);
25201       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
25202
25203       incr = NULL;
25204       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
25205         {
25206           /* If decl is an iterator, preserve the operator on decl
25207              until finish_omp_for.  */
25208           if (decl
25209               && ((type_dependent_expression_p (decl)
25210                    && !POINTER_TYPE_P (TREE_TYPE (decl)))
25211                   || CLASS_TYPE_P (TREE_TYPE (decl))))
25212             incr = cp_parser_omp_for_incr (parser, decl);
25213           else
25214             incr = cp_parser_expression (parser, false, NULL);
25215         }
25216
25217       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
25218         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
25219                                                /*or_comma=*/false,
25220                                                /*consume_paren=*/true);
25221
25222       TREE_VEC_ELT (declv, i) = decl;
25223       TREE_VEC_ELT (initv, i) = init;
25224       TREE_VEC_ELT (condv, i) = cond;
25225       TREE_VEC_ELT (incrv, i) = incr;
25226
25227       if (i == collapse - 1)
25228         break;
25229
25230       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
25231          in between the collapsed for loops to be still considered perfectly
25232          nested.  Hopefully the final version clarifies this.
25233          For now handle (multiple) {'s and empty statements.  */
25234       cp_parser_parse_tentatively (parser);
25235       do
25236         {
25237           if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
25238             break;
25239           else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
25240             {
25241               cp_lexer_consume_token (parser->lexer);
25242               bracecount++;
25243             }
25244           else if (bracecount
25245                    && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25246             cp_lexer_consume_token (parser->lexer);
25247           else
25248             {
25249               loc = cp_lexer_peek_token (parser->lexer)->location;
25250               error_at (loc, "not enough collapsed for loops");
25251               collapse_err = true;
25252               cp_parser_abort_tentative_parse (parser);
25253               declv = NULL_TREE;
25254               break;
25255             }
25256         }
25257       while (1);
25258
25259       if (declv)
25260         {
25261           cp_parser_parse_definitely (parser);
25262           nbraces += bracecount;
25263         }
25264     }
25265
25266   /* Note that we saved the original contents of this flag when we entered
25267      the structured block, and so we don't need to re-save it here.  */
25268   parser->in_statement = IN_OMP_FOR;
25269
25270   /* Note that the grammar doesn't call for a structured block here,
25271      though the loop as a whole is a structured block.  */
25272   body = push_stmt_list ();
25273   cp_parser_statement (parser, NULL_TREE, false, NULL);
25274   body = pop_stmt_list (body);
25275
25276   if (declv == NULL_TREE)
25277     ret = NULL_TREE;
25278   else
25279     ret = finish_omp_for (loc_first, declv, initv, condv, incrv, body,
25280                           pre_body, clauses);
25281
25282   while (nbraces)
25283     {
25284       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
25285         {
25286           cp_lexer_consume_token (parser->lexer);
25287           nbraces--;
25288         }
25289       else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25290         cp_lexer_consume_token (parser->lexer);
25291       else
25292         {
25293           if (!collapse_err)
25294             {
25295               error_at (cp_lexer_peek_token (parser->lexer)->location,
25296                         "collapsed loops not perfectly nested");
25297             }
25298           collapse_err = true;
25299           cp_parser_statement_seq_opt (parser, NULL);
25300           if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
25301             break;
25302         }
25303     }
25304
25305   while (!VEC_empty (tree, for_block))
25306     add_stmt (pop_stmt_list (VEC_pop (tree, for_block)));
25307   release_tree_vector (for_block);
25308
25309   return ret;
25310 }
25311
25312 /* OpenMP 2.5:
25313    #pragma omp for for-clause[optseq] new-line
25314      for-loop  */
25315
25316 #define OMP_FOR_CLAUSE_MASK                             \
25317         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25318         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25319         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
25320         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25321         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
25322         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
25323         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT)              \
25324         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE))
25325
25326 static tree
25327 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok)
25328 {
25329   tree clauses, sb, ret;
25330   unsigned int save;
25331
25332   clauses = cp_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
25333                                        "#pragma omp for", pragma_tok);
25334
25335   sb = begin_omp_structured_block ();
25336   save = cp_parser_begin_omp_structured_block (parser);
25337
25338   ret = cp_parser_omp_for_loop (parser, clauses, NULL);
25339
25340   cp_parser_end_omp_structured_block (parser, save);
25341   add_stmt (finish_omp_structured_block (sb));
25342
25343   return ret;
25344 }
25345
25346 /* OpenMP 2.5:
25347    # pragma omp master new-line
25348      structured-block  */
25349
25350 static tree
25351 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok)
25352 {
25353   cp_parser_require_pragma_eol (parser, pragma_tok);
25354   return c_finish_omp_master (input_location,
25355                               cp_parser_omp_structured_block (parser));
25356 }
25357
25358 /* OpenMP 2.5:
25359    # pragma omp ordered new-line
25360      structured-block  */
25361
25362 static tree
25363 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok)
25364 {
25365   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
25366   cp_parser_require_pragma_eol (parser, pragma_tok);
25367   return c_finish_omp_ordered (loc, cp_parser_omp_structured_block (parser));
25368 }
25369
25370 /* OpenMP 2.5:
25371
25372    section-scope:
25373      { section-sequence }
25374
25375    section-sequence:
25376      section-directive[opt] structured-block
25377      section-sequence section-directive structured-block  */
25378
25379 static tree
25380 cp_parser_omp_sections_scope (cp_parser *parser)
25381 {
25382   tree stmt, substmt;
25383   bool error_suppress = false;
25384   cp_token *tok;
25385
25386   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
25387     return NULL_TREE;
25388
25389   stmt = push_stmt_list ();
25390
25391   if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION)
25392     {
25393       unsigned save;
25394
25395       substmt = begin_omp_structured_block ();
25396       save = cp_parser_begin_omp_structured_block (parser);
25397
25398       while (1)
25399         {
25400           cp_parser_statement (parser, NULL_TREE, false, NULL);
25401
25402           tok = cp_lexer_peek_token (parser->lexer);
25403           if (tok->pragma_kind == PRAGMA_OMP_SECTION)
25404             break;
25405           if (tok->type == CPP_CLOSE_BRACE)
25406             break;
25407           if (tok->type == CPP_EOF)
25408             break;
25409         }
25410
25411       cp_parser_end_omp_structured_block (parser, save);
25412       substmt = finish_omp_structured_block (substmt);
25413       substmt = build1 (OMP_SECTION, void_type_node, substmt);
25414       add_stmt (substmt);
25415     }
25416
25417   while (1)
25418     {
25419       tok = cp_lexer_peek_token (parser->lexer);
25420       if (tok->type == CPP_CLOSE_BRACE)
25421         break;
25422       if (tok->type == CPP_EOF)
25423         break;
25424
25425       if (tok->pragma_kind == PRAGMA_OMP_SECTION)
25426         {
25427           cp_lexer_consume_token (parser->lexer);
25428           cp_parser_require_pragma_eol (parser, tok);
25429           error_suppress = false;
25430         }
25431       else if (!error_suppress)
25432         {
25433           cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
25434           error_suppress = true;
25435         }
25436
25437       substmt = cp_parser_omp_structured_block (parser);
25438       substmt = build1 (OMP_SECTION, void_type_node, substmt);
25439       add_stmt (substmt);
25440     }
25441   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
25442
25443   substmt = pop_stmt_list (stmt);
25444
25445   stmt = make_node (OMP_SECTIONS);
25446   TREE_TYPE (stmt) = void_type_node;
25447   OMP_SECTIONS_BODY (stmt) = substmt;
25448
25449   add_stmt (stmt);
25450   return stmt;
25451 }
25452
25453 /* OpenMP 2.5:
25454    # pragma omp sections sections-clause[optseq] newline
25455      sections-scope  */
25456
25457 #define OMP_SECTIONS_CLAUSE_MASK                        \
25458         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25459         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25460         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
25461         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25462         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25463
25464 static tree
25465 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok)
25466 {
25467   tree clauses, ret;
25468
25469   clauses = cp_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
25470                                        "#pragma omp sections", pragma_tok);
25471
25472   ret = cp_parser_omp_sections_scope (parser);
25473   if (ret)
25474     OMP_SECTIONS_CLAUSES (ret) = clauses;
25475
25476   return ret;
25477 }
25478
25479 /* OpenMP 2.5:
25480    # pragma parallel parallel-clause new-line
25481    # pragma parallel for parallel-for-clause new-line
25482    # pragma parallel sections parallel-sections-clause new-line  */
25483
25484 #define OMP_PARALLEL_CLAUSE_MASK                        \
25485         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25486         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25487         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25488         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25489         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
25490         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
25491         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25492         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
25493
25494 static tree
25495 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok)
25496 {
25497   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
25498   const char *p_name = "#pragma omp parallel";
25499   tree stmt, clauses, par_clause, ws_clause, block;
25500   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
25501   unsigned int save;
25502   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
25503
25504   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
25505     {
25506       cp_lexer_consume_token (parser->lexer);
25507       p_kind = PRAGMA_OMP_PARALLEL_FOR;
25508       p_name = "#pragma omp parallel for";
25509       mask |= OMP_FOR_CLAUSE_MASK;
25510       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
25511     }
25512   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
25513     {
25514       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
25515       const char *p = IDENTIFIER_POINTER (id);
25516       if (strcmp (p, "sections") == 0)
25517         {
25518           cp_lexer_consume_token (parser->lexer);
25519           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
25520           p_name = "#pragma omp parallel sections";
25521           mask |= OMP_SECTIONS_CLAUSE_MASK;
25522           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
25523         }
25524     }
25525
25526   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
25527   block = begin_omp_parallel ();
25528   save = cp_parser_begin_omp_structured_block (parser);
25529
25530   switch (p_kind)
25531     {
25532     case PRAGMA_OMP_PARALLEL:
25533       cp_parser_statement (parser, NULL_TREE, false, NULL);
25534       par_clause = clauses;
25535       break;
25536
25537     case PRAGMA_OMP_PARALLEL_FOR:
25538       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25539       cp_parser_omp_for_loop (parser, ws_clause, &par_clause);
25540       break;
25541
25542     case PRAGMA_OMP_PARALLEL_SECTIONS:
25543       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25544       stmt = cp_parser_omp_sections_scope (parser);
25545       if (stmt)
25546         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
25547       break;
25548
25549     default:
25550       gcc_unreachable ();
25551     }
25552
25553   cp_parser_end_omp_structured_block (parser, save);
25554   stmt = finish_omp_parallel (par_clause, block);
25555   if (p_kind != PRAGMA_OMP_PARALLEL)
25556     OMP_PARALLEL_COMBINED (stmt) = 1;
25557   return stmt;
25558 }
25559
25560 /* OpenMP 2.5:
25561    # pragma omp single single-clause[optseq] new-line
25562      structured-block  */
25563
25564 #define OMP_SINGLE_CLAUSE_MASK                          \
25565         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25566         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25567         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
25568         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25569
25570 static tree
25571 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok)
25572 {
25573   tree stmt = make_node (OMP_SINGLE);
25574   TREE_TYPE (stmt) = void_type_node;
25575
25576   OMP_SINGLE_CLAUSES (stmt)
25577     = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
25578                                  "#pragma omp single", pragma_tok);
25579   OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser);
25580
25581   return add_stmt (stmt);
25582 }
25583
25584 /* OpenMP 3.0:
25585    # pragma omp task task-clause[optseq] new-line
25586      structured-block  */
25587
25588 #define OMP_TASK_CLAUSE_MASK                            \
25589         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25590         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
25591         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25592         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25593         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25594         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
25595         | (1u << PRAGMA_OMP_CLAUSE_FINAL)               \
25596         | (1u << PRAGMA_OMP_CLAUSE_MERGEABLE))
25597
25598 static tree
25599 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok)
25600 {
25601   tree clauses, block;
25602   unsigned int save;
25603
25604   clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
25605                                        "#pragma omp task", pragma_tok);
25606   block = begin_omp_task ();
25607   save = cp_parser_begin_omp_structured_block (parser);
25608   cp_parser_statement (parser, NULL_TREE, false, NULL);
25609   cp_parser_end_omp_structured_block (parser, save);
25610   return finish_omp_task (clauses, block);
25611 }
25612
25613 /* OpenMP 3.0:
25614    # pragma omp taskwait new-line  */
25615
25616 static void
25617 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
25618 {
25619   cp_parser_require_pragma_eol (parser, pragma_tok);
25620   finish_omp_taskwait ();
25621 }
25622
25623 /* OpenMP 3.1:
25624    # pragma omp taskyield new-line  */
25625
25626 static void
25627 cp_parser_omp_taskyield (cp_parser *parser, cp_token *pragma_tok)
25628 {
25629   cp_parser_require_pragma_eol (parser, pragma_tok);
25630   finish_omp_taskyield ();
25631 }
25632
25633 /* OpenMP 2.5:
25634    # pragma omp threadprivate (variable-list) */
25635
25636 static void
25637 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
25638 {
25639   tree vars;
25640
25641   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
25642   cp_parser_require_pragma_eol (parser, pragma_tok);
25643
25644   finish_omp_threadprivate (vars);
25645 }
25646
25647 /* Main entry point to OpenMP statement pragmas.  */
25648
25649 static void
25650 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok)
25651 {
25652   tree stmt;
25653
25654   switch (pragma_tok->pragma_kind)
25655     {
25656     case PRAGMA_OMP_ATOMIC:
25657       cp_parser_omp_atomic (parser, pragma_tok);
25658       return;
25659     case PRAGMA_OMP_CRITICAL:
25660       stmt = cp_parser_omp_critical (parser, pragma_tok);
25661       break;
25662     case PRAGMA_OMP_FOR:
25663       stmt = cp_parser_omp_for (parser, pragma_tok);
25664       break;
25665     case PRAGMA_OMP_MASTER:
25666       stmt = cp_parser_omp_master (parser, pragma_tok);
25667       break;
25668     case PRAGMA_OMP_ORDERED:
25669       stmt = cp_parser_omp_ordered (parser, pragma_tok);
25670       break;
25671     case PRAGMA_OMP_PARALLEL:
25672       stmt = cp_parser_omp_parallel (parser, pragma_tok);
25673       break;
25674     case PRAGMA_OMP_SECTIONS:
25675       stmt = cp_parser_omp_sections (parser, pragma_tok);
25676       break;
25677     case PRAGMA_OMP_SINGLE:
25678       stmt = cp_parser_omp_single (parser, pragma_tok);
25679       break;
25680     case PRAGMA_OMP_TASK:
25681       stmt = cp_parser_omp_task (parser, pragma_tok);
25682       break;
25683     default:
25684       gcc_unreachable ();
25685     }
25686
25687   if (stmt)
25688     SET_EXPR_LOCATION (stmt, pragma_tok->location);
25689 }
25690 \f
25691 /* The parser.  */
25692
25693 static GTY (()) cp_parser *the_parser;
25694
25695 \f
25696 /* Special handling for the first token or line in the file.  The first
25697    thing in the file might be #pragma GCC pch_preprocess, which loads a
25698    PCH file, which is a GC collection point.  So we need to handle this
25699    first pragma without benefit of an existing lexer structure.
25700
25701    Always returns one token to the caller in *FIRST_TOKEN.  This is
25702    either the true first token of the file, or the first token after
25703    the initial pragma.  */
25704
25705 static void
25706 cp_parser_initial_pragma (cp_token *first_token)
25707 {
25708   tree name = NULL;
25709
25710   cp_lexer_get_preprocessor_token (NULL, first_token);
25711   if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS)
25712     return;
25713
25714   cp_lexer_get_preprocessor_token (NULL, first_token);
25715   if (first_token->type == CPP_STRING)
25716     {
25717       name = first_token->u.value;
25718
25719       cp_lexer_get_preprocessor_token (NULL, first_token);
25720       if (first_token->type != CPP_PRAGMA_EOL)
25721         error_at (first_token->location,
25722                   "junk at end of %<#pragma GCC pch_preprocess%>");
25723     }
25724   else
25725     error_at (first_token->location, "expected string literal");
25726
25727   /* Skip to the end of the pragma.  */
25728   while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
25729     cp_lexer_get_preprocessor_token (NULL, first_token);
25730
25731   /* Now actually load the PCH file.  */
25732   if (name)
25733     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
25734
25735   /* Read one more token to return to our caller.  We have to do this
25736      after reading the PCH file in, since its pointers have to be
25737      live.  */
25738   cp_lexer_get_preprocessor_token (NULL, first_token);
25739 }
25740
25741 /* Normal parsing of a pragma token.  Here we can (and must) use the
25742    regular lexer.  */
25743
25744 static bool
25745 cp_parser_pragma (cp_parser *parser, enum pragma_context context)
25746 {
25747   cp_token *pragma_tok;
25748   unsigned int id;
25749
25750   pragma_tok = cp_lexer_consume_token (parser->lexer);
25751   gcc_assert (pragma_tok->type == CPP_PRAGMA);
25752   parser->lexer->in_pragma = true;
25753
25754   id = pragma_tok->pragma_kind;
25755   switch (id)
25756     {
25757     case PRAGMA_GCC_PCH_PREPROCESS:
25758       error_at (pragma_tok->location,
25759                 "%<#pragma GCC pch_preprocess%> must be first");
25760       break;
25761
25762     case PRAGMA_OMP_BARRIER:
25763       switch (context)
25764         {
25765         case pragma_compound:
25766           cp_parser_omp_barrier (parser, pragma_tok);
25767           return false;
25768         case pragma_stmt:
25769           error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
25770                     "used in compound statements");
25771           break;
25772         default:
25773           goto bad_stmt;
25774         }
25775       break;
25776
25777     case PRAGMA_OMP_FLUSH:
25778       switch (context)
25779         {
25780         case pragma_compound:
25781           cp_parser_omp_flush (parser, pragma_tok);
25782           return false;
25783         case pragma_stmt:
25784           error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
25785                     "used in compound statements");
25786           break;
25787         default:
25788           goto bad_stmt;
25789         }
25790       break;
25791
25792     case PRAGMA_OMP_TASKWAIT:
25793       switch (context)
25794         {
25795         case pragma_compound:
25796           cp_parser_omp_taskwait (parser, pragma_tok);
25797           return false;
25798         case pragma_stmt:
25799           error_at (pragma_tok->location,
25800                     "%<#pragma omp taskwait%> may only be "
25801                     "used in compound statements");
25802           break;
25803         default:
25804           goto bad_stmt;
25805         }
25806       break;
25807
25808     case PRAGMA_OMP_TASKYIELD:
25809       switch (context)
25810         {
25811         case pragma_compound:
25812           cp_parser_omp_taskyield (parser, pragma_tok);
25813           return false;
25814         case pragma_stmt:
25815           error_at (pragma_tok->location,
25816                     "%<#pragma omp taskyield%> may only be "
25817                     "used in compound statements");
25818           break;
25819         default:
25820           goto bad_stmt;
25821         }
25822       break;
25823
25824     case PRAGMA_OMP_THREADPRIVATE:
25825       cp_parser_omp_threadprivate (parser, pragma_tok);
25826       return false;
25827
25828     case PRAGMA_OMP_ATOMIC:
25829     case PRAGMA_OMP_CRITICAL:
25830     case PRAGMA_OMP_FOR:
25831     case PRAGMA_OMP_MASTER:
25832     case PRAGMA_OMP_ORDERED:
25833     case PRAGMA_OMP_PARALLEL:
25834     case PRAGMA_OMP_SECTIONS:
25835     case PRAGMA_OMP_SINGLE:
25836     case PRAGMA_OMP_TASK:
25837       if (context == pragma_external)
25838         goto bad_stmt;
25839       cp_parser_omp_construct (parser, pragma_tok);
25840       return true;
25841
25842     case PRAGMA_OMP_SECTION:
25843       error_at (pragma_tok->location, 
25844                 "%<#pragma omp section%> may only be used in "
25845                 "%<#pragma omp sections%> construct");
25846       break;
25847
25848     default:
25849       gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
25850       c_invoke_pragma_handler (id);
25851       break;
25852
25853     bad_stmt:
25854       cp_parser_error (parser, "expected declaration specifiers");
25855       break;
25856     }
25857
25858   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
25859   return false;
25860 }
25861
25862 /* The interface the pragma parsers have to the lexer.  */
25863
25864 enum cpp_ttype
25865 pragma_lex (tree *value)
25866 {
25867   cp_token *tok;
25868   enum cpp_ttype ret;
25869
25870   tok = cp_lexer_peek_token (the_parser->lexer);
25871
25872   ret = tok->type;
25873   *value = tok->u.value;
25874
25875   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
25876     ret = CPP_EOF;
25877   else if (ret == CPP_STRING)
25878     *value = cp_parser_string_literal (the_parser, false, false);
25879   else
25880     {
25881       cp_lexer_consume_token (the_parser->lexer);
25882       if (ret == CPP_KEYWORD)
25883         ret = CPP_NAME;
25884     }
25885
25886   return ret;
25887 }
25888
25889 \f
25890 /* External interface.  */
25891
25892 /* Parse one entire translation unit.  */
25893
25894 void
25895 c_parse_file (void)
25896 {
25897   static bool already_called = false;
25898
25899   if (already_called)
25900     {
25901       sorry ("inter-module optimizations not implemented for C++");
25902       return;
25903     }
25904   already_called = true;
25905
25906   the_parser = cp_parser_new ();
25907   push_deferring_access_checks (flag_access_control
25908                                 ? dk_no_deferred : dk_no_check);
25909   cp_parser_translation_unit (the_parser);
25910   the_parser = NULL;
25911 }
25912
25913 #include "gt-cp-parser.h"