OSDN Git Service

PR c++/49983
[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                                           /*user_defined_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                                           /*user_defined_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                                       /*user_defined_p=*/true);
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                                       /*user_defined_p=*/true);
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                                       /*user_defined_p=*/true);
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                                       /*user_defined_p=*/true);
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                                       /*user_defined=*/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                                       /*user_defined=*/true);
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 (current_class_type)
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
16539   /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
16540      set correctly.  */
16541   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
16542   parser->greater_than_is_operator_p = !template_parm_p;
16543   /* Local variable names (and the `this' keyword) may not
16544      appear in a default argument.  */
16545   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
16546   parser->local_variables_forbidden_p = true;
16547   /* Parse the assignment-expression.  */
16548   if (template_parm_p)
16549     push_deferring_access_checks (dk_no_deferred);
16550   default_argument
16551     = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
16552   if (template_parm_p)
16553     pop_deferring_access_checks ();
16554   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
16555   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
16556
16557   return default_argument;
16558 }
16559
16560 /* Parse a function-body.
16561
16562    function-body:
16563      compound_statement  */
16564
16565 static void
16566 cp_parser_function_body (cp_parser *parser)
16567 {
16568   cp_parser_compound_statement (parser, NULL, false, true);
16569 }
16570
16571 /* Parse a ctor-initializer-opt followed by a function-body.  Return
16572    true if a ctor-initializer was present.  */
16573
16574 static bool
16575 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
16576 {
16577   tree body, list;
16578   bool ctor_initializer_p;
16579   const bool check_body_p =
16580      DECL_CONSTRUCTOR_P (current_function_decl)
16581      && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
16582   tree last = NULL;
16583
16584   /* Begin the function body.  */
16585   body = begin_function_body ();
16586   /* Parse the optional ctor-initializer.  */
16587   ctor_initializer_p = cp_parser_ctor_initializer_opt (parser);
16588
16589   /* If we're parsing a constexpr constructor definition, we need
16590      to check that the constructor body is indeed empty.  However,
16591      before we get to cp_parser_function_body lot of junk has been
16592      generated, so we can't just check that we have an empty block.
16593      Rather we take a snapshot of the outermost block, and check whether
16594      cp_parser_function_body changed its state.  */
16595   if (check_body_p)
16596     {
16597       list = body;
16598       if (TREE_CODE (list) == BIND_EXPR)
16599         list = BIND_EXPR_BODY (list);
16600       if (TREE_CODE (list) == STATEMENT_LIST
16601           && STATEMENT_LIST_TAIL (list) != NULL)
16602         last = STATEMENT_LIST_TAIL (list)->stmt;
16603     }
16604   /* Parse the function-body.  */
16605   cp_parser_function_body (parser);
16606   if (check_body_p)
16607     check_constexpr_ctor_body (last, list);
16608   /* Finish the function body.  */
16609   finish_function_body (body);
16610
16611   return ctor_initializer_p;
16612 }
16613
16614 /* Parse an initializer.
16615
16616    initializer:
16617      = initializer-clause
16618      ( expression-list )
16619
16620    Returns an expression representing the initializer.  If no
16621    initializer is present, NULL_TREE is returned.
16622
16623    *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
16624    production is used, and TRUE otherwise.  *IS_DIRECT_INIT is
16625    set to TRUE if there is no initializer present.  If there is an
16626    initializer, and it is not a constant-expression, *NON_CONSTANT_P
16627    is set to true; otherwise it is set to false.  */
16628
16629 static tree
16630 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
16631                        bool* non_constant_p)
16632 {
16633   cp_token *token;
16634   tree init;
16635
16636   /* Peek at the next token.  */
16637   token = cp_lexer_peek_token (parser->lexer);
16638
16639   /* Let our caller know whether or not this initializer was
16640      parenthesized.  */
16641   *is_direct_init = (token->type != CPP_EQ);
16642   /* Assume that the initializer is constant.  */
16643   *non_constant_p = false;
16644
16645   if (token->type == CPP_EQ)
16646     {
16647       /* Consume the `='.  */
16648       cp_lexer_consume_token (parser->lexer);
16649       /* Parse the initializer-clause.  */
16650       init = cp_parser_initializer_clause (parser, non_constant_p);
16651     }
16652   else if (token->type == CPP_OPEN_PAREN)
16653     {
16654       VEC(tree,gc) *vec;
16655       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
16656                                                      /*cast_p=*/false,
16657                                                      /*allow_expansion_p=*/true,
16658                                                      non_constant_p);
16659       if (vec == NULL)
16660         return error_mark_node;
16661       init = build_tree_list_vec (vec);
16662       release_tree_vector (vec);
16663     }
16664   else if (token->type == CPP_OPEN_BRACE)
16665     {
16666       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
16667       init = cp_parser_braced_list (parser, non_constant_p);
16668       CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
16669     }
16670   else
16671     {
16672       /* Anything else is an error.  */
16673       cp_parser_error (parser, "expected initializer");
16674       init = error_mark_node;
16675     }
16676
16677   return init;
16678 }
16679
16680 /* Parse an initializer-clause.
16681
16682    initializer-clause:
16683      assignment-expression
16684      braced-init-list
16685
16686    Returns an expression representing the initializer.
16687
16688    If the `assignment-expression' production is used the value
16689    returned is simply a representation for the expression.
16690
16691    Otherwise, calls cp_parser_braced_list.  */
16692
16693 static tree
16694 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
16695 {
16696   tree initializer;
16697
16698   /* Assume the expression is constant.  */
16699   *non_constant_p = false;
16700
16701   /* If it is not a `{', then we are looking at an
16702      assignment-expression.  */
16703   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
16704     {
16705       initializer
16706         = cp_parser_constant_expression (parser,
16707                                         /*allow_non_constant_p=*/true,
16708                                         non_constant_p);
16709     }
16710   else
16711     initializer = cp_parser_braced_list (parser, non_constant_p);
16712
16713   return initializer;
16714 }
16715
16716 /* Parse a brace-enclosed initializer list.
16717
16718    braced-init-list:
16719      { initializer-list , [opt] }
16720      { }
16721
16722    Returns a CONSTRUCTOR.  The CONSTRUCTOR_ELTS will be
16723    the elements of the initializer-list (or NULL, if the last
16724    production is used).  The TREE_TYPE for the CONSTRUCTOR will be
16725    NULL_TREE.  There is no way to detect whether or not the optional
16726    trailing `,' was provided.  NON_CONSTANT_P is as for
16727    cp_parser_initializer.  */     
16728
16729 static tree
16730 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
16731 {
16732   tree initializer;
16733
16734   /* Consume the `{' token.  */
16735   cp_lexer_consume_token (parser->lexer);
16736   /* Create a CONSTRUCTOR to represent the braced-initializer.  */
16737   initializer = make_node (CONSTRUCTOR);
16738   /* If it's not a `}', then there is a non-trivial initializer.  */
16739   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
16740     {
16741       /* Parse the initializer list.  */
16742       CONSTRUCTOR_ELTS (initializer)
16743         = cp_parser_initializer_list (parser, non_constant_p);
16744       /* A trailing `,' token is allowed.  */
16745       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
16746         cp_lexer_consume_token (parser->lexer);
16747     }
16748   /* Now, there should be a trailing `}'.  */
16749   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16750   TREE_TYPE (initializer) = init_list_type_node;
16751   return initializer;
16752 }
16753
16754 /* Parse an initializer-list.
16755
16756    initializer-list:
16757      initializer-clause ... [opt]
16758      initializer-list , initializer-clause ... [opt]
16759
16760    GNU Extension:
16761
16762    initializer-list:
16763      designation initializer-clause ...[opt]
16764      initializer-list , designation initializer-clause ...[opt]
16765
16766    designation:
16767      . identifier =
16768      identifier :
16769      [ constant-expression ] =
16770
16771    Returns a VEC of constructor_elt.  The VALUE of each elt is an expression
16772    for the initializer.  If the INDEX of the elt is non-NULL, it is the
16773    IDENTIFIER_NODE naming the field to initialize.  NON_CONSTANT_P is
16774    as for cp_parser_initializer.  */
16775
16776 static VEC(constructor_elt,gc) *
16777 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
16778 {
16779   VEC(constructor_elt,gc) *v = NULL;
16780
16781   /* Assume all of the expressions are constant.  */
16782   *non_constant_p = false;
16783
16784   /* Parse the rest of the list.  */
16785   while (true)
16786     {
16787       cp_token *token;
16788       tree designator;
16789       tree initializer;
16790       bool clause_non_constant_p;
16791
16792       /* If the next token is an identifier and the following one is a
16793          colon, we are looking at the GNU designated-initializer
16794          syntax.  */
16795       if (cp_parser_allow_gnu_extensions_p (parser)
16796           && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
16797           && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
16798         {
16799           /* Warn the user that they are using an extension.  */
16800           pedwarn (input_location, OPT_pedantic, 
16801                    "ISO C++ does not allow designated initializers");
16802           /* Consume the identifier.  */
16803           designator = cp_lexer_consume_token (parser->lexer)->u.value;
16804           /* Consume the `:'.  */
16805           cp_lexer_consume_token (parser->lexer);
16806         }
16807       /* Also handle the C99 syntax, '. id ='.  */
16808       else if (cp_parser_allow_gnu_extensions_p (parser)
16809                && cp_lexer_next_token_is (parser->lexer, CPP_DOT)
16810                && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
16811                && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_EQ)
16812         {
16813           /* Warn the user that they are using an extension.  */
16814           pedwarn (input_location, OPT_pedantic,
16815                    "ISO C++ does not allow C99 designated initializers");
16816           /* Consume the `.'.  */
16817           cp_lexer_consume_token (parser->lexer);
16818           /* Consume the identifier.  */
16819           designator = cp_lexer_consume_token (parser->lexer)->u.value;
16820           /* Consume the `='.  */
16821           cp_lexer_consume_token (parser->lexer);
16822         }
16823       /* Also handle C99 array designators, '[ const ] ='.  */
16824       else if (cp_parser_allow_gnu_extensions_p (parser)
16825                && !c_dialect_objc ()
16826                && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
16827         {
16828           cp_lexer_consume_token (parser->lexer);
16829           designator = cp_parser_constant_expression (parser, false, NULL);
16830           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
16831           cp_parser_require (parser, CPP_EQ, RT_EQ);
16832         }
16833       else
16834         designator = NULL_TREE;
16835
16836       /* Parse the initializer.  */
16837       initializer = cp_parser_initializer_clause (parser,
16838                                                   &clause_non_constant_p);
16839       /* If any clause is non-constant, so is the entire initializer.  */
16840       if (clause_non_constant_p)
16841         *non_constant_p = true;
16842
16843       /* If we have an ellipsis, this is an initializer pack
16844          expansion.  */
16845       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16846         {
16847           /* Consume the `...'.  */
16848           cp_lexer_consume_token (parser->lexer);
16849
16850           /* Turn the initializer into an initializer expansion.  */
16851           initializer = make_pack_expansion (initializer);
16852         }
16853
16854       /* Add it to the vector.  */
16855       CONSTRUCTOR_APPEND_ELT (v, designator, initializer);
16856
16857       /* If the next token is not a comma, we have reached the end of
16858          the list.  */
16859       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
16860         break;
16861
16862       /* Peek at the next token.  */
16863       token = cp_lexer_peek_nth_token (parser->lexer, 2);
16864       /* If the next token is a `}', then we're still done.  An
16865          initializer-clause can have a trailing `,' after the
16866          initializer-list and before the closing `}'.  */
16867       if (token->type == CPP_CLOSE_BRACE)
16868         break;
16869
16870       /* Consume the `,' token.  */
16871       cp_lexer_consume_token (parser->lexer);
16872     }
16873
16874   return v;
16875 }
16876
16877 /* Classes [gram.class] */
16878
16879 /* Parse a class-name.
16880
16881    class-name:
16882      identifier
16883      template-id
16884
16885    TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
16886    to indicate that names looked up in dependent types should be
16887    assumed to be types.  TEMPLATE_KEYWORD_P is true iff the `template'
16888    keyword has been used to indicate that the name that appears next
16889    is a template.  TAG_TYPE indicates the explicit tag given before
16890    the type name, if any.  If CHECK_DEPENDENCY_P is FALSE, names are
16891    looked up in dependent scopes.  If CLASS_HEAD_P is TRUE, this class
16892    is the class being defined in a class-head.
16893
16894    Returns the TYPE_DECL representing the class.  */
16895
16896 static tree
16897 cp_parser_class_name (cp_parser *parser,
16898                       bool typename_keyword_p,
16899                       bool template_keyword_p,
16900                       enum tag_types tag_type,
16901                       bool check_dependency_p,
16902                       bool class_head_p,
16903                       bool is_declaration)
16904 {
16905   tree decl;
16906   tree scope;
16907   bool typename_p;
16908   cp_token *token;
16909   tree identifier = NULL_TREE;
16910
16911   /* All class-names start with an identifier.  */
16912   token = cp_lexer_peek_token (parser->lexer);
16913   if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
16914     {
16915       cp_parser_error (parser, "expected class-name");
16916       return error_mark_node;
16917     }
16918
16919   /* PARSER->SCOPE can be cleared when parsing the template-arguments
16920      to a template-id, so we save it here.  */
16921   scope = parser->scope;
16922   if (scope == error_mark_node)
16923     return error_mark_node;
16924
16925   /* Any name names a type if we're following the `typename' keyword
16926      in a qualified name where the enclosing scope is type-dependent.  */
16927   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
16928                 && dependent_type_p (scope));
16929   /* Handle the common case (an identifier, but not a template-id)
16930      efficiently.  */
16931   if (token->type == CPP_NAME
16932       && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
16933     {
16934       cp_token *identifier_token;
16935       bool ambiguous_p;
16936
16937       /* Look for the identifier.  */
16938       identifier_token = cp_lexer_peek_token (parser->lexer);
16939       ambiguous_p = identifier_token->ambiguous_p;
16940       identifier = cp_parser_identifier (parser);
16941       /* If the next token isn't an identifier, we are certainly not
16942          looking at a class-name.  */
16943       if (identifier == error_mark_node)
16944         decl = error_mark_node;
16945       /* If we know this is a type-name, there's no need to look it
16946          up.  */
16947       else if (typename_p)
16948         decl = identifier;
16949       else
16950         {
16951           tree ambiguous_decls;
16952           /* If we already know that this lookup is ambiguous, then
16953              we've already issued an error message; there's no reason
16954              to check again.  */
16955           if (ambiguous_p)
16956             {
16957               cp_parser_simulate_error (parser);
16958               return error_mark_node;
16959             }
16960           /* If the next token is a `::', then the name must be a type
16961              name.
16962
16963              [basic.lookup.qual]
16964
16965              During the lookup for a name preceding the :: scope
16966              resolution operator, object, function, and enumerator
16967              names are ignored.  */
16968           if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16969             tag_type = typename_type;
16970           /* Look up the name.  */
16971           decl = cp_parser_lookup_name (parser, identifier,
16972                                         tag_type,
16973                                         /*is_template=*/false,
16974                                         /*is_namespace=*/false,
16975                                         check_dependency_p,
16976                                         &ambiguous_decls,
16977                                         identifier_token->location);
16978           if (ambiguous_decls)
16979             {
16980               if (cp_parser_parsing_tentatively (parser))
16981                 cp_parser_simulate_error (parser);
16982               return error_mark_node;
16983             }
16984         }
16985     }
16986   else
16987     {
16988       /* Try a template-id.  */
16989       decl = cp_parser_template_id (parser, template_keyword_p,
16990                                     check_dependency_p,
16991                                     is_declaration);
16992       if (decl == error_mark_node)
16993         return error_mark_node;
16994     }
16995
16996   decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
16997
16998   /* If this is a typename, create a TYPENAME_TYPE.  */
16999   if (typename_p && decl != error_mark_node)
17000     {
17001       decl = make_typename_type (scope, decl, typename_type,
17002                                  /*complain=*/tf_error);
17003       if (decl != error_mark_node)
17004         decl = TYPE_NAME (decl);
17005     }
17006
17007   /* Check to see that it is really the name of a class.  */
17008   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
17009       && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
17010       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
17011     /* Situations like this:
17012
17013          template <typename T> struct A {
17014            typename T::template X<int>::I i;
17015          };
17016
17017        are problematic.  Is `T::template X<int>' a class-name?  The
17018        standard does not seem to be definitive, but there is no other
17019        valid interpretation of the following `::'.  Therefore, those
17020        names are considered class-names.  */
17021     {
17022       decl = make_typename_type (scope, decl, tag_type, tf_error);
17023       if (decl != error_mark_node)
17024         decl = TYPE_NAME (decl);
17025     }
17026   else if (TREE_CODE (decl) != TYPE_DECL
17027            || TREE_TYPE (decl) == error_mark_node
17028            || !MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
17029            /* In Objective-C 2.0, a classname followed by '.' starts a
17030               dot-syntax expression, and it's not a type-name.  */
17031            || (c_dialect_objc ()
17032                && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT 
17033                && objc_is_class_name (decl)))
17034     decl = error_mark_node;
17035
17036   if (decl == error_mark_node)
17037     cp_parser_error (parser, "expected class-name");
17038   else if (identifier && !parser->scope)
17039     maybe_note_name_used_in_class (identifier, decl);
17040
17041   return decl;
17042 }
17043
17044 /* Parse a class-specifier.
17045
17046    class-specifier:
17047      class-head { member-specification [opt] }
17048
17049    Returns the TREE_TYPE representing the class.  */
17050
17051 static tree
17052 cp_parser_class_specifier_1 (cp_parser* parser)
17053 {
17054   tree type;
17055   tree attributes = NULL_TREE;
17056   bool nested_name_specifier_p;
17057   unsigned saved_num_template_parameter_lists;
17058   bool saved_in_function_body;
17059   unsigned char in_statement;
17060   bool in_switch_statement_p;
17061   bool saved_in_unbraced_linkage_specification_p;
17062   tree old_scope = NULL_TREE;
17063   tree scope = NULL_TREE;
17064   tree bases;
17065   cp_token *closing_brace;
17066
17067   push_deferring_access_checks (dk_no_deferred);
17068
17069   /* Parse the class-head.  */
17070   type = cp_parser_class_head (parser,
17071                                &nested_name_specifier_p,
17072                                &attributes,
17073                                &bases);
17074   /* If the class-head was a semantic disaster, skip the entire body
17075      of the class.  */
17076   if (!type)
17077     {
17078       cp_parser_skip_to_end_of_block_or_statement (parser);
17079       pop_deferring_access_checks ();
17080       return error_mark_node;
17081     }
17082
17083   /* Look for the `{'.  */
17084   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
17085     {
17086       pop_deferring_access_checks ();
17087       return error_mark_node;
17088     }
17089
17090   /* Process the base classes. If they're invalid, skip the 
17091      entire class body.  */
17092   if (!xref_basetypes (type, bases))
17093     {
17094       /* Consuming the closing brace yields better error messages
17095          later on.  */
17096       if (cp_parser_skip_to_closing_brace (parser))
17097         cp_lexer_consume_token (parser->lexer);
17098       pop_deferring_access_checks ();
17099       return error_mark_node;
17100     }
17101
17102   /* Issue an error message if type-definitions are forbidden here.  */
17103   cp_parser_check_type_definition (parser);
17104   /* Remember that we are defining one more class.  */
17105   ++parser->num_classes_being_defined;
17106   /* Inside the class, surrounding template-parameter-lists do not
17107      apply.  */
17108   saved_num_template_parameter_lists
17109     = parser->num_template_parameter_lists;
17110   parser->num_template_parameter_lists = 0;
17111   /* We are not in a function body.  */
17112   saved_in_function_body = parser->in_function_body;
17113   parser->in_function_body = false;
17114   /* Or in a loop.  */
17115   in_statement = parser->in_statement;
17116   parser->in_statement = 0;
17117   /* Or in a switch.  */
17118   in_switch_statement_p = parser->in_switch_statement_p;
17119   parser->in_switch_statement_p = false;
17120   /* We are not immediately inside an extern "lang" block.  */
17121   saved_in_unbraced_linkage_specification_p
17122     = parser->in_unbraced_linkage_specification_p;
17123   parser->in_unbraced_linkage_specification_p = false;
17124
17125   /* Start the class.  */
17126   if (nested_name_specifier_p)
17127     {
17128       scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
17129       old_scope = push_inner_scope (scope);
17130     }
17131   type = begin_class_definition (type, attributes);
17132
17133   if (type == error_mark_node)
17134     /* If the type is erroneous, skip the entire body of the class.  */
17135     cp_parser_skip_to_closing_brace (parser);
17136   else
17137     /* Parse the member-specification.  */
17138     cp_parser_member_specification_opt (parser);
17139
17140   /* Look for the trailing `}'.  */
17141   closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
17142   /* Look for trailing attributes to apply to this class.  */
17143   if (cp_parser_allow_gnu_extensions_p (parser))
17144     attributes = cp_parser_attributes_opt (parser);
17145   if (type != error_mark_node)
17146     type = finish_struct (type, attributes);
17147   if (nested_name_specifier_p)
17148     pop_inner_scope (old_scope, scope);
17149
17150   /* We've finished a type definition.  Check for the common syntax
17151      error of forgetting a semicolon after the definition.  We need to
17152      be careful, as we can't just check for not-a-semicolon and be done
17153      with it; the user might have typed:
17154
17155      class X { } c = ...;
17156      class X { } *p = ...;
17157
17158      and so forth.  Instead, enumerate all the possible tokens that
17159      might follow this production; if we don't see one of them, then
17160      complain and silently insert the semicolon.  */
17161   {
17162     cp_token *token = cp_lexer_peek_token (parser->lexer);
17163     bool want_semicolon = true;
17164
17165     switch (token->type)
17166       {
17167       case CPP_NAME:
17168       case CPP_SEMICOLON:
17169       case CPP_MULT:
17170       case CPP_AND:
17171       case CPP_OPEN_PAREN:
17172       case CPP_CLOSE_PAREN:
17173       case CPP_COMMA:
17174         want_semicolon = false;
17175         break;
17176
17177         /* While it's legal for type qualifiers and storage class
17178            specifiers to follow type definitions in the grammar, only
17179            compiler testsuites contain code like that.  Assume that if
17180            we see such code, then what we're really seeing is a case
17181            like:
17182
17183            class X { }
17184            const <type> var = ...;
17185
17186            or
17187
17188            class Y { }
17189            static <type> func (...) ...
17190
17191            i.e. the qualifier or specifier applies to the next
17192            declaration.  To do so, however, we need to look ahead one
17193            more token to see if *that* token is a type specifier.
17194
17195            This code could be improved to handle:
17196
17197            class Z { }
17198            static const <type> var = ...;  */
17199       case CPP_KEYWORD:
17200         if (keyword_is_decl_specifier (token->keyword))
17201           {
17202             cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
17203
17204             /* Handling user-defined types here would be nice, but very
17205                tricky.  */
17206             want_semicolon
17207               = (lookahead->type == CPP_KEYWORD
17208                  && keyword_begins_type_specifier (lookahead->keyword));
17209           }
17210         break;
17211       default:
17212         break;
17213       }
17214
17215     /* If we don't have a type, then something is very wrong and we
17216        shouldn't try to do anything clever.  Likewise for not seeing the
17217        closing brace.  */
17218     if (closing_brace && TYPE_P (type) && want_semicolon)
17219       {
17220         cp_token_position prev
17221           = cp_lexer_previous_token_position (parser->lexer);
17222         cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
17223         location_t loc = prev_token->location;
17224
17225         if (CLASSTYPE_DECLARED_CLASS (type))
17226           error_at (loc, "expected %<;%> after class definition");
17227         else if (TREE_CODE (type) == RECORD_TYPE)
17228           error_at (loc, "expected %<;%> after struct definition");
17229         else if (TREE_CODE (type) == UNION_TYPE)
17230           error_at (loc, "expected %<;%> after union definition");
17231         else
17232           gcc_unreachable ();
17233
17234         /* Unget one token and smash it to look as though we encountered
17235            a semicolon in the input stream.  */
17236         cp_lexer_set_token_position (parser->lexer, prev);
17237         token = cp_lexer_peek_token (parser->lexer);
17238         token->type = CPP_SEMICOLON;
17239         token->keyword = RID_MAX;
17240       }
17241   }
17242
17243   /* If this class is not itself within the scope of another class,
17244      then we need to parse the bodies of all of the queued function
17245      definitions.  Note that the queued functions defined in a class
17246      are not always processed immediately following the
17247      class-specifier for that class.  Consider:
17248
17249        struct A {
17250          struct B { void f() { sizeof (A); } };
17251        };
17252
17253      If `f' were processed before the processing of `A' were
17254      completed, there would be no way to compute the size of `A'.
17255      Note that the nesting we are interested in here is lexical --
17256      not the semantic nesting given by TYPE_CONTEXT.  In particular,
17257      for:
17258
17259        struct A { struct B; };
17260        struct A::B { void f() { } };
17261
17262      there is no need to delay the parsing of `A::B::f'.  */
17263   if (--parser->num_classes_being_defined == 0)
17264     {
17265       tree fn;
17266       tree class_type = NULL_TREE;
17267       tree pushed_scope = NULL_TREE;
17268       unsigned ix;
17269       cp_default_arg_entry *e;
17270
17271       /* In a first pass, parse default arguments to the functions.
17272          Then, in a second pass, parse the bodies of the functions.
17273          This two-phased approach handles cases like:
17274
17275             struct S {
17276               void f() { g(); }
17277               void g(int i = 3);
17278             };
17279
17280          */
17281       FOR_EACH_VEC_ELT (cp_default_arg_entry, unparsed_funs_with_default_args,
17282                         ix, e)
17283         {
17284           fn = e->decl;
17285           /* If there are default arguments that have not yet been processed,
17286              take care of them now.  */
17287           if (class_type != e->class_type)
17288             {
17289               if (pushed_scope)
17290                 pop_scope (pushed_scope);
17291               class_type = e->class_type;
17292               pushed_scope = push_scope (class_type);
17293             }
17294           /* Make sure that any template parameters are in scope.  */
17295           maybe_begin_member_template_processing (fn);
17296           /* Parse the default argument expressions.  */
17297           cp_parser_late_parsing_default_args (parser, fn);
17298           /* Remove any template parameters from the symbol table.  */
17299           maybe_end_member_template_processing ();
17300         }
17301       if (pushed_scope)
17302         pop_scope (pushed_scope);
17303       VEC_truncate (cp_default_arg_entry, unparsed_funs_with_default_args, 0);
17304       /* Now parse the body of the functions.  */
17305       FOR_EACH_VEC_ELT (tree, unparsed_funs_with_definitions, ix, fn)
17306         cp_parser_late_parsing_for_member (parser, fn);
17307       VEC_truncate (tree, unparsed_funs_with_definitions, 0);
17308     }
17309
17310   /* Put back any saved access checks.  */
17311   pop_deferring_access_checks ();
17312
17313   /* Restore saved state.  */
17314   parser->in_switch_statement_p = in_switch_statement_p;
17315   parser->in_statement = in_statement;
17316   parser->in_function_body = saved_in_function_body;
17317   parser->num_template_parameter_lists
17318     = saved_num_template_parameter_lists;
17319   parser->in_unbraced_linkage_specification_p
17320     = saved_in_unbraced_linkage_specification_p;
17321
17322   return type;
17323 }
17324
17325 static tree
17326 cp_parser_class_specifier (cp_parser* parser)
17327 {
17328   tree ret;
17329   timevar_push (TV_PARSE_STRUCT);
17330   ret = cp_parser_class_specifier_1 (parser);
17331   timevar_pop (TV_PARSE_STRUCT);
17332   return ret;
17333 }
17334
17335 /* Parse a class-head.
17336
17337    class-head:
17338      class-key identifier [opt] base-clause [opt]
17339      class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
17340      class-key nested-name-specifier [opt] template-id
17341        base-clause [opt]
17342
17343    class-virt-specifier:
17344      final
17345
17346    GNU Extensions:
17347      class-key attributes identifier [opt] base-clause [opt]
17348      class-key attributes nested-name-specifier identifier base-clause [opt]
17349      class-key attributes nested-name-specifier [opt] template-id
17350        base-clause [opt]
17351
17352    Upon return BASES is initialized to the list of base classes (or
17353    NULL, if there are none) in the same form returned by
17354    cp_parser_base_clause.
17355
17356    Returns the TYPE of the indicated class.  Sets
17357    *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
17358    involving a nested-name-specifier was used, and FALSE otherwise.
17359
17360    Returns error_mark_node if this is not a class-head.
17361
17362    Returns NULL_TREE if the class-head is syntactically valid, but
17363    semantically invalid in a way that means we should skip the entire
17364    body of the class.  */
17365
17366 static tree
17367 cp_parser_class_head (cp_parser* parser,
17368                       bool* nested_name_specifier_p,
17369                       tree *attributes_p,
17370                       tree *bases)
17371 {
17372   tree nested_name_specifier;
17373   enum tag_types class_key;
17374   tree id = NULL_TREE;
17375   tree type = NULL_TREE;
17376   tree attributes;
17377   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
17378   bool template_id_p = false;
17379   bool qualified_p = false;
17380   bool invalid_nested_name_p = false;
17381   bool invalid_explicit_specialization_p = false;
17382   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17383   tree pushed_scope = NULL_TREE;
17384   unsigned num_templates;
17385   cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
17386   /* Assume no nested-name-specifier will be present.  */
17387   *nested_name_specifier_p = false;
17388   /* Assume no template parameter lists will be used in defining the
17389      type.  */
17390   num_templates = 0;
17391   parser->colon_corrects_to_scope_p = false;
17392
17393   *bases = NULL_TREE;
17394
17395   /* Look for the class-key.  */
17396   class_key = cp_parser_class_key (parser);
17397   if (class_key == none_type)
17398     return error_mark_node;
17399
17400   /* Parse the attributes.  */
17401   attributes = cp_parser_attributes_opt (parser);
17402
17403   /* If the next token is `::', that is invalid -- but sometimes
17404      people do try to write:
17405
17406        struct ::S {};
17407
17408      Handle this gracefully by accepting the extra qualifier, and then
17409      issuing an error about it later if this really is a
17410      class-head.  If it turns out just to be an elaborated type
17411      specifier, remain silent.  */
17412   if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
17413     qualified_p = true;
17414
17415   push_deferring_access_checks (dk_no_check);
17416
17417   /* Determine the name of the class.  Begin by looking for an
17418      optional nested-name-specifier.  */
17419   nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
17420   nested_name_specifier
17421     = cp_parser_nested_name_specifier_opt (parser,
17422                                            /*typename_keyword_p=*/false,
17423                                            /*check_dependency_p=*/false,
17424                                            /*type_p=*/false,
17425                                            /*is_declaration=*/false);
17426   /* If there was a nested-name-specifier, then there *must* be an
17427      identifier.  */
17428   if (nested_name_specifier)
17429     {
17430       type_start_token = cp_lexer_peek_token (parser->lexer);
17431       /* Although the grammar says `identifier', it really means
17432          `class-name' or `template-name'.  You are only allowed to
17433          define a class that has already been declared with this
17434          syntax.
17435
17436          The proposed resolution for Core Issue 180 says that wherever
17437          you see `class T::X' you should treat `X' as a type-name.
17438
17439          It is OK to define an inaccessible class; for example:
17440
17441            class A { class B; };
17442            class A::B {};
17443
17444          We do not know if we will see a class-name, or a
17445          template-name.  We look for a class-name first, in case the
17446          class-name is a template-id; if we looked for the
17447          template-name first we would stop after the template-name.  */
17448       cp_parser_parse_tentatively (parser);
17449       type = cp_parser_class_name (parser,
17450                                    /*typename_keyword_p=*/false,
17451                                    /*template_keyword_p=*/false,
17452                                    class_type,
17453                                    /*check_dependency_p=*/false,
17454                                    /*class_head_p=*/true,
17455                                    /*is_declaration=*/false);
17456       /* If that didn't work, ignore the nested-name-specifier.  */
17457       if (!cp_parser_parse_definitely (parser))
17458         {
17459           invalid_nested_name_p = true;
17460           type_start_token = cp_lexer_peek_token (parser->lexer);
17461           id = cp_parser_identifier (parser);
17462           if (id == error_mark_node)
17463             id = NULL_TREE;
17464         }
17465       /* If we could not find a corresponding TYPE, treat this
17466          declaration like an unqualified declaration.  */
17467       if (type == error_mark_node)
17468         nested_name_specifier = NULL_TREE;
17469       /* Otherwise, count the number of templates used in TYPE and its
17470          containing scopes.  */
17471       else
17472         {
17473           tree scope;
17474
17475           for (scope = TREE_TYPE (type);
17476                scope && TREE_CODE (scope) != NAMESPACE_DECL;
17477                scope = (TYPE_P (scope)
17478                         ? TYPE_CONTEXT (scope)
17479                         : DECL_CONTEXT (scope)))
17480             if (TYPE_P (scope)
17481                 && CLASS_TYPE_P (scope)
17482                 && CLASSTYPE_TEMPLATE_INFO (scope)
17483                 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
17484                 && !CLASSTYPE_TEMPLATE_SPECIALIZATION (scope))
17485               ++num_templates;
17486         }
17487     }
17488   /* Otherwise, the identifier is optional.  */
17489   else
17490     {
17491       /* We don't know whether what comes next is a template-id,
17492          an identifier, or nothing at all.  */
17493       cp_parser_parse_tentatively (parser);
17494       /* Check for a template-id.  */
17495       type_start_token = cp_lexer_peek_token (parser->lexer);
17496       id = cp_parser_template_id (parser,
17497                                   /*template_keyword_p=*/false,
17498                                   /*check_dependency_p=*/true,
17499                                   /*is_declaration=*/true);
17500       /* If that didn't work, it could still be an identifier.  */
17501       if (!cp_parser_parse_definitely (parser))
17502         {
17503           if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
17504             {
17505               type_start_token = cp_lexer_peek_token (parser->lexer);
17506               id = cp_parser_identifier (parser);
17507             }
17508           else
17509             id = NULL_TREE;
17510         }
17511       else
17512         {
17513           template_id_p = true;
17514           ++num_templates;
17515         }
17516     }
17517
17518   pop_deferring_access_checks ();
17519
17520   if (id)
17521     {
17522       cp_parser_check_for_invalid_template_id (parser, id,
17523                                                type_start_token->location);
17524       virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
17525     }
17526
17527   /* If it's not a `:' or a `{' then we can't really be looking at a
17528      class-head, since a class-head only appears as part of a
17529      class-specifier.  We have to detect this situation before calling
17530      xref_tag, since that has irreversible side-effects.  */
17531   if (!cp_parser_next_token_starts_class_definition_p (parser))
17532     {
17533       cp_parser_error (parser, "expected %<{%> or %<:%>");
17534       type = error_mark_node;
17535       goto out;
17536     }
17537
17538   /* At this point, we're going ahead with the class-specifier, even
17539      if some other problem occurs.  */
17540   cp_parser_commit_to_tentative_parse (parser);
17541   if (virt_specifiers & VIRT_SPEC_OVERRIDE)
17542     {
17543       cp_parser_error (parser,
17544                        "cannot specify %<override%> for a class");
17545       type = error_mark_node;
17546       goto out;
17547     }
17548   /* Issue the error about the overly-qualified name now.  */
17549   if (qualified_p)
17550     {
17551       cp_parser_error (parser,
17552                        "global qualification of class name is invalid");
17553       type = error_mark_node;
17554       goto out;
17555     }
17556   else if (invalid_nested_name_p)
17557     {
17558       cp_parser_error (parser,
17559                        "qualified name does not name a class");
17560       type = error_mark_node;
17561       goto out;
17562     }
17563   else if (nested_name_specifier)
17564     {
17565       tree scope;
17566
17567       /* Reject typedef-names in class heads.  */
17568       if (!DECL_IMPLICIT_TYPEDEF_P (type))
17569         {
17570           error_at (type_start_token->location,
17571                     "invalid class name in declaration of %qD",
17572                     type);
17573           type = NULL_TREE;
17574           goto done;
17575         }
17576
17577       /* Figure out in what scope the declaration is being placed.  */
17578       scope = current_scope ();
17579       /* If that scope does not contain the scope in which the
17580          class was originally declared, the program is invalid.  */
17581       if (scope && !is_ancestor (scope, nested_name_specifier))
17582         {
17583           if (at_namespace_scope_p ())
17584             error_at (type_start_token->location,
17585                       "declaration of %qD in namespace %qD which does not "
17586                       "enclose %qD",
17587                       type, scope, nested_name_specifier);
17588           else
17589             error_at (type_start_token->location,
17590                       "declaration of %qD in %qD which does not enclose %qD",
17591                       type, scope, nested_name_specifier);
17592           type = NULL_TREE;
17593           goto done;
17594         }
17595       /* [dcl.meaning]
17596
17597          A declarator-id shall not be qualified except for the
17598          definition of a ... nested class outside of its class
17599          ... [or] the definition or explicit instantiation of a
17600          class member of a namespace outside of its namespace.  */
17601       if (scope == nested_name_specifier)
17602         {
17603           permerror (nested_name_specifier_token_start->location,
17604                      "extra qualification not allowed");
17605           nested_name_specifier = NULL_TREE;
17606           num_templates = 0;
17607         }
17608     }
17609   /* An explicit-specialization must be preceded by "template <>".  If
17610      it is not, try to recover gracefully.  */
17611   if (at_namespace_scope_p ()
17612       && parser->num_template_parameter_lists == 0
17613       && template_id_p)
17614     {
17615       error_at (type_start_token->location,
17616                 "an explicit specialization must be preceded by %<template <>%>");
17617       invalid_explicit_specialization_p = true;
17618       /* Take the same action that would have been taken by
17619          cp_parser_explicit_specialization.  */
17620       ++parser->num_template_parameter_lists;
17621       begin_specialization ();
17622     }
17623   /* There must be no "return" statements between this point and the
17624      end of this function; set "type "to the correct return value and
17625      use "goto done;" to return.  */
17626   /* Make sure that the right number of template parameters were
17627      present.  */
17628   if (!cp_parser_check_template_parameters (parser, num_templates,
17629                                             type_start_token->location,
17630                                             /*declarator=*/NULL))
17631     {
17632       /* If something went wrong, there is no point in even trying to
17633          process the class-definition.  */
17634       type = NULL_TREE;
17635       goto done;
17636     }
17637
17638   /* Look up the type.  */
17639   if (template_id_p)
17640     {
17641       if (TREE_CODE (id) == TEMPLATE_ID_EXPR
17642           && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
17643               || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
17644         {
17645           error_at (type_start_token->location,
17646                     "function template %qD redeclared as a class template", id);
17647           type = error_mark_node;
17648         }
17649       else
17650         {
17651           type = TREE_TYPE (id);
17652           type = maybe_process_partial_specialization (type);
17653         }
17654       if (nested_name_specifier)
17655         pushed_scope = push_scope (nested_name_specifier);
17656     }
17657   else if (nested_name_specifier)
17658     {
17659       tree class_type;
17660
17661       /* Given:
17662
17663             template <typename T> struct S { struct T };
17664             template <typename T> struct S<T>::T { };
17665
17666          we will get a TYPENAME_TYPE when processing the definition of
17667          `S::T'.  We need to resolve it to the actual type before we
17668          try to define it.  */
17669       if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
17670         {
17671           class_type = resolve_typename_type (TREE_TYPE (type),
17672                                               /*only_current_p=*/false);
17673           if (TREE_CODE (class_type) != TYPENAME_TYPE)
17674             type = TYPE_NAME (class_type);
17675           else
17676             {
17677               cp_parser_error (parser, "could not resolve typename type");
17678               type = error_mark_node;
17679             }
17680         }
17681
17682       if (maybe_process_partial_specialization (TREE_TYPE (type))
17683           == error_mark_node)
17684         {
17685           type = NULL_TREE;
17686           goto done;
17687         }
17688
17689       class_type = current_class_type;
17690       /* Enter the scope indicated by the nested-name-specifier.  */
17691       pushed_scope = push_scope (nested_name_specifier);
17692       /* Get the canonical version of this type.  */
17693       type = TYPE_MAIN_DECL (TREE_TYPE (type));
17694       if (PROCESSING_REAL_TEMPLATE_DECL_P ()
17695           && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
17696         {
17697           type = push_template_decl (type);
17698           if (type == error_mark_node)
17699             {
17700               type = NULL_TREE;
17701               goto done;
17702             }
17703         }
17704
17705       type = TREE_TYPE (type);
17706       *nested_name_specifier_p = true;
17707     }
17708   else      /* The name is not a nested name.  */
17709     {
17710       /* If the class was unnamed, create a dummy name.  */
17711       if (!id)
17712         id = make_anon_name ();
17713       type = xref_tag (class_key, id, /*tag_scope=*/ts_current,
17714                        parser->num_template_parameter_lists);
17715     }
17716
17717   /* Indicate whether this class was declared as a `class' or as a
17718      `struct'.  */
17719   if (TREE_CODE (type) == RECORD_TYPE)
17720     CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
17721   cp_parser_check_class_key (class_key, type);
17722
17723   /* If this type was already complete, and we see another definition,
17724      that's an error.  */
17725   if (type != error_mark_node && COMPLETE_TYPE_P (type))
17726     {
17727       error_at (type_start_token->location, "redefinition of %q#T",
17728                 type);
17729       error_at (type_start_token->location, "previous definition of %q+#T",
17730                 type);
17731       type = NULL_TREE;
17732       goto done;
17733     }
17734   else if (type == error_mark_node)
17735     type = NULL_TREE;
17736
17737   /* We will have entered the scope containing the class; the names of
17738      base classes should be looked up in that context.  For example:
17739
17740        struct A { struct B {}; struct C; };
17741        struct A::C : B {};
17742
17743      is valid.  */
17744
17745   /* Get the list of base-classes, if there is one.  */
17746   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
17747     *bases = cp_parser_base_clause (parser);
17748
17749  done:
17750   /* Leave the scope given by the nested-name-specifier.  We will
17751      enter the class scope itself while processing the members.  */
17752   if (pushed_scope)
17753     pop_scope (pushed_scope);
17754
17755   if (invalid_explicit_specialization_p)
17756     {
17757       end_specialization ();
17758       --parser->num_template_parameter_lists;
17759     }
17760
17761   if (type)
17762     DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
17763   *attributes_p = attributes;
17764   if (type && (virt_specifiers & VIRT_SPEC_FINAL))
17765     CLASSTYPE_FINAL (type) = 1;
17766  out:
17767   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
17768   return type;
17769 }
17770
17771 /* Parse a class-key.
17772
17773    class-key:
17774      class
17775      struct
17776      union
17777
17778    Returns the kind of class-key specified, or none_type to indicate
17779    error.  */
17780
17781 static enum tag_types
17782 cp_parser_class_key (cp_parser* parser)
17783 {
17784   cp_token *token;
17785   enum tag_types tag_type;
17786
17787   /* Look for the class-key.  */
17788   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
17789   if (!token)
17790     return none_type;
17791
17792   /* Check to see if the TOKEN is a class-key.  */
17793   tag_type = cp_parser_token_is_class_key (token);
17794   if (!tag_type)
17795     cp_parser_error (parser, "expected class-key");
17796   return tag_type;
17797 }
17798
17799 /* Parse an (optional) member-specification.
17800
17801    member-specification:
17802      member-declaration member-specification [opt]
17803      access-specifier : member-specification [opt]  */
17804
17805 static void
17806 cp_parser_member_specification_opt (cp_parser* parser)
17807 {
17808   while (true)
17809     {
17810       cp_token *token;
17811       enum rid keyword;
17812
17813       /* Peek at the next token.  */
17814       token = cp_lexer_peek_token (parser->lexer);
17815       /* If it's a `}', or EOF then we've seen all the members.  */
17816       if (token->type == CPP_CLOSE_BRACE
17817           || token->type == CPP_EOF
17818           || token->type == CPP_PRAGMA_EOL)
17819         break;
17820
17821       /* See if this token is a keyword.  */
17822       keyword = token->keyword;
17823       switch (keyword)
17824         {
17825         case RID_PUBLIC:
17826         case RID_PROTECTED:
17827         case RID_PRIVATE:
17828           /* Consume the access-specifier.  */
17829           cp_lexer_consume_token (parser->lexer);
17830           /* Remember which access-specifier is active.  */
17831           current_access_specifier = token->u.value;
17832           /* Look for the `:'.  */
17833           cp_parser_require (parser, CPP_COLON, RT_COLON);
17834           break;
17835
17836         default:
17837           /* Accept #pragmas at class scope.  */
17838           if (token->type == CPP_PRAGMA)
17839             {
17840               cp_parser_pragma (parser, pragma_external);
17841               break;
17842             }
17843
17844           /* Otherwise, the next construction must be a
17845              member-declaration.  */
17846           cp_parser_member_declaration (parser);
17847         }
17848     }
17849 }
17850
17851 /* Parse a member-declaration.
17852
17853    member-declaration:
17854      decl-specifier-seq [opt] member-declarator-list [opt] ;
17855      function-definition ; [opt]
17856      :: [opt] nested-name-specifier template [opt] unqualified-id ;
17857      using-declaration
17858      template-declaration
17859
17860    member-declarator-list:
17861      member-declarator
17862      member-declarator-list , member-declarator
17863
17864    member-declarator:
17865      declarator pure-specifier [opt]
17866      declarator constant-initializer [opt]
17867      identifier [opt] : constant-expression
17868
17869    GNU Extensions:
17870
17871    member-declaration:
17872      __extension__ member-declaration
17873
17874    member-declarator:
17875      declarator attributes [opt] pure-specifier [opt]
17876      declarator attributes [opt] constant-initializer [opt]
17877      identifier [opt] attributes [opt] : constant-expression  
17878
17879    C++0x Extensions:
17880
17881    member-declaration:
17882      static_assert-declaration  */
17883
17884 static void
17885 cp_parser_member_declaration (cp_parser* parser)
17886 {
17887   cp_decl_specifier_seq decl_specifiers;
17888   tree prefix_attributes;
17889   tree decl;
17890   int declares_class_or_enum;
17891   bool friend_p;
17892   cp_token *token = NULL;
17893   cp_token *decl_spec_token_start = NULL;
17894   cp_token *initializer_token_start = NULL;
17895   int saved_pedantic;
17896   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17897
17898   /* Check for the `__extension__' keyword.  */
17899   if (cp_parser_extension_opt (parser, &saved_pedantic))
17900     {
17901       /* Recurse.  */
17902       cp_parser_member_declaration (parser);
17903       /* Restore the old value of the PEDANTIC flag.  */
17904       pedantic = saved_pedantic;
17905
17906       return;
17907     }
17908
17909   /* Check for a template-declaration.  */
17910   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
17911     {
17912       /* An explicit specialization here is an error condition, and we
17913          expect the specialization handler to detect and report this.  */
17914       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
17915           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
17916         cp_parser_explicit_specialization (parser);
17917       else
17918         cp_parser_template_declaration (parser, /*member_p=*/true);
17919
17920       return;
17921     }
17922
17923   /* Check for a using-declaration.  */
17924   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
17925     {
17926       /* Parse the using-declaration.  */
17927       cp_parser_using_declaration (parser,
17928                                    /*access_declaration_p=*/false);
17929       return;
17930     }
17931
17932   /* Check for @defs.  */
17933   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
17934     {
17935       tree ivar, member;
17936       tree ivar_chains = cp_parser_objc_defs_expression (parser);
17937       ivar = ivar_chains;
17938       while (ivar)
17939         {
17940           member = ivar;
17941           ivar = TREE_CHAIN (member);
17942           TREE_CHAIN (member) = NULL_TREE;
17943           finish_member_declaration (member);
17944         }
17945       return;
17946     }
17947
17948   /* If the next token is `static_assert' we have a static assertion.  */
17949   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
17950     {
17951       cp_parser_static_assert (parser, /*member_p=*/true);
17952       return;
17953     }
17954
17955   parser->colon_corrects_to_scope_p = false;
17956
17957   if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
17958     goto out;
17959
17960   /* Parse the decl-specifier-seq.  */
17961   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
17962   cp_parser_decl_specifier_seq (parser,
17963                                 CP_PARSER_FLAGS_OPTIONAL,
17964                                 &decl_specifiers,
17965                                 &declares_class_or_enum);
17966   prefix_attributes = decl_specifiers.attributes;
17967   decl_specifiers.attributes = NULL_TREE;
17968   /* Check for an invalid type-name.  */
17969   if (!decl_specifiers.any_type_specifiers_p
17970       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
17971     goto out;
17972   /* If there is no declarator, then the decl-specifier-seq should
17973      specify a type.  */
17974   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
17975     {
17976       /* If there was no decl-specifier-seq, and the next token is a
17977          `;', then we have something like:
17978
17979            struct S { ; };
17980
17981          [class.mem]
17982
17983          Each member-declaration shall declare at least one member
17984          name of the class.  */
17985       if (!decl_specifiers.any_specifiers_p)
17986         {
17987           cp_token *token = cp_lexer_peek_token (parser->lexer);
17988           if (!in_system_header_at (token->location))
17989             pedwarn (token->location, OPT_pedantic, "extra %<;%>");
17990         }
17991       else
17992         {
17993           tree type;
17994
17995           /* See if this declaration is a friend.  */
17996           friend_p = cp_parser_friend_p (&decl_specifiers);
17997           /* If there were decl-specifiers, check to see if there was
17998              a class-declaration.  */
17999           type = check_tag_decl (&decl_specifiers);
18000           /* Nested classes have already been added to the class, but
18001              a `friend' needs to be explicitly registered.  */
18002           if (friend_p)
18003             {
18004               /* If the `friend' keyword was present, the friend must
18005                  be introduced with a class-key.  */
18006                if (!declares_class_or_enum && cxx_dialect < cxx0x)
18007                  pedwarn (decl_spec_token_start->location, OPT_pedantic,
18008                           "in C++03 a class-key must be used "
18009                           "when declaring a friend");
18010                /* In this case:
18011
18012                     template <typename T> struct A {
18013                       friend struct A<T>::B;
18014                     };
18015
18016                   A<T>::B will be represented by a TYPENAME_TYPE, and
18017                   therefore not recognized by check_tag_decl.  */
18018                if (!type)
18019                  {
18020                    type = decl_specifiers.type;
18021                    if (type && TREE_CODE (type) == TYPE_DECL)
18022                      type = TREE_TYPE (type);
18023                  }
18024                if (!type || !TYPE_P (type))
18025                  error_at (decl_spec_token_start->location,
18026                            "friend declaration does not name a class or "
18027                            "function");
18028                else
18029                  make_friend_class (current_class_type, type,
18030                                     /*complain=*/true);
18031             }
18032           /* If there is no TYPE, an error message will already have
18033              been issued.  */
18034           else if (!type || type == error_mark_node)
18035             ;
18036           /* An anonymous aggregate has to be handled specially; such
18037              a declaration really declares a data member (with a
18038              particular type), as opposed to a nested class.  */
18039           else if (ANON_AGGR_TYPE_P (type))
18040             {
18041               /* Remove constructors and such from TYPE, now that we
18042                  know it is an anonymous aggregate.  */
18043               fixup_anonymous_aggr (type);
18044               /* And make the corresponding data member.  */
18045               decl = build_decl (decl_spec_token_start->location,
18046                                  FIELD_DECL, NULL_TREE, type);
18047               /* Add it to the class.  */
18048               finish_member_declaration (decl);
18049             }
18050           else
18051             cp_parser_check_access_in_redeclaration
18052                                               (TYPE_NAME (type),
18053                                                decl_spec_token_start->location);
18054         }
18055     }
18056   else
18057     {
18058       bool assume_semicolon = false;
18059
18060       /* See if these declarations will be friends.  */
18061       friend_p = cp_parser_friend_p (&decl_specifiers);
18062
18063       /* Keep going until we hit the `;' at the end of the
18064          declaration.  */
18065       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
18066         {
18067           tree attributes = NULL_TREE;
18068           tree first_attribute;
18069
18070           /* Peek at the next token.  */
18071           token = cp_lexer_peek_token (parser->lexer);
18072
18073           /* Check for a bitfield declaration.  */
18074           if (token->type == CPP_COLON
18075               || (token->type == CPP_NAME
18076                   && cp_lexer_peek_nth_token (parser->lexer, 2)->type
18077                   == CPP_COLON))
18078             {
18079               tree identifier;
18080               tree width;
18081
18082               /* Get the name of the bitfield.  Note that we cannot just
18083                  check TOKEN here because it may have been invalidated by
18084                  the call to cp_lexer_peek_nth_token above.  */
18085               if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
18086                 identifier = cp_parser_identifier (parser);
18087               else
18088                 identifier = NULL_TREE;
18089
18090               /* Consume the `:' token.  */
18091               cp_lexer_consume_token (parser->lexer);
18092               /* Get the width of the bitfield.  */
18093               width
18094                 = cp_parser_constant_expression (parser,
18095                                                  /*allow_non_constant=*/false,
18096                                                  NULL);
18097
18098               /* Look for attributes that apply to the bitfield.  */
18099               attributes = cp_parser_attributes_opt (parser);
18100               /* Remember which attributes are prefix attributes and
18101                  which are not.  */
18102               first_attribute = attributes;
18103               /* Combine the attributes.  */
18104               attributes = chainon (prefix_attributes, attributes);
18105
18106               /* Create the bitfield declaration.  */
18107               decl = grokbitfield (identifier
18108                                    ? make_id_declarator (NULL_TREE,
18109                                                          identifier,
18110                                                          sfk_none)
18111                                    : NULL,
18112                                    &decl_specifiers,
18113                                    width,
18114                                    attributes);
18115             }
18116           else
18117             {
18118               cp_declarator *declarator;
18119               tree initializer;
18120               tree asm_specification;
18121               int ctor_dtor_or_conv_p;
18122
18123               /* Parse the declarator.  */
18124               declarator
18125                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
18126                                         &ctor_dtor_or_conv_p,
18127                                         /*parenthesized_p=*/NULL,
18128                                         /*member_p=*/true);
18129
18130               /* If something went wrong parsing the declarator, make sure
18131                  that we at least consume some tokens.  */
18132               if (declarator == cp_error_declarator)
18133                 {
18134                   /* Skip to the end of the statement.  */
18135                   cp_parser_skip_to_end_of_statement (parser);
18136                   /* If the next token is not a semicolon, that is
18137                      probably because we just skipped over the body of
18138                      a function.  So, we consume a semicolon if
18139                      present, but do not issue an error message if it
18140                      is not present.  */
18141                   if (cp_lexer_next_token_is (parser->lexer,
18142                                               CPP_SEMICOLON))
18143                     cp_lexer_consume_token (parser->lexer);
18144                   goto out;
18145                 }
18146
18147               if (declares_class_or_enum & 2)
18148                 cp_parser_check_for_definition_in_return_type
18149                                             (declarator, decl_specifiers.type,
18150                                              decl_specifiers.type_location);
18151
18152               /* Look for an asm-specification.  */
18153               asm_specification = cp_parser_asm_specification_opt (parser);
18154               /* Look for attributes that apply to the declaration.  */
18155               attributes = cp_parser_attributes_opt (parser);
18156               /* Remember which attributes are prefix attributes and
18157                  which are not.  */
18158               first_attribute = attributes;
18159               /* Combine the attributes.  */
18160               attributes = chainon (prefix_attributes, attributes);
18161
18162               /* If it's an `=', then we have a constant-initializer or a
18163                  pure-specifier.  It is not correct to parse the
18164                  initializer before registering the member declaration
18165                  since the member declaration should be in scope while
18166                  its initializer is processed.  However, the rest of the
18167                  front end does not yet provide an interface that allows
18168                  us to handle this correctly.  */
18169               if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
18170                 {
18171                   /* In [class.mem]:
18172
18173                      A pure-specifier shall be used only in the declaration of
18174                      a virtual function.
18175
18176                      A member-declarator can contain a constant-initializer
18177                      only if it declares a static member of integral or
18178                      enumeration type.
18179
18180                      Therefore, if the DECLARATOR is for a function, we look
18181                      for a pure-specifier; otherwise, we look for a
18182                      constant-initializer.  When we call `grokfield', it will
18183                      perform more stringent semantics checks.  */
18184                   initializer_token_start = cp_lexer_peek_token (parser->lexer);
18185                   if (function_declarator_p (declarator))
18186                     initializer = cp_parser_pure_specifier (parser);
18187                   else
18188                     /* Parse the initializer.  */
18189                     initializer = cp_parser_constant_initializer (parser);
18190                 }
18191               /* Otherwise, there is no initializer.  */
18192               else
18193                 initializer = NULL_TREE;
18194
18195               /* See if we are probably looking at a function
18196                  definition.  We are certainly not looking at a
18197                  member-declarator.  Calling `grokfield' has
18198                  side-effects, so we must not do it unless we are sure
18199                  that we are looking at a member-declarator.  */
18200               if (cp_parser_token_starts_function_definition_p
18201                   (cp_lexer_peek_token (parser->lexer)))
18202                 {
18203                   /* The grammar does not allow a pure-specifier to be
18204                      used when a member function is defined.  (It is
18205                      possible that this fact is an oversight in the
18206                      standard, since a pure function may be defined
18207                      outside of the class-specifier.  */
18208                   if (initializer)
18209                     error_at (initializer_token_start->location,
18210                               "pure-specifier on function-definition");
18211                   decl = cp_parser_save_member_function_body (parser,
18212                                                               &decl_specifiers,
18213                                                               declarator,
18214                                                               attributes);
18215                   /* If the member was not a friend, declare it here.  */
18216                   if (!friend_p)
18217                     finish_member_declaration (decl);
18218                   /* Peek at the next token.  */
18219                   token = cp_lexer_peek_token (parser->lexer);
18220                   /* If the next token is a semicolon, consume it.  */
18221                   if (token->type == CPP_SEMICOLON)
18222                     cp_lexer_consume_token (parser->lexer);
18223                   goto out;
18224                 }
18225               else
18226                 if (declarator->kind == cdk_function)
18227                   declarator->id_loc = token->location;
18228                 /* Create the declaration.  */
18229                 decl = grokfield (declarator, &decl_specifiers,
18230                                   initializer, /*init_const_expr_p=*/true,
18231                                   asm_specification,
18232                                   attributes);
18233             }
18234
18235           /* Reset PREFIX_ATTRIBUTES.  */
18236           while (attributes && TREE_CHAIN (attributes) != first_attribute)
18237             attributes = TREE_CHAIN (attributes);
18238           if (attributes)
18239             TREE_CHAIN (attributes) = NULL_TREE;
18240
18241           /* If there is any qualification still in effect, clear it
18242              now; we will be starting fresh with the next declarator.  */
18243           parser->scope = NULL_TREE;
18244           parser->qualifying_scope = NULL_TREE;
18245           parser->object_scope = NULL_TREE;
18246           /* If it's a `,', then there are more declarators.  */
18247           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18248             cp_lexer_consume_token (parser->lexer);
18249           /* If the next token isn't a `;', then we have a parse error.  */
18250           else if (cp_lexer_next_token_is_not (parser->lexer,
18251                                                CPP_SEMICOLON))
18252             {
18253               /* The next token might be a ways away from where the
18254                  actual semicolon is missing.  Find the previous token
18255                  and use that for our error position.  */
18256               cp_token *token = cp_lexer_previous_token (parser->lexer);
18257               error_at (token->location,
18258                         "expected %<;%> at end of member declaration");
18259
18260               /* Assume that the user meant to provide a semicolon.  If
18261                  we were to cp_parser_skip_to_end_of_statement, we might
18262                  skip to a semicolon inside a member function definition
18263                  and issue nonsensical error messages.  */
18264               assume_semicolon = true;
18265             }
18266
18267           if (decl)
18268             {
18269               /* Add DECL to the list of members.  */
18270               if (!friend_p)
18271                 finish_member_declaration (decl);
18272
18273               if (TREE_CODE (decl) == FUNCTION_DECL)
18274                 cp_parser_save_default_args (parser, decl);
18275             }
18276
18277           if (assume_semicolon)
18278             goto out;
18279         }
18280     }
18281
18282   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18283  out:
18284   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
18285 }
18286
18287 /* Parse a pure-specifier.
18288
18289    pure-specifier:
18290      = 0
18291
18292    Returns INTEGER_ZERO_NODE if a pure specifier is found.
18293    Otherwise, ERROR_MARK_NODE is returned.  */
18294
18295 static tree
18296 cp_parser_pure_specifier (cp_parser* parser)
18297 {
18298   cp_token *token;
18299
18300   /* Look for the `=' token.  */
18301   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18302     return error_mark_node;
18303   /* Look for the `0' token.  */
18304   token = cp_lexer_peek_token (parser->lexer);
18305
18306   if (token->type == CPP_EOF
18307       || token->type == CPP_PRAGMA_EOL)
18308     return error_mark_node;
18309
18310   cp_lexer_consume_token (parser->lexer);
18311
18312   /* Accept = default or = delete in c++0x mode.  */
18313   if (token->keyword == RID_DEFAULT
18314       || token->keyword == RID_DELETE)
18315     {
18316       maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
18317       return token->u.value;
18318     }
18319
18320   /* c_lex_with_flags marks a single digit '0' with PURE_ZERO.  */
18321   if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
18322     {
18323       cp_parser_error (parser,
18324                        "invalid pure specifier (only %<= 0%> is allowed)");
18325       cp_parser_skip_to_end_of_statement (parser);
18326       return error_mark_node;
18327     }
18328   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
18329     {
18330       error_at (token->location, "templates may not be %<virtual%>");
18331       return error_mark_node;
18332     }
18333
18334   return integer_zero_node;
18335 }
18336
18337 /* Parse a constant-initializer.
18338
18339    constant-initializer:
18340      = constant-expression
18341
18342    Returns a representation of the constant-expression.  */
18343
18344 static tree
18345 cp_parser_constant_initializer (cp_parser* parser)
18346 {
18347   /* Look for the `=' token.  */
18348   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18349     return error_mark_node;
18350
18351   /* It is invalid to write:
18352
18353        struct S { static const int i = { 7 }; };
18354
18355      */
18356   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18357     {
18358       cp_parser_error (parser,
18359                        "a brace-enclosed initializer is not allowed here");
18360       /* Consume the opening brace.  */
18361       cp_lexer_consume_token (parser->lexer);
18362       /* Skip the initializer.  */
18363       cp_parser_skip_to_closing_brace (parser);
18364       /* Look for the trailing `}'.  */
18365       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
18366
18367       return error_mark_node;
18368     }
18369
18370   return cp_parser_constant_expression (parser,
18371                                         /*allow_non_constant=*/false,
18372                                         NULL);
18373 }
18374
18375 /* Derived classes [gram.class.derived] */
18376
18377 /* Parse a base-clause.
18378
18379    base-clause:
18380      : base-specifier-list
18381
18382    base-specifier-list:
18383      base-specifier ... [opt]
18384      base-specifier-list , base-specifier ... [opt]
18385
18386    Returns a TREE_LIST representing the base-classes, in the order in
18387    which they were declared.  The representation of each node is as
18388    described by cp_parser_base_specifier.
18389
18390    In the case that no bases are specified, this function will return
18391    NULL_TREE, not ERROR_MARK_NODE.  */
18392
18393 static tree
18394 cp_parser_base_clause (cp_parser* parser)
18395 {
18396   tree bases = NULL_TREE;
18397
18398   /* Look for the `:' that begins the list.  */
18399   cp_parser_require (parser, CPP_COLON, RT_COLON);
18400
18401   /* Scan the base-specifier-list.  */
18402   while (true)
18403     {
18404       cp_token *token;
18405       tree base;
18406       bool pack_expansion_p = false;
18407
18408       /* Look for the base-specifier.  */
18409       base = cp_parser_base_specifier (parser);
18410       /* Look for the (optional) ellipsis. */
18411       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18412         {
18413           /* Consume the `...'. */
18414           cp_lexer_consume_token (parser->lexer);
18415
18416           pack_expansion_p = true;
18417         }
18418
18419       /* Add BASE to the front of the list.  */
18420       if (base && base != error_mark_node)
18421         {
18422           if (pack_expansion_p)
18423             /* Make this a pack expansion type. */
18424             TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
18425
18426           if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
18427             {
18428               TREE_CHAIN (base) = bases;
18429               bases = base;
18430             }
18431         }
18432       /* Peek at the next token.  */
18433       token = cp_lexer_peek_token (parser->lexer);
18434       /* If it's not a comma, then the list is complete.  */
18435       if (token->type != CPP_COMMA)
18436         break;
18437       /* Consume the `,'.  */
18438       cp_lexer_consume_token (parser->lexer);
18439     }
18440
18441   /* PARSER->SCOPE may still be non-NULL at this point, if the last
18442      base class had a qualified name.  However, the next name that
18443      appears is certainly not qualified.  */
18444   parser->scope = NULL_TREE;
18445   parser->qualifying_scope = NULL_TREE;
18446   parser->object_scope = NULL_TREE;
18447
18448   return nreverse (bases);
18449 }
18450
18451 /* Parse a base-specifier.
18452
18453    base-specifier:
18454      :: [opt] nested-name-specifier [opt] class-name
18455      virtual access-specifier [opt] :: [opt] nested-name-specifier
18456        [opt] class-name
18457      access-specifier virtual [opt] :: [opt] nested-name-specifier
18458        [opt] class-name
18459
18460    Returns a TREE_LIST.  The TREE_PURPOSE will be one of
18461    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
18462    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
18463    (or the ERROR_MARK_NODE) indicating the type that was specified.  */
18464
18465 static tree
18466 cp_parser_base_specifier (cp_parser* parser)
18467 {
18468   cp_token *token;
18469   bool done = false;
18470   bool virtual_p = false;
18471   bool duplicate_virtual_error_issued_p = false;
18472   bool duplicate_access_error_issued_p = false;
18473   bool class_scope_p, template_p;
18474   tree access = access_default_node;
18475   tree type;
18476
18477   /* Process the optional `virtual' and `access-specifier'.  */
18478   while (!done)
18479     {
18480       /* Peek at the next token.  */
18481       token = cp_lexer_peek_token (parser->lexer);
18482       /* Process `virtual'.  */
18483       switch (token->keyword)
18484         {
18485         case RID_VIRTUAL:
18486           /* If `virtual' appears more than once, issue an error.  */
18487           if (virtual_p && !duplicate_virtual_error_issued_p)
18488             {
18489               cp_parser_error (parser,
18490                                "%<virtual%> specified more than once in base-specified");
18491               duplicate_virtual_error_issued_p = true;
18492             }
18493
18494           virtual_p = true;
18495
18496           /* Consume the `virtual' token.  */
18497           cp_lexer_consume_token (parser->lexer);
18498
18499           break;
18500
18501         case RID_PUBLIC:
18502         case RID_PROTECTED:
18503         case RID_PRIVATE:
18504           /* If more than one access specifier appears, issue an
18505              error.  */
18506           if (access != access_default_node
18507               && !duplicate_access_error_issued_p)
18508             {
18509               cp_parser_error (parser,
18510                                "more than one access specifier in base-specified");
18511               duplicate_access_error_issued_p = true;
18512             }
18513
18514           access = ridpointers[(int) token->keyword];
18515
18516           /* Consume the access-specifier.  */
18517           cp_lexer_consume_token (parser->lexer);
18518
18519           break;
18520
18521         default:
18522           done = true;
18523           break;
18524         }
18525     }
18526   /* It is not uncommon to see programs mechanically, erroneously, use
18527      the 'typename' keyword to denote (dependent) qualified types
18528      as base classes.  */
18529   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
18530     {
18531       token = cp_lexer_peek_token (parser->lexer);
18532       if (!processing_template_decl)
18533         error_at (token->location,
18534                   "keyword %<typename%> not allowed outside of templates");
18535       else
18536         error_at (token->location,
18537                   "keyword %<typename%> not allowed in this context "
18538                   "(the base class is implicitly a type)");
18539       cp_lexer_consume_token (parser->lexer);
18540     }
18541
18542   /* Look for the optional `::' operator.  */
18543   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
18544   /* Look for the nested-name-specifier.  The simplest way to
18545      implement:
18546
18547        [temp.res]
18548
18549        The keyword `typename' is not permitted in a base-specifier or
18550        mem-initializer; in these contexts a qualified name that
18551        depends on a template-parameter is implicitly assumed to be a
18552        type name.
18553
18554      is to pretend that we have seen the `typename' keyword at this
18555      point.  */
18556   cp_parser_nested_name_specifier_opt (parser,
18557                                        /*typename_keyword_p=*/true,
18558                                        /*check_dependency_p=*/true,
18559                                        typename_type,
18560                                        /*is_declaration=*/true);
18561   /* If the base class is given by a qualified name, assume that names
18562      we see are type names or templates, as appropriate.  */
18563   class_scope_p = (parser->scope && TYPE_P (parser->scope));
18564   template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
18565
18566   if (!parser->scope
18567       && cp_lexer_next_token_is_decltype (parser->lexer))
18568     /* DR 950 allows decltype as a base-specifier.  */
18569     type = cp_parser_decltype (parser);
18570   else
18571     {
18572       /* Otherwise, look for the class-name.  */
18573       type = cp_parser_class_name (parser,
18574                                    class_scope_p,
18575                                    template_p,
18576                                    typename_type,
18577                                    /*check_dependency_p=*/true,
18578                                    /*class_head_p=*/false,
18579                                    /*is_declaration=*/true);
18580       type = TREE_TYPE (type);
18581     }
18582
18583   if (type == error_mark_node)
18584     return error_mark_node;
18585
18586   return finish_base_specifier (type, access, virtual_p);
18587 }
18588
18589 /* Exception handling [gram.exception] */
18590
18591 /* Parse an (optional) exception-specification.
18592
18593    exception-specification:
18594      throw ( type-id-list [opt] )
18595
18596    Returns a TREE_LIST representing the exception-specification.  The
18597    TREE_VALUE of each node is a type.  */
18598
18599 static tree
18600 cp_parser_exception_specification_opt (cp_parser* parser)
18601 {
18602   cp_token *token;
18603   tree type_id_list;
18604   const char *saved_message;
18605
18606   /* Peek at the next token.  */
18607   token = cp_lexer_peek_token (parser->lexer);
18608
18609   /* Is it a noexcept-specification?  */
18610   if (cp_parser_is_keyword (token, RID_NOEXCEPT))
18611     {
18612       tree expr;
18613       cp_lexer_consume_token (parser->lexer);
18614
18615       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
18616         {
18617           cp_lexer_consume_token (parser->lexer);
18618
18619           /* Types may not be defined in an exception-specification.  */
18620           saved_message = parser->type_definition_forbidden_message;
18621           parser->type_definition_forbidden_message
18622             = G_("types may not be defined in an exception-specification");
18623
18624           expr = cp_parser_constant_expression (parser, false, NULL);
18625
18626           /* Restore the saved message.  */
18627           parser->type_definition_forbidden_message = saved_message;
18628
18629           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18630         }
18631       else
18632         expr = boolean_true_node;
18633
18634       return build_noexcept_spec (expr, tf_warning_or_error);
18635     }
18636
18637   /* If it's not `throw', then there's no exception-specification.  */
18638   if (!cp_parser_is_keyword (token, RID_THROW))
18639     return NULL_TREE;
18640
18641 #if 0
18642   /* Enable this once a lot of code has transitioned to noexcept?  */
18643   if (cxx_dialect == cxx0x && !in_system_header)
18644     warning (OPT_Wdeprecated, "dynamic exception specifications are "
18645              "deprecated in C++0x; use %<noexcept%> instead");
18646 #endif
18647
18648   /* Consume the `throw'.  */
18649   cp_lexer_consume_token (parser->lexer);
18650
18651   /* Look for the `('.  */
18652   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18653
18654   /* Peek at the next token.  */
18655   token = cp_lexer_peek_token (parser->lexer);
18656   /* If it's not a `)', then there is a type-id-list.  */
18657   if (token->type != CPP_CLOSE_PAREN)
18658     {
18659       /* Types may not be defined in an exception-specification.  */
18660       saved_message = parser->type_definition_forbidden_message;
18661       parser->type_definition_forbidden_message
18662         = G_("types may not be defined in an exception-specification");
18663       /* Parse the type-id-list.  */
18664       type_id_list = cp_parser_type_id_list (parser);
18665       /* Restore the saved message.  */
18666       parser->type_definition_forbidden_message = saved_message;
18667     }
18668   else
18669     type_id_list = empty_except_spec;
18670
18671   /* Look for the `)'.  */
18672   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18673
18674   return type_id_list;
18675 }
18676
18677 /* Parse an (optional) type-id-list.
18678
18679    type-id-list:
18680      type-id ... [opt]
18681      type-id-list , type-id ... [opt]
18682
18683    Returns a TREE_LIST.  The TREE_VALUE of each node is a TYPE,
18684    in the order that the types were presented.  */
18685
18686 static tree
18687 cp_parser_type_id_list (cp_parser* parser)
18688 {
18689   tree types = NULL_TREE;
18690
18691   while (true)
18692     {
18693       cp_token *token;
18694       tree type;
18695
18696       /* Get the next type-id.  */
18697       type = cp_parser_type_id (parser);
18698       /* Parse the optional ellipsis. */
18699       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18700         {
18701           /* Consume the `...'. */
18702           cp_lexer_consume_token (parser->lexer);
18703
18704           /* Turn the type into a pack expansion expression. */
18705           type = make_pack_expansion (type);
18706         }
18707       /* Add it to the list.  */
18708       types = add_exception_specifier (types, type, /*complain=*/1);
18709       /* Peek at the next token.  */
18710       token = cp_lexer_peek_token (parser->lexer);
18711       /* If it is not a `,', we are done.  */
18712       if (token->type != CPP_COMMA)
18713         break;
18714       /* Consume the `,'.  */
18715       cp_lexer_consume_token (parser->lexer);
18716     }
18717
18718   return nreverse (types);
18719 }
18720
18721 /* Parse a try-block.
18722
18723    try-block:
18724      try compound-statement handler-seq  */
18725
18726 static tree
18727 cp_parser_try_block (cp_parser* parser)
18728 {
18729   tree try_block;
18730
18731   cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
18732   try_block = begin_try_block ();
18733   cp_parser_compound_statement (parser, NULL, true, false);
18734   finish_try_block (try_block);
18735   cp_parser_handler_seq (parser);
18736   finish_handler_sequence (try_block);
18737
18738   return try_block;
18739 }
18740
18741 /* Parse a function-try-block.
18742
18743    function-try-block:
18744      try ctor-initializer [opt] function-body handler-seq  */
18745
18746 static bool
18747 cp_parser_function_try_block (cp_parser* parser)
18748 {
18749   tree compound_stmt;
18750   tree try_block;
18751   bool ctor_initializer_p;
18752
18753   /* Look for the `try' keyword.  */
18754   if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
18755     return false;
18756   /* Let the rest of the front end know where we are.  */
18757   try_block = begin_function_try_block (&compound_stmt);
18758   /* Parse the function-body.  */
18759   ctor_initializer_p
18760     = cp_parser_ctor_initializer_opt_and_function_body (parser);
18761   /* We're done with the `try' part.  */
18762   finish_function_try_block (try_block);
18763   /* Parse the handlers.  */
18764   cp_parser_handler_seq (parser);
18765   /* We're done with the handlers.  */
18766   finish_function_handler_sequence (try_block, compound_stmt);
18767
18768   return ctor_initializer_p;
18769 }
18770
18771 /* Parse a handler-seq.
18772
18773    handler-seq:
18774      handler handler-seq [opt]  */
18775
18776 static void
18777 cp_parser_handler_seq (cp_parser* parser)
18778 {
18779   while (true)
18780     {
18781       cp_token *token;
18782
18783       /* Parse the handler.  */
18784       cp_parser_handler (parser);
18785       /* Peek at the next token.  */
18786       token = cp_lexer_peek_token (parser->lexer);
18787       /* If it's not `catch' then there are no more handlers.  */
18788       if (!cp_parser_is_keyword (token, RID_CATCH))
18789         break;
18790     }
18791 }
18792
18793 /* Parse a handler.
18794
18795    handler:
18796      catch ( exception-declaration ) compound-statement  */
18797
18798 static void
18799 cp_parser_handler (cp_parser* parser)
18800 {
18801   tree handler;
18802   tree declaration;
18803
18804   cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
18805   handler = begin_handler ();
18806   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18807   declaration = cp_parser_exception_declaration (parser);
18808   finish_handler_parms (declaration, handler);
18809   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18810   cp_parser_compound_statement (parser, NULL, false, false);
18811   finish_handler (handler);
18812 }
18813
18814 /* Parse an exception-declaration.
18815
18816    exception-declaration:
18817      type-specifier-seq declarator
18818      type-specifier-seq abstract-declarator
18819      type-specifier-seq
18820      ...
18821
18822    Returns a VAR_DECL for the declaration, or NULL_TREE if the
18823    ellipsis variant is used.  */
18824
18825 static tree
18826 cp_parser_exception_declaration (cp_parser* parser)
18827 {
18828   cp_decl_specifier_seq type_specifiers;
18829   cp_declarator *declarator;
18830   const char *saved_message;
18831
18832   /* If it's an ellipsis, it's easy to handle.  */
18833   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18834     {
18835       /* Consume the `...' token.  */
18836       cp_lexer_consume_token (parser->lexer);
18837       return NULL_TREE;
18838     }
18839
18840   /* Types may not be defined in exception-declarations.  */
18841   saved_message = parser->type_definition_forbidden_message;
18842   parser->type_definition_forbidden_message
18843     = G_("types may not be defined in exception-declarations");
18844
18845   /* Parse the type-specifier-seq.  */
18846   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
18847                                 /*is_trailing_return=*/false,
18848                                 &type_specifiers);
18849   /* If it's a `)', then there is no declarator.  */
18850   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
18851     declarator = NULL;
18852   else
18853     declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
18854                                        /*ctor_dtor_or_conv_p=*/NULL,
18855                                        /*parenthesized_p=*/NULL,
18856                                        /*member_p=*/false);
18857
18858   /* Restore the saved message.  */
18859   parser->type_definition_forbidden_message = saved_message;
18860
18861   if (!type_specifiers.any_specifiers_p)
18862     return error_mark_node;
18863
18864   return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
18865 }
18866
18867 /* Parse a throw-expression.
18868
18869    throw-expression:
18870      throw assignment-expression [opt]
18871
18872    Returns a THROW_EXPR representing the throw-expression.  */
18873
18874 static tree
18875 cp_parser_throw_expression (cp_parser* parser)
18876 {
18877   tree expression;
18878   cp_token* token;
18879
18880   cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
18881   token = cp_lexer_peek_token (parser->lexer);
18882   /* Figure out whether or not there is an assignment-expression
18883      following the "throw" keyword.  */
18884   if (token->type == CPP_COMMA
18885       || token->type == CPP_SEMICOLON
18886       || token->type == CPP_CLOSE_PAREN
18887       || token->type == CPP_CLOSE_SQUARE
18888       || token->type == CPP_CLOSE_BRACE
18889       || token->type == CPP_COLON)
18890     expression = NULL_TREE;
18891   else
18892     expression = cp_parser_assignment_expression (parser,
18893                                                   /*cast_p=*/false, NULL);
18894
18895   return build_throw (expression);
18896 }
18897
18898 /* GNU Extensions */
18899
18900 /* Parse an (optional) asm-specification.
18901
18902    asm-specification:
18903      asm ( string-literal )
18904
18905    If the asm-specification is present, returns a STRING_CST
18906    corresponding to the string-literal.  Otherwise, returns
18907    NULL_TREE.  */
18908
18909 static tree
18910 cp_parser_asm_specification_opt (cp_parser* parser)
18911 {
18912   cp_token *token;
18913   tree asm_specification;
18914
18915   /* Peek at the next token.  */
18916   token = cp_lexer_peek_token (parser->lexer);
18917   /* If the next token isn't the `asm' keyword, then there's no
18918      asm-specification.  */
18919   if (!cp_parser_is_keyword (token, RID_ASM))
18920     return NULL_TREE;
18921
18922   /* Consume the `asm' token.  */
18923   cp_lexer_consume_token (parser->lexer);
18924   /* Look for the `('.  */
18925   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18926
18927   /* Look for the string-literal.  */
18928   asm_specification = cp_parser_string_literal (parser, false, false);
18929
18930   /* Look for the `)'.  */
18931   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18932
18933   return asm_specification;
18934 }
18935
18936 /* Parse an asm-operand-list.
18937
18938    asm-operand-list:
18939      asm-operand
18940      asm-operand-list , asm-operand
18941
18942    asm-operand:
18943      string-literal ( expression )
18944      [ string-literal ] string-literal ( expression )
18945
18946    Returns a TREE_LIST representing the operands.  The TREE_VALUE of
18947    each node is the expression.  The TREE_PURPOSE is itself a
18948    TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
18949    string-literal (or NULL_TREE if not present) and whose TREE_VALUE
18950    is a STRING_CST for the string literal before the parenthesis. Returns
18951    ERROR_MARK_NODE if any of the operands are invalid.  */
18952
18953 static tree
18954 cp_parser_asm_operand_list (cp_parser* parser)
18955 {
18956   tree asm_operands = NULL_TREE;
18957   bool invalid_operands = false;
18958
18959   while (true)
18960     {
18961       tree string_literal;
18962       tree expression;
18963       tree name;
18964
18965       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
18966         {
18967           /* Consume the `[' token.  */
18968           cp_lexer_consume_token (parser->lexer);
18969           /* Read the operand name.  */
18970           name = cp_parser_identifier (parser);
18971           if (name != error_mark_node)
18972             name = build_string (IDENTIFIER_LENGTH (name),
18973                                  IDENTIFIER_POINTER (name));
18974           /* Look for the closing `]'.  */
18975           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
18976         }
18977       else
18978         name = NULL_TREE;
18979       /* Look for the string-literal.  */
18980       string_literal = cp_parser_string_literal (parser, false, false);
18981
18982       /* Look for the `('.  */
18983       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18984       /* Parse the expression.  */
18985       expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
18986       /* Look for the `)'.  */
18987       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18988
18989       if (name == error_mark_node 
18990           || string_literal == error_mark_node 
18991           || expression == error_mark_node)
18992         invalid_operands = true;
18993
18994       /* Add this operand to the list.  */
18995       asm_operands = tree_cons (build_tree_list (name, string_literal),
18996                                 expression,
18997                                 asm_operands);
18998       /* If the next token is not a `,', there are no more
18999          operands.  */
19000       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19001         break;
19002       /* Consume the `,'.  */
19003       cp_lexer_consume_token (parser->lexer);
19004     }
19005
19006   return invalid_operands ? error_mark_node : nreverse (asm_operands);
19007 }
19008
19009 /* Parse an asm-clobber-list.
19010
19011    asm-clobber-list:
19012      string-literal
19013      asm-clobber-list , string-literal
19014
19015    Returns a TREE_LIST, indicating the clobbers in the order that they
19016    appeared.  The TREE_VALUE of each node is a STRING_CST.  */
19017
19018 static tree
19019 cp_parser_asm_clobber_list (cp_parser* parser)
19020 {
19021   tree clobbers = NULL_TREE;
19022
19023   while (true)
19024     {
19025       tree string_literal;
19026
19027       /* Look for the string literal.  */
19028       string_literal = cp_parser_string_literal (parser, false, false);
19029       /* Add it to the list.  */
19030       clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
19031       /* If the next token is not a `,', then the list is
19032          complete.  */
19033       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19034         break;
19035       /* Consume the `,' token.  */
19036       cp_lexer_consume_token (parser->lexer);
19037     }
19038
19039   return clobbers;
19040 }
19041
19042 /* Parse an asm-label-list.
19043
19044    asm-label-list:
19045      identifier
19046      asm-label-list , identifier
19047
19048    Returns a TREE_LIST, indicating the labels in the order that they
19049    appeared.  The TREE_VALUE of each node is a label.  */
19050
19051 static tree
19052 cp_parser_asm_label_list (cp_parser* parser)
19053 {
19054   tree labels = NULL_TREE;
19055
19056   while (true)
19057     {
19058       tree identifier, label, name;
19059
19060       /* Look for the identifier.  */
19061       identifier = cp_parser_identifier (parser);
19062       if (!error_operand_p (identifier))
19063         {
19064           label = lookup_label (identifier);
19065           if (TREE_CODE (label) == LABEL_DECL)
19066             {
19067               TREE_USED (label) = 1;
19068               check_goto (label);
19069               name = build_string (IDENTIFIER_LENGTH (identifier),
19070                                    IDENTIFIER_POINTER (identifier));
19071               labels = tree_cons (name, label, labels);
19072             }
19073         }
19074       /* If the next token is not a `,', then the list is
19075          complete.  */
19076       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
19077         break;
19078       /* Consume the `,' token.  */
19079       cp_lexer_consume_token (parser->lexer);
19080     }
19081
19082   return nreverse (labels);
19083 }
19084
19085 /* Parse an (optional) series of attributes.
19086
19087    attributes:
19088      attributes attribute
19089
19090    attribute:
19091      __attribute__ (( attribute-list [opt] ))
19092
19093    The return value is as for cp_parser_attribute_list.  */
19094
19095 static tree
19096 cp_parser_attributes_opt (cp_parser* parser)
19097 {
19098   tree attributes = NULL_TREE;
19099
19100   while (true)
19101     {
19102       cp_token *token;
19103       tree attribute_list;
19104
19105       /* Peek at the next token.  */
19106       token = cp_lexer_peek_token (parser->lexer);
19107       /* If it's not `__attribute__', then we're done.  */
19108       if (token->keyword != RID_ATTRIBUTE)
19109         break;
19110
19111       /* Consume the `__attribute__' keyword.  */
19112       cp_lexer_consume_token (parser->lexer);
19113       /* Look for the two `(' tokens.  */
19114       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
19115       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
19116
19117       /* Peek at the next token.  */
19118       token = cp_lexer_peek_token (parser->lexer);
19119       if (token->type != CPP_CLOSE_PAREN)
19120         /* Parse the attribute-list.  */
19121         attribute_list = cp_parser_attribute_list (parser);
19122       else
19123         /* If the next token is a `)', then there is no attribute
19124            list.  */
19125         attribute_list = NULL;
19126
19127       /* Look for the two `)' tokens.  */
19128       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
19129       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
19130
19131       /* Add these new attributes to the list.  */
19132       attributes = chainon (attributes, attribute_list);
19133     }
19134
19135   return attributes;
19136 }
19137
19138 /* Parse an attribute-list.
19139
19140    attribute-list:
19141      attribute
19142      attribute-list , attribute
19143
19144    attribute:
19145      identifier
19146      identifier ( identifier )
19147      identifier ( identifier , expression-list )
19148      identifier ( expression-list )
19149
19150    Returns a TREE_LIST, or NULL_TREE on error.  Each node corresponds
19151    to an attribute.  The TREE_PURPOSE of each node is the identifier
19152    indicating which attribute is in use.  The TREE_VALUE represents
19153    the arguments, if any.  */
19154
19155 static tree
19156 cp_parser_attribute_list (cp_parser* parser)
19157 {
19158   tree attribute_list = NULL_TREE;
19159   bool save_translate_strings_p = parser->translate_strings_p;
19160
19161   parser->translate_strings_p = false;
19162   while (true)
19163     {
19164       cp_token *token;
19165       tree identifier;
19166       tree attribute;
19167
19168       /* Look for the identifier.  We also allow keywords here; for
19169          example `__attribute__ ((const))' is legal.  */
19170       token = cp_lexer_peek_token (parser->lexer);
19171       if (token->type == CPP_NAME
19172           || token->type == CPP_KEYWORD)
19173         {
19174           tree arguments = NULL_TREE;
19175
19176           /* Consume the token.  */
19177           token = cp_lexer_consume_token (parser->lexer);
19178
19179           /* Save away the identifier that indicates which attribute
19180              this is.  */
19181           identifier = (token->type == CPP_KEYWORD) 
19182             /* For keywords, use the canonical spelling, not the
19183                parsed identifier.  */
19184             ? ridpointers[(int) token->keyword]
19185             : token->u.value;
19186           
19187           attribute = build_tree_list (identifier, NULL_TREE);
19188
19189           /* Peek at the next token.  */
19190           token = cp_lexer_peek_token (parser->lexer);
19191           /* If it's an `(', then parse the attribute arguments.  */
19192           if (token->type == CPP_OPEN_PAREN)
19193             {
19194               VEC(tree,gc) *vec;
19195               int attr_flag = (attribute_takes_identifier_p (identifier)
19196                                ? id_attr : normal_attr);
19197               vec = cp_parser_parenthesized_expression_list
19198                     (parser, attr_flag, /*cast_p=*/false,
19199                      /*allow_expansion_p=*/false,
19200                      /*non_constant_p=*/NULL);
19201               if (vec == NULL)
19202                 arguments = error_mark_node;
19203               else
19204                 {
19205                   arguments = build_tree_list_vec (vec);
19206                   release_tree_vector (vec);
19207                 }
19208               /* Save the arguments away.  */
19209               TREE_VALUE (attribute) = arguments;
19210             }
19211
19212           if (arguments != error_mark_node)
19213             {
19214               /* Add this attribute to the list.  */
19215               TREE_CHAIN (attribute) = attribute_list;
19216               attribute_list = attribute;
19217             }
19218
19219           token = cp_lexer_peek_token (parser->lexer);
19220         }
19221       /* Now, look for more attributes.  If the next token isn't a
19222          `,', we're done.  */
19223       if (token->type != CPP_COMMA)
19224         break;
19225
19226       /* Consume the comma and keep going.  */
19227       cp_lexer_consume_token (parser->lexer);
19228     }
19229   parser->translate_strings_p = save_translate_strings_p;
19230
19231   /* We built up the list in reverse order.  */
19232   return nreverse (attribute_list);
19233 }
19234
19235 /* Parse an optional `__extension__' keyword.  Returns TRUE if it is
19236    present, and FALSE otherwise.  *SAVED_PEDANTIC is set to the
19237    current value of the PEDANTIC flag, regardless of whether or not
19238    the `__extension__' keyword is present.  The caller is responsible
19239    for restoring the value of the PEDANTIC flag.  */
19240
19241 static bool
19242 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
19243 {
19244   /* Save the old value of the PEDANTIC flag.  */
19245   *saved_pedantic = pedantic;
19246
19247   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
19248     {
19249       /* Consume the `__extension__' token.  */
19250       cp_lexer_consume_token (parser->lexer);
19251       /* We're not being pedantic while the `__extension__' keyword is
19252          in effect.  */
19253       pedantic = 0;
19254
19255       return true;
19256     }
19257
19258   return false;
19259 }
19260
19261 /* Parse a label declaration.
19262
19263    label-declaration:
19264      __label__ label-declarator-seq ;
19265
19266    label-declarator-seq:
19267      identifier , label-declarator-seq
19268      identifier  */
19269
19270 static void
19271 cp_parser_label_declaration (cp_parser* parser)
19272 {
19273   /* Look for the `__label__' keyword.  */
19274   cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
19275
19276   while (true)
19277     {
19278       tree identifier;
19279
19280       /* Look for an identifier.  */
19281       identifier = cp_parser_identifier (parser);
19282       /* If we failed, stop.  */
19283       if (identifier == error_mark_node)
19284         break;
19285       /* Declare it as a label.  */
19286       finish_label_decl (identifier);
19287       /* If the next token is a `;', stop.  */
19288       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
19289         break;
19290       /* Look for the `,' separating the label declarations.  */
19291       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
19292     }
19293
19294   /* Look for the final `;'.  */
19295   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19296 }
19297
19298 /* Support Functions */
19299
19300 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
19301    NAME should have one of the representations used for an
19302    id-expression.  If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
19303    is returned.  If PARSER->SCOPE is a dependent type, then a
19304    SCOPE_REF is returned.
19305
19306    If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
19307    returned; the name was already resolved when the TEMPLATE_ID_EXPR
19308    was formed.  Abstractly, such entities should not be passed to this
19309    function, because they do not need to be looked up, but it is
19310    simpler to check for this special case here, rather than at the
19311    call-sites.
19312
19313    In cases not explicitly covered above, this function returns a
19314    DECL, OVERLOAD, or baselink representing the result of the lookup.
19315    If there was no entity with the indicated NAME, the ERROR_MARK_NODE
19316    is returned.
19317
19318    If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
19319    (e.g., "struct") that was used.  In that case bindings that do not
19320    refer to types are ignored.
19321
19322    If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
19323    ignored.
19324
19325    If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
19326    are ignored.
19327
19328    If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
19329    types.
19330
19331    If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
19332    TREE_LIST of candidates if name-lookup results in an ambiguity, and
19333    NULL_TREE otherwise.  */
19334
19335 static tree
19336 cp_parser_lookup_name (cp_parser *parser, tree name,
19337                        enum tag_types tag_type,
19338                        bool is_template,
19339                        bool is_namespace,
19340                        bool check_dependency,
19341                        tree *ambiguous_decls,
19342                        location_t name_location)
19343 {
19344   int flags = 0;
19345   tree decl;
19346   tree object_type = parser->context->object_type;
19347
19348   if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
19349     flags |= LOOKUP_COMPLAIN;
19350
19351   /* Assume that the lookup will be unambiguous.  */
19352   if (ambiguous_decls)
19353     *ambiguous_decls = NULL_TREE;
19354
19355   /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
19356      no longer valid.  Note that if we are parsing tentatively, and
19357      the parse fails, OBJECT_TYPE will be automatically restored.  */
19358   parser->context->object_type = NULL_TREE;
19359
19360   if (name == error_mark_node)
19361     return error_mark_node;
19362
19363   /* A template-id has already been resolved; there is no lookup to
19364      do.  */
19365   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
19366     return name;
19367   if (BASELINK_P (name))
19368     {
19369       gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
19370                   == TEMPLATE_ID_EXPR);
19371       return name;
19372     }
19373
19374   /* A BIT_NOT_EXPR is used to represent a destructor.  By this point,
19375      it should already have been checked to make sure that the name
19376      used matches the type being destroyed.  */
19377   if (TREE_CODE (name) == BIT_NOT_EXPR)
19378     {
19379       tree type;
19380
19381       /* Figure out to which type this destructor applies.  */
19382       if (parser->scope)
19383         type = parser->scope;
19384       else if (object_type)
19385         type = object_type;
19386       else
19387         type = current_class_type;
19388       /* If that's not a class type, there is no destructor.  */
19389       if (!type || !CLASS_TYPE_P (type))
19390         return error_mark_node;
19391       if (CLASSTYPE_LAZY_DESTRUCTOR (type))
19392         lazily_declare_fn (sfk_destructor, type);
19393       if (!CLASSTYPE_DESTRUCTORS (type))
19394           return error_mark_node;
19395       /* If it was a class type, return the destructor.  */
19396       return CLASSTYPE_DESTRUCTORS (type);
19397     }
19398
19399   /* By this point, the NAME should be an ordinary identifier.  If
19400      the id-expression was a qualified name, the qualifying scope is
19401      stored in PARSER->SCOPE at this point.  */
19402   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
19403
19404   /* Perform the lookup.  */
19405   if (parser->scope)
19406     {
19407       bool dependent_p;
19408
19409       if (parser->scope == error_mark_node)
19410         return error_mark_node;
19411
19412       /* If the SCOPE is dependent, the lookup must be deferred until
19413          the template is instantiated -- unless we are explicitly
19414          looking up names in uninstantiated templates.  Even then, we
19415          cannot look up the name if the scope is not a class type; it
19416          might, for example, be a template type parameter.  */
19417       dependent_p = (TYPE_P (parser->scope)
19418                      && dependent_scope_p (parser->scope));
19419       if ((check_dependency || !CLASS_TYPE_P (parser->scope))
19420           && dependent_p)
19421         /* Defer lookup.  */
19422         decl = error_mark_node;
19423       else
19424         {
19425           tree pushed_scope = NULL_TREE;
19426
19427           /* If PARSER->SCOPE is a dependent type, then it must be a
19428              class type, and we must not be checking dependencies;
19429              otherwise, we would have processed this lookup above.  So
19430              that PARSER->SCOPE is not considered a dependent base by
19431              lookup_member, we must enter the scope here.  */
19432           if (dependent_p)
19433             pushed_scope = push_scope (parser->scope);
19434
19435           /* If the PARSER->SCOPE is a template specialization, it
19436              may be instantiated during name lookup.  In that case,
19437              errors may be issued.  Even if we rollback the current
19438              tentative parse, those errors are valid.  */
19439           decl = lookup_qualified_name (parser->scope, name,
19440                                         tag_type != none_type,
19441                                         /*complain=*/true);
19442
19443           /* 3.4.3.1: In a lookup in which the constructor is an acceptable
19444              lookup result and the nested-name-specifier nominates a class C:
19445                * if the name specified after the nested-name-specifier, when
19446                looked up in C, is the injected-class-name of C (Clause 9), or
19447                * if the name specified after the nested-name-specifier is the
19448                same as the identifier or the simple-template-id's template-
19449                name in the last component of the nested-name-specifier,
19450              the name is instead considered to name the constructor of
19451              class C. [ Note: for example, the constructor is not an
19452              acceptable lookup result in an elaborated-type-specifier so
19453              the constructor would not be used in place of the
19454              injected-class-name. --end note ] Such a constructor name
19455              shall be used only in the declarator-id of a declaration that
19456              names a constructor or in a using-declaration.  */
19457           if (tag_type == none_type
19458               && DECL_SELF_REFERENCE_P (decl)
19459               && same_type_p (DECL_CONTEXT (decl), parser->scope))
19460             decl = lookup_qualified_name (parser->scope, ctor_identifier,
19461                                           tag_type != none_type,
19462                                           /*complain=*/true);
19463
19464           /* If we have a single function from a using decl, pull it out.  */
19465           if (TREE_CODE (decl) == OVERLOAD
19466               && !really_overloaded_fn (decl))
19467             decl = OVL_FUNCTION (decl);
19468
19469           if (pushed_scope)
19470             pop_scope (pushed_scope);
19471         }
19472
19473       /* If the scope is a dependent type and either we deferred lookup or
19474          we did lookup but didn't find the name, rememeber the name.  */
19475       if (decl == error_mark_node && TYPE_P (parser->scope)
19476           && dependent_type_p (parser->scope))
19477         {
19478           if (tag_type)
19479             {
19480               tree type;
19481
19482               /* The resolution to Core Issue 180 says that `struct
19483                  A::B' should be considered a type-name, even if `A'
19484                  is dependent.  */
19485               type = make_typename_type (parser->scope, name, tag_type,
19486                                          /*complain=*/tf_error);
19487               decl = TYPE_NAME (type);
19488             }
19489           else if (is_template
19490                    && (cp_parser_next_token_ends_template_argument_p (parser)
19491                        || cp_lexer_next_token_is (parser->lexer,
19492                                                   CPP_CLOSE_PAREN)))
19493             decl = make_unbound_class_template (parser->scope,
19494                                                 name, NULL_TREE,
19495                                                 /*complain=*/tf_error);
19496           else
19497             decl = build_qualified_name (/*type=*/NULL_TREE,
19498                                          parser->scope, name,
19499                                          is_template);
19500         }
19501       parser->qualifying_scope = parser->scope;
19502       parser->object_scope = NULL_TREE;
19503     }
19504   else if (object_type)
19505     {
19506       tree object_decl = NULL_TREE;
19507       /* Look up the name in the scope of the OBJECT_TYPE, unless the
19508          OBJECT_TYPE is not a class.  */
19509       if (CLASS_TYPE_P (object_type))
19510         /* If the OBJECT_TYPE is a template specialization, it may
19511            be instantiated during name lookup.  In that case, errors
19512            may be issued.  Even if we rollback the current tentative
19513            parse, those errors are valid.  */
19514         object_decl = lookup_member (object_type,
19515                                      name,
19516                                      /*protect=*/0,
19517                                      tag_type != none_type);
19518       /* Look it up in the enclosing context, too.  */
19519       decl = lookup_name_real (name, tag_type != none_type,
19520                                /*nonclass=*/0,
19521                                /*block_p=*/true, is_namespace, flags);
19522       parser->object_scope = object_type;
19523       parser->qualifying_scope = NULL_TREE;
19524       if (object_decl)
19525         decl = object_decl;
19526     }
19527   else
19528     {
19529       decl = lookup_name_real (name, tag_type != none_type,
19530                                /*nonclass=*/0,
19531                                /*block_p=*/true, is_namespace, flags);
19532       parser->qualifying_scope = NULL_TREE;
19533       parser->object_scope = NULL_TREE;
19534     }
19535
19536   /* If the lookup failed, let our caller know.  */
19537   if (!decl || decl == error_mark_node)
19538     return error_mark_node;
19539
19540   /* Pull out the template from an injected-class-name (or multiple).  */
19541   if (is_template)
19542     decl = maybe_get_template_decl_from_type_decl (decl);
19543
19544   /* If it's a TREE_LIST, the result of the lookup was ambiguous.  */
19545   if (TREE_CODE (decl) == TREE_LIST)
19546     {
19547       if (ambiguous_decls)
19548         *ambiguous_decls = decl;
19549       /* The error message we have to print is too complicated for
19550          cp_parser_error, so we incorporate its actions directly.  */
19551       if (!cp_parser_simulate_error (parser))
19552         {
19553           error_at (name_location, "reference to %qD is ambiguous",
19554                     name);
19555           print_candidates (decl);
19556         }
19557       return error_mark_node;
19558     }
19559
19560   gcc_assert (DECL_P (decl)
19561               || TREE_CODE (decl) == OVERLOAD
19562               || TREE_CODE (decl) == SCOPE_REF
19563               || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
19564               || BASELINK_P (decl));
19565
19566   /* If we have resolved the name of a member declaration, check to
19567      see if the declaration is accessible.  When the name resolves to
19568      set of overloaded functions, accessibility is checked when
19569      overload resolution is done.
19570
19571      During an explicit instantiation, access is not checked at all,
19572      as per [temp.explicit].  */
19573   if (DECL_P (decl))
19574     check_accessibility_of_qualified_id (decl, object_type, parser->scope);
19575
19576   return decl;
19577 }
19578
19579 /* Like cp_parser_lookup_name, but for use in the typical case where
19580    CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
19581    IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE.  */
19582
19583 static tree
19584 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
19585 {
19586   return cp_parser_lookup_name (parser, name,
19587                                 none_type,
19588                                 /*is_template=*/false,
19589                                 /*is_namespace=*/false,
19590                                 /*check_dependency=*/true,
19591                                 /*ambiguous_decls=*/NULL,
19592                                 location);
19593 }
19594
19595 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
19596    the current context, return the TYPE_DECL.  If TAG_NAME_P is
19597    true, the DECL indicates the class being defined in a class-head,
19598    or declared in an elaborated-type-specifier.
19599
19600    Otherwise, return DECL.  */
19601
19602 static tree
19603 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
19604 {
19605   /* If the TEMPLATE_DECL is being declared as part of a class-head,
19606      the translation from TEMPLATE_DECL to TYPE_DECL occurs:
19607
19608        struct A {
19609          template <typename T> struct B;
19610        };
19611
19612        template <typename T> struct A::B {};
19613
19614      Similarly, in an elaborated-type-specifier:
19615
19616        namespace N { struct X{}; }
19617
19618        struct A {
19619          template <typename T> friend struct N::X;
19620        };
19621
19622      However, if the DECL refers to a class type, and we are in
19623      the scope of the class, then the name lookup automatically
19624      finds the TYPE_DECL created by build_self_reference rather
19625      than a TEMPLATE_DECL.  For example, in:
19626
19627        template <class T> struct S {
19628          S s;
19629        };
19630
19631      there is no need to handle such case.  */
19632
19633   if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
19634     return DECL_TEMPLATE_RESULT (decl);
19635
19636   return decl;
19637 }
19638
19639 /* If too many, or too few, template-parameter lists apply to the
19640    declarator, issue an error message.  Returns TRUE if all went well,
19641    and FALSE otherwise.  */
19642
19643 static bool
19644 cp_parser_check_declarator_template_parameters (cp_parser* parser,
19645                                                 cp_declarator *declarator,
19646                                                 location_t declarator_location)
19647 {
19648   unsigned num_templates;
19649
19650   /* We haven't seen any classes that involve template parameters yet.  */
19651   num_templates = 0;
19652
19653   switch (declarator->kind)
19654     {
19655     case cdk_id:
19656       if (declarator->u.id.qualifying_scope)
19657         {
19658           tree scope;
19659
19660           scope = declarator->u.id.qualifying_scope;
19661
19662           while (scope && CLASS_TYPE_P (scope))
19663             {
19664               /* You're supposed to have one `template <...>'
19665                  for every template class, but you don't need one
19666                  for a full specialization.  For example:
19667
19668                  template <class T> struct S{};
19669                  template <> struct S<int> { void f(); };
19670                  void S<int>::f () {}
19671
19672                  is correct; there shouldn't be a `template <>' for
19673                  the definition of `S<int>::f'.  */
19674               if (!CLASSTYPE_TEMPLATE_INFO (scope))
19675                 /* If SCOPE does not have template information of any
19676                    kind, then it is not a template, nor is it nested
19677                    within a template.  */
19678                 break;
19679               if (explicit_class_specialization_p (scope))
19680                 break;
19681               if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope)))
19682                 ++num_templates;
19683
19684               scope = TYPE_CONTEXT (scope);
19685             }
19686         }
19687       else if (TREE_CODE (declarator->u.id.unqualified_name)
19688                == TEMPLATE_ID_EXPR)
19689         /* If the DECLARATOR has the form `X<y>' then it uses one
19690            additional level of template parameters.  */
19691         ++num_templates;
19692
19693       return cp_parser_check_template_parameters 
19694         (parser, num_templates, declarator_location, declarator);
19695
19696
19697     case cdk_function:
19698     case cdk_array:
19699     case cdk_pointer:
19700     case cdk_reference:
19701     case cdk_ptrmem:
19702       return (cp_parser_check_declarator_template_parameters
19703               (parser, declarator->declarator, declarator_location));
19704
19705     case cdk_error:
19706       return true;
19707
19708     default:
19709       gcc_unreachable ();
19710     }
19711   return false;
19712 }
19713
19714 /* NUM_TEMPLATES were used in the current declaration.  If that is
19715    invalid, return FALSE and issue an error messages.  Otherwise,
19716    return TRUE.  If DECLARATOR is non-NULL, then we are checking a
19717    declarator and we can print more accurate diagnostics.  */
19718
19719 static bool
19720 cp_parser_check_template_parameters (cp_parser* parser,
19721                                      unsigned num_templates,
19722                                      location_t location,
19723                                      cp_declarator *declarator)
19724 {
19725   /* If there are the same number of template classes and parameter
19726      lists, that's OK.  */
19727   if (parser->num_template_parameter_lists == num_templates)
19728     return true;
19729   /* If there are more, but only one more, then we are referring to a
19730      member template.  That's OK too.  */
19731   if (parser->num_template_parameter_lists == num_templates + 1)
19732     return true;
19733   /* If there are more template classes than parameter lists, we have
19734      something like:
19735
19736        template <class T> void S<T>::R<T>::f ();  */
19737   if (parser->num_template_parameter_lists < num_templates)
19738     {
19739       if (declarator && !current_function_decl)
19740         error_at (location, "specializing member %<%T::%E%> "
19741                   "requires %<template<>%> syntax", 
19742                   declarator->u.id.qualifying_scope,
19743                   declarator->u.id.unqualified_name);
19744       else if (declarator)
19745         error_at (location, "invalid declaration of %<%T::%E%>",
19746                   declarator->u.id.qualifying_scope,
19747                   declarator->u.id.unqualified_name);
19748       else 
19749         error_at (location, "too few template-parameter-lists");
19750       return false;
19751     }
19752   /* Otherwise, there are too many template parameter lists.  We have
19753      something like:
19754
19755      template <class T> template <class U> void S::f();  */
19756   error_at (location, "too many template-parameter-lists");
19757   return false;
19758 }
19759
19760 /* Parse an optional `::' token indicating that the following name is
19761    from the global namespace.  If so, PARSER->SCOPE is set to the
19762    GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
19763    unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
19764    Returns the new value of PARSER->SCOPE, if the `::' token is
19765    present, and NULL_TREE otherwise.  */
19766
19767 static tree
19768 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
19769 {
19770   cp_token *token;
19771
19772   /* Peek at the next token.  */
19773   token = cp_lexer_peek_token (parser->lexer);
19774   /* If we're looking at a `::' token then we're starting from the
19775      global namespace, not our current location.  */
19776   if (token->type == CPP_SCOPE)
19777     {
19778       /* Consume the `::' token.  */
19779       cp_lexer_consume_token (parser->lexer);
19780       /* Set the SCOPE so that we know where to start the lookup.  */
19781       parser->scope = global_namespace;
19782       parser->qualifying_scope = global_namespace;
19783       parser->object_scope = NULL_TREE;
19784
19785       return parser->scope;
19786     }
19787   else if (!current_scope_valid_p)
19788     {
19789       parser->scope = NULL_TREE;
19790       parser->qualifying_scope = NULL_TREE;
19791       parser->object_scope = NULL_TREE;
19792     }
19793
19794   return NULL_TREE;
19795 }
19796
19797 /* Returns TRUE if the upcoming token sequence is the start of a
19798    constructor declarator.  If FRIEND_P is true, the declarator is
19799    preceded by the `friend' specifier.  */
19800
19801 static bool
19802 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
19803 {
19804   bool constructor_p;
19805   tree nested_name_specifier;
19806   cp_token *next_token;
19807
19808   /* The common case is that this is not a constructor declarator, so
19809      try to avoid doing lots of work if at all possible.  It's not
19810      valid declare a constructor at function scope.  */
19811   if (parser->in_function_body)
19812     return false;
19813   /* And only certain tokens can begin a constructor declarator.  */
19814   next_token = cp_lexer_peek_token (parser->lexer);
19815   if (next_token->type != CPP_NAME
19816       && next_token->type != CPP_SCOPE
19817       && next_token->type != CPP_NESTED_NAME_SPECIFIER
19818       && next_token->type != CPP_TEMPLATE_ID)
19819     return false;
19820
19821   /* Parse tentatively; we are going to roll back all of the tokens
19822      consumed here.  */
19823   cp_parser_parse_tentatively (parser);
19824   /* Assume that we are looking at a constructor declarator.  */
19825   constructor_p = true;
19826
19827   /* Look for the optional `::' operator.  */
19828   cp_parser_global_scope_opt (parser,
19829                               /*current_scope_valid_p=*/false);
19830   /* Look for the nested-name-specifier.  */
19831   nested_name_specifier
19832     = (cp_parser_nested_name_specifier_opt (parser,
19833                                             /*typename_keyword_p=*/false,
19834                                             /*check_dependency_p=*/false,
19835                                             /*type_p=*/false,
19836                                             /*is_declaration=*/false));
19837   /* Outside of a class-specifier, there must be a
19838      nested-name-specifier.  */
19839   if (!nested_name_specifier &&
19840       (!at_class_scope_p () || !TYPE_BEING_DEFINED (current_class_type)
19841        || friend_p))
19842     constructor_p = false;
19843   else if (nested_name_specifier == error_mark_node)
19844     constructor_p = false;
19845
19846   /* If we have a class scope, this is easy; DR 147 says that S::S always
19847      names the constructor, and no other qualified name could.  */
19848   if (constructor_p && nested_name_specifier
19849       && CLASS_TYPE_P (nested_name_specifier))
19850     {
19851       tree id = cp_parser_unqualified_id (parser,
19852                                           /*template_keyword_p=*/false,
19853                                           /*check_dependency_p=*/false,
19854                                           /*declarator_p=*/true,
19855                                           /*optional_p=*/false);
19856       if (is_overloaded_fn (id))
19857         id = DECL_NAME (get_first_fn (id));
19858       if (!constructor_name_p (id, nested_name_specifier))
19859         constructor_p = false;
19860     }
19861   /* If we still think that this might be a constructor-declarator,
19862      look for a class-name.  */
19863   else if (constructor_p)
19864     {
19865       /* If we have:
19866
19867            template <typename T> struct S {
19868              S();
19869            };
19870
19871          we must recognize that the nested `S' names a class.  */
19872       tree type_decl;
19873       type_decl = cp_parser_class_name (parser,
19874                                         /*typename_keyword_p=*/false,
19875                                         /*template_keyword_p=*/false,
19876                                         none_type,
19877                                         /*check_dependency_p=*/false,
19878                                         /*class_head_p=*/false,
19879                                         /*is_declaration=*/false);
19880       /* If there was no class-name, then this is not a constructor.  */
19881       constructor_p = !cp_parser_error_occurred (parser);
19882
19883       /* If we're still considering a constructor, we have to see a `(',
19884          to begin the parameter-declaration-clause, followed by either a
19885          `)', an `...', or a decl-specifier.  We need to check for a
19886          type-specifier to avoid being fooled into thinking that:
19887
19888            S (f) (int);
19889
19890          is a constructor.  (It is actually a function named `f' that
19891          takes one parameter (of type `int') and returns a value of type
19892          `S'.  */
19893       if (constructor_p
19894           && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
19895         constructor_p = false;
19896
19897       if (constructor_p
19898           && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
19899           && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
19900           /* A parameter declaration begins with a decl-specifier,
19901              which is either the "attribute" keyword, a storage class
19902              specifier, or (usually) a type-specifier.  */
19903           && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
19904         {
19905           tree type;
19906           tree pushed_scope = NULL_TREE;
19907           unsigned saved_num_template_parameter_lists;
19908
19909           /* Names appearing in the type-specifier should be looked up
19910              in the scope of the class.  */
19911           if (current_class_type)
19912             type = NULL_TREE;
19913           else
19914             {
19915               type = TREE_TYPE (type_decl);
19916               if (TREE_CODE (type) == TYPENAME_TYPE)
19917                 {
19918                   type = resolve_typename_type (type,
19919                                                 /*only_current_p=*/false);
19920                   if (TREE_CODE (type) == TYPENAME_TYPE)
19921                     {
19922                       cp_parser_abort_tentative_parse (parser);
19923                       return false;
19924                     }
19925                 }
19926               pushed_scope = push_scope (type);
19927             }
19928
19929           /* Inside the constructor parameter list, surrounding
19930              template-parameter-lists do not apply.  */
19931           saved_num_template_parameter_lists
19932             = parser->num_template_parameter_lists;
19933           parser->num_template_parameter_lists = 0;
19934
19935           /* Look for the type-specifier.  */
19936           cp_parser_type_specifier (parser,
19937                                     CP_PARSER_FLAGS_NONE,
19938                                     /*decl_specs=*/NULL,
19939                                     /*is_declarator=*/true,
19940                                     /*declares_class_or_enum=*/NULL,
19941                                     /*is_cv_qualifier=*/NULL);
19942
19943           parser->num_template_parameter_lists
19944             = saved_num_template_parameter_lists;
19945
19946           /* Leave the scope of the class.  */
19947           if (pushed_scope)
19948             pop_scope (pushed_scope);
19949
19950           constructor_p = !cp_parser_error_occurred (parser);
19951         }
19952     }
19953
19954   /* We did not really want to consume any tokens.  */
19955   cp_parser_abort_tentative_parse (parser);
19956
19957   return constructor_p;
19958 }
19959
19960 /* Parse the definition of the function given by the DECL_SPECIFIERS,
19961    ATTRIBUTES, and DECLARATOR.  The access checks have been deferred;
19962    they must be performed once we are in the scope of the function.
19963
19964    Returns the function defined.  */
19965
19966 static tree
19967 cp_parser_function_definition_from_specifiers_and_declarator
19968   (cp_parser* parser,
19969    cp_decl_specifier_seq *decl_specifiers,
19970    tree attributes,
19971    const cp_declarator *declarator)
19972 {
19973   tree fn;
19974   bool success_p;
19975
19976   /* Begin the function-definition.  */
19977   success_p = start_function (decl_specifiers, declarator, attributes);
19978
19979   /* The things we're about to see are not directly qualified by any
19980      template headers we've seen thus far.  */
19981   reset_specialization ();
19982
19983   /* If there were names looked up in the decl-specifier-seq that we
19984      did not check, check them now.  We must wait until we are in the
19985      scope of the function to perform the checks, since the function
19986      might be a friend.  */
19987   perform_deferred_access_checks ();
19988
19989   if (!success_p)
19990     {
19991       /* Skip the entire function.  */
19992       cp_parser_skip_to_end_of_block_or_statement (parser);
19993       fn = error_mark_node;
19994     }
19995   else if (DECL_INITIAL (current_function_decl) != error_mark_node)
19996     {
19997       /* Seen already, skip it.  An error message has already been output.  */
19998       cp_parser_skip_to_end_of_block_or_statement (parser);
19999       fn = current_function_decl;
20000       current_function_decl = NULL_TREE;
20001       /* If this is a function from a class, pop the nested class.  */
20002       if (current_class_name)
20003         pop_nested_class ();
20004     }
20005   else
20006     {
20007       timevar_id_t tv;
20008       if (DECL_DECLARED_INLINE_P (current_function_decl))
20009         tv = TV_PARSE_INLINE;
20010       else
20011         tv = TV_PARSE_FUNC;
20012       timevar_push (tv);
20013       fn = cp_parser_function_definition_after_declarator (parser,
20014                                                          /*inline_p=*/false);
20015       timevar_pop (tv);
20016     }
20017
20018   return fn;
20019 }
20020
20021 /* Parse the part of a function-definition that follows the
20022    declarator.  INLINE_P is TRUE iff this function is an inline
20023    function defined within a class-specifier.
20024
20025    Returns the function defined.  */
20026
20027 static tree
20028 cp_parser_function_definition_after_declarator (cp_parser* parser,
20029                                                 bool inline_p)
20030 {
20031   tree fn;
20032   bool ctor_initializer_p = false;
20033   bool saved_in_unbraced_linkage_specification_p;
20034   bool saved_in_function_body;
20035   unsigned saved_num_template_parameter_lists;
20036   cp_token *token;
20037
20038   saved_in_function_body = parser->in_function_body;
20039   parser->in_function_body = true;
20040   /* If the next token is `return', then the code may be trying to
20041      make use of the "named return value" extension that G++ used to
20042      support.  */
20043   token = cp_lexer_peek_token (parser->lexer);
20044   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
20045     {
20046       /* Consume the `return' keyword.  */
20047       cp_lexer_consume_token (parser->lexer);
20048       /* Look for the identifier that indicates what value is to be
20049          returned.  */
20050       cp_parser_identifier (parser);
20051       /* Issue an error message.  */
20052       error_at (token->location,
20053                 "named return values are no longer supported");
20054       /* Skip tokens until we reach the start of the function body.  */
20055       while (true)
20056         {
20057           cp_token *token = cp_lexer_peek_token (parser->lexer);
20058           if (token->type == CPP_OPEN_BRACE
20059               || token->type == CPP_EOF
20060               || token->type == CPP_PRAGMA_EOL)
20061             break;
20062           cp_lexer_consume_token (parser->lexer);
20063         }
20064     }
20065   /* The `extern' in `extern "C" void f () { ... }' does not apply to
20066      anything declared inside `f'.  */
20067   saved_in_unbraced_linkage_specification_p
20068     = parser->in_unbraced_linkage_specification_p;
20069   parser->in_unbraced_linkage_specification_p = false;
20070   /* Inside the function, surrounding template-parameter-lists do not
20071      apply.  */
20072   saved_num_template_parameter_lists
20073     = parser->num_template_parameter_lists;
20074   parser->num_template_parameter_lists = 0;
20075
20076   start_lambda_scope (current_function_decl);
20077
20078   /* If the next token is `try', then we are looking at a
20079      function-try-block.  */
20080   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
20081     ctor_initializer_p = cp_parser_function_try_block (parser);
20082   /* A function-try-block includes the function-body, so we only do
20083      this next part if we're not processing a function-try-block.  */
20084   else
20085     ctor_initializer_p
20086       = cp_parser_ctor_initializer_opt_and_function_body (parser);
20087
20088   finish_lambda_scope ();
20089
20090   /* Finish the function.  */
20091   fn = finish_function ((ctor_initializer_p ? 1 : 0) |
20092                         (inline_p ? 2 : 0));
20093   /* Generate code for it, if necessary.  */
20094   expand_or_defer_fn (fn);
20095   /* Restore the saved values.  */
20096   parser->in_unbraced_linkage_specification_p
20097     = saved_in_unbraced_linkage_specification_p;
20098   parser->num_template_parameter_lists
20099     = saved_num_template_parameter_lists;
20100   parser->in_function_body = saved_in_function_body;
20101
20102   return fn;
20103 }
20104
20105 /* Parse a template-declaration, assuming that the `export' (and
20106    `extern') keywords, if present, has already been scanned.  MEMBER_P
20107    is as for cp_parser_template_declaration.  */
20108
20109 static void
20110 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
20111 {
20112   tree decl = NULL_TREE;
20113   VEC (deferred_access_check,gc) *checks;
20114   tree parameter_list;
20115   bool friend_p = false;
20116   bool need_lang_pop;
20117   cp_token *token;
20118
20119   /* Look for the `template' keyword.  */
20120   token = cp_lexer_peek_token (parser->lexer);
20121   if (!cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE))
20122     return;
20123
20124   /* And the `<'.  */
20125   if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
20126     return;
20127   if (at_class_scope_p () && current_function_decl)
20128     {
20129       /* 14.5.2.2 [temp.mem]
20130
20131          A local class shall not have member templates.  */
20132       error_at (token->location,
20133                 "invalid declaration of member template in local class");
20134       cp_parser_skip_to_end_of_block_or_statement (parser);
20135       return;
20136     }
20137   /* [temp]
20138
20139      A template ... shall not have C linkage.  */
20140   if (current_lang_name == lang_name_c)
20141     {
20142       error_at (token->location, "template with C linkage");
20143       /* Give it C++ linkage to avoid confusing other parts of the
20144          front end.  */
20145       push_lang_context (lang_name_cplusplus);
20146       need_lang_pop = true;
20147     }
20148   else
20149     need_lang_pop = false;
20150
20151   /* We cannot perform access checks on the template parameter
20152      declarations until we know what is being declared, just as we
20153      cannot check the decl-specifier list.  */
20154   push_deferring_access_checks (dk_deferred);
20155
20156   /* If the next token is `>', then we have an invalid
20157      specialization.  Rather than complain about an invalid template
20158      parameter, issue an error message here.  */
20159   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
20160     {
20161       cp_parser_error (parser, "invalid explicit specialization");
20162       begin_specialization ();
20163       parameter_list = NULL_TREE;
20164     }
20165   else
20166     {
20167       /* Parse the template parameters.  */
20168       parameter_list = cp_parser_template_parameter_list (parser);
20169       fixup_template_parms ();
20170     }
20171
20172   /* Get the deferred access checks from the parameter list.  These
20173      will be checked once we know what is being declared, as for a
20174      member template the checks must be performed in the scope of the
20175      class containing the member.  */
20176   checks = get_deferred_access_checks ();
20177
20178   /* Look for the `>'.  */
20179   cp_parser_skip_to_end_of_template_parameter_list (parser);
20180   /* We just processed one more parameter list.  */
20181   ++parser->num_template_parameter_lists;
20182   /* If the next token is `template', there are more template
20183      parameters.  */
20184   if (cp_lexer_next_token_is_keyword (parser->lexer,
20185                                       RID_TEMPLATE))
20186     cp_parser_template_declaration_after_export (parser, member_p);
20187   else
20188     {
20189       /* There are no access checks when parsing a template, as we do not
20190          know if a specialization will be a friend.  */
20191       push_deferring_access_checks (dk_no_check);
20192       token = cp_lexer_peek_token (parser->lexer);
20193       decl = cp_parser_single_declaration (parser,
20194                                            checks,
20195                                            member_p,
20196                                            /*explicit_specialization_p=*/false,
20197                                            &friend_p);
20198       pop_deferring_access_checks ();
20199
20200       /* If this is a member template declaration, let the front
20201          end know.  */
20202       if (member_p && !friend_p && decl)
20203         {
20204           if (TREE_CODE (decl) == TYPE_DECL)
20205             cp_parser_check_access_in_redeclaration (decl, token->location);
20206
20207           decl = finish_member_template_decl (decl);
20208         }
20209       else if (friend_p && decl && TREE_CODE (decl) == TYPE_DECL)
20210         make_friend_class (current_class_type, TREE_TYPE (decl),
20211                            /*complain=*/true);
20212     }
20213   /* We are done with the current parameter list.  */
20214   --parser->num_template_parameter_lists;
20215
20216   pop_deferring_access_checks ();
20217
20218   /* Finish up.  */
20219   finish_template_decl (parameter_list);
20220
20221   /* Register member declarations.  */
20222   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
20223     finish_member_declaration (decl);
20224   /* For the erroneous case of a template with C linkage, we pushed an
20225      implicit C++ linkage scope; exit that scope now.  */
20226   if (need_lang_pop)
20227     pop_lang_context ();
20228   /* If DECL is a function template, we must return to parse it later.
20229      (Even though there is no definition, there might be default
20230      arguments that need handling.)  */
20231   if (member_p && decl
20232       && (TREE_CODE (decl) == FUNCTION_DECL
20233           || DECL_FUNCTION_TEMPLATE_P (decl)))
20234     VEC_safe_push (tree, gc, unparsed_funs_with_definitions, decl);
20235 }
20236
20237 /* Perform the deferred access checks from a template-parameter-list.
20238    CHECKS is a TREE_LIST of access checks, as returned by
20239    get_deferred_access_checks.  */
20240
20241 static void
20242 cp_parser_perform_template_parameter_access_checks (VEC (deferred_access_check,gc)* checks)
20243 {
20244   ++processing_template_parmlist;
20245   perform_access_checks (checks);
20246   --processing_template_parmlist;
20247 }
20248
20249 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
20250    `function-definition' sequence.  MEMBER_P is true, this declaration
20251    appears in a class scope.
20252
20253    Returns the DECL for the declared entity.  If FRIEND_P is non-NULL,
20254    *FRIEND_P is set to TRUE iff the declaration is a friend.  */
20255
20256 static tree
20257 cp_parser_single_declaration (cp_parser* parser,
20258                               VEC (deferred_access_check,gc)* checks,
20259                               bool member_p,
20260                               bool explicit_specialization_p,
20261                               bool* friend_p)
20262 {
20263   int declares_class_or_enum;
20264   tree decl = NULL_TREE;
20265   cp_decl_specifier_seq decl_specifiers;
20266   bool function_definition_p = false;
20267   cp_token *decl_spec_token_start;
20268
20269   /* This function is only used when processing a template
20270      declaration.  */
20271   gcc_assert (innermost_scope_kind () == sk_template_parms
20272               || innermost_scope_kind () == sk_template_spec);
20273
20274   /* Defer access checks until we know what is being declared.  */
20275   push_deferring_access_checks (dk_deferred);
20276
20277   /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
20278      alternative.  */
20279   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
20280   cp_parser_decl_specifier_seq (parser,
20281                                 CP_PARSER_FLAGS_OPTIONAL,
20282                                 &decl_specifiers,
20283                                 &declares_class_or_enum);
20284   if (friend_p)
20285     *friend_p = cp_parser_friend_p (&decl_specifiers);
20286
20287   /* There are no template typedefs.  */
20288   if (decl_specifiers.specs[(int) ds_typedef])
20289     {
20290       error_at (decl_spec_token_start->location,
20291                 "template declaration of %<typedef%>");
20292       decl = error_mark_node;
20293     }
20294
20295   /* Gather up the access checks that occurred the
20296      decl-specifier-seq.  */
20297   stop_deferring_access_checks ();
20298
20299   /* Check for the declaration of a template class.  */
20300   if (declares_class_or_enum)
20301     {
20302       if (cp_parser_declares_only_class_p (parser))
20303         {
20304           decl = shadow_tag (&decl_specifiers);
20305
20306           /* In this case:
20307
20308                struct C {
20309                  friend template <typename T> struct A<T>::B;
20310                };
20311
20312              A<T>::B will be represented by a TYPENAME_TYPE, and
20313              therefore not recognized by shadow_tag.  */
20314           if (friend_p && *friend_p
20315               && !decl
20316               && decl_specifiers.type
20317               && TYPE_P (decl_specifiers.type))
20318             decl = decl_specifiers.type;
20319
20320           if (decl && decl != error_mark_node)
20321             decl = TYPE_NAME (decl);
20322           else
20323             decl = error_mark_node;
20324
20325           /* Perform access checks for template parameters.  */
20326           cp_parser_perform_template_parameter_access_checks (checks);
20327         }
20328     }
20329
20330   /* Complain about missing 'typename' or other invalid type names.  */
20331   if (!decl_specifiers.any_type_specifiers_p
20332       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
20333     {
20334       /* cp_parser_parse_and_diagnose_invalid_type_name calls
20335          cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
20336          the rest of this declaration.  */
20337       decl = error_mark_node;
20338       goto out;
20339     }
20340
20341   /* If it's not a template class, try for a template function.  If
20342      the next token is a `;', then this declaration does not declare
20343      anything.  But, if there were errors in the decl-specifiers, then
20344      the error might well have come from an attempted class-specifier.
20345      In that case, there's no need to warn about a missing declarator.  */
20346   if (!decl
20347       && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
20348           || decl_specifiers.type != error_mark_node))
20349     {
20350       decl = cp_parser_init_declarator (parser,
20351                                         &decl_specifiers,
20352                                         checks,
20353                                         /*function_definition_allowed_p=*/true,
20354                                         member_p,
20355                                         declares_class_or_enum,
20356                                         &function_definition_p,
20357                                         NULL);
20358
20359     /* 7.1.1-1 [dcl.stc]
20360
20361        A storage-class-specifier shall not be specified in an explicit
20362        specialization...  */
20363     if (decl
20364         && explicit_specialization_p
20365         && decl_specifiers.storage_class != sc_none)
20366       {
20367         error_at (decl_spec_token_start->location,
20368                   "explicit template specialization cannot have a storage class");
20369         decl = error_mark_node;
20370       }
20371     }
20372
20373   /* Look for a trailing `;' after the declaration.  */
20374   if (!function_definition_p
20375       && (decl == error_mark_node
20376           || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
20377     cp_parser_skip_to_end_of_block_or_statement (parser);
20378
20379  out:
20380   pop_deferring_access_checks ();
20381
20382   /* Clear any current qualification; whatever comes next is the start
20383      of something new.  */
20384   parser->scope = NULL_TREE;
20385   parser->qualifying_scope = NULL_TREE;
20386   parser->object_scope = NULL_TREE;
20387
20388   return decl;
20389 }
20390
20391 /* Parse a cast-expression that is not the operand of a unary "&".  */
20392
20393 static tree
20394 cp_parser_simple_cast_expression (cp_parser *parser)
20395 {
20396   return cp_parser_cast_expression (parser, /*address_p=*/false,
20397                                     /*cast_p=*/false, NULL);
20398 }
20399
20400 /* Parse a functional cast to TYPE.  Returns an expression
20401    representing the cast.  */
20402
20403 static tree
20404 cp_parser_functional_cast (cp_parser* parser, tree type)
20405 {
20406   VEC(tree,gc) *vec;
20407   tree expression_list;
20408   tree cast;
20409   bool nonconst_p;
20410
20411   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
20412     {
20413       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
20414       expression_list = cp_parser_braced_list (parser, &nonconst_p);
20415       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
20416       if (TREE_CODE (type) == TYPE_DECL)
20417         type = TREE_TYPE (type);
20418       return finish_compound_literal (type, expression_list,
20419                                       tf_warning_or_error);
20420     }
20421
20422
20423   vec = cp_parser_parenthesized_expression_list (parser, non_attr,
20424                                                  /*cast_p=*/true,
20425                                                  /*allow_expansion_p=*/true,
20426                                                  /*non_constant_p=*/NULL);
20427   if (vec == NULL)
20428     expression_list = error_mark_node;
20429   else
20430     {
20431       expression_list = build_tree_list_vec (vec);
20432       release_tree_vector (vec);
20433     }
20434
20435   cast = build_functional_cast (type, expression_list,
20436                                 tf_warning_or_error);
20437   /* [expr.const]/1: In an integral constant expression "only type
20438      conversions to integral or enumeration type can be used".  */
20439   if (TREE_CODE (type) == TYPE_DECL)
20440     type = TREE_TYPE (type);
20441   if (cast != error_mark_node
20442       && !cast_valid_in_integral_constant_expression_p (type)
20443       && cp_parser_non_integral_constant_expression (parser,
20444                                                      NIC_CONSTRUCTOR))
20445     return error_mark_node;
20446   return cast;
20447 }
20448
20449 /* Save the tokens that make up the body of a member function defined
20450    in a class-specifier.  The DECL_SPECIFIERS and DECLARATOR have
20451    already been parsed.  The ATTRIBUTES are any GNU "__attribute__"
20452    specifiers applied to the declaration.  Returns the FUNCTION_DECL
20453    for the member function.  */
20454
20455 static tree
20456 cp_parser_save_member_function_body (cp_parser* parser,
20457                                      cp_decl_specifier_seq *decl_specifiers,
20458                                      cp_declarator *declarator,
20459                                      tree attributes)
20460 {
20461   cp_token *first;
20462   cp_token *last;
20463   tree fn;
20464
20465   /* Create the FUNCTION_DECL.  */
20466   fn = grokmethod (decl_specifiers, declarator, attributes);
20467   /* If something went badly wrong, bail out now.  */
20468   if (fn == error_mark_node)
20469     {
20470       /* If there's a function-body, skip it.  */
20471       if (cp_parser_token_starts_function_definition_p
20472           (cp_lexer_peek_token (parser->lexer)))
20473         cp_parser_skip_to_end_of_block_or_statement (parser);
20474       return error_mark_node;
20475     }
20476
20477   /* Remember it, if there default args to post process.  */
20478   cp_parser_save_default_args (parser, fn);
20479
20480   /* Save away the tokens that make up the body of the
20481      function.  */
20482   first = parser->lexer->next_token;
20483   /* We can have braced-init-list mem-initializers before the fn body.  */
20484   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
20485     {
20486       cp_lexer_consume_token (parser->lexer);
20487       while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
20488              && cp_lexer_next_token_is_not_keyword (parser->lexer, RID_TRY))
20489         {
20490           /* cache_group will stop after an un-nested { } pair, too.  */
20491           if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
20492             break;
20493
20494           /* variadic mem-inits have ... after the ')'.  */
20495           if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20496             cp_lexer_consume_token (parser->lexer);
20497         }
20498     }
20499   cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20500   /* Handle function try blocks.  */
20501   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
20502     cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20503   last = parser->lexer->next_token;
20504
20505   /* Save away the inline definition; we will process it when the
20506      class is complete.  */
20507   DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
20508   DECL_PENDING_INLINE_P (fn) = 1;
20509
20510   /* We need to know that this was defined in the class, so that
20511      friend templates are handled correctly.  */
20512   DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
20513
20514   /* Add FN to the queue of functions to be parsed later.  */
20515   VEC_safe_push (tree, gc, unparsed_funs_with_definitions, fn);
20516
20517   return fn;
20518 }
20519
20520 /* Parse a template-argument-list, as well as the trailing ">" (but
20521    not the opening ">").  See cp_parser_template_argument_list for the
20522    return value.  */
20523
20524 static tree
20525 cp_parser_enclosed_template_argument_list (cp_parser* parser)
20526 {
20527   tree arguments;
20528   tree saved_scope;
20529   tree saved_qualifying_scope;
20530   tree saved_object_scope;
20531   bool saved_greater_than_is_operator_p;
20532   int saved_unevaluated_operand;
20533   int saved_inhibit_evaluation_warnings;
20534
20535   /* [temp.names]
20536
20537      When parsing a template-id, the first non-nested `>' is taken as
20538      the end of the template-argument-list rather than a greater-than
20539      operator.  */
20540   saved_greater_than_is_operator_p
20541     = parser->greater_than_is_operator_p;
20542   parser->greater_than_is_operator_p = false;
20543   /* Parsing the argument list may modify SCOPE, so we save it
20544      here.  */
20545   saved_scope = parser->scope;
20546   saved_qualifying_scope = parser->qualifying_scope;
20547   saved_object_scope = parser->object_scope;
20548   /* We need to evaluate the template arguments, even though this
20549      template-id may be nested within a "sizeof".  */
20550   saved_unevaluated_operand = cp_unevaluated_operand;
20551   cp_unevaluated_operand = 0;
20552   saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
20553   c_inhibit_evaluation_warnings = 0;
20554   /* Parse the template-argument-list itself.  */
20555   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
20556       || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20557     arguments = NULL_TREE;
20558   else
20559     arguments = cp_parser_template_argument_list (parser);
20560   /* Look for the `>' that ends the template-argument-list. If we find
20561      a '>>' instead, it's probably just a typo.  */
20562   if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20563     {
20564       if (cxx_dialect != cxx98)
20565         {
20566           /* In C++0x, a `>>' in a template argument list or cast
20567              expression is considered to be two separate `>'
20568              tokens. So, change the current token to a `>', but don't
20569              consume it: it will be consumed later when the outer
20570              template argument list (or cast expression) is parsed.
20571              Note that this replacement of `>' for `>>' is necessary
20572              even if we are parsing tentatively: in the tentative
20573              case, after calling
20574              cp_parser_enclosed_template_argument_list we will always
20575              throw away all of the template arguments and the first
20576              closing `>', either because the template argument list
20577              was erroneous or because we are replacing those tokens
20578              with a CPP_TEMPLATE_ID token.  The second `>' (which will
20579              not have been thrown away) is needed either to close an
20580              outer template argument list or to complete a new-style
20581              cast.  */
20582           cp_token *token = cp_lexer_peek_token (parser->lexer);
20583           token->type = CPP_GREATER;
20584         }
20585       else if (!saved_greater_than_is_operator_p)
20586         {
20587           /* If we're in a nested template argument list, the '>>' has
20588             to be a typo for '> >'. We emit the error message, but we
20589             continue parsing and we push a '>' as next token, so that
20590             the argument list will be parsed correctly.  Note that the
20591             global source location is still on the token before the
20592             '>>', so we need to say explicitly where we want it.  */
20593           cp_token *token = cp_lexer_peek_token (parser->lexer);
20594           error_at (token->location, "%<>>%> should be %<> >%> "
20595                     "within a nested template argument list");
20596
20597           token->type = CPP_GREATER;
20598         }
20599       else
20600         {
20601           /* If this is not a nested template argument list, the '>>'
20602             is a typo for '>'. Emit an error message and continue.
20603             Same deal about the token location, but here we can get it
20604             right by consuming the '>>' before issuing the diagnostic.  */
20605           cp_token *token = cp_lexer_consume_token (parser->lexer);
20606           error_at (token->location,
20607                     "spurious %<>>%>, use %<>%> to terminate "
20608                     "a template argument list");
20609         }
20610     }
20611   else
20612     cp_parser_skip_to_end_of_template_parameter_list (parser);
20613   /* The `>' token might be a greater-than operator again now.  */
20614   parser->greater_than_is_operator_p
20615     = saved_greater_than_is_operator_p;
20616   /* Restore the SAVED_SCOPE.  */
20617   parser->scope = saved_scope;
20618   parser->qualifying_scope = saved_qualifying_scope;
20619   parser->object_scope = saved_object_scope;
20620   cp_unevaluated_operand = saved_unevaluated_operand;
20621   c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
20622
20623   return arguments;
20624 }
20625
20626 /* MEMBER_FUNCTION is a member function, or a friend.  If default
20627    arguments, or the body of the function have not yet been parsed,
20628    parse them now.  */
20629
20630 static void
20631 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
20632 {
20633   timevar_push (TV_PARSE_INMETH);
20634   /* If this member is a template, get the underlying
20635      FUNCTION_DECL.  */
20636   if (DECL_FUNCTION_TEMPLATE_P (member_function))
20637     member_function = DECL_TEMPLATE_RESULT (member_function);
20638
20639   /* There should not be any class definitions in progress at this
20640      point; the bodies of members are only parsed outside of all class
20641      definitions.  */
20642   gcc_assert (parser->num_classes_being_defined == 0);
20643   /* While we're parsing the member functions we might encounter more
20644      classes.  We want to handle them right away, but we don't want
20645      them getting mixed up with functions that are currently in the
20646      queue.  */
20647   push_unparsed_function_queues (parser);
20648
20649   /* Make sure that any template parameters are in scope.  */
20650   maybe_begin_member_template_processing (member_function);
20651
20652   /* If the body of the function has not yet been parsed, parse it
20653      now.  */
20654   if (DECL_PENDING_INLINE_P (member_function))
20655     {
20656       tree function_scope;
20657       cp_token_cache *tokens;
20658
20659       /* The function is no longer pending; we are processing it.  */
20660       tokens = DECL_PENDING_INLINE_INFO (member_function);
20661       DECL_PENDING_INLINE_INFO (member_function) = NULL;
20662       DECL_PENDING_INLINE_P (member_function) = 0;
20663
20664       /* If this is a local class, enter the scope of the containing
20665          function.  */
20666       function_scope = current_function_decl;
20667       if (function_scope)
20668         push_function_context ();
20669
20670       /* Push the body of the function onto the lexer stack.  */
20671       cp_parser_push_lexer_for_tokens (parser, tokens);
20672
20673       /* Let the front end know that we going to be defining this
20674          function.  */
20675       start_preparsed_function (member_function, NULL_TREE,
20676                                 SF_PRE_PARSED | SF_INCLASS_INLINE);
20677
20678       /* Don't do access checking if it is a templated function.  */
20679       if (processing_template_decl)
20680         push_deferring_access_checks (dk_no_check);
20681
20682       /* Now, parse the body of the function.  */
20683       cp_parser_function_definition_after_declarator (parser,
20684                                                       /*inline_p=*/true);
20685
20686       if (processing_template_decl)
20687         pop_deferring_access_checks ();
20688
20689       /* Leave the scope of the containing function.  */
20690       if (function_scope)
20691         pop_function_context ();
20692       cp_parser_pop_lexer (parser);
20693     }
20694
20695   /* Remove any template parameters from the symbol table.  */
20696   maybe_end_member_template_processing ();
20697
20698   /* Restore the queue.  */
20699   pop_unparsed_function_queues (parser);
20700   timevar_pop (TV_PARSE_INMETH);
20701 }
20702
20703 /* If DECL contains any default args, remember it on the unparsed
20704    functions queue.  */
20705
20706 static void
20707 cp_parser_save_default_args (cp_parser* parser, tree decl)
20708 {
20709   tree probe;
20710
20711   for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
20712        probe;
20713        probe = TREE_CHAIN (probe))
20714     if (TREE_PURPOSE (probe))
20715       {
20716         cp_default_arg_entry *entry
20717           = VEC_safe_push (cp_default_arg_entry, gc,
20718                            unparsed_funs_with_default_args, NULL);
20719         entry->class_type = current_class_type;
20720         entry->decl = decl;
20721         break;
20722       }
20723 }
20724
20725 /* FN is a FUNCTION_DECL which may contains a parameter with an
20726    unparsed DEFAULT_ARG.  Parse the default args now.  This function
20727    assumes that the current scope is the scope in which the default
20728    argument should be processed.  */
20729
20730 static void
20731 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
20732 {
20733   bool saved_local_variables_forbidden_p;
20734   tree parm, parmdecl;
20735
20736   /* While we're parsing the default args, we might (due to the
20737      statement expression extension) encounter more classes.  We want
20738      to handle them right away, but we don't want them getting mixed
20739      up with default args that are currently in the queue.  */
20740   push_unparsed_function_queues (parser);
20741
20742   /* Local variable names (and the `this' keyword) may not appear
20743      in a default argument.  */
20744   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
20745   parser->local_variables_forbidden_p = true;
20746
20747   push_defarg_context (fn);
20748
20749   for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
20750          parmdecl = DECL_ARGUMENTS (fn);
20751        parm && parm != void_list_node;
20752        parm = TREE_CHAIN (parm),
20753          parmdecl = DECL_CHAIN (parmdecl))
20754     {
20755       cp_token_cache *tokens;
20756       tree default_arg = TREE_PURPOSE (parm);
20757       tree parsed_arg;
20758       VEC(tree,gc) *insts;
20759       tree copy;
20760       unsigned ix;
20761
20762       if (!default_arg)
20763         continue;
20764
20765       if (TREE_CODE (default_arg) != DEFAULT_ARG)
20766         /* This can happen for a friend declaration for a function
20767            already declared with default arguments.  */
20768         continue;
20769
20770        /* Push the saved tokens for the default argument onto the parser's
20771           lexer stack.  */
20772       tokens = DEFARG_TOKENS (default_arg);
20773       cp_parser_push_lexer_for_tokens (parser, tokens);
20774
20775       start_lambda_scope (parmdecl);
20776
20777       /* Parse the assignment-expression.  */
20778       parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
20779       if (parsed_arg == error_mark_node)
20780         {
20781           cp_parser_pop_lexer (parser);
20782           continue;
20783         }
20784
20785       if (!processing_template_decl)
20786         parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg);
20787
20788       TREE_PURPOSE (parm) = parsed_arg;
20789
20790       /* Update any instantiations we've already created.  */
20791       for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
20792            VEC_iterate (tree, insts, ix, copy); ix++)
20793         TREE_PURPOSE (copy) = parsed_arg;
20794
20795       finish_lambda_scope ();
20796
20797       /* If the token stream has not been completely used up, then
20798          there was extra junk after the end of the default
20799          argument.  */
20800       if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
20801         cp_parser_error (parser, "expected %<,%>");
20802
20803       /* Revert to the main lexer.  */
20804       cp_parser_pop_lexer (parser);
20805     }
20806
20807   pop_defarg_context ();
20808
20809   /* Make sure no default arg is missing.  */
20810   check_default_args (fn);
20811
20812   /* Restore the state of local_variables_forbidden_p.  */
20813   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
20814
20815   /* Restore the queue.  */
20816   pop_unparsed_function_queues (parser);
20817 }
20818
20819 /* Parse the operand of `sizeof' (or a similar operator).  Returns
20820    either a TYPE or an expression, depending on the form of the
20821    input.  The KEYWORD indicates which kind of expression we have
20822    encountered.  */
20823
20824 static tree
20825 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
20826 {
20827   tree expr = NULL_TREE;
20828   const char *saved_message;
20829   char *tmp;
20830   bool saved_integral_constant_expression_p;
20831   bool saved_non_integral_constant_expression_p;
20832   bool pack_expansion_p = false;
20833
20834   /* Types cannot be defined in a `sizeof' expression.  Save away the
20835      old message.  */
20836   saved_message = parser->type_definition_forbidden_message;
20837   /* And create the new one.  */
20838   tmp = concat ("types may not be defined in %<",
20839                 IDENTIFIER_POINTER (ridpointers[keyword]),
20840                 "%> expressions", NULL);
20841   parser->type_definition_forbidden_message = tmp;
20842
20843   /* The restrictions on constant-expressions do not apply inside
20844      sizeof expressions.  */
20845   saved_integral_constant_expression_p
20846     = parser->integral_constant_expression_p;
20847   saved_non_integral_constant_expression_p
20848     = parser->non_integral_constant_expression_p;
20849   parser->integral_constant_expression_p = false;
20850
20851   /* If it's a `...', then we are computing the length of a parameter
20852      pack.  */
20853   if (keyword == RID_SIZEOF
20854       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20855     {
20856       /* Consume the `...'.  */
20857       cp_lexer_consume_token (parser->lexer);
20858       maybe_warn_variadic_templates ();
20859
20860       /* Note that this is an expansion.  */
20861       pack_expansion_p = true;
20862     }
20863
20864   /* Do not actually evaluate the expression.  */
20865   ++cp_unevaluated_operand;
20866   ++c_inhibit_evaluation_warnings;
20867   /* If it's a `(', then we might be looking at the type-id
20868      construction.  */
20869   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
20870     {
20871       tree type;
20872       bool saved_in_type_id_in_expr_p;
20873
20874       /* We can't be sure yet whether we're looking at a type-id or an
20875          expression.  */
20876       cp_parser_parse_tentatively (parser);
20877       /* Consume the `('.  */
20878       cp_lexer_consume_token (parser->lexer);
20879       /* Parse the type-id.  */
20880       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
20881       parser->in_type_id_in_expr_p = true;
20882       type = cp_parser_type_id (parser);
20883       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
20884       /* Now, look for the trailing `)'.  */
20885       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
20886       /* If all went well, then we're done.  */
20887       if (cp_parser_parse_definitely (parser))
20888         {
20889           cp_decl_specifier_seq decl_specs;
20890
20891           /* Build a trivial decl-specifier-seq.  */
20892           clear_decl_specs (&decl_specs);
20893           decl_specs.type = type;
20894
20895           /* Call grokdeclarator to figure out what type this is.  */
20896           expr = grokdeclarator (NULL,
20897                                  &decl_specs,
20898                                  TYPENAME,
20899                                  /*initialized=*/0,
20900                                  /*attrlist=*/NULL);
20901         }
20902     }
20903
20904   /* If the type-id production did not work out, then we must be
20905      looking at the unary-expression production.  */
20906   if (!expr)
20907     expr = cp_parser_unary_expression (parser, /*address_p=*/false,
20908                                        /*cast_p=*/false, NULL);
20909
20910   if (pack_expansion_p)
20911     /* Build a pack expansion. */
20912     expr = make_pack_expansion (expr);
20913
20914   /* Go back to evaluating expressions.  */
20915   --cp_unevaluated_operand;
20916   --c_inhibit_evaluation_warnings;
20917
20918   /* Free the message we created.  */
20919   free (tmp);
20920   /* And restore the old one.  */
20921   parser->type_definition_forbidden_message = saved_message;
20922   parser->integral_constant_expression_p
20923     = saved_integral_constant_expression_p;
20924   parser->non_integral_constant_expression_p
20925     = saved_non_integral_constant_expression_p;
20926
20927   return expr;
20928 }
20929
20930 /* If the current declaration has no declarator, return true.  */
20931
20932 static bool
20933 cp_parser_declares_only_class_p (cp_parser *parser)
20934 {
20935   /* If the next token is a `;' or a `,' then there is no
20936      declarator.  */
20937   return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
20938           || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
20939 }
20940
20941 /* Update the DECL_SPECS to reflect the storage class indicated by
20942    KEYWORD.  */
20943
20944 static void
20945 cp_parser_set_storage_class (cp_parser *parser,
20946                              cp_decl_specifier_seq *decl_specs,
20947                              enum rid keyword,
20948                              location_t location)
20949 {
20950   cp_storage_class storage_class;
20951
20952   if (parser->in_unbraced_linkage_specification_p)
20953     {
20954       error_at (location, "invalid use of %qD in linkage specification",
20955                 ridpointers[keyword]);
20956       return;
20957     }
20958   else if (decl_specs->storage_class != sc_none)
20959     {
20960       decl_specs->conflicting_specifiers_p = true;
20961       return;
20962     }
20963
20964   if ((keyword == RID_EXTERN || keyword == RID_STATIC)
20965       && decl_specs->specs[(int) ds_thread])
20966     {
20967       error_at (location, "%<__thread%> before %qD", ridpointers[keyword]);
20968       decl_specs->specs[(int) ds_thread] = 0;
20969     }
20970
20971   switch (keyword)
20972     {
20973     case RID_AUTO:
20974       storage_class = sc_auto;
20975       break;
20976     case RID_REGISTER:
20977       storage_class = sc_register;
20978       break;
20979     case RID_STATIC:
20980       storage_class = sc_static;
20981       break;
20982     case RID_EXTERN:
20983       storage_class = sc_extern;
20984       break;
20985     case RID_MUTABLE:
20986       storage_class = sc_mutable;
20987       break;
20988     default:
20989       gcc_unreachable ();
20990     }
20991   decl_specs->storage_class = storage_class;
20992
20993   /* A storage class specifier cannot be applied alongside a typedef 
20994      specifier. If there is a typedef specifier present then set 
20995      conflicting_specifiers_p which will trigger an error later
20996      on in grokdeclarator. */
20997   if (decl_specs->specs[(int)ds_typedef])
20998     decl_specs->conflicting_specifiers_p = true;
20999 }
21000
21001 /* Update the DECL_SPECS to reflect the TYPE_SPEC.  If USER_DEFINED_P
21002    is true, the type is a user-defined type; otherwise it is a
21003    built-in type specified by a keyword.  */
21004
21005 static void
21006 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
21007                               tree type_spec,
21008                               location_t location,
21009                               bool user_defined_p)
21010 {
21011   decl_specs->any_specifiers_p = true;
21012
21013   /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
21014      (with, for example, in "typedef int wchar_t;") we remember that
21015      this is what happened.  In system headers, we ignore these
21016      declarations so that G++ can work with system headers that are not
21017      C++-safe.  */
21018   if (decl_specs->specs[(int) ds_typedef]
21019       && !user_defined_p
21020       && (type_spec == boolean_type_node
21021           || type_spec == char16_type_node
21022           || type_spec == char32_type_node
21023           || type_spec == wchar_type_node)
21024       && (decl_specs->type
21025           || decl_specs->specs[(int) ds_long]
21026           || decl_specs->specs[(int) ds_short]
21027           || decl_specs->specs[(int) ds_unsigned]
21028           || decl_specs->specs[(int) ds_signed]))
21029     {
21030       decl_specs->redefined_builtin_type = type_spec;
21031       if (!decl_specs->type)
21032         {
21033           decl_specs->type = type_spec;
21034           decl_specs->user_defined_type_p = false;
21035           decl_specs->type_location = location;
21036         }
21037     }
21038   else if (decl_specs->type)
21039     decl_specs->multiple_types_p = true;
21040   else
21041     {
21042       decl_specs->type = type_spec;
21043       decl_specs->user_defined_type_p = user_defined_p;
21044       decl_specs->redefined_builtin_type = NULL_TREE;
21045       decl_specs->type_location = location;
21046     }
21047 }
21048
21049 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
21050    Returns TRUE iff `friend' appears among the DECL_SPECIFIERS.  */
21051
21052 static bool
21053 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
21054 {
21055   return decl_specifiers->specs[(int) ds_friend] != 0;
21056 }
21057
21058 /* Issue an error message indicating that TOKEN_DESC was expected.
21059    If KEYWORD is true, it indicated this function is called by
21060    cp_parser_require_keword and the required token can only be
21061    a indicated keyword. */
21062
21063 static void
21064 cp_parser_required_error (cp_parser *parser,
21065                           required_token token_desc,
21066                           bool keyword)
21067 {
21068   switch (token_desc)
21069     {
21070       case RT_NEW:
21071         cp_parser_error (parser, "expected %<new%>");
21072         return;
21073       case RT_DELETE:
21074         cp_parser_error (parser, "expected %<delete%>");
21075         return;
21076       case RT_RETURN:
21077         cp_parser_error (parser, "expected %<return%>");
21078         return;
21079       case RT_WHILE:
21080         cp_parser_error (parser, "expected %<while%>");
21081         return;
21082       case RT_EXTERN:
21083         cp_parser_error (parser, "expected %<extern%>");
21084         return;
21085       case RT_STATIC_ASSERT:
21086         cp_parser_error (parser, "expected %<static_assert%>");
21087         return;
21088       case RT_DECLTYPE:
21089         cp_parser_error (parser, "expected %<decltype%>");
21090         return;
21091       case RT_OPERATOR:
21092         cp_parser_error (parser, "expected %<operator%>");
21093         return;
21094       case RT_CLASS:
21095         cp_parser_error (parser, "expected %<class%>");
21096         return;
21097       case RT_TEMPLATE:
21098         cp_parser_error (parser, "expected %<template%>");
21099         return;
21100       case RT_NAMESPACE:
21101         cp_parser_error (parser, "expected %<namespace%>");
21102         return;
21103       case RT_USING:
21104         cp_parser_error (parser, "expected %<using%>");
21105         return;
21106       case RT_ASM:
21107         cp_parser_error (parser, "expected %<asm%>");
21108         return;
21109       case RT_TRY:
21110         cp_parser_error (parser, "expected %<try%>");
21111         return;
21112       case RT_CATCH:
21113         cp_parser_error (parser, "expected %<catch%>");
21114         return;
21115       case RT_THROW:
21116         cp_parser_error (parser, "expected %<throw%>");
21117         return;
21118       case RT_LABEL:
21119         cp_parser_error (parser, "expected %<__label__%>");
21120         return;
21121       case RT_AT_TRY:
21122         cp_parser_error (parser, "expected %<@try%>");
21123         return;
21124       case RT_AT_SYNCHRONIZED:
21125         cp_parser_error (parser, "expected %<@synchronized%>");
21126         return;
21127       case RT_AT_THROW:
21128         cp_parser_error (parser, "expected %<@throw%>");
21129         return;
21130       default:
21131         break;
21132     }
21133   if (!keyword)
21134     {
21135       switch (token_desc)
21136         {
21137           case RT_SEMICOLON:
21138             cp_parser_error (parser, "expected %<;%>");
21139             return;
21140           case RT_OPEN_PAREN:
21141             cp_parser_error (parser, "expected %<(%>");
21142             return;
21143           case RT_CLOSE_BRACE:
21144             cp_parser_error (parser, "expected %<}%>");
21145             return;
21146           case RT_OPEN_BRACE:
21147             cp_parser_error (parser, "expected %<{%>");
21148             return;
21149           case RT_CLOSE_SQUARE:
21150             cp_parser_error (parser, "expected %<]%>");
21151             return;
21152           case RT_OPEN_SQUARE:
21153             cp_parser_error (parser, "expected %<[%>");
21154             return;
21155           case RT_COMMA:
21156             cp_parser_error (parser, "expected %<,%>");
21157             return;
21158           case RT_SCOPE:
21159             cp_parser_error (parser, "expected %<::%>");
21160             return;
21161           case RT_LESS:
21162             cp_parser_error (parser, "expected %<<%>");
21163             return;
21164           case RT_GREATER:
21165             cp_parser_error (parser, "expected %<>%>");
21166             return;
21167           case RT_EQ:
21168             cp_parser_error (parser, "expected %<=%>");
21169             return;
21170           case RT_ELLIPSIS:
21171             cp_parser_error (parser, "expected %<...%>");
21172             return;
21173           case RT_MULT:
21174             cp_parser_error (parser, "expected %<*%>");
21175             return;
21176           case RT_COMPL:
21177             cp_parser_error (parser, "expected %<~%>");
21178             return;
21179           case RT_COLON:
21180             cp_parser_error (parser, "expected %<:%>");
21181             return;
21182           case RT_COLON_SCOPE:
21183             cp_parser_error (parser, "expected %<:%> or %<::%>");
21184             return;
21185           case RT_CLOSE_PAREN:
21186             cp_parser_error (parser, "expected %<)%>");
21187             return;
21188           case RT_COMMA_CLOSE_PAREN:
21189             cp_parser_error (parser, "expected %<,%> or %<)%>");
21190             return;
21191           case RT_PRAGMA_EOL:
21192             cp_parser_error (parser, "expected end of line");
21193             return;
21194           case RT_NAME:
21195             cp_parser_error (parser, "expected identifier");
21196             return;
21197           case RT_SELECT:
21198             cp_parser_error (parser, "expected selection-statement");
21199             return;
21200           case RT_INTERATION:
21201             cp_parser_error (parser, "expected iteration-statement");
21202             return;
21203           case RT_JUMP:
21204             cp_parser_error (parser, "expected jump-statement");
21205             return;
21206           case RT_CLASS_KEY:
21207             cp_parser_error (parser, "expected class-key");
21208             return;
21209           case RT_CLASS_TYPENAME_TEMPLATE:
21210             cp_parser_error (parser,
21211                  "expected %<class%>, %<typename%>, or %<template%>");
21212             return;
21213           default:
21214             gcc_unreachable ();
21215         }
21216     }
21217   else
21218     gcc_unreachable ();
21219 }
21220
21221
21222
21223 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
21224    issue an error message indicating that TOKEN_DESC was expected.
21225
21226    Returns the token consumed, if the token had the appropriate type.
21227    Otherwise, returns NULL.  */
21228
21229 static cp_token *
21230 cp_parser_require (cp_parser* parser,
21231                    enum cpp_ttype type,
21232                    required_token token_desc)
21233 {
21234   if (cp_lexer_next_token_is (parser->lexer, type))
21235     return cp_lexer_consume_token (parser->lexer);
21236   else
21237     {
21238       /* Output the MESSAGE -- unless we're parsing tentatively.  */
21239       if (!cp_parser_simulate_error (parser))
21240         cp_parser_required_error (parser, token_desc, /*keyword=*/false);
21241       return NULL;
21242     }
21243 }
21244
21245 /* An error message is produced if the next token is not '>'.
21246    All further tokens are skipped until the desired token is
21247    found or '{', '}', ';' or an unbalanced ')' or ']'.  */
21248
21249 static void
21250 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
21251 {
21252   /* Current level of '< ... >'.  */
21253   unsigned level = 0;
21254   /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'.  */
21255   unsigned nesting_depth = 0;
21256
21257   /* Are we ready, yet?  If not, issue error message.  */
21258   if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
21259     return;
21260
21261   /* Skip tokens until the desired token is found.  */
21262   while (true)
21263     {
21264       /* Peek at the next token.  */
21265       switch (cp_lexer_peek_token (parser->lexer)->type)
21266         {
21267         case CPP_LESS:
21268           if (!nesting_depth)
21269             ++level;
21270           break;
21271
21272         case CPP_RSHIFT:
21273           if (cxx_dialect == cxx98)
21274             /* C++0x views the `>>' operator as two `>' tokens, but
21275                C++98 does not. */
21276             break;
21277           else if (!nesting_depth && level-- == 0)
21278             {
21279               /* We've hit a `>>' where the first `>' closes the
21280                  template argument list, and the second `>' is
21281                  spurious.  Just consume the `>>' and stop; we've
21282                  already produced at least one error.  */
21283               cp_lexer_consume_token (parser->lexer);
21284               return;
21285             }
21286           /* Fall through for C++0x, so we handle the second `>' in
21287              the `>>'.  */
21288
21289         case CPP_GREATER:
21290           if (!nesting_depth && level-- == 0)
21291             {
21292               /* We've reached the token we want, consume it and stop.  */
21293               cp_lexer_consume_token (parser->lexer);
21294               return;
21295             }
21296           break;
21297
21298         case CPP_OPEN_PAREN:
21299         case CPP_OPEN_SQUARE:
21300           ++nesting_depth;
21301           break;
21302
21303         case CPP_CLOSE_PAREN:
21304         case CPP_CLOSE_SQUARE:
21305           if (nesting_depth-- == 0)
21306             return;
21307           break;
21308
21309         case CPP_EOF:
21310         case CPP_PRAGMA_EOL:
21311         case CPP_SEMICOLON:
21312         case CPP_OPEN_BRACE:
21313         case CPP_CLOSE_BRACE:
21314           /* The '>' was probably forgotten, don't look further.  */
21315           return;
21316
21317         default:
21318           break;
21319         }
21320
21321       /* Consume this token.  */
21322       cp_lexer_consume_token (parser->lexer);
21323     }
21324 }
21325
21326 /* If the next token is the indicated keyword, consume it.  Otherwise,
21327    issue an error message indicating that TOKEN_DESC was expected.
21328
21329    Returns the token consumed, if the token had the appropriate type.
21330    Otherwise, returns NULL.  */
21331
21332 static cp_token *
21333 cp_parser_require_keyword (cp_parser* parser,
21334                            enum rid keyword,
21335                            required_token token_desc)
21336 {
21337   cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
21338
21339   if (token && token->keyword != keyword)
21340     {
21341       cp_parser_required_error (parser, token_desc, /*keyword=*/true); 
21342       return NULL;
21343     }
21344
21345   return token;
21346 }
21347
21348 /* Returns TRUE iff TOKEN is a token that can begin the body of a
21349    function-definition.  */
21350
21351 static bool
21352 cp_parser_token_starts_function_definition_p (cp_token* token)
21353 {
21354   return (/* An ordinary function-body begins with an `{'.  */
21355           token->type == CPP_OPEN_BRACE
21356           /* A ctor-initializer begins with a `:'.  */
21357           || token->type == CPP_COLON
21358           /* A function-try-block begins with `try'.  */
21359           || token->keyword == RID_TRY
21360           /* The named return value extension begins with `return'.  */
21361           || token->keyword == RID_RETURN);
21362 }
21363
21364 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
21365    definition.  */
21366
21367 static bool
21368 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
21369 {
21370   cp_token *token;
21371
21372   token = cp_lexer_peek_token (parser->lexer);
21373   return (token->type == CPP_OPEN_BRACE || token->type == CPP_COLON);
21374 }
21375
21376 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
21377    C++0x) ending a template-argument.  */
21378
21379 static bool
21380 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
21381 {
21382   cp_token *token;
21383
21384   token = cp_lexer_peek_token (parser->lexer);
21385   return (token->type == CPP_COMMA 
21386           || token->type == CPP_GREATER
21387           || token->type == CPP_ELLIPSIS
21388           || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
21389 }
21390
21391 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
21392    (n+1)-th is a ":" (which is a possible digraph typo for "< ::").  */
21393
21394 static bool
21395 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
21396                                                      size_t n)
21397 {
21398   cp_token *token;
21399
21400   token = cp_lexer_peek_nth_token (parser->lexer, n);
21401   if (token->type == CPP_LESS)
21402     return true;
21403   /* Check for the sequence `<::' in the original code. It would be lexed as
21404      `[:', where `[' is a digraph, and there is no whitespace before
21405      `:'.  */
21406   if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
21407     {
21408       cp_token *token2;
21409       token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
21410       if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
21411         return true;
21412     }
21413   return false;
21414 }
21415
21416 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
21417    or none_type otherwise.  */
21418
21419 static enum tag_types
21420 cp_parser_token_is_class_key (cp_token* token)
21421 {
21422   switch (token->keyword)
21423     {
21424     case RID_CLASS:
21425       return class_type;
21426     case RID_STRUCT:
21427       return record_type;
21428     case RID_UNION:
21429       return union_type;
21430
21431     default:
21432       return none_type;
21433     }
21434 }
21435
21436 /* Issue an error message if the CLASS_KEY does not match the TYPE.  */
21437
21438 static void
21439 cp_parser_check_class_key (enum tag_types class_key, tree type)
21440 {
21441   if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
21442     permerror (input_location, "%qs tag used in naming %q#T",
21443             class_key == union_type ? "union"
21444              : class_key == record_type ? "struct" : "class",
21445              type);
21446 }
21447
21448 /* Issue an error message if DECL is redeclared with different
21449    access than its original declaration [class.access.spec/3].
21450    This applies to nested classes and nested class templates.
21451    [class.mem/1].  */
21452
21453 static void
21454 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
21455 {
21456   if (!decl || !CLASS_TYPE_P (TREE_TYPE (decl)))
21457     return;
21458
21459   if ((TREE_PRIVATE (decl)
21460        != (current_access_specifier == access_private_node))
21461       || (TREE_PROTECTED (decl)
21462           != (current_access_specifier == access_protected_node)))
21463     error_at (location, "%qD redeclared with different access", decl);
21464 }
21465
21466 /* Look for the `template' keyword, as a syntactic disambiguator.
21467    Return TRUE iff it is present, in which case it will be
21468    consumed.  */
21469
21470 static bool
21471 cp_parser_optional_template_keyword (cp_parser *parser)
21472 {
21473   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
21474     {
21475       /* The `template' keyword can only be used within templates;
21476          outside templates the parser can always figure out what is a
21477          template and what is not.  */
21478       if (!processing_template_decl)
21479         {
21480           cp_token *token = cp_lexer_peek_token (parser->lexer);
21481           error_at (token->location,
21482                     "%<template%> (as a disambiguator) is only allowed "
21483                     "within templates");
21484           /* If this part of the token stream is rescanned, the same
21485              error message would be generated.  So, we purge the token
21486              from the stream.  */
21487           cp_lexer_purge_token (parser->lexer);
21488           return false;
21489         }
21490       else
21491         {
21492           /* Consume the `template' keyword.  */
21493           cp_lexer_consume_token (parser->lexer);
21494           return true;
21495         }
21496     }
21497
21498   return false;
21499 }
21500
21501 /* The next token is a CPP_NESTED_NAME_SPECIFIER.  Consume the token,
21502    set PARSER->SCOPE, and perform other related actions.  */
21503
21504 static void
21505 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
21506 {
21507   int i;
21508   struct tree_check *check_value;
21509   deferred_access_check *chk;
21510   VEC (deferred_access_check,gc) *checks;
21511
21512   /* Get the stored value.  */
21513   check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
21514   /* Perform any access checks that were deferred.  */
21515   checks = check_value->checks;
21516   if (checks)
21517     {
21518       FOR_EACH_VEC_ELT (deferred_access_check, checks, i, chk)
21519         perform_or_defer_access_check (chk->binfo,
21520                                        chk->decl,
21521                                        chk->diag_decl);
21522     }
21523   /* Set the scope from the stored value.  */
21524   parser->scope = check_value->value;
21525   parser->qualifying_scope = check_value->qualifying_scope;
21526   parser->object_scope = NULL_TREE;
21527 }
21528
21529 /* Consume tokens up through a non-nested END token.  Returns TRUE if we
21530    encounter the end of a block before what we were looking for.  */
21531
21532 static bool
21533 cp_parser_cache_group (cp_parser *parser,
21534                        enum cpp_ttype end,
21535                        unsigned depth)
21536 {
21537   while (true)
21538     {
21539       cp_token *token = cp_lexer_peek_token (parser->lexer);
21540
21541       /* Abort a parenthesized expression if we encounter a semicolon.  */
21542       if ((end == CPP_CLOSE_PAREN || depth == 0)
21543           && token->type == CPP_SEMICOLON)
21544         return true;
21545       /* If we've reached the end of the file, stop.  */
21546       if (token->type == CPP_EOF
21547           || (end != CPP_PRAGMA_EOL
21548               && token->type == CPP_PRAGMA_EOL))
21549         return true;
21550       if (token->type == CPP_CLOSE_BRACE && depth == 0)
21551         /* We've hit the end of an enclosing block, so there's been some
21552            kind of syntax error.  */
21553         return true;
21554
21555       /* Consume the token.  */
21556       cp_lexer_consume_token (parser->lexer);
21557       /* See if it starts a new group.  */
21558       if (token->type == CPP_OPEN_BRACE)
21559         {
21560           cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
21561           /* In theory this should probably check end == '}', but
21562              cp_parser_save_member_function_body needs it to exit
21563              after either '}' or ')' when called with ')'.  */
21564           if (depth == 0)
21565             return false;
21566         }
21567       else if (token->type == CPP_OPEN_PAREN)
21568         {
21569           cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
21570           if (depth == 0 && end == CPP_CLOSE_PAREN)
21571             return false;
21572         }
21573       else if (token->type == CPP_PRAGMA)
21574         cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
21575       else if (token->type == end)
21576         return false;
21577     }
21578 }
21579
21580 /* Begin parsing tentatively.  We always save tokens while parsing
21581    tentatively so that if the tentative parsing fails we can restore the
21582    tokens.  */
21583
21584 static void
21585 cp_parser_parse_tentatively (cp_parser* parser)
21586 {
21587   /* Enter a new parsing context.  */
21588   parser->context = cp_parser_context_new (parser->context);
21589   /* Begin saving tokens.  */
21590   cp_lexer_save_tokens (parser->lexer);
21591   /* In order to avoid repetitive access control error messages,
21592      access checks are queued up until we are no longer parsing
21593      tentatively.  */
21594   push_deferring_access_checks (dk_deferred);
21595 }
21596
21597 /* Commit to the currently active tentative parse.  */
21598
21599 static void
21600 cp_parser_commit_to_tentative_parse (cp_parser* parser)
21601 {
21602   cp_parser_context *context;
21603   cp_lexer *lexer;
21604
21605   /* Mark all of the levels as committed.  */
21606   lexer = parser->lexer;
21607   for (context = parser->context; context->next; context = context->next)
21608     {
21609       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
21610         break;
21611       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
21612       while (!cp_lexer_saving_tokens (lexer))
21613         lexer = lexer->next;
21614       cp_lexer_commit_tokens (lexer);
21615     }
21616 }
21617
21618 /* Abort the currently active tentative parse.  All consumed tokens
21619    will be rolled back, and no diagnostics will be issued.  */
21620
21621 static void
21622 cp_parser_abort_tentative_parse (cp_parser* parser)
21623 {
21624   gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
21625               || errorcount > 0);
21626   cp_parser_simulate_error (parser);
21627   /* Now, pretend that we want to see if the construct was
21628      successfully parsed.  */
21629   cp_parser_parse_definitely (parser);
21630 }
21631
21632 /* Stop parsing tentatively.  If a parse error has occurred, restore the
21633    token stream.  Otherwise, commit to the tokens we have consumed.
21634    Returns true if no error occurred; false otherwise.  */
21635
21636 static bool
21637 cp_parser_parse_definitely (cp_parser* parser)
21638 {
21639   bool error_occurred;
21640   cp_parser_context *context;
21641
21642   /* Remember whether or not an error occurred, since we are about to
21643      destroy that information.  */
21644   error_occurred = cp_parser_error_occurred (parser);
21645   /* Remove the topmost context from the stack.  */
21646   context = parser->context;
21647   parser->context = context->next;
21648   /* If no parse errors occurred, commit to the tentative parse.  */
21649   if (!error_occurred)
21650     {
21651       /* Commit to the tokens read tentatively, unless that was
21652          already done.  */
21653       if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
21654         cp_lexer_commit_tokens (parser->lexer);
21655
21656       pop_to_parent_deferring_access_checks ();
21657     }
21658   /* Otherwise, if errors occurred, roll back our state so that things
21659      are just as they were before we began the tentative parse.  */
21660   else
21661     {
21662       cp_lexer_rollback_tokens (parser->lexer);
21663       pop_deferring_access_checks ();
21664     }
21665   /* Add the context to the front of the free list.  */
21666   context->next = cp_parser_context_free_list;
21667   cp_parser_context_free_list = context;
21668
21669   return !error_occurred;
21670 }
21671
21672 /* Returns true if we are parsing tentatively and are not committed to
21673    this tentative parse.  */
21674
21675 static bool
21676 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
21677 {
21678   return (cp_parser_parsing_tentatively (parser)
21679           && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
21680 }
21681
21682 /* Returns nonzero iff an error has occurred during the most recent
21683    tentative parse.  */
21684
21685 static bool
21686 cp_parser_error_occurred (cp_parser* parser)
21687 {
21688   return (cp_parser_parsing_tentatively (parser)
21689           && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
21690 }
21691
21692 /* Returns nonzero if GNU extensions are allowed.  */
21693
21694 static bool
21695 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
21696 {
21697   return parser->allow_gnu_extensions_p;
21698 }
21699 \f
21700 /* Objective-C++ Productions */
21701
21702
21703 /* Parse an Objective-C expression, which feeds into a primary-expression
21704    above.
21705
21706    objc-expression:
21707      objc-message-expression
21708      objc-string-literal
21709      objc-encode-expression
21710      objc-protocol-expression
21711      objc-selector-expression
21712
21713   Returns a tree representation of the expression.  */
21714
21715 static tree
21716 cp_parser_objc_expression (cp_parser* parser)
21717 {
21718   /* Try to figure out what kind of declaration is present.  */
21719   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
21720
21721   switch (kwd->type)
21722     {
21723     case CPP_OPEN_SQUARE:
21724       return cp_parser_objc_message_expression (parser);
21725
21726     case CPP_OBJC_STRING:
21727       kwd = cp_lexer_consume_token (parser->lexer);
21728       return objc_build_string_object (kwd->u.value);
21729
21730     case CPP_KEYWORD:
21731       switch (kwd->keyword)
21732         {
21733         case RID_AT_ENCODE:
21734           return cp_parser_objc_encode_expression (parser);
21735
21736         case RID_AT_PROTOCOL:
21737           return cp_parser_objc_protocol_expression (parser);
21738
21739         case RID_AT_SELECTOR:
21740           return cp_parser_objc_selector_expression (parser);
21741
21742         default:
21743           break;
21744         }
21745     default:
21746       error_at (kwd->location,
21747                 "misplaced %<@%D%> Objective-C++ construct",
21748                 kwd->u.value);
21749       cp_parser_skip_to_end_of_block_or_statement (parser);
21750     }
21751
21752   return error_mark_node;
21753 }
21754
21755 /* Parse an Objective-C message expression.
21756
21757    objc-message-expression:
21758      [ objc-message-receiver objc-message-args ]
21759
21760    Returns a representation of an Objective-C message.  */
21761
21762 static tree
21763 cp_parser_objc_message_expression (cp_parser* parser)
21764 {
21765   tree receiver, messageargs;
21766
21767   cp_lexer_consume_token (parser->lexer);  /* Eat '['.  */
21768   receiver = cp_parser_objc_message_receiver (parser);
21769   messageargs = cp_parser_objc_message_args (parser);
21770   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
21771
21772   return objc_build_message_expr (receiver, messageargs);
21773 }
21774
21775 /* Parse an objc-message-receiver.
21776
21777    objc-message-receiver:
21778      expression
21779      simple-type-specifier
21780
21781   Returns a representation of the type or expression.  */
21782
21783 static tree
21784 cp_parser_objc_message_receiver (cp_parser* parser)
21785 {
21786   tree rcv;
21787
21788   /* An Objective-C message receiver may be either (1) a type
21789      or (2) an expression.  */
21790   cp_parser_parse_tentatively (parser);
21791   rcv = cp_parser_expression (parser, false, NULL);
21792
21793   if (cp_parser_parse_definitely (parser))
21794     return rcv;
21795
21796   rcv = cp_parser_simple_type_specifier (parser,
21797                                          /*decl_specs=*/NULL,
21798                                          CP_PARSER_FLAGS_NONE);
21799
21800   return objc_get_class_reference (rcv);
21801 }
21802
21803 /* Parse the arguments and selectors comprising an Objective-C message.
21804
21805    objc-message-args:
21806      objc-selector
21807      objc-selector-args
21808      objc-selector-args , objc-comma-args
21809
21810    objc-selector-args:
21811      objc-selector [opt] : assignment-expression
21812      objc-selector-args objc-selector [opt] : assignment-expression
21813
21814    objc-comma-args:
21815      assignment-expression
21816      objc-comma-args , assignment-expression
21817
21818    Returns a TREE_LIST, with TREE_PURPOSE containing a list of
21819    selector arguments and TREE_VALUE containing a list of comma
21820    arguments.  */
21821
21822 static tree
21823 cp_parser_objc_message_args (cp_parser* parser)
21824 {
21825   tree sel_args = NULL_TREE, addl_args = NULL_TREE;
21826   bool maybe_unary_selector_p = true;
21827   cp_token *token = cp_lexer_peek_token (parser->lexer);
21828
21829   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
21830     {
21831       tree selector = NULL_TREE, arg;
21832
21833       if (token->type != CPP_COLON)
21834         selector = cp_parser_objc_selector (parser);
21835
21836       /* Detect if we have a unary selector.  */
21837       if (maybe_unary_selector_p
21838           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
21839         return build_tree_list (selector, NULL_TREE);
21840
21841       maybe_unary_selector_p = false;
21842       cp_parser_require (parser, CPP_COLON, RT_COLON);
21843       arg = cp_parser_assignment_expression (parser, false, NULL);
21844
21845       sel_args
21846         = chainon (sel_args,
21847                    build_tree_list (selector, arg));
21848
21849       token = cp_lexer_peek_token (parser->lexer);
21850     }
21851
21852   /* Handle non-selector arguments, if any. */
21853   while (token->type == CPP_COMMA)
21854     {
21855       tree arg;
21856
21857       cp_lexer_consume_token (parser->lexer);
21858       arg = cp_parser_assignment_expression (parser, false, NULL);
21859
21860       addl_args
21861         = chainon (addl_args,
21862                    build_tree_list (NULL_TREE, arg));
21863
21864       token = cp_lexer_peek_token (parser->lexer);
21865     }
21866
21867   if (sel_args == NULL_TREE && addl_args == NULL_TREE)
21868     {
21869       cp_parser_error (parser, "objective-c++ message argument(s) are expected");
21870       return build_tree_list (error_mark_node, error_mark_node);
21871     }
21872
21873   return build_tree_list (sel_args, addl_args);
21874 }
21875
21876 /* Parse an Objective-C encode expression.
21877
21878    objc-encode-expression:
21879      @encode objc-typename
21880
21881    Returns an encoded representation of the type argument.  */
21882
21883 static tree
21884 cp_parser_objc_encode_expression (cp_parser* parser)
21885 {
21886   tree type;
21887   cp_token *token;
21888
21889   cp_lexer_consume_token (parser->lexer);  /* Eat '@encode'.  */
21890   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21891   token = cp_lexer_peek_token (parser->lexer);
21892   type = complete_type (cp_parser_type_id (parser));
21893   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21894
21895   if (!type)
21896     {
21897       error_at (token->location, 
21898                 "%<@encode%> must specify a type as an argument");
21899       return error_mark_node;
21900     }
21901
21902   /* This happens if we find @encode(T) (where T is a template
21903      typename or something dependent on a template typename) when
21904      parsing a template.  In that case, we can't compile it
21905      immediately, but we rather create an AT_ENCODE_EXPR which will
21906      need to be instantiated when the template is used.
21907   */
21908   if (dependent_type_p (type))
21909     {
21910       tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
21911       TREE_READONLY (value) = 1;
21912       return value;
21913     }
21914
21915   return objc_build_encode_expr (type);
21916 }
21917
21918 /* Parse an Objective-C @defs expression.  */
21919
21920 static tree
21921 cp_parser_objc_defs_expression (cp_parser *parser)
21922 {
21923   tree name;
21924
21925   cp_lexer_consume_token (parser->lexer);  /* Eat '@defs'.  */
21926   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21927   name = cp_parser_identifier (parser);
21928   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21929
21930   return objc_get_class_ivars (name);
21931 }
21932
21933 /* Parse an Objective-C protocol expression.
21934
21935   objc-protocol-expression:
21936     @protocol ( identifier )
21937
21938   Returns a representation of the protocol expression.  */
21939
21940 static tree
21941 cp_parser_objc_protocol_expression (cp_parser* parser)
21942 {
21943   tree proto;
21944
21945   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
21946   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21947   proto = cp_parser_identifier (parser);
21948   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21949
21950   return objc_build_protocol_expr (proto);
21951 }
21952
21953 /* Parse an Objective-C selector expression.
21954
21955    objc-selector-expression:
21956      @selector ( objc-method-signature )
21957
21958    objc-method-signature:
21959      objc-selector
21960      objc-selector-seq
21961
21962    objc-selector-seq:
21963      objc-selector :
21964      objc-selector-seq objc-selector :
21965
21966   Returns a representation of the method selector.  */
21967
21968 static tree
21969 cp_parser_objc_selector_expression (cp_parser* parser)
21970 {
21971   tree sel_seq = NULL_TREE;
21972   bool maybe_unary_selector_p = true;
21973   cp_token *token;
21974   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
21975
21976   cp_lexer_consume_token (parser->lexer);  /* Eat '@selector'.  */
21977   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21978   token = cp_lexer_peek_token (parser->lexer);
21979
21980   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
21981          || token->type == CPP_SCOPE)
21982     {
21983       tree selector = NULL_TREE;
21984
21985       if (token->type != CPP_COLON
21986           || token->type == CPP_SCOPE)
21987         selector = cp_parser_objc_selector (parser);
21988
21989       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
21990           && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
21991         {
21992           /* Detect if we have a unary selector.  */
21993           if (maybe_unary_selector_p)
21994             {
21995               sel_seq = selector;
21996               goto finish_selector;
21997             }
21998           else
21999             {
22000               cp_parser_error (parser, "expected %<:%>");
22001             }
22002         }
22003       maybe_unary_selector_p = false;
22004       token = cp_lexer_consume_token (parser->lexer);
22005
22006       if (token->type == CPP_SCOPE)
22007         {
22008           sel_seq
22009             = chainon (sel_seq,
22010                        build_tree_list (selector, NULL_TREE));
22011           sel_seq
22012             = chainon (sel_seq,
22013                        build_tree_list (NULL_TREE, NULL_TREE));
22014         }
22015       else
22016         sel_seq
22017           = chainon (sel_seq,
22018                      build_tree_list (selector, NULL_TREE));
22019
22020       token = cp_lexer_peek_token (parser->lexer);
22021     }
22022
22023  finish_selector:
22024   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22025
22026   return objc_build_selector_expr (loc, sel_seq);
22027 }
22028
22029 /* Parse a list of identifiers.
22030
22031    objc-identifier-list:
22032      identifier
22033      objc-identifier-list , identifier
22034
22035    Returns a TREE_LIST of identifier nodes.  */
22036
22037 static tree
22038 cp_parser_objc_identifier_list (cp_parser* parser)
22039 {
22040   tree identifier;
22041   tree list;
22042   cp_token *sep;
22043
22044   identifier = cp_parser_identifier (parser);
22045   if (identifier == error_mark_node)
22046     return error_mark_node;      
22047
22048   list = build_tree_list (NULL_TREE, identifier);
22049   sep = cp_lexer_peek_token (parser->lexer);
22050
22051   while (sep->type == CPP_COMMA)
22052     {
22053       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22054       identifier = cp_parser_identifier (parser);
22055       if (identifier == error_mark_node)
22056         return list;
22057
22058       list = chainon (list, build_tree_list (NULL_TREE,
22059                                              identifier));
22060       sep = cp_lexer_peek_token (parser->lexer);
22061     }
22062   
22063   return list;
22064 }
22065
22066 /* Parse an Objective-C alias declaration.
22067
22068    objc-alias-declaration:
22069      @compatibility_alias identifier identifier ;
22070
22071    This function registers the alias mapping with the Objective-C front end.
22072    It returns nothing.  */
22073
22074 static void
22075 cp_parser_objc_alias_declaration (cp_parser* parser)
22076 {
22077   tree alias, orig;
22078
22079   cp_lexer_consume_token (parser->lexer);  /* Eat '@compatibility_alias'.  */
22080   alias = cp_parser_identifier (parser);
22081   orig = cp_parser_identifier (parser);
22082   objc_declare_alias (alias, orig);
22083   cp_parser_consume_semicolon_at_end_of_statement (parser);
22084 }
22085
22086 /* Parse an Objective-C class forward-declaration.
22087
22088    objc-class-declaration:
22089      @class objc-identifier-list ;
22090
22091    The function registers the forward declarations with the Objective-C
22092    front end.  It returns nothing.  */
22093
22094 static void
22095 cp_parser_objc_class_declaration (cp_parser* parser)
22096 {
22097   cp_lexer_consume_token (parser->lexer);  /* Eat '@class'.  */
22098   while (true)
22099     {
22100       tree id;
22101       
22102       id = cp_parser_identifier (parser);
22103       if (id == error_mark_node)
22104         break;
22105       
22106       objc_declare_class (id);
22107
22108       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22109         cp_lexer_consume_token (parser->lexer);
22110       else
22111         break;
22112     }
22113   cp_parser_consume_semicolon_at_end_of_statement (parser);
22114 }
22115
22116 /* Parse a list of Objective-C protocol references.
22117
22118    objc-protocol-refs-opt:
22119      objc-protocol-refs [opt]
22120
22121    objc-protocol-refs:
22122      < objc-identifier-list >
22123
22124    Returns a TREE_LIST of identifiers, if any.  */
22125
22126 static tree
22127 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
22128 {
22129   tree protorefs = NULL_TREE;
22130
22131   if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
22132     {
22133       cp_lexer_consume_token (parser->lexer);  /* Eat '<'.  */
22134       protorefs = cp_parser_objc_identifier_list (parser);
22135       cp_parser_require (parser, CPP_GREATER, RT_GREATER);
22136     }
22137
22138   return protorefs;
22139 }
22140
22141 /* Parse a Objective-C visibility specification.  */
22142
22143 static void
22144 cp_parser_objc_visibility_spec (cp_parser* parser)
22145 {
22146   cp_token *vis = cp_lexer_peek_token (parser->lexer);
22147
22148   switch (vis->keyword)
22149     {
22150     case RID_AT_PRIVATE:
22151       objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
22152       break;
22153     case RID_AT_PROTECTED:
22154       objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
22155       break;
22156     case RID_AT_PUBLIC:
22157       objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
22158       break;
22159     case RID_AT_PACKAGE:
22160       objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
22161       break;
22162     default:
22163       return;
22164     }
22165
22166   /* Eat '@private'/'@protected'/'@public'.  */
22167   cp_lexer_consume_token (parser->lexer);
22168 }
22169
22170 /* Parse an Objective-C method type.  Return 'true' if it is a class
22171    (+) method, and 'false' if it is an instance (-) method.  */
22172
22173 static inline bool
22174 cp_parser_objc_method_type (cp_parser* parser)
22175 {
22176   if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
22177     return true;
22178   else
22179     return false;
22180 }
22181
22182 /* Parse an Objective-C protocol qualifier.  */
22183
22184 static tree
22185 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
22186 {
22187   tree quals = NULL_TREE, node;
22188   cp_token *token = cp_lexer_peek_token (parser->lexer);
22189
22190   node = token->u.value;
22191
22192   while (node && TREE_CODE (node) == IDENTIFIER_NODE
22193          && (node == ridpointers [(int) RID_IN]
22194              || node == ridpointers [(int) RID_OUT]
22195              || node == ridpointers [(int) RID_INOUT]
22196              || node == ridpointers [(int) RID_BYCOPY]
22197              || node == ridpointers [(int) RID_BYREF]
22198              || node == ridpointers [(int) RID_ONEWAY]))
22199     {
22200       quals = tree_cons (NULL_TREE, node, quals);
22201       cp_lexer_consume_token (parser->lexer);
22202       token = cp_lexer_peek_token (parser->lexer);
22203       node = token->u.value;
22204     }
22205
22206   return quals;
22207 }
22208
22209 /* Parse an Objective-C typename.  */
22210
22211 static tree
22212 cp_parser_objc_typename (cp_parser* parser)
22213 {
22214   tree type_name = NULL_TREE;
22215
22216   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
22217     {
22218       tree proto_quals, cp_type = NULL_TREE;
22219
22220       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22221       proto_quals = cp_parser_objc_protocol_qualifiers (parser);
22222
22223       /* An ObjC type name may consist of just protocol qualifiers, in which
22224          case the type shall default to 'id'.  */
22225       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
22226         {
22227           cp_type = cp_parser_type_id (parser);
22228           
22229           /* If the type could not be parsed, an error has already
22230              been produced.  For error recovery, behave as if it had
22231              not been specified, which will use the default type
22232              'id'.  */
22233           if (cp_type == error_mark_node)
22234             {
22235               cp_type = NULL_TREE;
22236               /* We need to skip to the closing parenthesis as
22237                  cp_parser_type_id() does not seem to do it for
22238                  us.  */
22239               cp_parser_skip_to_closing_parenthesis (parser,
22240                                                      /*recovering=*/true,
22241                                                      /*or_comma=*/false,
22242                                                      /*consume_paren=*/false);
22243             }
22244         }
22245
22246       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22247       type_name = build_tree_list (proto_quals, cp_type);
22248     }
22249
22250   return type_name;
22251 }
22252
22253 /* Check to see if TYPE refers to an Objective-C selector name.  */
22254
22255 static bool
22256 cp_parser_objc_selector_p (enum cpp_ttype type)
22257 {
22258   return (type == CPP_NAME || type == CPP_KEYWORD
22259           || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
22260           || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
22261           || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
22262           || type == CPP_XOR || type == CPP_XOR_EQ);
22263 }
22264
22265 /* Parse an Objective-C selector.  */
22266
22267 static tree
22268 cp_parser_objc_selector (cp_parser* parser)
22269 {
22270   cp_token *token = cp_lexer_consume_token (parser->lexer);
22271
22272   if (!cp_parser_objc_selector_p (token->type))
22273     {
22274       error_at (token->location, "invalid Objective-C++ selector name");
22275       return error_mark_node;
22276     }
22277
22278   /* C++ operator names are allowed to appear in ObjC selectors.  */
22279   switch (token->type)
22280     {
22281     case CPP_AND_AND: return get_identifier ("and");
22282     case CPP_AND_EQ: return get_identifier ("and_eq");
22283     case CPP_AND: return get_identifier ("bitand");
22284     case CPP_OR: return get_identifier ("bitor");
22285     case CPP_COMPL: return get_identifier ("compl");
22286     case CPP_NOT: return get_identifier ("not");
22287     case CPP_NOT_EQ: return get_identifier ("not_eq");
22288     case CPP_OR_OR: return get_identifier ("or");
22289     case CPP_OR_EQ: return get_identifier ("or_eq");
22290     case CPP_XOR: return get_identifier ("xor");
22291     case CPP_XOR_EQ: return get_identifier ("xor_eq");
22292     default: return token->u.value;
22293     }
22294 }
22295
22296 /* Parse an Objective-C params list.  */
22297
22298 static tree
22299 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
22300 {
22301   tree params = NULL_TREE;
22302   bool maybe_unary_selector_p = true;
22303   cp_token *token = cp_lexer_peek_token (parser->lexer);
22304
22305   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
22306     {
22307       tree selector = NULL_TREE, type_name, identifier;
22308       tree parm_attr = NULL_TREE;
22309
22310       if (token->keyword == RID_ATTRIBUTE)
22311         break;
22312
22313       if (token->type != CPP_COLON)
22314         selector = cp_parser_objc_selector (parser);
22315
22316       /* Detect if we have a unary selector.  */
22317       if (maybe_unary_selector_p
22318           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
22319         {
22320           params = selector; /* Might be followed by attributes.  */
22321           break;
22322         }
22323
22324       maybe_unary_selector_p = false;
22325       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
22326         {
22327           /* Something went quite wrong.  There should be a colon
22328              here, but there is not.  Stop parsing parameters.  */
22329           break;
22330         }
22331       type_name = cp_parser_objc_typename (parser);
22332       /* New ObjC allows attributes on parameters too.  */
22333       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
22334         parm_attr = cp_parser_attributes_opt (parser);
22335       identifier = cp_parser_identifier (parser);
22336
22337       params
22338         = chainon (params,
22339                    objc_build_keyword_decl (selector,
22340                                             type_name,
22341                                             identifier,
22342                                             parm_attr));
22343
22344       token = cp_lexer_peek_token (parser->lexer);
22345     }
22346
22347   if (params == NULL_TREE)
22348     {
22349       cp_parser_error (parser, "objective-c++ method declaration is expected");
22350       return error_mark_node;
22351     }
22352
22353   /* We allow tail attributes for the method.  */
22354   if (token->keyword == RID_ATTRIBUTE)
22355     {
22356       *attributes = cp_parser_attributes_opt (parser);
22357       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22358           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22359         return params;
22360       cp_parser_error (parser, 
22361                        "method attributes must be specified at the end");
22362       return error_mark_node;
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   return params;
22371 }
22372
22373 /* Parse the non-keyword Objective-C params.  */
22374
22375 static tree
22376 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp, 
22377                                        tree* attributes)
22378 {
22379   tree params = make_node (TREE_LIST);
22380   cp_token *token = cp_lexer_peek_token (parser->lexer);
22381   *ellipsisp = false;  /* Initially, assume no ellipsis.  */
22382
22383   while (token->type == CPP_COMMA)
22384     {
22385       cp_parameter_declarator *parmdecl;
22386       tree parm;
22387
22388       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22389       token = cp_lexer_peek_token (parser->lexer);
22390
22391       if (token->type == CPP_ELLIPSIS)
22392         {
22393           cp_lexer_consume_token (parser->lexer);  /* Eat '...'.  */
22394           *ellipsisp = true;
22395           token = cp_lexer_peek_token (parser->lexer);
22396           break;
22397         }
22398
22399       /* TODO: parse attributes for tail parameters.  */
22400       parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
22401       parm = grokdeclarator (parmdecl->declarator,
22402                              &parmdecl->decl_specifiers,
22403                              PARM, /*initialized=*/0,
22404                              /*attrlist=*/NULL);
22405
22406       chainon (params, build_tree_list (NULL_TREE, parm));
22407       token = cp_lexer_peek_token (parser->lexer);
22408     }
22409
22410   /* We allow tail attributes for the method.  */
22411   if (token->keyword == RID_ATTRIBUTE)
22412     {
22413       if (*attributes == NULL_TREE)
22414         {
22415           *attributes = cp_parser_attributes_opt (parser);
22416           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22417               || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22418             return params;
22419         }
22420       else        
22421         /* We have an error, but parse the attributes, so that we can 
22422            carry on.  */
22423         *attributes = cp_parser_attributes_opt (parser);
22424
22425       cp_parser_error (parser, 
22426                        "method attributes must be specified at the end");
22427       return error_mark_node;
22428     }
22429
22430   return params;
22431 }
22432
22433 /* Parse a linkage specification, a pragma, an extra semicolon or a block.  */
22434
22435 static void
22436 cp_parser_objc_interstitial_code (cp_parser* parser)
22437 {
22438   cp_token *token = cp_lexer_peek_token (parser->lexer);
22439
22440   /* If the next token is `extern' and the following token is a string
22441      literal, then we have a linkage specification.  */
22442   if (token->keyword == RID_EXTERN
22443       && cp_parser_is_string_literal (cp_lexer_peek_nth_token (parser->lexer, 2)))
22444     cp_parser_linkage_specification (parser);
22445   /* Handle #pragma, if any.  */
22446   else if (token->type == CPP_PRAGMA)
22447     cp_parser_pragma (parser, pragma_external);
22448   /* Allow stray semicolons.  */
22449   else if (token->type == CPP_SEMICOLON)
22450     cp_lexer_consume_token (parser->lexer);
22451   /* Mark methods as optional or required, when building protocols.  */
22452   else if (token->keyword == RID_AT_OPTIONAL)
22453     {
22454       cp_lexer_consume_token (parser->lexer);
22455       objc_set_method_opt (true);
22456     }
22457   else if (token->keyword == RID_AT_REQUIRED)
22458     {
22459       cp_lexer_consume_token (parser->lexer);
22460       objc_set_method_opt (false);
22461     }
22462   else if (token->keyword == RID_NAMESPACE)
22463     cp_parser_namespace_definition (parser);
22464   /* Other stray characters must generate errors.  */
22465   else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
22466     {
22467       cp_lexer_consume_token (parser->lexer);
22468       error ("stray %qs between Objective-C++ methods",
22469              token->type == CPP_OPEN_BRACE ? "{" : "}");
22470     }
22471   /* Finally, try to parse a block-declaration, or a function-definition.  */
22472   else
22473     cp_parser_block_declaration (parser, /*statement_p=*/false);
22474 }
22475
22476 /* Parse a method signature.  */
22477
22478 static tree
22479 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
22480 {
22481   tree rettype, kwdparms, optparms;
22482   bool ellipsis = false;
22483   bool is_class_method;
22484
22485   is_class_method = cp_parser_objc_method_type (parser);
22486   rettype = cp_parser_objc_typename (parser);
22487   *attributes = NULL_TREE;
22488   kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
22489   if (kwdparms == error_mark_node)
22490     return error_mark_node;
22491   optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
22492   if (optparms == error_mark_node)
22493     return error_mark_node;
22494
22495   return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
22496 }
22497
22498 static bool
22499 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
22500 {
22501   tree tattr;  
22502   cp_lexer_save_tokens (parser->lexer);
22503   tattr = cp_parser_attributes_opt (parser);
22504   gcc_assert (tattr) ;
22505   
22506   /* If the attributes are followed by a method introducer, this is not allowed.
22507      Dump the attributes and flag the situation.  */
22508   if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
22509       || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
22510     return true;
22511
22512   /* Otherwise, the attributes introduce some interstitial code, possibly so
22513      rewind to allow that check.  */
22514   cp_lexer_rollback_tokens (parser->lexer);
22515   return false;  
22516 }
22517
22518 /* Parse an Objective-C method prototype list.  */
22519
22520 static void
22521 cp_parser_objc_method_prototype_list (cp_parser* parser)
22522 {
22523   cp_token *token = cp_lexer_peek_token (parser->lexer);
22524
22525   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22526     {
22527       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22528         {
22529           tree attributes, sig;
22530           bool is_class_method;
22531           if (token->type == CPP_PLUS)
22532             is_class_method = true;
22533           else
22534             is_class_method = false;
22535           sig = cp_parser_objc_method_signature (parser, &attributes);
22536           if (sig == error_mark_node)
22537             {
22538               cp_parser_skip_to_end_of_block_or_statement (parser);
22539               token = cp_lexer_peek_token (parser->lexer);
22540               continue;
22541             }
22542           objc_add_method_declaration (is_class_method, sig, attributes);
22543           cp_parser_consume_semicolon_at_end_of_statement (parser);
22544         }
22545       else if (token->keyword == RID_AT_PROPERTY)
22546         cp_parser_objc_at_property_declaration (parser);
22547       else if (token->keyword == RID_ATTRIBUTE 
22548                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22549         warning_at (cp_lexer_peek_token (parser->lexer)->location, 
22550                     OPT_Wattributes, 
22551                     "prefix attributes are ignored for methods");
22552       else
22553         /* Allow for interspersed non-ObjC++ code.  */
22554         cp_parser_objc_interstitial_code (parser);
22555
22556       token = cp_lexer_peek_token (parser->lexer);
22557     }
22558
22559   if (token->type != CPP_EOF)
22560     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22561   else
22562     cp_parser_error (parser, "expected %<@end%>");
22563
22564   objc_finish_interface ();
22565 }
22566
22567 /* Parse an Objective-C method definition list.  */
22568
22569 static void
22570 cp_parser_objc_method_definition_list (cp_parser* parser)
22571 {
22572   cp_token *token = cp_lexer_peek_token (parser->lexer);
22573
22574   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22575     {
22576       tree meth;
22577
22578       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22579         {
22580           cp_token *ptk;
22581           tree sig, attribute;
22582           bool is_class_method;
22583           if (token->type == CPP_PLUS)
22584             is_class_method = true;
22585           else
22586             is_class_method = false;
22587           push_deferring_access_checks (dk_deferred);
22588           sig = cp_parser_objc_method_signature (parser, &attribute);
22589           if (sig == error_mark_node)
22590             {
22591               cp_parser_skip_to_end_of_block_or_statement (parser);
22592               token = cp_lexer_peek_token (parser->lexer);
22593               continue;
22594             }
22595           objc_start_method_definition (is_class_method, sig, attribute,
22596                                         NULL_TREE);
22597
22598           /* For historical reasons, we accept an optional semicolon.  */
22599           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22600             cp_lexer_consume_token (parser->lexer);
22601
22602           ptk = cp_lexer_peek_token (parser->lexer);
22603           if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS 
22604                 || ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
22605             {
22606               perform_deferred_access_checks ();
22607               stop_deferring_access_checks ();
22608               meth = cp_parser_function_definition_after_declarator (parser,
22609                                                                      false);
22610               pop_deferring_access_checks ();
22611               objc_finish_method_definition (meth);
22612             }
22613         }
22614       /* The following case will be removed once @synthesize is
22615          completely implemented.  */
22616       else if (token->keyword == RID_AT_PROPERTY)
22617         cp_parser_objc_at_property_declaration (parser);
22618       else if (token->keyword == RID_AT_SYNTHESIZE)
22619         cp_parser_objc_at_synthesize_declaration (parser);
22620       else if (token->keyword == RID_AT_DYNAMIC)
22621         cp_parser_objc_at_dynamic_declaration (parser);
22622       else if (token->keyword == RID_ATTRIBUTE 
22623                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22624         warning_at (token->location, OPT_Wattributes,
22625                     "prefix attributes are ignored for methods");
22626       else
22627         /* Allow for interspersed non-ObjC++ code.  */
22628         cp_parser_objc_interstitial_code (parser);
22629
22630       token = cp_lexer_peek_token (parser->lexer);
22631     }
22632
22633   if (token->type != CPP_EOF)
22634     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22635   else
22636     cp_parser_error (parser, "expected %<@end%>");
22637
22638   objc_finish_implementation ();
22639 }
22640
22641 /* Parse Objective-C ivars.  */
22642
22643 static void
22644 cp_parser_objc_class_ivars (cp_parser* parser)
22645 {
22646   cp_token *token = cp_lexer_peek_token (parser->lexer);
22647
22648   if (token->type != CPP_OPEN_BRACE)
22649     return;     /* No ivars specified.  */
22650
22651   cp_lexer_consume_token (parser->lexer);  /* Eat '{'.  */
22652   token = cp_lexer_peek_token (parser->lexer);
22653
22654   while (token->type != CPP_CLOSE_BRACE 
22655         && token->keyword != RID_AT_END && token->type != CPP_EOF)
22656     {
22657       cp_decl_specifier_seq declspecs;
22658       int decl_class_or_enum_p;
22659       tree prefix_attributes;
22660
22661       cp_parser_objc_visibility_spec (parser);
22662
22663       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
22664         break;
22665
22666       cp_parser_decl_specifier_seq (parser,
22667                                     CP_PARSER_FLAGS_OPTIONAL,
22668                                     &declspecs,
22669                                     &decl_class_or_enum_p);
22670
22671       /* auto, register, static, extern, mutable.  */
22672       if (declspecs.storage_class != sc_none)
22673         {
22674           cp_parser_error (parser, "invalid type for instance variable");         
22675           declspecs.storage_class = sc_none;
22676         }
22677
22678       /* __thread.  */
22679       if (declspecs.specs[(int) ds_thread])
22680         {
22681           cp_parser_error (parser, "invalid type for instance variable");
22682           declspecs.specs[(int) ds_thread] = 0;
22683         }
22684       
22685       /* typedef.  */
22686       if (declspecs.specs[(int) ds_typedef])
22687         {
22688           cp_parser_error (parser, "invalid type for instance variable");
22689           declspecs.specs[(int) ds_typedef] = 0;
22690         }
22691
22692       prefix_attributes = declspecs.attributes;
22693       declspecs.attributes = NULL_TREE;
22694
22695       /* Keep going until we hit the `;' at the end of the
22696          declaration.  */
22697       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22698         {
22699           tree width = NULL_TREE, attributes, first_attribute, decl;
22700           cp_declarator *declarator = NULL;
22701           int ctor_dtor_or_conv_p;
22702
22703           /* Check for a (possibly unnamed) bitfield declaration.  */
22704           token = cp_lexer_peek_token (parser->lexer);
22705           if (token->type == CPP_COLON)
22706             goto eat_colon;
22707
22708           if (token->type == CPP_NAME
22709               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
22710                   == CPP_COLON))
22711             {
22712               /* Get the name of the bitfield.  */
22713               declarator = make_id_declarator (NULL_TREE,
22714                                                cp_parser_identifier (parser),
22715                                                sfk_none);
22716
22717              eat_colon:
22718               cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22719               /* Get the width of the bitfield.  */
22720               width
22721                 = cp_parser_constant_expression (parser,
22722                                                  /*allow_non_constant=*/false,
22723                                                  NULL);
22724             }
22725           else
22726             {
22727               /* Parse the declarator.  */
22728               declarator
22729                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
22730                                         &ctor_dtor_or_conv_p,
22731                                         /*parenthesized_p=*/NULL,
22732                                         /*member_p=*/false);
22733             }
22734
22735           /* Look for attributes that apply to the ivar.  */
22736           attributes = cp_parser_attributes_opt (parser);
22737           /* Remember which attributes are prefix attributes and
22738              which are not.  */
22739           first_attribute = attributes;
22740           /* Combine the attributes.  */
22741           attributes = chainon (prefix_attributes, attributes);
22742
22743           if (width)
22744               /* Create the bitfield declaration.  */
22745               decl = grokbitfield (declarator, &declspecs,
22746                                    width,
22747                                    attributes);
22748           else
22749             decl = grokfield (declarator, &declspecs,
22750                               NULL_TREE, /*init_const_expr_p=*/false,
22751                               NULL_TREE, attributes);
22752
22753           /* Add the instance variable.  */
22754           if (decl != error_mark_node && decl != NULL_TREE)
22755             objc_add_instance_variable (decl);
22756
22757           /* Reset PREFIX_ATTRIBUTES.  */
22758           while (attributes && TREE_CHAIN (attributes) != first_attribute)
22759             attributes = TREE_CHAIN (attributes);
22760           if (attributes)
22761             TREE_CHAIN (attributes) = NULL_TREE;
22762
22763           token = cp_lexer_peek_token (parser->lexer);
22764
22765           if (token->type == CPP_COMMA)
22766             {
22767               cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22768               continue;
22769             }
22770           break;
22771         }
22772
22773       cp_parser_consume_semicolon_at_end_of_statement (parser);
22774       token = cp_lexer_peek_token (parser->lexer);
22775     }
22776
22777   if (token->keyword == RID_AT_END)
22778     cp_parser_error (parser, "expected %<}%>");
22779
22780   /* Do not consume the RID_AT_END, so it will be read again as terminating
22781      the @interface of @implementation.  */ 
22782   if (token->keyword != RID_AT_END && token->type != CPP_EOF)
22783     cp_lexer_consume_token (parser->lexer);  /* Eat '}'.  */
22784     
22785   /* For historical reasons, we accept an optional semicolon.  */
22786   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22787     cp_lexer_consume_token (parser->lexer);
22788 }
22789
22790 /* Parse an Objective-C protocol declaration.  */
22791
22792 static void
22793 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
22794 {
22795   tree proto, protorefs;
22796   cp_token *tok;
22797
22798   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
22799   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
22800     {
22801       tok = cp_lexer_peek_token (parser->lexer);
22802       error_at (tok->location, "identifier expected after %<@protocol%>");
22803       cp_parser_consume_semicolon_at_end_of_statement (parser);
22804       return;
22805     }
22806
22807   /* See if we have a forward declaration or a definition.  */
22808   tok = cp_lexer_peek_nth_token (parser->lexer, 2);
22809
22810   /* Try a forward declaration first.  */
22811   if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
22812     {
22813       while (true)
22814         {
22815           tree id;
22816           
22817           id = cp_parser_identifier (parser);
22818           if (id == error_mark_node)
22819             break;
22820           
22821           objc_declare_protocol (id, attributes);
22822           
22823           if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22824             cp_lexer_consume_token (parser->lexer);
22825           else
22826             break;
22827         }
22828       cp_parser_consume_semicolon_at_end_of_statement (parser);
22829     }
22830
22831   /* Ok, we got a full-fledged definition (or at least should).  */
22832   else
22833     {
22834       proto = cp_parser_identifier (parser);
22835       protorefs = cp_parser_objc_protocol_refs_opt (parser);
22836       objc_start_protocol (proto, protorefs, attributes);
22837       cp_parser_objc_method_prototype_list (parser);
22838     }
22839 }
22840
22841 /* Parse an Objective-C superclass or category.  */
22842
22843 static void
22844 cp_parser_objc_superclass_or_category (cp_parser *parser, 
22845                                        bool iface_p,
22846                                        tree *super,
22847                                        tree *categ, bool *is_class_extension)
22848 {
22849   cp_token *next = cp_lexer_peek_token (parser->lexer);
22850
22851   *super = *categ = NULL_TREE;
22852   *is_class_extension = false;
22853   if (next->type == CPP_COLON)
22854     {
22855       cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22856       *super = cp_parser_identifier (parser);
22857     }
22858   else if (next->type == CPP_OPEN_PAREN)
22859     {
22860       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22861
22862       /* If there is no category name, and this is an @interface, we
22863          have a class extension.  */
22864       if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22865         {
22866           *categ = NULL_TREE;
22867           *is_class_extension = true;
22868         }
22869       else
22870         *categ = cp_parser_identifier (parser);
22871
22872       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22873     }
22874 }
22875
22876 /* Parse an Objective-C class interface.  */
22877
22878 static void
22879 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
22880 {
22881   tree name, super, categ, protos;
22882   bool is_class_extension;
22883
22884   cp_lexer_consume_token (parser->lexer);  /* Eat '@interface'.  */
22885   name = cp_parser_identifier (parser);
22886   if (name == error_mark_node)
22887     {
22888       /* It's hard to recover because even if valid @interface stuff
22889          is to follow, we can't compile it (or validate it) if we
22890          don't even know which class it refers to.  Let's assume this
22891          was a stray '@interface' token in the stream and skip it.
22892       */
22893       return;
22894     }
22895   cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
22896                                          &is_class_extension);
22897   protos = cp_parser_objc_protocol_refs_opt (parser);
22898
22899   /* We have either a class or a category on our hands.  */
22900   if (categ || is_class_extension)
22901     objc_start_category_interface (name, categ, protos, attributes);
22902   else
22903     {
22904       objc_start_class_interface (name, super, protos, attributes);
22905       /* Handle instance variable declarations, if any.  */
22906       cp_parser_objc_class_ivars (parser);
22907       objc_continue_interface ();
22908     }
22909
22910   cp_parser_objc_method_prototype_list (parser);
22911 }
22912
22913 /* Parse an Objective-C class implementation.  */
22914
22915 static void
22916 cp_parser_objc_class_implementation (cp_parser* parser)
22917 {
22918   tree name, super, categ;
22919   bool is_class_extension;
22920
22921   cp_lexer_consume_token (parser->lexer);  /* Eat '@implementation'.  */
22922   name = cp_parser_identifier (parser);
22923   if (name == error_mark_node)
22924     {
22925       /* It's hard to recover because even if valid @implementation
22926          stuff is to follow, we can't compile it (or validate it) if
22927          we don't even know which class it refers to.  Let's assume
22928          this was a stray '@implementation' token in the stream and
22929          skip it.
22930       */
22931       return;
22932     }
22933   cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
22934                                          &is_class_extension);
22935
22936   /* We have either a class or a category on our hands.  */
22937   if (categ)
22938     objc_start_category_implementation (name, categ);
22939   else
22940     {
22941       objc_start_class_implementation (name, super);
22942       /* Handle instance variable declarations, if any.  */
22943       cp_parser_objc_class_ivars (parser);
22944       objc_continue_implementation ();
22945     }
22946
22947   cp_parser_objc_method_definition_list (parser);
22948 }
22949
22950 /* Consume the @end token and finish off the implementation.  */
22951
22952 static void
22953 cp_parser_objc_end_implementation (cp_parser* parser)
22954 {
22955   cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22956   objc_finish_implementation ();
22957 }
22958
22959 /* Parse an Objective-C declaration.  */
22960
22961 static void
22962 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
22963 {
22964   /* Try to figure out what kind of declaration is present.  */
22965   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22966
22967   if (attributes)
22968     switch (kwd->keyword)
22969       {
22970         case RID_AT_ALIAS:
22971         case RID_AT_CLASS:
22972         case RID_AT_END:
22973           error_at (kwd->location, "attributes may not be specified before"
22974                     " the %<@%D%> Objective-C++ keyword",
22975                     kwd->u.value);
22976           attributes = NULL;
22977           break;
22978         case RID_AT_IMPLEMENTATION:
22979           warning_at (kwd->location, OPT_Wattributes,
22980                       "prefix attributes are ignored before %<@%D%>",
22981                       kwd->u.value);
22982           attributes = NULL;
22983         default:
22984           break;
22985       }
22986
22987   switch (kwd->keyword)
22988     {
22989     case RID_AT_ALIAS:
22990       cp_parser_objc_alias_declaration (parser);
22991       break;
22992     case RID_AT_CLASS:
22993       cp_parser_objc_class_declaration (parser);
22994       break;
22995     case RID_AT_PROTOCOL:
22996       cp_parser_objc_protocol_declaration (parser, attributes);
22997       break;
22998     case RID_AT_INTERFACE:
22999       cp_parser_objc_class_interface (parser, attributes);
23000       break;
23001     case RID_AT_IMPLEMENTATION:
23002       cp_parser_objc_class_implementation (parser);
23003       break;
23004     case RID_AT_END:
23005       cp_parser_objc_end_implementation (parser);
23006       break;
23007     default:
23008       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
23009                 kwd->u.value);
23010       cp_parser_skip_to_end_of_block_or_statement (parser);
23011     }
23012 }
23013
23014 /* Parse an Objective-C try-catch-finally statement.
23015
23016    objc-try-catch-finally-stmt:
23017      @try compound-statement objc-catch-clause-seq [opt]
23018        objc-finally-clause [opt]
23019
23020    objc-catch-clause-seq:
23021      objc-catch-clause objc-catch-clause-seq [opt]
23022
23023    objc-catch-clause:
23024      @catch ( objc-exception-declaration ) compound-statement
23025
23026    objc-finally-clause:
23027      @finally compound-statement
23028
23029    objc-exception-declaration:
23030      parameter-declaration
23031      '...'
23032
23033    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
23034
23035    Returns NULL_TREE.
23036
23037    PS: This function is identical to c_parser_objc_try_catch_finally_statement
23038    for C.  Keep them in sync.  */   
23039
23040 static tree
23041 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
23042 {
23043   location_t location;
23044   tree stmt;
23045
23046   cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
23047   location = cp_lexer_peek_token (parser->lexer)->location;
23048   objc_maybe_warn_exceptions (location);
23049   /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
23050      node, lest it get absorbed into the surrounding block.  */
23051   stmt = push_stmt_list ();
23052   cp_parser_compound_statement (parser, NULL, false, false);
23053   objc_begin_try_stmt (location, pop_stmt_list (stmt));
23054
23055   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
23056     {
23057       cp_parameter_declarator *parm;
23058       tree parameter_declaration = error_mark_node;
23059       bool seen_open_paren = false;
23060
23061       cp_lexer_consume_token (parser->lexer);
23062       if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23063         seen_open_paren = true;
23064       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
23065         {
23066           /* We have "@catch (...)" (where the '...' are literally
23067              what is in the code).  Skip the '...'.
23068              parameter_declaration is set to NULL_TREE, and
23069              objc_being_catch_clauses() knows that that means
23070              '...'.  */
23071           cp_lexer_consume_token (parser->lexer);
23072           parameter_declaration = NULL_TREE;
23073         }
23074       else
23075         {
23076           /* We have "@catch (NSException *exception)" or something
23077              like that.  Parse the parameter declaration.  */
23078           parm = cp_parser_parameter_declaration (parser, false, NULL);
23079           if (parm == NULL)
23080             parameter_declaration = error_mark_node;
23081           else
23082             parameter_declaration = grokdeclarator (parm->declarator,
23083                                                     &parm->decl_specifiers,
23084                                                     PARM, /*initialized=*/0,
23085                                                     /*attrlist=*/NULL);
23086         }
23087       if (seen_open_paren)
23088         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
23089       else
23090         {
23091           /* If there was no open parenthesis, we are recovering from
23092              an error, and we are trying to figure out what mistake
23093              the user has made.  */
23094
23095           /* If there is an immediate closing parenthesis, the user
23096              probably forgot the opening one (ie, they typed "@catch
23097              NSException *e)".  Parse the closing parenthesis and keep
23098              going.  */
23099           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
23100             cp_lexer_consume_token (parser->lexer);
23101           
23102           /* If these is no immediate closing parenthesis, the user
23103              probably doesn't know that parenthesis are required at
23104              all (ie, they typed "@catch NSException *e").  So, just
23105              forget about the closing parenthesis and keep going.  */
23106         }
23107       objc_begin_catch_clause (parameter_declaration);
23108       cp_parser_compound_statement (parser, NULL, false, false);
23109       objc_finish_catch_clause ();
23110     }
23111   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
23112     {
23113       cp_lexer_consume_token (parser->lexer);
23114       location = cp_lexer_peek_token (parser->lexer)->location;
23115       /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
23116          node, lest it get absorbed into the surrounding block.  */
23117       stmt = push_stmt_list ();
23118       cp_parser_compound_statement (parser, NULL, false, false);
23119       objc_build_finally_clause (location, pop_stmt_list (stmt));
23120     }
23121
23122   return objc_finish_try_stmt ();
23123 }
23124
23125 /* Parse an Objective-C synchronized statement.
23126
23127    objc-synchronized-stmt:
23128      @synchronized ( expression ) compound-statement
23129
23130    Returns NULL_TREE.  */
23131
23132 static tree
23133 cp_parser_objc_synchronized_statement (cp_parser *parser)
23134 {
23135   location_t location;
23136   tree lock, stmt;
23137
23138   cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
23139
23140   location = cp_lexer_peek_token (parser->lexer)->location;
23141   objc_maybe_warn_exceptions (location);
23142   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
23143   lock = cp_parser_expression (parser, false, NULL);
23144   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
23145
23146   /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
23147      node, lest it get absorbed into the surrounding block.  */
23148   stmt = push_stmt_list ();
23149   cp_parser_compound_statement (parser, NULL, false, false);
23150
23151   return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
23152 }
23153
23154 /* Parse an Objective-C throw statement.
23155
23156    objc-throw-stmt:
23157      @throw assignment-expression [opt] ;
23158
23159    Returns a constructed '@throw' statement.  */
23160
23161 static tree
23162 cp_parser_objc_throw_statement (cp_parser *parser)
23163 {
23164   tree expr = NULL_TREE;
23165   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
23166
23167   cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
23168
23169   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23170     expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
23171
23172   cp_parser_consume_semicolon_at_end_of_statement (parser);
23173
23174   return objc_build_throw_stmt (loc, expr);
23175 }
23176
23177 /* Parse an Objective-C statement.  */
23178
23179 static tree
23180 cp_parser_objc_statement (cp_parser * parser)
23181 {
23182   /* Try to figure out what kind of declaration is present.  */
23183   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
23184
23185   switch (kwd->keyword)
23186     {
23187     case RID_AT_TRY:
23188       return cp_parser_objc_try_catch_finally_statement (parser);
23189     case RID_AT_SYNCHRONIZED:
23190       return cp_parser_objc_synchronized_statement (parser);
23191     case RID_AT_THROW:
23192       return cp_parser_objc_throw_statement (parser);
23193     default:
23194       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
23195                kwd->u.value);
23196       cp_parser_skip_to_end_of_block_or_statement (parser);
23197     }
23198
23199   return error_mark_node;
23200 }
23201
23202 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to 
23203    look ahead to see if an objc keyword follows the attributes.  This
23204    is to detect the use of prefix attributes on ObjC @interface and 
23205    @protocol.  */
23206
23207 static bool
23208 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
23209 {
23210   cp_lexer_save_tokens (parser->lexer);
23211   *attrib = cp_parser_attributes_opt (parser);
23212   gcc_assert (*attrib);
23213   if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
23214     {
23215       cp_lexer_commit_tokens (parser->lexer);
23216       return true;
23217     }
23218   cp_lexer_rollback_tokens (parser->lexer);
23219   return false;  
23220 }
23221
23222 /* This routine is a minimal replacement for
23223    c_parser_struct_declaration () used when parsing the list of
23224    types/names or ObjC++ properties.  For example, when parsing the
23225    code
23226
23227    @property (readonly) int a, b, c;
23228
23229    this function is responsible for parsing "int a, int b, int c" and
23230    returning the declarations as CHAIN of DECLs.
23231
23232    TODO: Share this code with cp_parser_objc_class_ivars.  It's very
23233    similar parsing.  */
23234 static tree
23235 cp_parser_objc_struct_declaration (cp_parser *parser)
23236 {
23237   tree decls = NULL_TREE;
23238   cp_decl_specifier_seq declspecs;
23239   int decl_class_or_enum_p;
23240   tree prefix_attributes;
23241
23242   cp_parser_decl_specifier_seq (parser,
23243                                 CP_PARSER_FLAGS_NONE,
23244                                 &declspecs,
23245                                 &decl_class_or_enum_p);
23246
23247   if (declspecs.type == error_mark_node)
23248     return error_mark_node;
23249
23250   /* auto, register, static, extern, mutable.  */
23251   if (declspecs.storage_class != sc_none)
23252     {
23253       cp_parser_error (parser, "invalid type for property");
23254       declspecs.storage_class = sc_none;
23255     }
23256   
23257   /* __thread.  */
23258   if (declspecs.specs[(int) ds_thread])
23259     {
23260       cp_parser_error (parser, "invalid type for property");
23261       declspecs.specs[(int) ds_thread] = 0;
23262     }
23263   
23264   /* typedef.  */
23265   if (declspecs.specs[(int) ds_typedef])
23266     {
23267       cp_parser_error (parser, "invalid type for property");
23268       declspecs.specs[(int) ds_typedef] = 0;
23269     }
23270
23271   prefix_attributes = declspecs.attributes;
23272   declspecs.attributes = NULL_TREE;
23273
23274   /* Keep going until we hit the `;' at the end of the declaration. */
23275   while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23276     {
23277       tree attributes, first_attribute, decl;
23278       cp_declarator *declarator;
23279       cp_token *token;
23280
23281       /* Parse the declarator.  */
23282       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
23283                                          NULL, NULL, false);
23284
23285       /* Look for attributes that apply to the ivar.  */
23286       attributes = cp_parser_attributes_opt (parser);
23287       /* Remember which attributes are prefix attributes and
23288          which are not.  */
23289       first_attribute = attributes;
23290       /* Combine the attributes.  */
23291       attributes = chainon (prefix_attributes, attributes);
23292       
23293       decl = grokfield (declarator, &declspecs,
23294                         NULL_TREE, /*init_const_expr_p=*/false,
23295                         NULL_TREE, attributes);
23296
23297       if (decl == error_mark_node || decl == NULL_TREE)
23298         return error_mark_node;
23299       
23300       /* Reset PREFIX_ATTRIBUTES.  */
23301       while (attributes && TREE_CHAIN (attributes) != first_attribute)
23302         attributes = TREE_CHAIN (attributes);
23303       if (attributes)
23304         TREE_CHAIN (attributes) = NULL_TREE;
23305
23306       DECL_CHAIN (decl) = decls;
23307       decls = decl;
23308
23309       token = cp_lexer_peek_token (parser->lexer);
23310       if (token->type == CPP_COMMA)
23311         {
23312           cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
23313           continue;
23314         }
23315       else
23316         break;
23317     }
23318   return decls;
23319 }
23320
23321 /* Parse an Objective-C @property declaration.  The syntax is:
23322
23323    objc-property-declaration:
23324      '@property' objc-property-attributes[opt] struct-declaration ;
23325
23326    objc-property-attributes:
23327     '(' objc-property-attribute-list ')'
23328
23329    objc-property-attribute-list:
23330      objc-property-attribute
23331      objc-property-attribute-list, objc-property-attribute
23332
23333    objc-property-attribute
23334      'getter' = identifier
23335      'setter' = identifier
23336      'readonly'
23337      'readwrite'
23338      'assign'
23339      'retain'
23340      'copy'
23341      'nonatomic'
23342
23343   For example:
23344     @property NSString *name;
23345     @property (readonly) id object;
23346     @property (retain, nonatomic, getter=getTheName) id name;
23347     @property int a, b, c;
23348
23349    PS: This function is identical to
23350    c_parser_objc_at_property_declaration for C.  Keep them in sync.  */
23351 static void 
23352 cp_parser_objc_at_property_declaration (cp_parser *parser)
23353 {
23354   /* The following variables hold the attributes of the properties as
23355      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
23356      seen.  When we see an attribute, we set them to 'true' (if they
23357      are boolean properties) or to the identifier (if they have an
23358      argument, ie, for getter and setter).  Note that here we only
23359      parse the list of attributes, check the syntax and accumulate the
23360      attributes that we find.  objc_add_property_declaration() will
23361      then process the information.  */
23362   bool property_assign = false;
23363   bool property_copy = false;
23364   tree property_getter_ident = NULL_TREE;
23365   bool property_nonatomic = false;
23366   bool property_readonly = false;
23367   bool property_readwrite = false;
23368   bool property_retain = false;
23369   tree property_setter_ident = NULL_TREE;
23370
23371   /* 'properties' is the list of properties that we read.  Usually a
23372      single one, but maybe more (eg, in "@property int a, b, c;" there
23373      are three).  */
23374   tree properties;
23375   location_t loc;
23376
23377   loc = cp_lexer_peek_token (parser->lexer)->location;
23378
23379   cp_lexer_consume_token (parser->lexer);  /* Eat '@property'.  */
23380
23381   /* Parse the optional attribute list...  */
23382   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
23383     {
23384       /* Eat the '('.  */
23385       cp_lexer_consume_token (parser->lexer);
23386
23387       while (true)
23388         {
23389           bool syntax_error = false;
23390           cp_token *token = cp_lexer_peek_token (parser->lexer);
23391           enum rid keyword;
23392
23393           if (token->type != CPP_NAME)
23394             {
23395               cp_parser_error (parser, "expected identifier");
23396               break;
23397             }
23398           keyword = C_RID_CODE (token->u.value);
23399           cp_lexer_consume_token (parser->lexer);
23400           switch (keyword)
23401             {
23402             case RID_ASSIGN:    property_assign = true;    break;
23403             case RID_COPY:      property_copy = true;      break;
23404             case RID_NONATOMIC: property_nonatomic = true; break;
23405             case RID_READONLY:  property_readonly = true;  break;
23406             case RID_READWRITE: property_readwrite = true; break;
23407             case RID_RETAIN:    property_retain = true;    break;
23408
23409             case RID_GETTER:
23410             case RID_SETTER:
23411               if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
23412                 {
23413                   if (keyword == RID_GETTER)
23414                     cp_parser_error (parser,
23415                                      "missing %<=%> (after %<getter%> attribute)");
23416                   else
23417                     cp_parser_error (parser,
23418                                      "missing %<=%> (after %<setter%> attribute)");
23419                   syntax_error = true;
23420                   break;
23421                 }
23422               cp_lexer_consume_token (parser->lexer); /* eat the = */
23423               if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
23424                 {
23425                   cp_parser_error (parser, "expected identifier");
23426                   syntax_error = true;
23427                   break;
23428                 }
23429               if (keyword == RID_SETTER)
23430                 {
23431                   if (property_setter_ident != NULL_TREE)
23432                     {
23433                       cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
23434                       cp_lexer_consume_token (parser->lexer);
23435                     }
23436                   else
23437                     property_setter_ident = cp_parser_objc_selector (parser);
23438                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
23439                     cp_parser_error (parser, "setter name must terminate with %<:%>");
23440                   else
23441                     cp_lexer_consume_token (parser->lexer);
23442                 }
23443               else
23444                 {
23445                   if (property_getter_ident != NULL_TREE)
23446                     {
23447                       cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
23448                       cp_lexer_consume_token (parser->lexer);
23449                     }
23450                   else
23451                     property_getter_ident = cp_parser_objc_selector (parser);
23452                 }
23453               break;
23454             default:
23455               cp_parser_error (parser, "unknown property attribute");
23456               syntax_error = true;
23457               break;
23458             }
23459
23460           if (syntax_error)
23461             break;
23462
23463           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23464             cp_lexer_consume_token (parser->lexer);
23465           else
23466             break;
23467         }
23468
23469       /* FIXME: "@property (setter, assign);" will generate a spurious
23470          "error: expected â€˜)’ before â€˜,’ token".  This is because
23471          cp_parser_require, unlike the C counterpart, will produce an
23472          error even if we are in error recovery.  */
23473       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23474         {
23475           cp_parser_skip_to_closing_parenthesis (parser,
23476                                                  /*recovering=*/true,
23477                                                  /*or_comma=*/false,
23478                                                  /*consume_paren=*/true);
23479         }
23480     }
23481
23482   /* ... and the property declaration(s).  */
23483   properties = cp_parser_objc_struct_declaration (parser);
23484
23485   if (properties == error_mark_node)
23486     {
23487       cp_parser_skip_to_end_of_statement (parser);
23488       /* If the next token is now a `;', consume it.  */
23489       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23490         cp_lexer_consume_token (parser->lexer);
23491       return;
23492     }
23493
23494   if (properties == NULL_TREE)
23495     cp_parser_error (parser, "expected identifier");
23496   else
23497     {
23498       /* Comma-separated properties are chained together in
23499          reverse order; add them one by one.  */
23500       properties = nreverse (properties);
23501       
23502       for (; properties; properties = TREE_CHAIN (properties))
23503         objc_add_property_declaration (loc, copy_node (properties),
23504                                        property_readonly, property_readwrite,
23505                                        property_assign, property_retain,
23506                                        property_copy, property_nonatomic,
23507                                        property_getter_ident, property_setter_ident);
23508     }
23509   
23510   cp_parser_consume_semicolon_at_end_of_statement (parser);
23511 }
23512
23513 /* Parse an Objective-C++ @synthesize declaration.  The syntax is:
23514
23515    objc-synthesize-declaration:
23516      @synthesize objc-synthesize-identifier-list ;
23517
23518    objc-synthesize-identifier-list:
23519      objc-synthesize-identifier
23520      objc-synthesize-identifier-list, objc-synthesize-identifier
23521
23522    objc-synthesize-identifier
23523      identifier
23524      identifier = identifier
23525
23526   For example:
23527     @synthesize MyProperty;
23528     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
23529
23530   PS: This function is identical to c_parser_objc_at_synthesize_declaration
23531   for C.  Keep them in sync.
23532 */
23533 static void 
23534 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
23535 {
23536   tree list = NULL_TREE;
23537   location_t loc;
23538   loc = cp_lexer_peek_token (parser->lexer)->location;
23539
23540   cp_lexer_consume_token (parser->lexer);  /* Eat '@synthesize'.  */
23541   while (true)
23542     {
23543       tree property, ivar;
23544       property = cp_parser_identifier (parser);
23545       if (property == error_mark_node)
23546         {
23547           cp_parser_consume_semicolon_at_end_of_statement (parser);
23548           return;
23549         }
23550       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
23551         {
23552           cp_lexer_consume_token (parser->lexer);
23553           ivar = cp_parser_identifier (parser);
23554           if (ivar == error_mark_node)
23555             {
23556               cp_parser_consume_semicolon_at_end_of_statement (parser);
23557               return;
23558             }
23559         }
23560       else
23561         ivar = NULL_TREE;
23562       list = chainon (list, build_tree_list (ivar, property));
23563       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23564         cp_lexer_consume_token (parser->lexer);
23565       else
23566         break;
23567     }
23568   cp_parser_consume_semicolon_at_end_of_statement (parser);
23569   objc_add_synthesize_declaration (loc, list);
23570 }
23571
23572 /* Parse an Objective-C++ @dynamic declaration.  The syntax is:
23573
23574    objc-dynamic-declaration:
23575      @dynamic identifier-list ;
23576
23577    For example:
23578      @dynamic MyProperty;
23579      @dynamic MyProperty, AnotherProperty;
23580
23581   PS: This function is identical to c_parser_objc_at_dynamic_declaration
23582   for C.  Keep them in sync.
23583 */
23584 static void 
23585 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
23586 {
23587   tree list = NULL_TREE;
23588   location_t loc;
23589   loc = cp_lexer_peek_token (parser->lexer)->location;
23590
23591   cp_lexer_consume_token (parser->lexer);  /* Eat '@dynamic'.  */
23592   while (true)
23593     {
23594       tree property;
23595       property = cp_parser_identifier (parser);
23596       if (property == error_mark_node)
23597         {
23598           cp_parser_consume_semicolon_at_end_of_statement (parser);
23599           return;
23600         }
23601       list = chainon (list, build_tree_list (NULL, property));
23602       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23603         cp_lexer_consume_token (parser->lexer);
23604       else
23605         break;
23606     }
23607   cp_parser_consume_semicolon_at_end_of_statement (parser);
23608   objc_add_dynamic_declaration (loc, list);
23609 }
23610
23611 \f
23612 /* OpenMP 2.5 parsing routines.  */
23613
23614 /* Returns name of the next clause.
23615    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
23616    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
23617    returned and the token is consumed.  */
23618
23619 static pragma_omp_clause
23620 cp_parser_omp_clause_name (cp_parser *parser)
23621 {
23622   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
23623
23624   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
23625     result = PRAGMA_OMP_CLAUSE_IF;
23626   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
23627     result = PRAGMA_OMP_CLAUSE_DEFAULT;
23628   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
23629     result = PRAGMA_OMP_CLAUSE_PRIVATE;
23630   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23631     {
23632       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23633       const char *p = IDENTIFIER_POINTER (id);
23634
23635       switch (p[0])
23636         {
23637         case 'c':
23638           if (!strcmp ("collapse", p))
23639             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
23640           else if (!strcmp ("copyin", p))
23641             result = PRAGMA_OMP_CLAUSE_COPYIN;
23642           else if (!strcmp ("copyprivate", p))
23643             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
23644           break;
23645         case 'f':
23646           if (!strcmp ("final", p))
23647             result = PRAGMA_OMP_CLAUSE_FINAL;
23648           else if (!strcmp ("firstprivate", p))
23649             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
23650           break;
23651         case 'l':
23652           if (!strcmp ("lastprivate", p))
23653             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
23654           break;
23655         case 'm':
23656           if (!strcmp ("mergeable", p))
23657             result = PRAGMA_OMP_CLAUSE_MERGEABLE;
23658           break;
23659         case 'n':
23660           if (!strcmp ("nowait", p))
23661             result = PRAGMA_OMP_CLAUSE_NOWAIT;
23662           else if (!strcmp ("num_threads", p))
23663             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
23664           break;
23665         case 'o':
23666           if (!strcmp ("ordered", p))
23667             result = PRAGMA_OMP_CLAUSE_ORDERED;
23668           break;
23669         case 'r':
23670           if (!strcmp ("reduction", p))
23671             result = PRAGMA_OMP_CLAUSE_REDUCTION;
23672           break;
23673         case 's':
23674           if (!strcmp ("schedule", p))
23675             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
23676           else if (!strcmp ("shared", p))
23677             result = PRAGMA_OMP_CLAUSE_SHARED;
23678           break;
23679         case 'u':
23680           if (!strcmp ("untied", p))
23681             result = PRAGMA_OMP_CLAUSE_UNTIED;
23682           break;
23683         }
23684     }
23685
23686   if (result != PRAGMA_OMP_CLAUSE_NONE)
23687     cp_lexer_consume_token (parser->lexer);
23688
23689   return result;
23690 }
23691
23692 /* Validate that a clause of the given type does not already exist.  */
23693
23694 static void
23695 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
23696                            const char *name, location_t location)
23697 {
23698   tree c;
23699
23700   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
23701     if (OMP_CLAUSE_CODE (c) == code)
23702       {
23703         error_at (location, "too many %qs clauses", name);
23704         break;
23705       }
23706 }
23707
23708 /* OpenMP 2.5:
23709    variable-list:
23710      identifier
23711      variable-list , identifier
23712
23713    In addition, we match a closing parenthesis.  An opening parenthesis
23714    will have been consumed by the caller.
23715
23716    If KIND is nonzero, create the appropriate node and install the decl
23717    in OMP_CLAUSE_DECL and add the node to the head of the list.
23718
23719    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
23720    return the list created.  */
23721
23722 static tree
23723 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
23724                                 tree list)
23725 {
23726   cp_token *token;
23727   while (1)
23728     {
23729       tree name, decl;
23730
23731       token = cp_lexer_peek_token (parser->lexer);
23732       name = cp_parser_id_expression (parser, /*template_p=*/false,
23733                                       /*check_dependency_p=*/true,
23734                                       /*template_p=*/NULL,
23735                                       /*declarator_p=*/false,
23736                                       /*optional_p=*/false);
23737       if (name == error_mark_node)
23738         goto skip_comma;
23739
23740       decl = cp_parser_lookup_name_simple (parser, name, token->location);
23741       if (decl == error_mark_node)
23742         cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
23743                                      token->location);
23744       else if (kind != 0)
23745         {
23746           tree u = build_omp_clause (token->location, kind);
23747           OMP_CLAUSE_DECL (u) = decl;
23748           OMP_CLAUSE_CHAIN (u) = list;
23749           list = u;
23750         }
23751       else
23752         list = tree_cons (decl, NULL_TREE, list);
23753
23754     get_comma:
23755       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
23756         break;
23757       cp_lexer_consume_token (parser->lexer);
23758     }
23759
23760   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23761     {
23762       int ending;
23763
23764       /* Try to resync to an unnested comma.  Copied from
23765          cp_parser_parenthesized_expression_list.  */
23766     skip_comma:
23767       ending = cp_parser_skip_to_closing_parenthesis (parser,
23768                                                       /*recovering=*/true,
23769                                                       /*or_comma=*/true,
23770                                                       /*consume_paren=*/true);
23771       if (ending < 0)
23772         goto get_comma;
23773     }
23774
23775   return list;
23776 }
23777
23778 /* Similarly, but expect leading and trailing parenthesis.  This is a very
23779    common case for omp clauses.  */
23780
23781 static tree
23782 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
23783 {
23784   if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23785     return cp_parser_omp_var_list_no_open (parser, kind, list);
23786   return list;
23787 }
23788
23789 /* OpenMP 3.0:
23790    collapse ( constant-expression ) */
23791
23792 static tree
23793 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
23794 {
23795   tree c, num;
23796   location_t loc;
23797   HOST_WIDE_INT n;
23798
23799   loc = cp_lexer_peek_token (parser->lexer)->location;
23800   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23801     return list;
23802
23803   num = cp_parser_constant_expression (parser, false, NULL);
23804
23805   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23806     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23807                                            /*or_comma=*/false,
23808                                            /*consume_paren=*/true);
23809
23810   if (num == error_mark_node)
23811     return list;
23812   num = fold_non_dependent_expr (num);
23813   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
23814       || !host_integerp (num, 0)
23815       || (n = tree_low_cst (num, 0)) <= 0
23816       || (int) n != n)
23817     {
23818       error_at (loc, "collapse argument needs positive constant integer expression");
23819       return list;
23820     }
23821
23822   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
23823   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
23824   OMP_CLAUSE_CHAIN (c) = list;
23825   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
23826
23827   return c;
23828 }
23829
23830 /* OpenMP 2.5:
23831    default ( shared | none ) */
23832
23833 static tree
23834 cp_parser_omp_clause_default (cp_parser *parser, tree list, location_t location)
23835 {
23836   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
23837   tree c;
23838
23839   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23840     return list;
23841   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23842     {
23843       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23844       const char *p = IDENTIFIER_POINTER (id);
23845
23846       switch (p[0])
23847         {
23848         case 'n':
23849           if (strcmp ("none", p) != 0)
23850             goto invalid_kind;
23851           kind = OMP_CLAUSE_DEFAULT_NONE;
23852           break;
23853
23854         case 's':
23855           if (strcmp ("shared", p) != 0)
23856             goto invalid_kind;
23857           kind = OMP_CLAUSE_DEFAULT_SHARED;
23858           break;
23859
23860         default:
23861           goto invalid_kind;
23862         }
23863
23864       cp_lexer_consume_token (parser->lexer);
23865     }
23866   else
23867     {
23868     invalid_kind:
23869       cp_parser_error (parser, "expected %<none%> or %<shared%>");
23870     }
23871
23872   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23873     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23874                                            /*or_comma=*/false,
23875                                            /*consume_paren=*/true);
23876
23877   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
23878     return list;
23879
23880   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
23881   c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
23882   OMP_CLAUSE_CHAIN (c) = list;
23883   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
23884
23885   return c;
23886 }
23887
23888 /* OpenMP 3.1:
23889    final ( expression ) */
23890
23891 static tree
23892 cp_parser_omp_clause_final (cp_parser *parser, tree list, location_t location)
23893 {
23894   tree t, c;
23895
23896   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23897     return list;
23898
23899   t = cp_parser_condition (parser);
23900
23901   if (t == error_mark_node
23902       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23903     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23904                                            /*or_comma=*/false,
23905                                            /*consume_paren=*/true);
23906
23907   check_no_duplicate_clause (list, OMP_CLAUSE_FINAL, "final", location);
23908
23909   c = build_omp_clause (location, OMP_CLAUSE_FINAL);
23910   OMP_CLAUSE_FINAL_EXPR (c) = t;
23911   OMP_CLAUSE_CHAIN (c) = list;
23912
23913   return c;
23914 }
23915
23916 /* OpenMP 2.5:
23917    if ( expression ) */
23918
23919 static tree
23920 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
23921 {
23922   tree t, c;
23923
23924   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23925     return list;
23926
23927   t = cp_parser_condition (parser);
23928
23929   if (t == error_mark_node
23930       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23931     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23932                                            /*or_comma=*/false,
23933                                            /*consume_paren=*/true);
23934
23935   check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if", location);
23936
23937   c = build_omp_clause (location, OMP_CLAUSE_IF);
23938   OMP_CLAUSE_IF_EXPR (c) = t;
23939   OMP_CLAUSE_CHAIN (c) = list;
23940
23941   return c;
23942 }
23943
23944 /* OpenMP 3.1:
23945    mergeable */
23946
23947 static tree
23948 cp_parser_omp_clause_mergeable (cp_parser *parser ATTRIBUTE_UNUSED,
23949                                 tree list, location_t location)
23950 {
23951   tree c;
23952
23953   check_no_duplicate_clause (list, OMP_CLAUSE_MERGEABLE, "mergeable",
23954                              location);
23955
23956   c = build_omp_clause (location, OMP_CLAUSE_MERGEABLE);
23957   OMP_CLAUSE_CHAIN (c) = list;
23958   return c;
23959 }
23960
23961 /* OpenMP 2.5:
23962    nowait */
23963
23964 static tree
23965 cp_parser_omp_clause_nowait (cp_parser *parser ATTRIBUTE_UNUSED,
23966                              tree list, location_t location)
23967 {
23968   tree c;
23969
23970   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
23971
23972   c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
23973   OMP_CLAUSE_CHAIN (c) = list;
23974   return c;
23975 }
23976
23977 /* OpenMP 2.5:
23978    num_threads ( expression ) */
23979
23980 static tree
23981 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
23982                                   location_t location)
23983 {
23984   tree t, c;
23985
23986   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23987     return list;
23988
23989   t = cp_parser_expression (parser, false, NULL);
23990
23991   if (t == error_mark_node
23992       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23993     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23994                                            /*or_comma=*/false,
23995                                            /*consume_paren=*/true);
23996
23997   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
23998                              "num_threads", location);
23999
24000   c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
24001   OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
24002   OMP_CLAUSE_CHAIN (c) = list;
24003
24004   return c;
24005 }
24006
24007 /* OpenMP 2.5:
24008    ordered */
24009
24010 static tree
24011 cp_parser_omp_clause_ordered (cp_parser *parser ATTRIBUTE_UNUSED,
24012                               tree list, location_t location)
24013 {
24014   tree c;
24015
24016   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
24017                              "ordered", location);
24018
24019   c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
24020   OMP_CLAUSE_CHAIN (c) = list;
24021   return c;
24022 }
24023
24024 /* OpenMP 2.5:
24025    reduction ( reduction-operator : variable-list )
24026
24027    reduction-operator:
24028      One of: + * - & ^ | && ||
24029
24030    OpenMP 3.1:
24031
24032    reduction-operator:
24033      One of: + * - & ^ | && || min max  */
24034
24035 static tree
24036 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
24037 {
24038   enum tree_code code;
24039   tree nlist, c;
24040
24041   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24042     return list;
24043
24044   switch (cp_lexer_peek_token (parser->lexer)->type)
24045     {
24046     case CPP_PLUS:
24047       code = PLUS_EXPR;
24048       break;
24049     case CPP_MULT:
24050       code = MULT_EXPR;
24051       break;
24052     case CPP_MINUS:
24053       code = MINUS_EXPR;
24054       break;
24055     case CPP_AND:
24056       code = BIT_AND_EXPR;
24057       break;
24058     case CPP_XOR:
24059       code = BIT_XOR_EXPR;
24060       break;
24061     case CPP_OR:
24062       code = BIT_IOR_EXPR;
24063       break;
24064     case CPP_AND_AND:
24065       code = TRUTH_ANDIF_EXPR;
24066       break;
24067     case CPP_OR_OR:
24068       code = TRUTH_ORIF_EXPR;
24069       break;
24070     case CPP_NAME:
24071       {
24072         tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24073         const char *p = IDENTIFIER_POINTER (id);
24074
24075         if (strcmp (p, "min") == 0)
24076           {
24077             code = MIN_EXPR;
24078             break;
24079           }
24080         if (strcmp (p, "max") == 0)
24081           {
24082             code = MAX_EXPR;
24083             break;
24084           }
24085       }
24086       /* FALLTHROUGH */
24087     default:
24088       cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
24089                                "%<|%>, %<&&%>, %<||%>, %<min%> or %<max%>");
24090     resync_fail:
24091       cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24092                                              /*or_comma=*/false,
24093                                              /*consume_paren=*/true);
24094       return list;
24095     }
24096   cp_lexer_consume_token (parser->lexer);
24097
24098   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
24099     goto resync_fail;
24100
24101   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list);
24102   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
24103     OMP_CLAUSE_REDUCTION_CODE (c) = code;
24104
24105   return nlist;
24106 }
24107
24108 /* OpenMP 2.5:
24109    schedule ( schedule-kind )
24110    schedule ( schedule-kind , expression )
24111
24112    schedule-kind:
24113      static | dynamic | guided | runtime | auto  */
24114
24115 static tree
24116 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
24117 {
24118   tree c, t;
24119
24120   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24121     return list;
24122
24123   c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
24124
24125   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24126     {
24127       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24128       const char *p = IDENTIFIER_POINTER (id);
24129
24130       switch (p[0])
24131         {
24132         case 'd':
24133           if (strcmp ("dynamic", p) != 0)
24134             goto invalid_kind;
24135           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
24136           break;
24137
24138         case 'g':
24139           if (strcmp ("guided", p) != 0)
24140             goto invalid_kind;
24141           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
24142           break;
24143
24144         case 'r':
24145           if (strcmp ("runtime", p) != 0)
24146             goto invalid_kind;
24147           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
24148           break;
24149
24150         default:
24151           goto invalid_kind;
24152         }
24153     }
24154   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
24155     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
24156   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
24157     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
24158   else
24159     goto invalid_kind;
24160   cp_lexer_consume_token (parser->lexer);
24161
24162   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
24163     {
24164       cp_token *token;
24165       cp_lexer_consume_token (parser->lexer);
24166
24167       token = cp_lexer_peek_token (parser->lexer);
24168       t = cp_parser_assignment_expression (parser, false, NULL);
24169
24170       if (t == error_mark_node)
24171         goto resync_fail;
24172       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
24173         error_at (token->location, "schedule %<runtime%> does not take "
24174                   "a %<chunk_size%> parameter");
24175       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
24176         error_at (token->location, "schedule %<auto%> does not take "
24177                   "a %<chunk_size%> parameter");
24178       else
24179         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
24180
24181       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24182         goto resync_fail;
24183     }
24184   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
24185     goto resync_fail;
24186
24187   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
24188   OMP_CLAUSE_CHAIN (c) = list;
24189   return c;
24190
24191  invalid_kind:
24192   cp_parser_error (parser, "invalid schedule kind");
24193  resync_fail:
24194   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24195                                          /*or_comma=*/false,
24196                                          /*consume_paren=*/true);
24197   return list;
24198 }
24199
24200 /* OpenMP 3.0:
24201    untied */
24202
24203 static tree
24204 cp_parser_omp_clause_untied (cp_parser *parser ATTRIBUTE_UNUSED,
24205                              tree list, location_t location)
24206 {
24207   tree c;
24208
24209   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
24210
24211   c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
24212   OMP_CLAUSE_CHAIN (c) = list;
24213   return c;
24214 }
24215
24216 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
24217    is a bitmask in MASK.  Return the list of clauses found; the result
24218    of clause default goes in *pdefault.  */
24219
24220 static tree
24221 cp_parser_omp_all_clauses (cp_parser *parser, unsigned int mask,
24222                            const char *where, cp_token *pragma_tok)
24223 {
24224   tree clauses = NULL;
24225   bool first = true;
24226   cp_token *token = NULL;
24227
24228   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
24229     {
24230       pragma_omp_clause c_kind;
24231       const char *c_name;
24232       tree prev = clauses;
24233
24234       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
24235         cp_lexer_consume_token (parser->lexer);
24236
24237       token = cp_lexer_peek_token (parser->lexer);
24238       c_kind = cp_parser_omp_clause_name (parser);
24239       first = false;
24240
24241       switch (c_kind)
24242         {
24243         case PRAGMA_OMP_CLAUSE_COLLAPSE:
24244           clauses = cp_parser_omp_clause_collapse (parser, clauses,
24245                                                    token->location);
24246           c_name = "collapse";
24247           break;
24248         case PRAGMA_OMP_CLAUSE_COPYIN:
24249           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
24250           c_name = "copyin";
24251           break;
24252         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
24253           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
24254                                             clauses);
24255           c_name = "copyprivate";
24256           break;
24257         case PRAGMA_OMP_CLAUSE_DEFAULT:
24258           clauses = cp_parser_omp_clause_default (parser, clauses,
24259                                                   token->location);
24260           c_name = "default";
24261           break;
24262         case PRAGMA_OMP_CLAUSE_FINAL:
24263           clauses = cp_parser_omp_clause_final (parser, clauses, token->location);
24264           c_name = "final";
24265           break;
24266         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
24267           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
24268                                             clauses);
24269           c_name = "firstprivate";
24270           break;
24271         case PRAGMA_OMP_CLAUSE_IF:
24272           clauses = cp_parser_omp_clause_if (parser, clauses, token->location);
24273           c_name = "if";
24274           break;
24275         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
24276           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
24277                                             clauses);
24278           c_name = "lastprivate";
24279           break;
24280         case PRAGMA_OMP_CLAUSE_MERGEABLE:
24281           clauses = cp_parser_omp_clause_mergeable (parser, clauses,
24282                                                     token->location);
24283           c_name = "mergeable";
24284           break;
24285         case PRAGMA_OMP_CLAUSE_NOWAIT:
24286           clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
24287           c_name = "nowait";
24288           break;
24289         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
24290           clauses = cp_parser_omp_clause_num_threads (parser, clauses,
24291                                                       token->location);
24292           c_name = "num_threads";
24293           break;
24294         case PRAGMA_OMP_CLAUSE_ORDERED:
24295           clauses = cp_parser_omp_clause_ordered (parser, clauses,
24296                                                   token->location);
24297           c_name = "ordered";
24298           break;
24299         case PRAGMA_OMP_CLAUSE_PRIVATE:
24300           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
24301                                             clauses);
24302           c_name = "private";
24303           break;
24304         case PRAGMA_OMP_CLAUSE_REDUCTION:
24305           clauses = cp_parser_omp_clause_reduction (parser, clauses);
24306           c_name = "reduction";
24307           break;
24308         case PRAGMA_OMP_CLAUSE_SCHEDULE:
24309           clauses = cp_parser_omp_clause_schedule (parser, clauses,
24310                                                    token->location);
24311           c_name = "schedule";
24312           break;
24313         case PRAGMA_OMP_CLAUSE_SHARED:
24314           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
24315                                             clauses);
24316           c_name = "shared";
24317           break;
24318         case PRAGMA_OMP_CLAUSE_UNTIED:
24319           clauses = cp_parser_omp_clause_untied (parser, clauses,
24320                                                  token->location);
24321           c_name = "nowait";
24322           break;
24323         default:
24324           cp_parser_error (parser, "expected %<#pragma omp%> clause");
24325           goto saw_error;
24326         }
24327
24328       if (((mask >> c_kind) & 1) == 0)
24329         {
24330           /* Remove the invalid clause(s) from the list to avoid
24331              confusing the rest of the compiler.  */
24332           clauses = prev;
24333           error_at (token->location, "%qs is not valid for %qs", c_name, where);
24334         }
24335     }
24336  saw_error:
24337   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
24338   return finish_omp_clauses (clauses);
24339 }
24340
24341 /* OpenMP 2.5:
24342    structured-block:
24343      statement
24344
24345    In practice, we're also interested in adding the statement to an
24346    outer node.  So it is convenient if we work around the fact that
24347    cp_parser_statement calls add_stmt.  */
24348
24349 static unsigned
24350 cp_parser_begin_omp_structured_block (cp_parser *parser)
24351 {
24352   unsigned save = parser->in_statement;
24353
24354   /* Only move the values to IN_OMP_BLOCK if they weren't false.
24355      This preserves the "not within loop or switch" style error messages
24356      for nonsense cases like
24357         void foo() {
24358         #pragma omp single
24359           break;
24360         }
24361   */
24362   if (parser->in_statement)
24363     parser->in_statement = IN_OMP_BLOCK;
24364
24365   return save;
24366 }
24367
24368 static void
24369 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
24370 {
24371   parser->in_statement = save;
24372 }
24373
24374 static tree
24375 cp_parser_omp_structured_block (cp_parser *parser)
24376 {
24377   tree stmt = begin_omp_structured_block ();
24378   unsigned int save = cp_parser_begin_omp_structured_block (parser);
24379
24380   cp_parser_statement (parser, NULL_TREE, false, NULL);
24381
24382   cp_parser_end_omp_structured_block (parser, save);
24383   return finish_omp_structured_block (stmt);
24384 }
24385
24386 /* OpenMP 2.5:
24387    # pragma omp atomic new-line
24388      expression-stmt
24389
24390    expression-stmt:
24391      x binop= expr | x++ | ++x | x-- | --x
24392    binop:
24393      +, *, -, /, &, ^, |, <<, >>
24394
24395   where x is an lvalue expression with scalar type.
24396
24397    OpenMP 3.1:
24398    # pragma omp atomic new-line
24399      update-stmt
24400
24401    # pragma omp atomic read new-line
24402      read-stmt
24403
24404    # pragma omp atomic write new-line
24405      write-stmt
24406
24407    # pragma omp atomic update new-line
24408      update-stmt
24409
24410    # pragma omp atomic capture new-line
24411      capture-stmt
24412
24413    # pragma omp atomic capture new-line
24414      capture-block
24415
24416    read-stmt:
24417      v = x
24418    write-stmt:
24419      x = expr
24420    update-stmt:
24421      expression-stmt | x = x binop expr
24422    capture-stmt:
24423      v = x binop= expr | v = x++ | v = ++x | v = x-- | v = --x
24424    capture-block:
24425      { v = x; update-stmt; } | { update-stmt; v = x; }
24426
24427   where x and v are lvalue expressions with scalar type.  */
24428
24429 static void
24430 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
24431 {
24432   tree lhs = NULL_TREE, rhs = NULL_TREE, v = NULL_TREE, lhs1 = NULL_TREE;
24433   tree rhs1 = NULL_TREE, orig_lhs;
24434   enum tree_code code = OMP_ATOMIC, opcode = NOP_EXPR;
24435   bool structured_block = false;
24436
24437   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24438     {
24439       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24440       const char *p = IDENTIFIER_POINTER (id);
24441
24442       if (!strcmp (p, "read"))
24443         code = OMP_ATOMIC_READ;
24444       else if (!strcmp (p, "write"))
24445         code = NOP_EXPR;
24446       else if (!strcmp (p, "update"))
24447         code = OMP_ATOMIC;
24448       else if (!strcmp (p, "capture"))
24449         code = OMP_ATOMIC_CAPTURE_NEW;
24450       else
24451         p = NULL;
24452       if (p)
24453         cp_lexer_consume_token (parser->lexer);
24454     }
24455   cp_parser_require_pragma_eol (parser, pragma_tok);
24456
24457   switch (code)
24458     {
24459     case OMP_ATOMIC_READ:
24460     case NOP_EXPR: /* atomic write */
24461       v = cp_parser_unary_expression (parser, /*address_p=*/false,
24462                                       /*cast_p=*/false, NULL);
24463       if (v == error_mark_node)
24464         goto saw_error;
24465       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24466         goto saw_error;
24467       if (code == NOP_EXPR)
24468         lhs = cp_parser_expression (parser, /*cast_p=*/false, NULL);
24469       else
24470         lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24471                                           /*cast_p=*/false, NULL);
24472       if (lhs == error_mark_node)
24473         goto saw_error;
24474       if (code == NOP_EXPR)
24475         {
24476           /* atomic write is represented by OMP_ATOMIC with NOP_EXPR
24477              opcode.  */
24478           code = OMP_ATOMIC;
24479           rhs = lhs;
24480           lhs = v;
24481           v = NULL_TREE;
24482         }
24483       goto done;
24484     case OMP_ATOMIC_CAPTURE_NEW:
24485       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
24486         {
24487           cp_lexer_consume_token (parser->lexer);
24488           structured_block = true;
24489         }
24490       else
24491         {
24492           v = cp_parser_unary_expression (parser, /*address_p=*/false,
24493                                           /*cast_p=*/false, NULL);
24494           if (v == error_mark_node)
24495             goto saw_error;
24496           if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24497             goto saw_error;
24498         }
24499     default:
24500       break;
24501     }
24502
24503 restart:
24504   lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24505                                     /*cast_p=*/false, NULL);
24506   orig_lhs = lhs;
24507   switch (TREE_CODE (lhs))
24508     {
24509     case ERROR_MARK:
24510       goto saw_error;
24511
24512     case POSTINCREMENT_EXPR:
24513       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
24514         code = OMP_ATOMIC_CAPTURE_OLD;
24515       /* FALLTHROUGH */
24516     case PREINCREMENT_EXPR:
24517       lhs = TREE_OPERAND (lhs, 0);
24518       opcode = PLUS_EXPR;
24519       rhs = integer_one_node;
24520       break;
24521
24522     case POSTDECREMENT_EXPR:
24523       if (code == OMP_ATOMIC_CAPTURE_NEW && !structured_block)
24524         code = OMP_ATOMIC_CAPTURE_OLD;
24525       /* FALLTHROUGH */
24526     case PREDECREMENT_EXPR:
24527       lhs = TREE_OPERAND (lhs, 0);
24528       opcode = MINUS_EXPR;
24529       rhs = integer_one_node;
24530       break;
24531
24532     case COMPOUND_EXPR:
24533       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
24534          && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
24535          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
24536          && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
24537          && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
24538                                              (TREE_OPERAND (lhs, 1), 0), 0)))
24539             == BOOLEAN_TYPE)
24540        /* Undo effects of boolean_increment for post {in,de}crement.  */
24541        lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
24542       /* FALLTHRU */
24543     case MODIFY_EXPR:
24544       if (TREE_CODE (lhs) == MODIFY_EXPR
24545          && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
24546         {
24547           /* Undo effects of boolean_increment.  */
24548           if (integer_onep (TREE_OPERAND (lhs, 1)))
24549             {
24550               /* This is pre or post increment.  */
24551               rhs = TREE_OPERAND (lhs, 1);
24552               lhs = TREE_OPERAND (lhs, 0);
24553               opcode = NOP_EXPR;
24554               if (code == OMP_ATOMIC_CAPTURE_NEW
24555                   && !structured_block
24556                   && TREE_CODE (orig_lhs) == COMPOUND_EXPR)
24557                 code = OMP_ATOMIC_CAPTURE_OLD;
24558               break;
24559             }
24560         }
24561       /* FALLTHRU */
24562     default:
24563       switch (cp_lexer_peek_token (parser->lexer)->type)
24564         {
24565         case CPP_MULT_EQ:
24566           opcode = MULT_EXPR;
24567           break;
24568         case CPP_DIV_EQ:
24569           opcode = TRUNC_DIV_EXPR;
24570           break;
24571         case CPP_PLUS_EQ:
24572           opcode = PLUS_EXPR;
24573           break;
24574         case CPP_MINUS_EQ:
24575           opcode = MINUS_EXPR;
24576           break;
24577         case CPP_LSHIFT_EQ:
24578           opcode = LSHIFT_EXPR;
24579           break;
24580         case CPP_RSHIFT_EQ:
24581           opcode = RSHIFT_EXPR;
24582           break;
24583         case CPP_AND_EQ:
24584           opcode = BIT_AND_EXPR;
24585           break;
24586         case CPP_OR_EQ:
24587           opcode = BIT_IOR_EXPR;
24588           break;
24589         case CPP_XOR_EQ:
24590           opcode = BIT_XOR_EXPR;
24591           break;
24592         case CPP_EQ:
24593           if (structured_block || code == OMP_ATOMIC)
24594             {
24595               enum cp_parser_prec oprec;
24596               cp_token *token;
24597               cp_lexer_consume_token (parser->lexer);
24598               rhs1 = cp_parser_unary_expression (parser, /*address_p=*/false,
24599                                                  /*cast_p=*/false, NULL);
24600               if (rhs1 == error_mark_node)
24601                 goto saw_error;
24602               token = cp_lexer_peek_token (parser->lexer);
24603               switch (token->type)
24604                 {
24605                 case CPP_SEMICOLON:
24606                   if (code == OMP_ATOMIC_CAPTURE_NEW)
24607                     {
24608                       code = OMP_ATOMIC_CAPTURE_OLD;
24609                       v = lhs;
24610                       lhs = NULL_TREE;
24611                       lhs1 = rhs1;
24612                       rhs1 = NULL_TREE;
24613                       cp_lexer_consume_token (parser->lexer);
24614                       goto restart;
24615                     }
24616                   cp_parser_error (parser,
24617                                    "invalid form of %<#pragma omp atomic%>");
24618                   goto saw_error;
24619                 case CPP_MULT:
24620                   opcode = MULT_EXPR;
24621                   break;
24622                 case CPP_DIV:
24623                   opcode = TRUNC_DIV_EXPR;
24624                   break;
24625                 case CPP_PLUS:
24626                   opcode = PLUS_EXPR;
24627                   break;
24628                 case CPP_MINUS:
24629                   opcode = MINUS_EXPR;
24630                   break;
24631                 case CPP_LSHIFT:
24632                   opcode = LSHIFT_EXPR;
24633                   break;
24634                 case CPP_RSHIFT:
24635                   opcode = RSHIFT_EXPR;
24636                   break;
24637                 case CPP_AND:
24638                   opcode = BIT_AND_EXPR;
24639                   break;
24640                 case CPP_OR:
24641                   opcode = BIT_IOR_EXPR;
24642                   break;
24643                 case CPP_XOR:
24644                   opcode = BIT_XOR_EXPR;
24645                   break;
24646                 default:
24647                   cp_parser_error (parser,
24648                                    "invalid operator for %<#pragma omp atomic%>");
24649                   goto saw_error;
24650                 }
24651               oprec = TOKEN_PRECEDENCE (token);
24652               gcc_assert (oprec != PREC_NOT_OPERATOR);
24653               if (commutative_tree_code (opcode))
24654                 oprec = (enum cp_parser_prec) (oprec - 1);
24655               cp_lexer_consume_token (parser->lexer);
24656               rhs = cp_parser_binary_expression (parser, false, false,
24657                                                  oprec, NULL);
24658               if (rhs == error_mark_node)
24659                 goto saw_error;
24660               goto stmt_done;
24661             }
24662           /* FALLTHROUGH */
24663         default:
24664           cp_parser_error (parser,
24665                            "invalid operator for %<#pragma omp atomic%>");
24666           goto saw_error;
24667         }
24668       cp_lexer_consume_token (parser->lexer);
24669
24670       rhs = cp_parser_expression (parser, false, NULL);
24671       if (rhs == error_mark_node)
24672         goto saw_error;
24673       break;
24674     }
24675 stmt_done:
24676   if (structured_block && code == OMP_ATOMIC_CAPTURE_NEW)
24677     {
24678       if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
24679         goto saw_error;
24680       v = cp_parser_unary_expression (parser, /*address_p=*/false,
24681                                       /*cast_p=*/false, NULL);
24682       if (v == error_mark_node)
24683         goto saw_error;
24684       if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
24685         goto saw_error;
24686       lhs1 = cp_parser_unary_expression (parser, /*address_p=*/false,
24687                                          /*cast_p=*/false, NULL);
24688       if (lhs1 == error_mark_node)
24689         goto saw_error;
24690     }
24691   if (structured_block)
24692     {
24693       cp_parser_consume_semicolon_at_end_of_statement (parser);
24694       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
24695     }
24696 done:
24697   finish_omp_atomic (code, opcode, lhs, rhs, v, lhs1, rhs1);
24698   if (!structured_block)
24699     cp_parser_consume_semicolon_at_end_of_statement (parser);
24700   return;
24701
24702  saw_error:
24703   cp_parser_skip_to_end_of_block_or_statement (parser);
24704   if (structured_block)
24705     {
24706       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24707         cp_lexer_consume_token (parser->lexer);
24708       else if (code == OMP_ATOMIC_CAPTURE_NEW)
24709         {
24710           cp_parser_skip_to_end_of_block_or_statement (parser);
24711           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24712             cp_lexer_consume_token (parser->lexer);
24713         }
24714     }
24715 }
24716
24717
24718 /* OpenMP 2.5:
24719    # pragma omp barrier new-line  */
24720
24721 static void
24722 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
24723 {
24724   cp_parser_require_pragma_eol (parser, pragma_tok);
24725   finish_omp_barrier ();
24726 }
24727
24728 /* OpenMP 2.5:
24729    # pragma omp critical [(name)] new-line
24730      structured-block  */
24731
24732 static tree
24733 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok)
24734 {
24735   tree stmt, name = NULL;
24736
24737   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24738     {
24739       cp_lexer_consume_token (parser->lexer);
24740
24741       name = cp_parser_identifier (parser);
24742
24743       if (name == error_mark_node
24744           || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24745         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24746                                                /*or_comma=*/false,
24747                                                /*consume_paren=*/true);
24748       if (name == error_mark_node)
24749         name = NULL;
24750     }
24751   cp_parser_require_pragma_eol (parser, pragma_tok);
24752
24753   stmt = cp_parser_omp_structured_block (parser);
24754   return c_finish_omp_critical (input_location, stmt, name);
24755 }
24756
24757 /* OpenMP 2.5:
24758    # pragma omp flush flush-vars[opt] new-line
24759
24760    flush-vars:
24761      ( variable-list ) */
24762
24763 static void
24764 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
24765 {
24766   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24767     (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
24768   cp_parser_require_pragma_eol (parser, pragma_tok);
24769
24770   finish_omp_flush ();
24771 }
24772
24773 /* Helper function, to parse omp for increment expression.  */
24774
24775 static tree
24776 cp_parser_omp_for_cond (cp_parser *parser, tree decl)
24777 {
24778   tree cond = cp_parser_binary_expression (parser, false, true,
24779                                            PREC_NOT_OPERATOR, NULL);
24780   if (cond == error_mark_node
24781       || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24782     {
24783       cp_parser_skip_to_end_of_statement (parser);
24784       return error_mark_node;
24785     }
24786
24787   switch (TREE_CODE (cond))
24788     {
24789     case GT_EXPR:
24790     case GE_EXPR:
24791     case LT_EXPR:
24792     case LE_EXPR:
24793       break;
24794     default:
24795       return error_mark_node;
24796     }
24797
24798   /* If decl is an iterator, preserve LHS and RHS of the relational
24799      expr until finish_omp_for.  */
24800   if (decl
24801       && (type_dependent_expression_p (decl)
24802           || CLASS_TYPE_P (TREE_TYPE (decl))))
24803     return cond;
24804
24805   return build_x_binary_op (TREE_CODE (cond),
24806                             TREE_OPERAND (cond, 0), ERROR_MARK,
24807                             TREE_OPERAND (cond, 1), ERROR_MARK,
24808                             /*overload=*/NULL, tf_warning_or_error);
24809 }
24810
24811 /* Helper function, to parse omp for increment expression.  */
24812
24813 static tree
24814 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
24815 {
24816   cp_token *token = cp_lexer_peek_token (parser->lexer);
24817   enum tree_code op;
24818   tree lhs, rhs;
24819   cp_id_kind idk;
24820   bool decl_first;
24821
24822   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24823     {
24824       op = (token->type == CPP_PLUS_PLUS
24825             ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
24826       cp_lexer_consume_token (parser->lexer);
24827       lhs = cp_parser_cast_expression (parser, false, false, NULL);
24828       if (lhs != decl)
24829         return error_mark_node;
24830       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24831     }
24832
24833   lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
24834   if (lhs != decl)
24835     return error_mark_node;
24836
24837   token = cp_lexer_peek_token (parser->lexer);
24838   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24839     {
24840       op = (token->type == CPP_PLUS_PLUS
24841             ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
24842       cp_lexer_consume_token (parser->lexer);
24843       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24844     }
24845
24846   op = cp_parser_assignment_operator_opt (parser);
24847   if (op == ERROR_MARK)
24848     return error_mark_node;
24849
24850   if (op != NOP_EXPR)
24851     {
24852       rhs = cp_parser_assignment_expression (parser, false, NULL);
24853       rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
24854       return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24855     }
24856
24857   lhs = cp_parser_binary_expression (parser, false, false,
24858                                      PREC_ADDITIVE_EXPRESSION, NULL);
24859   token = cp_lexer_peek_token (parser->lexer);
24860   decl_first = lhs == decl;
24861   if (decl_first)
24862     lhs = NULL_TREE;
24863   if (token->type != CPP_PLUS
24864       && token->type != CPP_MINUS)
24865     return error_mark_node;
24866
24867   do
24868     {
24869       op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
24870       cp_lexer_consume_token (parser->lexer);
24871       rhs = cp_parser_binary_expression (parser, false, false,
24872                                          PREC_ADDITIVE_EXPRESSION, NULL);
24873       token = cp_lexer_peek_token (parser->lexer);
24874       if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
24875         {
24876           if (lhs == NULL_TREE)
24877             {
24878               if (op == PLUS_EXPR)
24879                 lhs = rhs;
24880               else
24881                 lhs = build_x_unary_op (NEGATE_EXPR, rhs, tf_warning_or_error);
24882             }
24883           else
24884             lhs = build_x_binary_op (op, lhs, ERROR_MARK, rhs, ERROR_MARK,
24885                                      NULL, tf_warning_or_error);
24886         }
24887     }
24888   while (token->type == CPP_PLUS || token->type == CPP_MINUS);
24889
24890   if (!decl_first)
24891     {
24892       if (rhs != decl || op == MINUS_EXPR)
24893         return error_mark_node;
24894       rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
24895     }
24896   else
24897     rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
24898
24899   return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24900 }
24901
24902 /* Parse the restricted form of the for statement allowed by OpenMP.  */
24903
24904 static tree
24905 cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses)
24906 {
24907   tree init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
24908   tree real_decl, initv, condv, incrv, declv;
24909   tree this_pre_body, cl;
24910   location_t loc_first;
24911   bool collapse_err = false;
24912   int i, collapse = 1, nbraces = 0;
24913   VEC(tree,gc) *for_block = make_tree_vector ();
24914
24915   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
24916     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
24917       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
24918
24919   gcc_assert (collapse >= 1);
24920
24921   declv = make_tree_vec (collapse);
24922   initv = make_tree_vec (collapse);
24923   condv = make_tree_vec (collapse);
24924   incrv = make_tree_vec (collapse);
24925
24926   loc_first = cp_lexer_peek_token (parser->lexer)->location;
24927
24928   for (i = 0; i < collapse; i++)
24929     {
24930       int bracecount = 0;
24931       bool add_private_clause = false;
24932       location_t loc;
24933
24934       if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24935         {
24936           cp_parser_error (parser, "for statement expected");
24937           return NULL;
24938         }
24939       loc = cp_lexer_consume_token (parser->lexer)->location;
24940
24941       if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24942         return NULL;
24943
24944       init = decl = real_decl = NULL;
24945       this_pre_body = push_stmt_list ();
24946       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24947         {
24948           /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
24949
24950              init-expr:
24951                        var = lb
24952                        integer-type var = lb
24953                        random-access-iterator-type var = lb
24954                        pointer-type var = lb
24955           */
24956           cp_decl_specifier_seq type_specifiers;
24957
24958           /* First, try to parse as an initialized declaration.  See
24959              cp_parser_condition, from whence the bulk of this is copied.  */
24960
24961           cp_parser_parse_tentatively (parser);
24962           cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
24963                                         /*is_trailing_return=*/false,
24964                                         &type_specifiers);
24965           if (cp_parser_parse_definitely (parser))
24966             {
24967               /* If parsing a type specifier seq succeeded, then this
24968                  MUST be a initialized declaration.  */
24969               tree asm_specification, attributes;
24970               cp_declarator *declarator;
24971
24972               declarator = cp_parser_declarator (parser,
24973                                                  CP_PARSER_DECLARATOR_NAMED,
24974                                                  /*ctor_dtor_or_conv_p=*/NULL,
24975                                                  /*parenthesized_p=*/NULL,
24976                                                  /*member_p=*/false);
24977               attributes = cp_parser_attributes_opt (parser);
24978               asm_specification = cp_parser_asm_specification_opt (parser);
24979
24980               if (declarator == cp_error_declarator) 
24981                 cp_parser_skip_to_end_of_statement (parser);
24982
24983               else 
24984                 {
24985                   tree pushed_scope, auto_node;
24986
24987                   decl = start_decl (declarator, &type_specifiers,
24988                                      SD_INITIALIZED, attributes,
24989                                      /*prefix_attributes=*/NULL_TREE,
24990                                      &pushed_scope);
24991
24992                   auto_node = type_uses_auto (TREE_TYPE (decl));
24993                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
24994                     {
24995                       if (cp_lexer_next_token_is (parser->lexer, 
24996                                                   CPP_OPEN_PAREN))
24997                         error ("parenthesized initialization is not allowed in "
24998                                "OpenMP %<for%> loop");
24999                       else
25000                         /* Trigger an error.  */
25001                         cp_parser_require (parser, CPP_EQ, RT_EQ);
25002
25003                       init = error_mark_node;
25004                       cp_parser_skip_to_end_of_statement (parser);
25005                     }
25006                   else if (CLASS_TYPE_P (TREE_TYPE (decl))
25007                            || type_dependent_expression_p (decl)
25008                            || auto_node)
25009                     {
25010                       bool is_direct_init, is_non_constant_init;
25011
25012                       init = cp_parser_initializer (parser,
25013                                                     &is_direct_init,
25014                                                     &is_non_constant_init);
25015
25016                       if (auto_node)
25017                         {
25018                           TREE_TYPE (decl)
25019                             = do_auto_deduction (TREE_TYPE (decl), init,
25020                                                  auto_node);
25021
25022                           if (!CLASS_TYPE_P (TREE_TYPE (decl))
25023                               && !type_dependent_expression_p (decl))
25024                             goto non_class;
25025                         }
25026                       
25027                       cp_finish_decl (decl, init, !is_non_constant_init,
25028                                       asm_specification,
25029                                       LOOKUP_ONLYCONVERTING);
25030                       if (CLASS_TYPE_P (TREE_TYPE (decl)))
25031                         {
25032                           VEC_safe_push (tree, gc, for_block, this_pre_body);
25033                           init = NULL_TREE;
25034                         }
25035                       else
25036                         init = pop_stmt_list (this_pre_body);
25037                       this_pre_body = NULL_TREE;
25038                     }
25039                   else
25040                     {
25041                       /* Consume '='.  */
25042                       cp_lexer_consume_token (parser->lexer);
25043                       init = cp_parser_assignment_expression (parser, false, NULL);
25044
25045                     non_class:
25046                       if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
25047                         init = error_mark_node;
25048                       else
25049                         cp_finish_decl (decl, NULL_TREE,
25050                                         /*init_const_expr_p=*/false,
25051                                         asm_specification,
25052                                         LOOKUP_ONLYCONVERTING);
25053                     }
25054
25055                   if (pushed_scope)
25056                     pop_scope (pushed_scope);
25057                 }
25058             }
25059           else 
25060             {
25061               cp_id_kind idk;
25062               /* If parsing a type specifier sequence failed, then
25063                  this MUST be a simple expression.  */
25064               cp_parser_parse_tentatively (parser);
25065               decl = cp_parser_primary_expression (parser, false, false,
25066                                                    false, &idk);
25067               if (!cp_parser_error_occurred (parser)
25068                   && decl
25069                   && DECL_P (decl)
25070                   && CLASS_TYPE_P (TREE_TYPE (decl)))
25071                 {
25072                   tree rhs;
25073
25074                   cp_parser_parse_definitely (parser);
25075                   cp_parser_require (parser, CPP_EQ, RT_EQ);
25076                   rhs = cp_parser_assignment_expression (parser, false, NULL);
25077                   finish_expr_stmt (build_x_modify_expr (decl, NOP_EXPR,
25078                                                          rhs,
25079                                                          tf_warning_or_error));
25080                   add_private_clause = true;
25081                 }
25082               else
25083                 {
25084                   decl = NULL;
25085                   cp_parser_abort_tentative_parse (parser);
25086                   init = cp_parser_expression (parser, false, NULL);
25087                   if (init)
25088                     {
25089                       if (TREE_CODE (init) == MODIFY_EXPR
25090                           || TREE_CODE (init) == MODOP_EXPR)
25091                         real_decl = TREE_OPERAND (init, 0);
25092                     }
25093                 }
25094             }
25095         }
25096       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
25097       if (this_pre_body)
25098         {
25099           this_pre_body = pop_stmt_list (this_pre_body);
25100           if (pre_body)
25101             {
25102               tree t = pre_body;
25103               pre_body = push_stmt_list ();
25104               add_stmt (t);
25105               add_stmt (this_pre_body);
25106               pre_body = pop_stmt_list (pre_body);
25107             }
25108           else
25109             pre_body = this_pre_body;
25110         }
25111
25112       if (decl)
25113         real_decl = decl;
25114       if (par_clauses != NULL && real_decl != NULL_TREE)
25115         {
25116           tree *c;
25117           for (c = par_clauses; *c ; )
25118             if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
25119                 && OMP_CLAUSE_DECL (*c) == real_decl)
25120               {
25121                 error_at (loc, "iteration variable %qD"
25122                           " should not be firstprivate", real_decl);
25123                 *c = OMP_CLAUSE_CHAIN (*c);
25124               }
25125             else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
25126                      && OMP_CLAUSE_DECL (*c) == real_decl)
25127               {
25128                 /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
25129                    change it to shared (decl) in OMP_PARALLEL_CLAUSES.  */
25130                 tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
25131                 OMP_CLAUSE_DECL (l) = real_decl;
25132                 OMP_CLAUSE_CHAIN (l) = clauses;
25133                 CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
25134                 clauses = l;
25135                 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
25136                 CP_OMP_CLAUSE_INFO (*c) = NULL;
25137                 add_private_clause = false;
25138               }
25139             else
25140               {
25141                 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
25142                     && OMP_CLAUSE_DECL (*c) == real_decl)
25143                   add_private_clause = false;
25144                 c = &OMP_CLAUSE_CHAIN (*c);
25145               }
25146         }
25147
25148       if (add_private_clause)
25149         {
25150           tree c;
25151           for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
25152             {
25153               if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
25154                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
25155                   && OMP_CLAUSE_DECL (c) == decl)
25156                 break;
25157               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
25158                        && OMP_CLAUSE_DECL (c) == decl)
25159                 error_at (loc, "iteration variable %qD "
25160                           "should not be firstprivate",
25161                           decl);
25162               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
25163                        && OMP_CLAUSE_DECL (c) == decl)
25164                 error_at (loc, "iteration variable %qD should not be reduction",
25165                           decl);
25166             }
25167           if (c == NULL)
25168             {
25169               c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
25170               OMP_CLAUSE_DECL (c) = decl;
25171               c = finish_omp_clauses (c);
25172               if (c)
25173                 {
25174                   OMP_CLAUSE_CHAIN (c) = clauses;
25175                   clauses = c;
25176                 }
25177             }
25178         }
25179
25180       cond = NULL;
25181       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
25182         cond = cp_parser_omp_for_cond (parser, decl);
25183       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
25184
25185       incr = NULL;
25186       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
25187         {
25188           /* If decl is an iterator, preserve the operator on decl
25189              until finish_omp_for.  */
25190           if (decl
25191               && ((type_dependent_expression_p (decl)
25192                    && !POINTER_TYPE_P (TREE_TYPE (decl)))
25193                   || CLASS_TYPE_P (TREE_TYPE (decl))))
25194             incr = cp_parser_omp_for_incr (parser, decl);
25195           else
25196             incr = cp_parser_expression (parser, false, NULL);
25197         }
25198
25199       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
25200         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
25201                                                /*or_comma=*/false,
25202                                                /*consume_paren=*/true);
25203
25204       TREE_VEC_ELT (declv, i) = decl;
25205       TREE_VEC_ELT (initv, i) = init;
25206       TREE_VEC_ELT (condv, i) = cond;
25207       TREE_VEC_ELT (incrv, i) = incr;
25208
25209       if (i == collapse - 1)
25210         break;
25211
25212       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
25213          in between the collapsed for loops to be still considered perfectly
25214          nested.  Hopefully the final version clarifies this.
25215          For now handle (multiple) {'s and empty statements.  */
25216       cp_parser_parse_tentatively (parser);
25217       do
25218         {
25219           if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
25220             break;
25221           else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
25222             {
25223               cp_lexer_consume_token (parser->lexer);
25224               bracecount++;
25225             }
25226           else if (bracecount
25227                    && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25228             cp_lexer_consume_token (parser->lexer);
25229           else
25230             {
25231               loc = cp_lexer_peek_token (parser->lexer)->location;
25232               error_at (loc, "not enough collapsed for loops");
25233               collapse_err = true;
25234               cp_parser_abort_tentative_parse (parser);
25235               declv = NULL_TREE;
25236               break;
25237             }
25238         }
25239       while (1);
25240
25241       if (declv)
25242         {
25243           cp_parser_parse_definitely (parser);
25244           nbraces += bracecount;
25245         }
25246     }
25247
25248   /* Note that we saved the original contents of this flag when we entered
25249      the structured block, and so we don't need to re-save it here.  */
25250   parser->in_statement = IN_OMP_FOR;
25251
25252   /* Note that the grammar doesn't call for a structured block here,
25253      though the loop as a whole is a structured block.  */
25254   body = push_stmt_list ();
25255   cp_parser_statement (parser, NULL_TREE, false, NULL);
25256   body = pop_stmt_list (body);
25257
25258   if (declv == NULL_TREE)
25259     ret = NULL_TREE;
25260   else
25261     ret = finish_omp_for (loc_first, declv, initv, condv, incrv, body,
25262                           pre_body, clauses);
25263
25264   while (nbraces)
25265     {
25266       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
25267         {
25268           cp_lexer_consume_token (parser->lexer);
25269           nbraces--;
25270         }
25271       else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
25272         cp_lexer_consume_token (parser->lexer);
25273       else
25274         {
25275           if (!collapse_err)
25276             {
25277               error_at (cp_lexer_peek_token (parser->lexer)->location,
25278                         "collapsed loops not perfectly nested");
25279             }
25280           collapse_err = true;
25281           cp_parser_statement_seq_opt (parser, NULL);
25282           if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
25283             break;
25284         }
25285     }
25286
25287   while (!VEC_empty (tree, for_block))
25288     add_stmt (pop_stmt_list (VEC_pop (tree, for_block)));
25289   release_tree_vector (for_block);
25290
25291   return ret;
25292 }
25293
25294 /* OpenMP 2.5:
25295    #pragma omp for for-clause[optseq] new-line
25296      for-loop  */
25297
25298 #define OMP_FOR_CLAUSE_MASK                             \
25299         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25300         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25301         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
25302         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25303         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
25304         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
25305         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT)              \
25306         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE))
25307
25308 static tree
25309 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok)
25310 {
25311   tree clauses, sb, ret;
25312   unsigned int save;
25313
25314   clauses = cp_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
25315                                        "#pragma omp for", pragma_tok);
25316
25317   sb = begin_omp_structured_block ();
25318   save = cp_parser_begin_omp_structured_block (parser);
25319
25320   ret = cp_parser_omp_for_loop (parser, clauses, NULL);
25321
25322   cp_parser_end_omp_structured_block (parser, save);
25323   add_stmt (finish_omp_structured_block (sb));
25324
25325   return ret;
25326 }
25327
25328 /* OpenMP 2.5:
25329    # pragma omp master new-line
25330      structured-block  */
25331
25332 static tree
25333 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok)
25334 {
25335   cp_parser_require_pragma_eol (parser, pragma_tok);
25336   return c_finish_omp_master (input_location,
25337                               cp_parser_omp_structured_block (parser));
25338 }
25339
25340 /* OpenMP 2.5:
25341    # pragma omp ordered new-line
25342      structured-block  */
25343
25344 static tree
25345 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok)
25346 {
25347   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
25348   cp_parser_require_pragma_eol (parser, pragma_tok);
25349   return c_finish_omp_ordered (loc, cp_parser_omp_structured_block (parser));
25350 }
25351
25352 /* OpenMP 2.5:
25353
25354    section-scope:
25355      { section-sequence }
25356
25357    section-sequence:
25358      section-directive[opt] structured-block
25359      section-sequence section-directive structured-block  */
25360
25361 static tree
25362 cp_parser_omp_sections_scope (cp_parser *parser)
25363 {
25364   tree stmt, substmt;
25365   bool error_suppress = false;
25366   cp_token *tok;
25367
25368   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
25369     return NULL_TREE;
25370
25371   stmt = push_stmt_list ();
25372
25373   if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION)
25374     {
25375       unsigned save;
25376
25377       substmt = begin_omp_structured_block ();
25378       save = cp_parser_begin_omp_structured_block (parser);
25379
25380       while (1)
25381         {
25382           cp_parser_statement (parser, NULL_TREE, false, NULL);
25383
25384           tok = cp_lexer_peek_token (parser->lexer);
25385           if (tok->pragma_kind == PRAGMA_OMP_SECTION)
25386             break;
25387           if (tok->type == CPP_CLOSE_BRACE)
25388             break;
25389           if (tok->type == CPP_EOF)
25390             break;
25391         }
25392
25393       cp_parser_end_omp_structured_block (parser, save);
25394       substmt = finish_omp_structured_block (substmt);
25395       substmt = build1 (OMP_SECTION, void_type_node, substmt);
25396       add_stmt (substmt);
25397     }
25398
25399   while (1)
25400     {
25401       tok = cp_lexer_peek_token (parser->lexer);
25402       if (tok->type == CPP_CLOSE_BRACE)
25403         break;
25404       if (tok->type == CPP_EOF)
25405         break;
25406
25407       if (tok->pragma_kind == PRAGMA_OMP_SECTION)
25408         {
25409           cp_lexer_consume_token (parser->lexer);
25410           cp_parser_require_pragma_eol (parser, tok);
25411           error_suppress = false;
25412         }
25413       else if (!error_suppress)
25414         {
25415           cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
25416           error_suppress = true;
25417         }
25418
25419       substmt = cp_parser_omp_structured_block (parser);
25420       substmt = build1 (OMP_SECTION, void_type_node, substmt);
25421       add_stmt (substmt);
25422     }
25423   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
25424
25425   substmt = pop_stmt_list (stmt);
25426
25427   stmt = make_node (OMP_SECTIONS);
25428   TREE_TYPE (stmt) = void_type_node;
25429   OMP_SECTIONS_BODY (stmt) = substmt;
25430
25431   add_stmt (stmt);
25432   return stmt;
25433 }
25434
25435 /* OpenMP 2.5:
25436    # pragma omp sections sections-clause[optseq] newline
25437      sections-scope  */
25438
25439 #define OMP_SECTIONS_CLAUSE_MASK                        \
25440         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25441         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25442         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
25443         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25444         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25445
25446 static tree
25447 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok)
25448 {
25449   tree clauses, ret;
25450
25451   clauses = cp_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
25452                                        "#pragma omp sections", pragma_tok);
25453
25454   ret = cp_parser_omp_sections_scope (parser);
25455   if (ret)
25456     OMP_SECTIONS_CLAUSES (ret) = clauses;
25457
25458   return ret;
25459 }
25460
25461 /* OpenMP 2.5:
25462    # pragma parallel parallel-clause new-line
25463    # pragma parallel for parallel-for-clause new-line
25464    # pragma parallel sections parallel-sections-clause new-line  */
25465
25466 #define OMP_PARALLEL_CLAUSE_MASK                        \
25467         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25468         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25469         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25470         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25471         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
25472         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
25473         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
25474         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
25475
25476 static tree
25477 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok)
25478 {
25479   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
25480   const char *p_name = "#pragma omp parallel";
25481   tree stmt, clauses, par_clause, ws_clause, block;
25482   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
25483   unsigned int save;
25484   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
25485
25486   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
25487     {
25488       cp_lexer_consume_token (parser->lexer);
25489       p_kind = PRAGMA_OMP_PARALLEL_FOR;
25490       p_name = "#pragma omp parallel for";
25491       mask |= OMP_FOR_CLAUSE_MASK;
25492       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
25493     }
25494   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
25495     {
25496       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
25497       const char *p = IDENTIFIER_POINTER (id);
25498       if (strcmp (p, "sections") == 0)
25499         {
25500           cp_lexer_consume_token (parser->lexer);
25501           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
25502           p_name = "#pragma omp parallel sections";
25503           mask |= OMP_SECTIONS_CLAUSE_MASK;
25504           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
25505         }
25506     }
25507
25508   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
25509   block = begin_omp_parallel ();
25510   save = cp_parser_begin_omp_structured_block (parser);
25511
25512   switch (p_kind)
25513     {
25514     case PRAGMA_OMP_PARALLEL:
25515       cp_parser_statement (parser, NULL_TREE, false, NULL);
25516       par_clause = clauses;
25517       break;
25518
25519     case PRAGMA_OMP_PARALLEL_FOR:
25520       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25521       cp_parser_omp_for_loop (parser, ws_clause, &par_clause);
25522       break;
25523
25524     case PRAGMA_OMP_PARALLEL_SECTIONS:
25525       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25526       stmt = cp_parser_omp_sections_scope (parser);
25527       if (stmt)
25528         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
25529       break;
25530
25531     default:
25532       gcc_unreachable ();
25533     }
25534
25535   cp_parser_end_omp_structured_block (parser, save);
25536   stmt = finish_omp_parallel (par_clause, block);
25537   if (p_kind != PRAGMA_OMP_PARALLEL)
25538     OMP_PARALLEL_COMBINED (stmt) = 1;
25539   return stmt;
25540 }
25541
25542 /* OpenMP 2.5:
25543    # pragma omp single single-clause[optseq] new-line
25544      structured-block  */
25545
25546 #define OMP_SINGLE_CLAUSE_MASK                          \
25547         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25548         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25549         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
25550         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25551
25552 static tree
25553 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok)
25554 {
25555   tree stmt = make_node (OMP_SINGLE);
25556   TREE_TYPE (stmt) = void_type_node;
25557
25558   OMP_SINGLE_CLAUSES (stmt)
25559     = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
25560                                  "#pragma omp single", pragma_tok);
25561   OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser);
25562
25563   return add_stmt (stmt);
25564 }
25565
25566 /* OpenMP 3.0:
25567    # pragma omp task task-clause[optseq] new-line
25568      structured-block  */
25569
25570 #define OMP_TASK_CLAUSE_MASK                            \
25571         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25572         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
25573         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25574         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25575         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25576         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
25577         | (1u << PRAGMA_OMP_CLAUSE_FINAL)               \
25578         | (1u << PRAGMA_OMP_CLAUSE_MERGEABLE))
25579
25580 static tree
25581 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok)
25582 {
25583   tree clauses, block;
25584   unsigned int save;
25585
25586   clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
25587                                        "#pragma omp task", pragma_tok);
25588   block = begin_omp_task ();
25589   save = cp_parser_begin_omp_structured_block (parser);
25590   cp_parser_statement (parser, NULL_TREE, false, NULL);
25591   cp_parser_end_omp_structured_block (parser, save);
25592   return finish_omp_task (clauses, block);
25593 }
25594
25595 /* OpenMP 3.0:
25596    # pragma omp taskwait new-line  */
25597
25598 static void
25599 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
25600 {
25601   cp_parser_require_pragma_eol (parser, pragma_tok);
25602   finish_omp_taskwait ();
25603 }
25604
25605 /* OpenMP 3.1:
25606    # pragma omp taskyield new-line  */
25607
25608 static void
25609 cp_parser_omp_taskyield (cp_parser *parser, cp_token *pragma_tok)
25610 {
25611   cp_parser_require_pragma_eol (parser, pragma_tok);
25612   finish_omp_taskyield ();
25613 }
25614
25615 /* OpenMP 2.5:
25616    # pragma omp threadprivate (variable-list) */
25617
25618 static void
25619 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
25620 {
25621   tree vars;
25622
25623   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
25624   cp_parser_require_pragma_eol (parser, pragma_tok);
25625
25626   finish_omp_threadprivate (vars);
25627 }
25628
25629 /* Main entry point to OpenMP statement pragmas.  */
25630
25631 static void
25632 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok)
25633 {
25634   tree stmt;
25635
25636   switch (pragma_tok->pragma_kind)
25637     {
25638     case PRAGMA_OMP_ATOMIC:
25639       cp_parser_omp_atomic (parser, pragma_tok);
25640       return;
25641     case PRAGMA_OMP_CRITICAL:
25642       stmt = cp_parser_omp_critical (parser, pragma_tok);
25643       break;
25644     case PRAGMA_OMP_FOR:
25645       stmt = cp_parser_omp_for (parser, pragma_tok);
25646       break;
25647     case PRAGMA_OMP_MASTER:
25648       stmt = cp_parser_omp_master (parser, pragma_tok);
25649       break;
25650     case PRAGMA_OMP_ORDERED:
25651       stmt = cp_parser_omp_ordered (parser, pragma_tok);
25652       break;
25653     case PRAGMA_OMP_PARALLEL:
25654       stmt = cp_parser_omp_parallel (parser, pragma_tok);
25655       break;
25656     case PRAGMA_OMP_SECTIONS:
25657       stmt = cp_parser_omp_sections (parser, pragma_tok);
25658       break;
25659     case PRAGMA_OMP_SINGLE:
25660       stmt = cp_parser_omp_single (parser, pragma_tok);
25661       break;
25662     case PRAGMA_OMP_TASK:
25663       stmt = cp_parser_omp_task (parser, pragma_tok);
25664       break;
25665     default:
25666       gcc_unreachable ();
25667     }
25668
25669   if (stmt)
25670     SET_EXPR_LOCATION (stmt, pragma_tok->location);
25671 }
25672 \f
25673 /* The parser.  */
25674
25675 static GTY (()) cp_parser *the_parser;
25676
25677 \f
25678 /* Special handling for the first token or line in the file.  The first
25679    thing in the file might be #pragma GCC pch_preprocess, which loads a
25680    PCH file, which is a GC collection point.  So we need to handle this
25681    first pragma without benefit of an existing lexer structure.
25682
25683    Always returns one token to the caller in *FIRST_TOKEN.  This is
25684    either the true first token of the file, or the first token after
25685    the initial pragma.  */
25686
25687 static void
25688 cp_parser_initial_pragma (cp_token *first_token)
25689 {
25690   tree name = NULL;
25691
25692   cp_lexer_get_preprocessor_token (NULL, first_token);
25693   if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS)
25694     return;
25695
25696   cp_lexer_get_preprocessor_token (NULL, first_token);
25697   if (first_token->type == CPP_STRING)
25698     {
25699       name = first_token->u.value;
25700
25701       cp_lexer_get_preprocessor_token (NULL, first_token);
25702       if (first_token->type != CPP_PRAGMA_EOL)
25703         error_at (first_token->location,
25704                   "junk at end of %<#pragma GCC pch_preprocess%>");
25705     }
25706   else
25707     error_at (first_token->location, "expected string literal");
25708
25709   /* Skip to the end of the pragma.  */
25710   while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
25711     cp_lexer_get_preprocessor_token (NULL, first_token);
25712
25713   /* Now actually load the PCH file.  */
25714   if (name)
25715     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
25716
25717   /* Read one more token to return to our caller.  We have to do this
25718      after reading the PCH file in, since its pointers have to be
25719      live.  */
25720   cp_lexer_get_preprocessor_token (NULL, first_token);
25721 }
25722
25723 /* Normal parsing of a pragma token.  Here we can (and must) use the
25724    regular lexer.  */
25725
25726 static bool
25727 cp_parser_pragma (cp_parser *parser, enum pragma_context context)
25728 {
25729   cp_token *pragma_tok;
25730   unsigned int id;
25731
25732   pragma_tok = cp_lexer_consume_token (parser->lexer);
25733   gcc_assert (pragma_tok->type == CPP_PRAGMA);
25734   parser->lexer->in_pragma = true;
25735
25736   id = pragma_tok->pragma_kind;
25737   switch (id)
25738     {
25739     case PRAGMA_GCC_PCH_PREPROCESS:
25740       error_at (pragma_tok->location,
25741                 "%<#pragma GCC pch_preprocess%> must be first");
25742       break;
25743
25744     case PRAGMA_OMP_BARRIER:
25745       switch (context)
25746         {
25747         case pragma_compound:
25748           cp_parser_omp_barrier (parser, pragma_tok);
25749           return false;
25750         case pragma_stmt:
25751           error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
25752                     "used in compound statements");
25753           break;
25754         default:
25755           goto bad_stmt;
25756         }
25757       break;
25758
25759     case PRAGMA_OMP_FLUSH:
25760       switch (context)
25761         {
25762         case pragma_compound:
25763           cp_parser_omp_flush (parser, pragma_tok);
25764           return false;
25765         case pragma_stmt:
25766           error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
25767                     "used in compound statements");
25768           break;
25769         default:
25770           goto bad_stmt;
25771         }
25772       break;
25773
25774     case PRAGMA_OMP_TASKWAIT:
25775       switch (context)
25776         {
25777         case pragma_compound:
25778           cp_parser_omp_taskwait (parser, pragma_tok);
25779           return false;
25780         case pragma_stmt:
25781           error_at (pragma_tok->location,
25782                     "%<#pragma omp taskwait%> may only be "
25783                     "used in compound statements");
25784           break;
25785         default:
25786           goto bad_stmt;
25787         }
25788       break;
25789
25790     case PRAGMA_OMP_TASKYIELD:
25791       switch (context)
25792         {
25793         case pragma_compound:
25794           cp_parser_omp_taskyield (parser, pragma_tok);
25795           return false;
25796         case pragma_stmt:
25797           error_at (pragma_tok->location,
25798                     "%<#pragma omp taskyield%> may only be "
25799                     "used in compound statements");
25800           break;
25801         default:
25802           goto bad_stmt;
25803         }
25804       break;
25805
25806     case PRAGMA_OMP_THREADPRIVATE:
25807       cp_parser_omp_threadprivate (parser, pragma_tok);
25808       return false;
25809
25810     case PRAGMA_OMP_ATOMIC:
25811     case PRAGMA_OMP_CRITICAL:
25812     case PRAGMA_OMP_FOR:
25813     case PRAGMA_OMP_MASTER:
25814     case PRAGMA_OMP_ORDERED:
25815     case PRAGMA_OMP_PARALLEL:
25816     case PRAGMA_OMP_SECTIONS:
25817     case PRAGMA_OMP_SINGLE:
25818     case PRAGMA_OMP_TASK:
25819       if (context == pragma_external)
25820         goto bad_stmt;
25821       cp_parser_omp_construct (parser, pragma_tok);
25822       return true;
25823
25824     case PRAGMA_OMP_SECTION:
25825       error_at (pragma_tok->location, 
25826                 "%<#pragma omp section%> may only be used in "
25827                 "%<#pragma omp sections%> construct");
25828       break;
25829
25830     default:
25831       gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
25832       c_invoke_pragma_handler (id);
25833       break;
25834
25835     bad_stmt:
25836       cp_parser_error (parser, "expected declaration specifiers");
25837       break;
25838     }
25839
25840   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
25841   return false;
25842 }
25843
25844 /* The interface the pragma parsers have to the lexer.  */
25845
25846 enum cpp_ttype
25847 pragma_lex (tree *value)
25848 {
25849   cp_token *tok;
25850   enum cpp_ttype ret;
25851
25852   tok = cp_lexer_peek_token (the_parser->lexer);
25853
25854   ret = tok->type;
25855   *value = tok->u.value;
25856
25857   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
25858     ret = CPP_EOF;
25859   else if (ret == CPP_STRING)
25860     *value = cp_parser_string_literal (the_parser, false, false);
25861   else
25862     {
25863       cp_lexer_consume_token (the_parser->lexer);
25864       if (ret == CPP_KEYWORD)
25865         ret = CPP_NAME;
25866     }
25867
25868   return ret;
25869 }
25870
25871 \f
25872 /* External interface.  */
25873
25874 /* Parse one entire translation unit.  */
25875
25876 void
25877 c_parse_file (void)
25878 {
25879   static bool already_called = false;
25880
25881   if (already_called)
25882     {
25883       sorry ("inter-module optimizations not implemented for C++");
25884       return;
25885     }
25886   already_called = true;
25887
25888   the_parser = cp_parser_new ();
25889   push_deferring_access_checks (flag_access_control
25890                                 ? dk_no_deferred : dk_no_check);
25891   cp_parser_translation_unit (the_parser);
25892   the_parser = NULL;
25893 }
25894
25895 #include "gt-cp-parser.h"