OSDN Git Service

DR 1207
[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 /* Return a pointer to the Nth token in the token stream.  If N is 1,
667    then this is precisely equivalent to cp_lexer_peek_token (except
668    that it is not inline).  One would like to disallow that case, but
669    there is one case (cp_parser_nth_token_starts_template_id) where
670    the caller passes a variable for N and it might be 1.  */
671
672 static cp_token *
673 cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
674 {
675   cp_token *token;
676
677   /* N is 1-based, not zero-based.  */
678   gcc_assert (n > 0);
679
680   if (cp_lexer_debugging_p (lexer))
681     fprintf (cp_lexer_debug_stream,
682              "cp_lexer: peeking ahead %ld at token: ", (long)n);
683
684   --n;
685   token = lexer->next_token;
686   gcc_assert (!n || token != &eof_token);
687   while (n != 0)
688     {
689       ++token;
690       if (token == lexer->last_token)
691         {
692           token = &eof_token;
693           break;
694         }
695
696       if (!token->purged_p)
697         --n;
698     }
699
700   if (cp_lexer_debugging_p (lexer))
701     {
702       cp_lexer_print_token (cp_lexer_debug_stream, token);
703       putc ('\n', cp_lexer_debug_stream);
704     }
705
706   return token;
707 }
708
709 /* Return the next token, and advance the lexer's next_token pointer
710    to point to the next non-purged token.  */
711
712 static cp_token *
713 cp_lexer_consume_token (cp_lexer* lexer)
714 {
715   cp_token *token = lexer->next_token;
716
717   gcc_assert (token != &eof_token);
718   gcc_assert (!lexer->in_pragma || token->type != CPP_PRAGMA_EOL);
719
720   do
721     {
722       lexer->next_token++;
723       if (lexer->next_token == lexer->last_token)
724         {
725           lexer->next_token = &eof_token;
726           break;
727         }
728
729     }
730   while (lexer->next_token->purged_p);
731
732   cp_lexer_set_source_position_from_token (token);
733
734   /* Provide debugging output.  */
735   if (cp_lexer_debugging_p (lexer))
736     {
737       fputs ("cp_lexer: consuming token: ", cp_lexer_debug_stream);
738       cp_lexer_print_token (cp_lexer_debug_stream, token);
739       putc ('\n', cp_lexer_debug_stream);
740     }
741
742   return token;
743 }
744
745 /* Permanently remove the next token from the token stream, and
746    advance the next_token pointer to refer to the next non-purged
747    token.  */
748
749 static void
750 cp_lexer_purge_token (cp_lexer *lexer)
751 {
752   cp_token *tok = lexer->next_token;
753
754   gcc_assert (tok != &eof_token);
755   tok->purged_p = true;
756   tok->location = UNKNOWN_LOCATION;
757   tok->u.value = NULL_TREE;
758   tok->keyword = RID_MAX;
759
760   do
761     {
762       tok++;
763       if (tok == lexer->last_token)
764         {
765           tok = &eof_token;
766           break;
767         }
768     }
769   while (tok->purged_p);
770   lexer->next_token = tok;
771 }
772
773 /* Permanently remove all tokens after TOK, up to, but not
774    including, the token that will be returned next by
775    cp_lexer_peek_token.  */
776
777 static void
778 cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
779 {
780   cp_token *peek = lexer->next_token;
781
782   if (peek == &eof_token)
783     peek = lexer->last_token;
784
785   gcc_assert (tok < peek);
786
787   for ( tok += 1; tok != peek; tok += 1)
788     {
789       tok->purged_p = true;
790       tok->location = UNKNOWN_LOCATION;
791       tok->u.value = NULL_TREE;
792       tok->keyword = RID_MAX;
793     }
794 }
795
796 /* Begin saving tokens.  All tokens consumed after this point will be
797    preserved.  */
798
799 static void
800 cp_lexer_save_tokens (cp_lexer* lexer)
801 {
802   /* Provide debugging output.  */
803   if (cp_lexer_debugging_p (lexer))
804     fprintf (cp_lexer_debug_stream, "cp_lexer: saving tokens\n");
805
806   VEC_safe_push (cp_token_position, heap,
807                  lexer->saved_tokens, lexer->next_token);
808 }
809
810 /* Commit to the portion of the token stream most recently saved.  */
811
812 static void
813 cp_lexer_commit_tokens (cp_lexer* lexer)
814 {
815   /* Provide debugging output.  */
816   if (cp_lexer_debugging_p (lexer))
817     fprintf (cp_lexer_debug_stream, "cp_lexer: committing tokens\n");
818
819   VEC_pop (cp_token_position, lexer->saved_tokens);
820 }
821
822 /* Return all tokens saved since the last call to cp_lexer_save_tokens
823    to the token stream.  Stop saving tokens.  */
824
825 static void
826 cp_lexer_rollback_tokens (cp_lexer* lexer)
827 {
828   /* Provide debugging output.  */
829   if (cp_lexer_debugging_p (lexer))
830     fprintf (cp_lexer_debug_stream, "cp_lexer: restoring tokens\n");
831
832   lexer->next_token = VEC_pop (cp_token_position, lexer->saved_tokens);
833 }
834
835 /* Print a representation of the TOKEN on the STREAM.  */
836
837 #ifdef ENABLE_CHECKING
838
839 static void
840 cp_lexer_print_token (FILE * stream, cp_token *token)
841 {
842   /* We don't use cpp_type2name here because the parser defines
843      a few tokens of its own.  */
844   static const char *const token_names[] = {
845     /* cpplib-defined token types */
846 #define OP(e, s) #e,
847 #define TK(e, s) #e,
848     TTYPE_TABLE
849 #undef OP
850 #undef TK
851     /* C++ parser token types - see "Manifest constants", above.  */
852     "KEYWORD",
853     "TEMPLATE_ID",
854     "NESTED_NAME_SPECIFIER",
855   };
856
857   /* For some tokens, print the associated data.  */
858   switch (token->type)
859     {
860     case CPP_KEYWORD:
861       /* Some keywords have a value that is not an IDENTIFIER_NODE.
862          For example, `struct' is mapped to an INTEGER_CST.  */
863       if (TREE_CODE (token->u.value) != IDENTIFIER_NODE)
864         break;
865       /* else fall through */
866     case CPP_NAME:
867       fputs (IDENTIFIER_POINTER (token->u.value), stream);
868       break;
869
870     case CPP_STRING:
871     case CPP_STRING16:
872     case CPP_STRING32:
873     case CPP_WSTRING:
874     case CPP_UTF8STRING:
875       fprintf (stream, " \"%s\"", TREE_STRING_POINTER (token->u.value));
876       break;
877
878     case CPP_NUMBER:
879       print_generic_expr (stream, token->u.value, 0);
880       break;
881
882     default:
883       /* If we have a name for the token, print it out.  Otherwise, we
884          simply give the numeric code.  */
885       if (token->type < ARRAY_SIZE(token_names))
886         fputs (token_names[token->type], stream);
887       else
888         fprintf (stream, "[%d]", token->type);
889       break;
890     }
891 }
892
893 /* Start emitting debugging information.  */
894
895 static void
896 cp_lexer_start_debugging (cp_lexer* lexer)
897 {
898   lexer->debugging_p = true;
899 }
900
901 /* Stop emitting debugging information.  */
902
903 static void
904 cp_lexer_stop_debugging (cp_lexer* lexer)
905 {
906   lexer->debugging_p = false;
907 }
908
909 #endif /* ENABLE_CHECKING */
910
911 /* Create a new cp_token_cache, representing a range of tokens.  */
912
913 static cp_token_cache *
914 cp_token_cache_new (cp_token *first, cp_token *last)
915 {
916   cp_token_cache *cache = ggc_alloc_cp_token_cache ();
917   cache->first = first;
918   cache->last = last;
919   return cache;
920 }
921
922 \f
923 /* Decl-specifiers.  */
924
925 /* Set *DECL_SPECS to represent an empty decl-specifier-seq.  */
926
927 static void
928 clear_decl_specs (cp_decl_specifier_seq *decl_specs)
929 {
930   memset (decl_specs, 0, sizeof (cp_decl_specifier_seq));
931 }
932
933 /* Declarators.  */
934
935 /* Nothing other than the parser should be creating declarators;
936    declarators are a semi-syntactic representation of C++ entities.
937    Other parts of the front end that need to create entities (like
938    VAR_DECLs or FUNCTION_DECLs) should do that directly.  */
939
940 static cp_declarator *make_call_declarator
941   (cp_declarator *, tree, cp_cv_quals, cp_virt_specifiers, tree, tree);
942 static cp_declarator *make_array_declarator
943   (cp_declarator *, tree);
944 static cp_declarator *make_pointer_declarator
945   (cp_cv_quals, cp_declarator *);
946 static cp_declarator *make_reference_declarator
947   (cp_cv_quals, cp_declarator *, bool);
948 static cp_parameter_declarator *make_parameter_declarator
949   (cp_decl_specifier_seq *, cp_declarator *, tree);
950 static cp_declarator *make_ptrmem_declarator
951   (cp_cv_quals, tree, cp_declarator *);
952
953 /* An erroneous declarator.  */
954 static cp_declarator *cp_error_declarator;
955
956 /* The obstack on which declarators and related data structures are
957    allocated.  */
958 static struct obstack declarator_obstack;
959
960 /* Alloc BYTES from the declarator memory pool.  */
961
962 static inline void *
963 alloc_declarator (size_t bytes)
964 {
965   return obstack_alloc (&declarator_obstack, bytes);
966 }
967
968 /* Allocate a declarator of the indicated KIND.  Clear fields that are
969    common to all declarators.  */
970
971 static cp_declarator *
972 make_declarator (cp_declarator_kind kind)
973 {
974   cp_declarator *declarator;
975
976   declarator = (cp_declarator *) alloc_declarator (sizeof (cp_declarator));
977   declarator->kind = kind;
978   declarator->attributes = NULL_TREE;
979   declarator->declarator = NULL;
980   declarator->parameter_pack_p = false;
981   declarator->id_loc = UNKNOWN_LOCATION;
982
983   return declarator;
984 }
985
986 /* Make a declarator for a generalized identifier.  If
987    QUALIFYING_SCOPE is non-NULL, the identifier is
988    QUALIFYING_SCOPE::UNQUALIFIED_NAME; otherwise, it is just
989    UNQUALIFIED_NAME.  SFK indicates the kind of special function this
990    is, if any.   */
991
992 static cp_declarator *
993 make_id_declarator (tree qualifying_scope, tree unqualified_name,
994                     special_function_kind sfk)
995 {
996   cp_declarator *declarator;
997
998   /* It is valid to write:
999
1000        class C { void f(); };
1001        typedef C D;
1002        void D::f();
1003
1004      The standard is not clear about whether `typedef const C D' is
1005      legal; as of 2002-09-15 the committee is considering that
1006      question.  EDG 3.0 allows that syntax.  Therefore, we do as
1007      well.  */
1008   if (qualifying_scope && TYPE_P (qualifying_scope))
1009     qualifying_scope = TYPE_MAIN_VARIANT (qualifying_scope);
1010
1011   gcc_assert (TREE_CODE (unqualified_name) == IDENTIFIER_NODE
1012               || TREE_CODE (unqualified_name) == BIT_NOT_EXPR
1013               || TREE_CODE (unqualified_name) == TEMPLATE_ID_EXPR);
1014
1015   declarator = make_declarator (cdk_id);
1016   declarator->u.id.qualifying_scope = qualifying_scope;
1017   declarator->u.id.unqualified_name = unqualified_name;
1018   declarator->u.id.sfk = sfk;
1019   
1020   return declarator;
1021 }
1022
1023 /* Make a declarator for a pointer to TARGET.  CV_QUALIFIERS is a list
1024    of modifiers such as const or volatile to apply to the pointer
1025    type, represented as identifiers.  */
1026
1027 cp_declarator *
1028 make_pointer_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target)
1029 {
1030   cp_declarator *declarator;
1031
1032   declarator = make_declarator (cdk_pointer);
1033   declarator->declarator = target;
1034   declarator->u.pointer.qualifiers = cv_qualifiers;
1035   declarator->u.pointer.class_type = NULL_TREE;
1036   if (target)
1037     {
1038       declarator->id_loc = target->id_loc;
1039       declarator->parameter_pack_p = target->parameter_pack_p;
1040       target->parameter_pack_p = false;
1041     }
1042   else
1043     declarator->parameter_pack_p = false;
1044
1045   return declarator;
1046 }
1047
1048 /* Like make_pointer_declarator -- but for references.  */
1049
1050 cp_declarator *
1051 make_reference_declarator (cp_cv_quals cv_qualifiers, cp_declarator *target,
1052                            bool rvalue_ref)
1053 {
1054   cp_declarator *declarator;
1055
1056   declarator = make_declarator (cdk_reference);
1057   declarator->declarator = target;
1058   declarator->u.reference.qualifiers = cv_qualifiers;
1059   declarator->u.reference.rvalue_ref = rvalue_ref;
1060   if (target)
1061     {
1062       declarator->id_loc = target->id_loc;
1063       declarator->parameter_pack_p = target->parameter_pack_p;
1064       target->parameter_pack_p = false;
1065     }
1066   else
1067     declarator->parameter_pack_p = false;
1068
1069   return declarator;
1070 }
1071
1072 /* Like make_pointer_declarator -- but for a pointer to a non-static
1073    member of CLASS_TYPE.  */
1074
1075 cp_declarator *
1076 make_ptrmem_declarator (cp_cv_quals cv_qualifiers, tree class_type,
1077                         cp_declarator *pointee)
1078 {
1079   cp_declarator *declarator;
1080
1081   declarator = make_declarator (cdk_ptrmem);
1082   declarator->declarator = pointee;
1083   declarator->u.pointer.qualifiers = cv_qualifiers;
1084   declarator->u.pointer.class_type = class_type;
1085
1086   if (pointee)
1087     {
1088       declarator->parameter_pack_p = pointee->parameter_pack_p;
1089       pointee->parameter_pack_p = false;
1090     }
1091   else
1092     declarator->parameter_pack_p = false;
1093
1094   return declarator;
1095 }
1096
1097 /* Make a declarator for the function given by TARGET, with the
1098    indicated PARMS.  The CV_QUALIFIERS aply to the function, as in
1099    "const"-qualified member function.  The EXCEPTION_SPECIFICATION
1100    indicates what exceptions can be thrown.  */
1101
1102 cp_declarator *
1103 make_call_declarator (cp_declarator *target,
1104                       tree parms,
1105                       cp_cv_quals cv_qualifiers,
1106                       cp_virt_specifiers virt_specifiers,
1107                       tree exception_specification,
1108                       tree late_return_type)
1109 {
1110   cp_declarator *declarator;
1111
1112   declarator = make_declarator (cdk_function);
1113   declarator->declarator = target;
1114   declarator->u.function.parameters = parms;
1115   declarator->u.function.qualifiers = cv_qualifiers;
1116   declarator->u.function.virt_specifiers = virt_specifiers;
1117   declarator->u.function.exception_specification = exception_specification;
1118   declarator->u.function.late_return_type = late_return_type;
1119   if (target)
1120     {
1121       declarator->id_loc = target->id_loc;
1122       declarator->parameter_pack_p = target->parameter_pack_p;
1123       target->parameter_pack_p = false;
1124     }
1125   else
1126     declarator->parameter_pack_p = false;
1127
1128   return declarator;
1129 }
1130
1131 /* Make a declarator for an array of BOUNDS elements, each of which is
1132    defined by ELEMENT.  */
1133
1134 cp_declarator *
1135 make_array_declarator (cp_declarator *element, tree bounds)
1136 {
1137   cp_declarator *declarator;
1138
1139   declarator = make_declarator (cdk_array);
1140   declarator->declarator = element;
1141   declarator->u.array.bounds = bounds;
1142   if (element)
1143     {
1144       declarator->id_loc = element->id_loc;
1145       declarator->parameter_pack_p = element->parameter_pack_p;
1146       element->parameter_pack_p = false;
1147     }
1148   else
1149     declarator->parameter_pack_p = false;
1150
1151   return declarator;
1152 }
1153
1154 /* Determine whether the declarator we've seen so far can be a
1155    parameter pack, when followed by an ellipsis.  */
1156 static bool 
1157 declarator_can_be_parameter_pack (cp_declarator *declarator)
1158 {
1159   /* Search for a declarator name, or any other declarator that goes
1160      after the point where the ellipsis could appear in a parameter
1161      pack. If we find any of these, then this declarator can not be
1162      made into a parameter pack.  */
1163   bool found = false;
1164   while (declarator && !found)
1165     {
1166       switch ((int)declarator->kind)
1167         {
1168         case cdk_id:
1169         case cdk_array:
1170           found = true;
1171           break;
1172
1173         case cdk_error:
1174           return true;
1175
1176         default:
1177           declarator = declarator->declarator;
1178           break;
1179         }
1180     }
1181
1182   return !found;
1183 }
1184
1185 cp_parameter_declarator *no_parameters;
1186
1187 /* Create a parameter declarator with the indicated DECL_SPECIFIERS,
1188    DECLARATOR and DEFAULT_ARGUMENT.  */
1189
1190 cp_parameter_declarator *
1191 make_parameter_declarator (cp_decl_specifier_seq *decl_specifiers,
1192                            cp_declarator *declarator,
1193                            tree default_argument)
1194 {
1195   cp_parameter_declarator *parameter;
1196
1197   parameter = ((cp_parameter_declarator *)
1198                alloc_declarator (sizeof (cp_parameter_declarator)));
1199   parameter->next = NULL;
1200   if (decl_specifiers)
1201     parameter->decl_specifiers = *decl_specifiers;
1202   else
1203     clear_decl_specs (&parameter->decl_specifiers);
1204   parameter->declarator = declarator;
1205   parameter->default_argument = default_argument;
1206   parameter->ellipsis_p = false;
1207
1208   return parameter;
1209 }
1210
1211 /* Returns true iff DECLARATOR  is a declaration for a function.  */
1212
1213 static bool
1214 function_declarator_p (const cp_declarator *declarator)
1215 {
1216   while (declarator)
1217     {
1218       if (declarator->kind == cdk_function
1219           && declarator->declarator->kind == cdk_id)
1220         return true;
1221       if (declarator->kind == cdk_id
1222           || declarator->kind == cdk_error)
1223         return false;
1224       declarator = declarator->declarator;
1225     }
1226   return false;
1227 }
1228  
1229 /* The parser.  */
1230
1231 /* Overview
1232    --------
1233
1234    A cp_parser parses the token stream as specified by the C++
1235    grammar.  Its job is purely parsing, not semantic analysis.  For
1236    example, the parser breaks the token stream into declarators,
1237    expressions, statements, and other similar syntactic constructs.
1238    It does not check that the types of the expressions on either side
1239    of an assignment-statement are compatible, or that a function is
1240    not declared with a parameter of type `void'.
1241
1242    The parser invokes routines elsewhere in the compiler to perform
1243    semantic analysis and to build up the abstract syntax tree for the
1244    code processed.
1245
1246    The parser (and the template instantiation code, which is, in a
1247    way, a close relative of parsing) are the only parts of the
1248    compiler that should be calling push_scope and pop_scope, or
1249    related functions.  The parser (and template instantiation code)
1250    keeps track of what scope is presently active; everything else
1251    should simply honor that.  (The code that generates static
1252    initializers may also need to set the scope, in order to check
1253    access control correctly when emitting the initializers.)
1254
1255    Methodology
1256    -----------
1257
1258    The parser is of the standard recursive-descent variety.  Upcoming
1259    tokens in the token stream are examined in order to determine which
1260    production to use when parsing a non-terminal.  Some C++ constructs
1261    require arbitrary look ahead to disambiguate.  For example, it is
1262    impossible, in the general case, to tell whether a statement is an
1263    expression or declaration without scanning the entire statement.
1264    Therefore, the parser is capable of "parsing tentatively."  When the
1265    parser is not sure what construct comes next, it enters this mode.
1266    Then, while we attempt to parse the construct, the parser queues up
1267    error messages, rather than issuing them immediately, and saves the
1268    tokens it consumes.  If the construct is parsed successfully, the
1269    parser "commits", i.e., it issues any queued error messages and
1270    the tokens that were being preserved are permanently discarded.
1271    If, however, the construct is not parsed successfully, the parser
1272    rolls back its state completely so that it can resume parsing using
1273    a different alternative.
1274
1275    Future Improvements
1276    -------------------
1277
1278    The performance of the parser could probably be improved substantially.
1279    We could often eliminate the need to parse tentatively by looking ahead
1280    a little bit.  In some places, this approach might not entirely eliminate
1281    the need to parse tentatively, but it might still speed up the average
1282    case.  */
1283
1284 /* Flags that are passed to some parsing functions.  These values can
1285    be bitwise-ored together.  */
1286
1287 enum
1288 {
1289   /* No flags.  */
1290   CP_PARSER_FLAGS_NONE = 0x0,
1291   /* The construct is optional.  If it is not present, then no error
1292      should be issued.  */
1293   CP_PARSER_FLAGS_OPTIONAL = 0x1,
1294   /* When parsing a type-specifier, treat user-defined type-names
1295      as non-type identifiers.  */
1296   CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES = 0x2,
1297   /* When parsing a type-specifier, do not try to parse a class-specifier
1298      or enum-specifier.  */
1299   CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS = 0x4,
1300   /* When parsing a decl-specifier-seq, only allow type-specifier or
1301      constexpr.  */
1302   CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR = 0x8
1303 };
1304
1305 /* This type is used for parameters and variables which hold
1306    combinations of the above flags.  */
1307 typedef int cp_parser_flags;
1308
1309 /* The different kinds of declarators we want to parse.  */
1310
1311 typedef enum cp_parser_declarator_kind
1312 {
1313   /* We want an abstract declarator.  */
1314   CP_PARSER_DECLARATOR_ABSTRACT,
1315   /* We want a named declarator.  */
1316   CP_PARSER_DECLARATOR_NAMED,
1317   /* We don't mind, but the name must be an unqualified-id.  */
1318   CP_PARSER_DECLARATOR_EITHER
1319 } cp_parser_declarator_kind;
1320
1321 /* The precedence values used to parse binary expressions.  The minimum value
1322    of PREC must be 1, because zero is reserved to quickly discriminate
1323    binary operators from other tokens.  */
1324
1325 enum cp_parser_prec
1326 {
1327   PREC_NOT_OPERATOR,
1328   PREC_LOGICAL_OR_EXPRESSION,
1329   PREC_LOGICAL_AND_EXPRESSION,
1330   PREC_INCLUSIVE_OR_EXPRESSION,
1331   PREC_EXCLUSIVE_OR_EXPRESSION,
1332   PREC_AND_EXPRESSION,
1333   PREC_EQUALITY_EXPRESSION,
1334   PREC_RELATIONAL_EXPRESSION,
1335   PREC_SHIFT_EXPRESSION,
1336   PREC_ADDITIVE_EXPRESSION,
1337   PREC_MULTIPLICATIVE_EXPRESSION,
1338   PREC_PM_EXPRESSION,
1339   NUM_PREC_VALUES = PREC_PM_EXPRESSION
1340 };
1341
1342 /* A mapping from a token type to a corresponding tree node type, with a
1343    precedence value.  */
1344
1345 typedef struct cp_parser_binary_operations_map_node
1346 {
1347   /* The token type.  */
1348   enum cpp_ttype token_type;
1349   /* The corresponding tree code.  */
1350   enum tree_code tree_type;
1351   /* The precedence of this operator.  */
1352   enum cp_parser_prec prec;
1353 } cp_parser_binary_operations_map_node;
1354
1355 typedef struct cp_parser_expression_stack_entry
1356 {
1357   /* Left hand side of the binary operation we are currently
1358      parsing.  */
1359   tree lhs;
1360   /* Original tree code for left hand side, if it was a binary
1361      expression itself (used for -Wparentheses).  */
1362   enum tree_code lhs_type;
1363   /* Tree code for the binary operation we are parsing.  */
1364   enum tree_code tree_type;
1365   /* Precedence of the binary operation we are parsing.  */
1366   enum cp_parser_prec prec;
1367 } cp_parser_expression_stack_entry;
1368
1369 /* The stack for storing partial expressions.  We only need NUM_PREC_VALUES
1370    entries because precedence levels on the stack are monotonically
1371    increasing.  */
1372 typedef struct cp_parser_expression_stack_entry
1373   cp_parser_expression_stack[NUM_PREC_VALUES];
1374
1375 /* Prototypes.  */
1376
1377 /* Constructors and destructors.  */
1378
1379 static cp_parser_context *cp_parser_context_new
1380   (cp_parser_context *);
1381
1382 /* Class variables.  */
1383
1384 static GTY((deletable)) cp_parser_context* cp_parser_context_free_list;
1385
1386 /* The operator-precedence table used by cp_parser_binary_expression.
1387    Transformed into an associative array (binops_by_token) by
1388    cp_parser_new.  */
1389
1390 static const cp_parser_binary_operations_map_node binops[] = {
1391   { CPP_DEREF_STAR, MEMBER_REF, PREC_PM_EXPRESSION },
1392   { CPP_DOT_STAR, DOTSTAR_EXPR, PREC_PM_EXPRESSION },
1393
1394   { CPP_MULT, MULT_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1395   { CPP_DIV, TRUNC_DIV_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1396   { CPP_MOD, TRUNC_MOD_EXPR, PREC_MULTIPLICATIVE_EXPRESSION },
1397
1398   { CPP_PLUS, PLUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1399   { CPP_MINUS, MINUS_EXPR, PREC_ADDITIVE_EXPRESSION },
1400
1401   { CPP_LSHIFT, LSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1402   { CPP_RSHIFT, RSHIFT_EXPR, PREC_SHIFT_EXPRESSION },
1403
1404   { CPP_LESS, LT_EXPR, PREC_RELATIONAL_EXPRESSION },
1405   { CPP_GREATER, GT_EXPR, PREC_RELATIONAL_EXPRESSION },
1406   { CPP_LESS_EQ, LE_EXPR, PREC_RELATIONAL_EXPRESSION },
1407   { CPP_GREATER_EQ, GE_EXPR, PREC_RELATIONAL_EXPRESSION },
1408
1409   { CPP_EQ_EQ, EQ_EXPR, PREC_EQUALITY_EXPRESSION },
1410   { CPP_NOT_EQ, NE_EXPR, PREC_EQUALITY_EXPRESSION },
1411
1412   { CPP_AND, BIT_AND_EXPR, PREC_AND_EXPRESSION },
1413
1414   { CPP_XOR, BIT_XOR_EXPR, PREC_EXCLUSIVE_OR_EXPRESSION },
1415
1416   { CPP_OR, BIT_IOR_EXPR, PREC_INCLUSIVE_OR_EXPRESSION },
1417
1418   { CPP_AND_AND, TRUTH_ANDIF_EXPR, PREC_LOGICAL_AND_EXPRESSION },
1419
1420   { CPP_OR_OR, TRUTH_ORIF_EXPR, PREC_LOGICAL_OR_EXPRESSION }
1421 };
1422
1423 /* The same as binops, but initialized by cp_parser_new so that
1424    binops_by_token[N].token_type == N.  Used in cp_parser_binary_expression
1425    for speed.  */
1426 static cp_parser_binary_operations_map_node binops_by_token[N_CP_TTYPES];
1427
1428 /* Constructors and destructors.  */
1429
1430 /* Construct a new context.  The context below this one on the stack
1431    is given by NEXT.  */
1432
1433 static cp_parser_context *
1434 cp_parser_context_new (cp_parser_context* next)
1435 {
1436   cp_parser_context *context;
1437
1438   /* Allocate the storage.  */
1439   if (cp_parser_context_free_list != NULL)
1440     {
1441       /* Pull the first entry from the free list.  */
1442       context = cp_parser_context_free_list;
1443       cp_parser_context_free_list = context->next;
1444       memset (context, 0, sizeof (*context));
1445     }
1446   else
1447     context = ggc_alloc_cleared_cp_parser_context ();
1448
1449   /* No errors have occurred yet in this context.  */
1450   context->status = CP_PARSER_STATUS_KIND_NO_ERROR;
1451   /* If this is not the bottommost context, copy information that we
1452      need from the previous context.  */
1453   if (next)
1454     {
1455       /* If, in the NEXT context, we are parsing an `x->' or `x.'
1456          expression, then we are parsing one in this context, too.  */
1457       context->object_type = next->object_type;
1458       /* Thread the stack.  */
1459       context->next = next;
1460     }
1461
1462   return context;
1463 }
1464
1465 /* Managing the unparsed function queues.  */
1466
1467 #define unparsed_funs_with_default_args \
1468   VEC_last (cp_unparsed_functions_entry, parser->unparsed_queues)->funs_with_default_args
1469 #define unparsed_funs_with_definitions \
1470   VEC_last (cp_unparsed_functions_entry, parser->unparsed_queues)->funs_with_definitions
1471
1472 static void
1473 push_unparsed_function_queues (cp_parser *parser)
1474 {
1475   VEC_safe_push (cp_unparsed_functions_entry, gc,
1476                  parser->unparsed_queues, NULL);
1477   unparsed_funs_with_default_args = NULL;
1478   unparsed_funs_with_definitions = make_tree_vector ();
1479 }
1480
1481 static void
1482 pop_unparsed_function_queues (cp_parser *parser)
1483 {
1484   release_tree_vector (unparsed_funs_with_definitions);
1485   VEC_pop (cp_unparsed_functions_entry, parser->unparsed_queues);
1486 }
1487
1488 /* Prototypes.  */
1489
1490 /* Constructors and destructors.  */
1491
1492 static cp_parser *cp_parser_new
1493   (void);
1494
1495 /* Routines to parse various constructs.
1496
1497    Those that return `tree' will return the error_mark_node (rather
1498    than NULL_TREE) if a parse error occurs, unless otherwise noted.
1499    Sometimes, they will return an ordinary node if error-recovery was
1500    attempted, even though a parse error occurred.  So, to check
1501    whether or not a parse error occurred, you should always use
1502    cp_parser_error_occurred.  If the construct is optional (indicated
1503    either by an `_opt' in the name of the function that does the
1504    parsing or via a FLAGS parameter), then NULL_TREE is returned if
1505    the construct is not present.  */
1506
1507 /* Lexical conventions [gram.lex]  */
1508
1509 static tree cp_parser_identifier
1510   (cp_parser *);
1511 static tree cp_parser_string_literal
1512   (cp_parser *, bool, bool);
1513
1514 /* Basic concepts [gram.basic]  */
1515
1516 static bool cp_parser_translation_unit
1517   (cp_parser *);
1518
1519 /* Expressions [gram.expr]  */
1520
1521 static tree cp_parser_primary_expression
1522   (cp_parser *, bool, bool, bool, cp_id_kind *);
1523 static tree cp_parser_id_expression
1524   (cp_parser *, bool, bool, bool *, bool, bool);
1525 static tree cp_parser_unqualified_id
1526   (cp_parser *, bool, bool, bool, bool);
1527 static tree cp_parser_nested_name_specifier_opt
1528   (cp_parser *, bool, bool, bool, bool);
1529 static tree cp_parser_nested_name_specifier
1530   (cp_parser *, bool, bool, bool, bool);
1531 static tree cp_parser_qualifying_entity
1532   (cp_parser *, bool, bool, bool, bool, bool);
1533 static tree cp_parser_postfix_expression
1534   (cp_parser *, bool, bool, bool, cp_id_kind *);
1535 static tree cp_parser_postfix_open_square_expression
1536   (cp_parser *, tree, bool);
1537 static tree cp_parser_postfix_dot_deref_expression
1538   (cp_parser *, enum cpp_ttype, tree, bool, cp_id_kind *, location_t);
1539 static VEC(tree,gc) *cp_parser_parenthesized_expression_list
1540   (cp_parser *, int, bool, bool, bool *);
1541 /* Values for the second parameter of cp_parser_parenthesized_expression_list.  */
1542 enum { non_attr = 0, normal_attr = 1, id_attr = 2 };
1543 static void cp_parser_pseudo_destructor_name
1544   (cp_parser *, tree *, tree *);
1545 static tree cp_parser_unary_expression
1546   (cp_parser *, bool, bool, cp_id_kind *);
1547 static enum tree_code cp_parser_unary_operator
1548   (cp_token *);
1549 static tree cp_parser_new_expression
1550   (cp_parser *);
1551 static VEC(tree,gc) *cp_parser_new_placement
1552   (cp_parser *);
1553 static tree cp_parser_new_type_id
1554   (cp_parser *, tree *);
1555 static cp_declarator *cp_parser_new_declarator_opt
1556   (cp_parser *);
1557 static cp_declarator *cp_parser_direct_new_declarator
1558   (cp_parser *);
1559 static VEC(tree,gc) *cp_parser_new_initializer
1560   (cp_parser *);
1561 static tree cp_parser_delete_expression
1562   (cp_parser *);
1563 static tree cp_parser_cast_expression
1564   (cp_parser *, bool, bool, cp_id_kind *);
1565 static tree cp_parser_binary_expression
1566   (cp_parser *, bool, bool, enum cp_parser_prec, cp_id_kind *);
1567 static tree cp_parser_question_colon_clause
1568   (cp_parser *, tree);
1569 static tree cp_parser_assignment_expression
1570   (cp_parser *, bool, cp_id_kind *);
1571 static enum tree_code cp_parser_assignment_operator_opt
1572   (cp_parser *);
1573 static tree cp_parser_expression
1574   (cp_parser *, bool, cp_id_kind *);
1575 static tree cp_parser_constant_expression
1576   (cp_parser *, bool, bool *);
1577 static tree cp_parser_builtin_offsetof
1578   (cp_parser *);
1579 static tree cp_parser_lambda_expression
1580   (cp_parser *);
1581 static void cp_parser_lambda_introducer
1582   (cp_parser *, tree);
1583 static bool cp_parser_lambda_declarator_opt
1584   (cp_parser *, tree);
1585 static void cp_parser_lambda_body
1586   (cp_parser *, tree);
1587
1588 /* Statements [gram.stmt.stmt]  */
1589
1590 static void cp_parser_statement
1591   (cp_parser *, tree, bool, bool *);
1592 static void cp_parser_label_for_labeled_statement
1593   (cp_parser *);
1594 static tree cp_parser_expression_statement
1595   (cp_parser *, tree);
1596 static tree cp_parser_compound_statement
1597   (cp_parser *, tree, bool, bool);
1598 static void cp_parser_statement_seq_opt
1599   (cp_parser *, tree);
1600 static tree cp_parser_selection_statement
1601   (cp_parser *, bool *);
1602 static tree cp_parser_condition
1603   (cp_parser *);
1604 static tree cp_parser_iteration_statement
1605   (cp_parser *);
1606 static bool cp_parser_for_init_statement
1607   (cp_parser *, tree *decl);
1608 static tree cp_parser_for
1609   (cp_parser *);
1610 static tree cp_parser_c_for
1611   (cp_parser *, tree, tree);
1612 static tree cp_parser_range_for
1613   (cp_parser *, tree, tree, tree);
1614 static tree cp_parser_perform_range_for_lookup
1615   (tree, tree *, tree *);
1616 static tree cp_parser_range_for_member_function
1617   (tree, tree);
1618 static tree cp_parser_jump_statement
1619   (cp_parser *);
1620 static void cp_parser_declaration_statement
1621   (cp_parser *);
1622
1623 static tree cp_parser_implicitly_scoped_statement
1624   (cp_parser *, bool *);
1625 static void cp_parser_already_scoped_statement
1626   (cp_parser *);
1627
1628 /* Declarations [gram.dcl.dcl] */
1629
1630 static void cp_parser_declaration_seq_opt
1631   (cp_parser *);
1632 static void cp_parser_declaration
1633   (cp_parser *);
1634 static void cp_parser_block_declaration
1635   (cp_parser *, bool);
1636 static void cp_parser_simple_declaration
1637   (cp_parser *, bool, tree *);
1638 static void cp_parser_decl_specifier_seq
1639   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, int *);
1640 static tree cp_parser_storage_class_specifier_opt
1641   (cp_parser *);
1642 static tree cp_parser_function_specifier_opt
1643   (cp_parser *, cp_decl_specifier_seq *);
1644 static tree cp_parser_type_specifier
1645   (cp_parser *, cp_parser_flags, cp_decl_specifier_seq *, bool,
1646    int *, bool *);
1647 static tree cp_parser_simple_type_specifier
1648   (cp_parser *, cp_decl_specifier_seq *, cp_parser_flags);
1649 static tree cp_parser_type_name
1650   (cp_parser *);
1651 static tree cp_parser_nonclass_name 
1652   (cp_parser* parser);
1653 static tree cp_parser_elaborated_type_specifier
1654   (cp_parser *, bool, bool);
1655 static tree cp_parser_enum_specifier
1656   (cp_parser *);
1657 static void cp_parser_enumerator_list
1658   (cp_parser *, tree);
1659 static void cp_parser_enumerator_definition
1660   (cp_parser *, tree);
1661 static tree cp_parser_namespace_name
1662   (cp_parser *);
1663 static void cp_parser_namespace_definition
1664   (cp_parser *);
1665 static void cp_parser_namespace_body
1666   (cp_parser *);
1667 static tree cp_parser_qualified_namespace_specifier
1668   (cp_parser *);
1669 static void cp_parser_namespace_alias_definition
1670   (cp_parser *);
1671 static bool cp_parser_using_declaration
1672   (cp_parser *, bool);
1673 static void cp_parser_using_directive
1674   (cp_parser *);
1675 static void cp_parser_asm_definition
1676   (cp_parser *);
1677 static void cp_parser_linkage_specification
1678   (cp_parser *);
1679 static void cp_parser_static_assert
1680   (cp_parser *, bool);
1681 static tree cp_parser_decltype
1682   (cp_parser *);
1683
1684 /* Declarators [gram.dcl.decl] */
1685
1686 static tree cp_parser_init_declarator
1687   (cp_parser *, cp_decl_specifier_seq *, VEC (deferred_access_check,gc)*, bool, bool, int, bool *, tree *);
1688 static cp_declarator *cp_parser_declarator
1689   (cp_parser *, cp_parser_declarator_kind, int *, bool *, bool);
1690 static cp_declarator *cp_parser_direct_declarator
1691   (cp_parser *, cp_parser_declarator_kind, int *, bool);
1692 static enum tree_code cp_parser_ptr_operator
1693   (cp_parser *, tree *, cp_cv_quals *);
1694 static cp_cv_quals cp_parser_cv_qualifier_seq_opt
1695   (cp_parser *);
1696 static cp_virt_specifiers cp_parser_virt_specifier_seq_opt
1697   (cp_parser *);
1698 static tree cp_parser_late_return_type_opt
1699   (cp_parser *, cp_cv_quals);
1700 static tree cp_parser_declarator_id
1701   (cp_parser *, bool);
1702 static tree cp_parser_type_id
1703   (cp_parser *);
1704 static tree cp_parser_template_type_arg
1705   (cp_parser *);
1706 static tree cp_parser_trailing_type_id (cp_parser *);
1707 static tree cp_parser_type_id_1
1708   (cp_parser *, bool, bool);
1709 static void cp_parser_type_specifier_seq
1710   (cp_parser *, bool, bool, cp_decl_specifier_seq *);
1711 static tree cp_parser_parameter_declaration_clause
1712   (cp_parser *);
1713 static tree cp_parser_parameter_declaration_list
1714   (cp_parser *, bool *);
1715 static cp_parameter_declarator *cp_parser_parameter_declaration
1716   (cp_parser *, bool, bool *);
1717 static tree cp_parser_default_argument 
1718   (cp_parser *, bool);
1719 static void cp_parser_function_body
1720   (cp_parser *);
1721 static tree cp_parser_initializer
1722   (cp_parser *, bool *, bool *);
1723 static tree cp_parser_initializer_clause
1724   (cp_parser *, bool *);
1725 static tree cp_parser_braced_list
1726   (cp_parser*, bool*);
1727 static VEC(constructor_elt,gc) *cp_parser_initializer_list
1728   (cp_parser *, bool *);
1729
1730 static bool cp_parser_ctor_initializer_opt_and_function_body
1731   (cp_parser *);
1732
1733 /* Classes [gram.class] */
1734
1735 static tree cp_parser_class_name
1736   (cp_parser *, bool, bool, enum tag_types, bool, bool, bool);
1737 static tree cp_parser_class_specifier
1738   (cp_parser *);
1739 static tree cp_parser_class_head
1740   (cp_parser *, bool *, tree *, tree *);
1741 static enum tag_types cp_parser_class_key
1742   (cp_parser *);
1743 static void cp_parser_member_specification_opt
1744   (cp_parser *);
1745 static void cp_parser_member_declaration
1746   (cp_parser *);
1747 static tree cp_parser_pure_specifier
1748   (cp_parser *);
1749 static tree cp_parser_constant_initializer
1750   (cp_parser *);
1751
1752 /* Derived classes [gram.class.derived] */
1753
1754 static tree cp_parser_base_clause
1755   (cp_parser *);
1756 static tree cp_parser_base_specifier
1757   (cp_parser *);
1758
1759 /* Special member functions [gram.special] */
1760
1761 static tree cp_parser_conversion_function_id
1762   (cp_parser *);
1763 static tree cp_parser_conversion_type_id
1764   (cp_parser *);
1765 static cp_declarator *cp_parser_conversion_declarator_opt
1766   (cp_parser *);
1767 static bool cp_parser_ctor_initializer_opt
1768   (cp_parser *);
1769 static void cp_parser_mem_initializer_list
1770   (cp_parser *);
1771 static tree cp_parser_mem_initializer
1772   (cp_parser *);
1773 static tree cp_parser_mem_initializer_id
1774   (cp_parser *);
1775
1776 /* Overloading [gram.over] */
1777
1778 static tree cp_parser_operator_function_id
1779   (cp_parser *);
1780 static tree cp_parser_operator
1781   (cp_parser *);
1782
1783 /* Templates [gram.temp] */
1784
1785 static void cp_parser_template_declaration
1786   (cp_parser *, bool);
1787 static tree cp_parser_template_parameter_list
1788   (cp_parser *);
1789 static tree cp_parser_template_parameter
1790   (cp_parser *, bool *, bool *);
1791 static tree cp_parser_type_parameter
1792   (cp_parser *, bool *);
1793 static tree cp_parser_template_id
1794   (cp_parser *, bool, bool, bool);
1795 static tree cp_parser_template_name
1796   (cp_parser *, bool, bool, bool, bool *);
1797 static tree cp_parser_template_argument_list
1798   (cp_parser *);
1799 static tree cp_parser_template_argument
1800   (cp_parser *);
1801 static void cp_parser_explicit_instantiation
1802   (cp_parser *);
1803 static void cp_parser_explicit_specialization
1804   (cp_parser *);
1805
1806 /* Exception handling [gram.exception] */
1807
1808 static tree cp_parser_try_block
1809   (cp_parser *);
1810 static bool cp_parser_function_try_block
1811   (cp_parser *);
1812 static void cp_parser_handler_seq
1813   (cp_parser *);
1814 static void cp_parser_handler
1815   (cp_parser *);
1816 static tree cp_parser_exception_declaration
1817   (cp_parser *);
1818 static tree cp_parser_throw_expression
1819   (cp_parser *);
1820 static tree cp_parser_exception_specification_opt
1821   (cp_parser *);
1822 static tree cp_parser_type_id_list
1823   (cp_parser *);
1824
1825 /* GNU Extensions */
1826
1827 static tree cp_parser_asm_specification_opt
1828   (cp_parser *);
1829 static tree cp_parser_asm_operand_list
1830   (cp_parser *);
1831 static tree cp_parser_asm_clobber_list
1832   (cp_parser *);
1833 static tree cp_parser_asm_label_list
1834   (cp_parser *);
1835 static tree cp_parser_attributes_opt
1836   (cp_parser *);
1837 static tree cp_parser_attribute_list
1838   (cp_parser *);
1839 static bool cp_parser_extension_opt
1840   (cp_parser *, int *);
1841 static void cp_parser_label_declaration
1842   (cp_parser *);
1843
1844 enum pragma_context { pragma_external, pragma_stmt, pragma_compound };
1845 static bool cp_parser_pragma
1846   (cp_parser *, enum pragma_context);
1847
1848 /* Objective-C++ Productions */
1849
1850 static tree cp_parser_objc_message_receiver
1851   (cp_parser *);
1852 static tree cp_parser_objc_message_args
1853   (cp_parser *);
1854 static tree cp_parser_objc_message_expression
1855   (cp_parser *);
1856 static tree cp_parser_objc_encode_expression
1857   (cp_parser *);
1858 static tree cp_parser_objc_defs_expression
1859   (cp_parser *);
1860 static tree cp_parser_objc_protocol_expression
1861   (cp_parser *);
1862 static tree cp_parser_objc_selector_expression
1863   (cp_parser *);
1864 static tree cp_parser_objc_expression
1865   (cp_parser *);
1866 static bool cp_parser_objc_selector_p
1867   (enum cpp_ttype);
1868 static tree cp_parser_objc_selector
1869   (cp_parser *);
1870 static tree cp_parser_objc_protocol_refs_opt
1871   (cp_parser *);
1872 static void cp_parser_objc_declaration
1873   (cp_parser *, tree);
1874 static tree cp_parser_objc_statement
1875   (cp_parser *);
1876 static bool cp_parser_objc_valid_prefix_attributes
1877   (cp_parser *, tree *);
1878 static void cp_parser_objc_at_property_declaration 
1879   (cp_parser *) ;
1880 static void cp_parser_objc_at_synthesize_declaration 
1881   (cp_parser *) ;
1882 static void cp_parser_objc_at_dynamic_declaration
1883   (cp_parser *) ;
1884 static tree cp_parser_objc_struct_declaration
1885   (cp_parser *) ;
1886
1887 /* Utility Routines */
1888
1889 static tree cp_parser_lookup_name
1890   (cp_parser *, tree, enum tag_types, bool, bool, bool, tree *, location_t);
1891 static tree cp_parser_lookup_name_simple
1892   (cp_parser *, tree, location_t);
1893 static tree cp_parser_maybe_treat_template_as_class
1894   (tree, bool);
1895 static bool cp_parser_check_declarator_template_parameters
1896   (cp_parser *, cp_declarator *, location_t);
1897 static bool cp_parser_check_template_parameters
1898   (cp_parser *, unsigned, location_t, cp_declarator *);
1899 static tree cp_parser_simple_cast_expression
1900   (cp_parser *);
1901 static tree cp_parser_global_scope_opt
1902   (cp_parser *, bool);
1903 static bool cp_parser_constructor_declarator_p
1904   (cp_parser *, bool);
1905 static tree cp_parser_function_definition_from_specifiers_and_declarator
1906   (cp_parser *, cp_decl_specifier_seq *, tree, const cp_declarator *);
1907 static tree cp_parser_function_definition_after_declarator
1908   (cp_parser *, bool);
1909 static void cp_parser_template_declaration_after_export
1910   (cp_parser *, bool);
1911 static void cp_parser_perform_template_parameter_access_checks
1912   (VEC (deferred_access_check,gc)*);
1913 static tree cp_parser_single_declaration
1914   (cp_parser *, VEC (deferred_access_check,gc)*, bool, bool, bool *);
1915 static tree cp_parser_functional_cast
1916   (cp_parser *, tree);
1917 static tree cp_parser_save_member_function_body
1918   (cp_parser *, cp_decl_specifier_seq *, cp_declarator *, tree);
1919 static tree cp_parser_enclosed_template_argument_list
1920   (cp_parser *);
1921 static void cp_parser_save_default_args
1922   (cp_parser *, tree);
1923 static void cp_parser_late_parsing_for_member
1924   (cp_parser *, tree);
1925 static void cp_parser_late_parsing_default_args
1926   (cp_parser *, tree);
1927 static tree cp_parser_sizeof_operand
1928   (cp_parser *, enum rid);
1929 static tree cp_parser_trait_expr
1930   (cp_parser *, enum rid);
1931 static bool cp_parser_declares_only_class_p
1932   (cp_parser *);
1933 static void cp_parser_set_storage_class
1934   (cp_parser *, cp_decl_specifier_seq *, enum rid, location_t);
1935 static void cp_parser_set_decl_spec_type
1936   (cp_decl_specifier_seq *, tree, location_t, bool);
1937 static bool cp_parser_friend_p
1938   (const cp_decl_specifier_seq *);
1939 static void cp_parser_required_error
1940   (cp_parser *, required_token, bool);
1941 static cp_token *cp_parser_require
1942   (cp_parser *, enum cpp_ttype, required_token);
1943 static cp_token *cp_parser_require_keyword
1944   (cp_parser *, enum rid, required_token);
1945 static bool cp_parser_token_starts_function_definition_p
1946   (cp_token *);
1947 static bool cp_parser_next_token_starts_class_definition_p
1948   (cp_parser *);
1949 static bool cp_parser_next_token_ends_template_argument_p
1950   (cp_parser *);
1951 static bool cp_parser_nth_token_starts_template_argument_list_p
1952   (cp_parser *, size_t);
1953 static enum tag_types cp_parser_token_is_class_key
1954   (cp_token *);
1955 static void cp_parser_check_class_key
1956   (enum tag_types, tree type);
1957 static void cp_parser_check_access_in_redeclaration
1958   (tree type, location_t location);
1959 static bool cp_parser_optional_template_keyword
1960   (cp_parser *);
1961 static void cp_parser_pre_parsed_nested_name_specifier
1962   (cp_parser *);
1963 static bool cp_parser_cache_group
1964   (cp_parser *, enum cpp_ttype, unsigned);
1965 static void cp_parser_parse_tentatively
1966   (cp_parser *);
1967 static void cp_parser_commit_to_tentative_parse
1968   (cp_parser *);
1969 static void cp_parser_abort_tentative_parse
1970   (cp_parser *);
1971 static bool cp_parser_parse_definitely
1972   (cp_parser *);
1973 static inline bool cp_parser_parsing_tentatively
1974   (cp_parser *);
1975 static bool cp_parser_uncommitted_to_tentative_parse_p
1976   (cp_parser *);
1977 static void cp_parser_error
1978   (cp_parser *, const char *);
1979 static void cp_parser_name_lookup_error
1980   (cp_parser *, tree, tree, name_lookup_error, location_t);
1981 static bool cp_parser_simulate_error
1982   (cp_parser *);
1983 static bool cp_parser_check_type_definition
1984   (cp_parser *);
1985 static void cp_parser_check_for_definition_in_return_type
1986   (cp_declarator *, tree, location_t type_location);
1987 static void cp_parser_check_for_invalid_template_id
1988   (cp_parser *, tree, location_t location);
1989 static bool cp_parser_non_integral_constant_expression
1990   (cp_parser *, non_integral_constant);
1991 static void cp_parser_diagnose_invalid_type_name
1992   (cp_parser *, tree, tree, location_t);
1993 static bool cp_parser_parse_and_diagnose_invalid_type_name
1994   (cp_parser *);
1995 static int cp_parser_skip_to_closing_parenthesis
1996   (cp_parser *, bool, bool, bool);
1997 static void cp_parser_skip_to_end_of_statement
1998   (cp_parser *);
1999 static void cp_parser_consume_semicolon_at_end_of_statement
2000   (cp_parser *);
2001 static void cp_parser_skip_to_end_of_block_or_statement
2002   (cp_parser *);
2003 static bool cp_parser_skip_to_closing_brace
2004   (cp_parser *);
2005 static void cp_parser_skip_to_end_of_template_parameter_list
2006   (cp_parser *);
2007 static void cp_parser_skip_to_pragma_eol
2008   (cp_parser*, cp_token *);
2009 static bool cp_parser_error_occurred
2010   (cp_parser *);
2011 static bool cp_parser_allow_gnu_extensions_p
2012   (cp_parser *);
2013 static bool cp_parser_is_string_literal
2014   (cp_token *);
2015 static bool cp_parser_is_keyword
2016   (cp_token *, enum rid);
2017 static tree cp_parser_make_typename_type
2018   (cp_parser *, tree, tree, location_t location);
2019 static cp_declarator * cp_parser_make_indirect_declarator
2020   (enum tree_code, tree, cp_cv_quals, cp_declarator *);
2021
2022 /* Returns nonzero if we are parsing tentatively.  */
2023
2024 static inline bool
2025 cp_parser_parsing_tentatively (cp_parser* parser)
2026 {
2027   return parser->context->next != NULL;
2028 }
2029
2030 /* Returns nonzero if TOKEN is a string literal.  */
2031
2032 static bool
2033 cp_parser_is_string_literal (cp_token* token)
2034 {
2035   return (token->type == CPP_STRING ||
2036           token->type == CPP_STRING16 ||
2037           token->type == CPP_STRING32 ||
2038           token->type == CPP_WSTRING ||
2039           token->type == CPP_UTF8STRING);
2040 }
2041
2042 /* Returns nonzero if TOKEN is the indicated KEYWORD.  */
2043
2044 static bool
2045 cp_parser_is_keyword (cp_token* token, enum rid keyword)
2046 {
2047   return token->keyword == keyword;
2048 }
2049
2050 /* If not parsing tentatively, issue a diagnostic of the form
2051       FILE:LINE: MESSAGE before TOKEN
2052    where TOKEN is the next token in the input stream.  MESSAGE
2053    (specified by the caller) is usually of the form "expected
2054    OTHER-TOKEN".  */
2055
2056 static void
2057 cp_parser_error (cp_parser* parser, const char* gmsgid)
2058 {
2059   if (!cp_parser_simulate_error (parser))
2060     {
2061       cp_token *token = cp_lexer_peek_token (parser->lexer);
2062       /* This diagnostic makes more sense if it is tagged to the line
2063          of the token we just peeked at.  */
2064       cp_lexer_set_source_position_from_token (token);
2065
2066       if (token->type == CPP_PRAGMA)
2067         {
2068           error_at (token->location,
2069                     "%<#pragma%> is not allowed here");
2070           cp_parser_skip_to_pragma_eol (parser, token);
2071           return;
2072         }
2073
2074       c_parse_error (gmsgid,
2075                      /* Because c_parser_error does not understand
2076                         CPP_KEYWORD, keywords are treated like
2077                         identifiers.  */
2078                      (token->type == CPP_KEYWORD ? CPP_NAME : token->type),
2079                      token->u.value, token->flags);
2080     }
2081 }
2082
2083 /* Issue an error about name-lookup failing.  NAME is the
2084    IDENTIFIER_NODE DECL is the result of
2085    the lookup (as returned from cp_parser_lookup_name).  DESIRED is
2086    the thing that we hoped to find.  */
2087
2088 static void
2089 cp_parser_name_lookup_error (cp_parser* parser,
2090                              tree name,
2091                              tree decl,
2092                              name_lookup_error desired,
2093                              location_t location)
2094 {
2095   /* If name lookup completely failed, tell the user that NAME was not
2096      declared.  */
2097   if (decl == error_mark_node)
2098     {
2099       if (parser->scope && parser->scope != global_namespace)
2100         error_at (location, "%<%E::%E%> has not been declared",
2101                   parser->scope, name);
2102       else if (parser->scope == global_namespace)
2103         error_at (location, "%<::%E%> has not been declared", name);
2104       else if (parser->object_scope
2105                && !CLASS_TYPE_P (parser->object_scope))
2106         error_at (location, "request for member %qE in non-class type %qT",
2107                   name, parser->object_scope);
2108       else if (parser->object_scope)
2109         error_at (location, "%<%T::%E%> has not been declared",
2110                   parser->object_scope, name);
2111       else
2112         error_at (location, "%qE has not been declared", name);
2113     }
2114   else if (parser->scope && parser->scope != global_namespace)
2115     {
2116       switch (desired)
2117         {
2118           case NLE_TYPE:
2119             error_at (location, "%<%E::%E%> is not a type",
2120                                 parser->scope, name);
2121             break;
2122           case NLE_CXX98:
2123             error_at (location, "%<%E::%E%> is not a class or namespace",
2124                                 parser->scope, name);
2125             break;
2126           case NLE_NOT_CXX98:
2127             error_at (location,
2128                       "%<%E::%E%> is not a class, namespace, or enumeration",
2129                       parser->scope, name);
2130             break;
2131           default:
2132             gcc_unreachable ();
2133             
2134         }
2135     }
2136   else if (parser->scope == global_namespace)
2137     {
2138       switch (desired)
2139         {
2140           case NLE_TYPE:
2141             error_at (location, "%<::%E%> is not a type", name);
2142             break;
2143           case NLE_CXX98:
2144             error_at (location, "%<::%E%> is not a class or namespace", name);
2145             break;
2146           case NLE_NOT_CXX98:
2147             error_at (location,
2148                       "%<::%E%> is not a class, namespace, or enumeration",
2149                       name);
2150             break;
2151           default:
2152             gcc_unreachable ();
2153         }
2154     }
2155   else
2156     {
2157       switch (desired)
2158         {
2159           case NLE_TYPE:
2160             error_at (location, "%qE is not a type", name);
2161             break;
2162           case NLE_CXX98:
2163             error_at (location, "%qE is not a class or namespace", name);
2164             break;
2165           case NLE_NOT_CXX98:
2166             error_at (location,
2167                       "%qE is not a class, namespace, or enumeration", name);
2168             break;
2169           default:
2170             gcc_unreachable ();
2171         }
2172     }
2173 }
2174
2175 /* If we are parsing tentatively, remember that an error has occurred
2176    during this tentative parse.  Returns true if the error was
2177    simulated; false if a message should be issued by the caller.  */
2178
2179 static bool
2180 cp_parser_simulate_error (cp_parser* parser)
2181 {
2182   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2183     {
2184       parser->context->status = CP_PARSER_STATUS_KIND_ERROR;
2185       return true;
2186     }
2187   return false;
2188 }
2189
2190 /* Check for repeated decl-specifiers.  */
2191
2192 static void
2193 cp_parser_check_decl_spec (cp_decl_specifier_seq *decl_specs,
2194                            location_t location)
2195 {
2196   int ds;
2197
2198   for (ds = ds_first; ds != ds_last; ++ds)
2199     {
2200       unsigned count = decl_specs->specs[ds];
2201       if (count < 2)
2202         continue;
2203       /* The "long" specifier is a special case because of "long long".  */
2204       if (ds == ds_long)
2205         {
2206           if (count > 2)
2207             error_at (location, "%<long long long%> is too long for GCC");
2208           else 
2209             pedwarn_cxx98 (location, OPT_Wlong_long, 
2210                            "ISO C++ 1998 does not support %<long long%>");
2211         }
2212       else if (count > 1)
2213         {
2214           static const char *const decl_spec_names[] = {
2215             "signed",
2216             "unsigned",
2217             "short",
2218             "long",
2219             "const",
2220             "volatile",
2221             "restrict",
2222             "inline",
2223             "virtual",
2224             "explicit",
2225             "friend",
2226             "typedef",
2227             "constexpr",
2228             "__complex",
2229             "__thread"
2230           };
2231           error_at (location, "duplicate %qs", decl_spec_names[ds]);
2232         }
2233     }
2234 }
2235
2236 /* This function is called when a type is defined.  If type
2237    definitions are forbidden at this point, an error message is
2238    issued.  */
2239
2240 static bool
2241 cp_parser_check_type_definition (cp_parser* parser)
2242 {
2243   /* If types are forbidden here, issue a message.  */
2244   if (parser->type_definition_forbidden_message)
2245     {
2246       /* Don't use `%s' to print the string, because quotations (`%<', `%>')
2247          in the message need to be interpreted.  */
2248       error (parser->type_definition_forbidden_message);
2249       return false;
2250     }
2251   return true;
2252 }
2253
2254 /* This function is called when the DECLARATOR is processed.  The TYPE
2255    was a type defined in the decl-specifiers.  If it is invalid to
2256    define a type in the decl-specifiers for DECLARATOR, an error is
2257    issued. TYPE_LOCATION is the location of TYPE and is used
2258    for error reporting.  */
2259
2260 static void
2261 cp_parser_check_for_definition_in_return_type (cp_declarator *declarator,
2262                                                tree type, location_t type_location)
2263 {
2264   /* [dcl.fct] forbids type definitions in return types.
2265      Unfortunately, it's not easy to know whether or not we are
2266      processing a return type until after the fact.  */
2267   while (declarator
2268          && (declarator->kind == cdk_pointer
2269              || declarator->kind == cdk_reference
2270              || declarator->kind == cdk_ptrmem))
2271     declarator = declarator->declarator;
2272   if (declarator
2273       && declarator->kind == cdk_function)
2274     {
2275       error_at (type_location,
2276                 "new types may not be defined in a return type");
2277       inform (type_location, 
2278               "(perhaps a semicolon is missing after the definition of %qT)",
2279               type);
2280     }
2281 }
2282
2283 /* A type-specifier (TYPE) has been parsed which cannot be followed by
2284    "<" in any valid C++ program.  If the next token is indeed "<",
2285    issue a message warning the user about what appears to be an
2286    invalid attempt to form a template-id. LOCATION is the location
2287    of the type-specifier (TYPE) */
2288
2289 static void
2290 cp_parser_check_for_invalid_template_id (cp_parser* parser,
2291                                          tree type, location_t location)
2292 {
2293   cp_token_position start = 0;
2294
2295   if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
2296     {
2297       if (TYPE_P (type))
2298         error_at (location, "%qT is not a template", type);
2299       else if (TREE_CODE (type) == IDENTIFIER_NODE)
2300         error_at (location, "%qE is not a template", type);
2301       else
2302         error_at (location, "invalid template-id");
2303       /* Remember the location of the invalid "<".  */
2304       if (cp_parser_uncommitted_to_tentative_parse_p (parser))
2305         start = cp_lexer_token_position (parser->lexer, true);
2306       /* Consume the "<".  */
2307       cp_lexer_consume_token (parser->lexer);
2308       /* Parse the template arguments.  */
2309       cp_parser_enclosed_template_argument_list (parser);
2310       /* Permanently remove the invalid template arguments so that
2311          this error message is not issued again.  */
2312       if (start)
2313         cp_lexer_purge_tokens_after (parser->lexer, start);
2314     }
2315 }
2316
2317 /* If parsing an integral constant-expression, issue an error message
2318    about the fact that THING appeared and return true.  Otherwise,
2319    return false.  In either case, set
2320    PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P.  */
2321
2322 static bool
2323 cp_parser_non_integral_constant_expression (cp_parser  *parser,
2324                                             non_integral_constant thing)
2325 {
2326   parser->non_integral_constant_expression_p = true;
2327   if (parser->integral_constant_expression_p)
2328     {
2329       if (!parser->allow_non_integral_constant_expression_p)
2330         {
2331           const char *msg = NULL;
2332           switch (thing)
2333             {
2334               case NIC_FLOAT:
2335                 error ("floating-point literal "
2336                        "cannot appear in a constant-expression");
2337                 return true;
2338               case NIC_CAST:
2339                 error ("a cast to a type other than an integral or "
2340                        "enumeration type cannot appear in a "
2341                        "constant-expression");
2342                 return true;
2343               case NIC_TYPEID:
2344                 error ("%<typeid%> operator "
2345                        "cannot appear in a constant-expression");
2346                 return true;
2347               case NIC_NCC:
2348                 error ("non-constant compound literals "
2349                        "cannot appear in a constant-expression");
2350                 return true;
2351               case NIC_FUNC_CALL:
2352                 error ("a function call "
2353                        "cannot appear in a constant-expression");
2354                 return true;
2355               case NIC_INC:
2356                 error ("an increment "
2357                        "cannot appear in a constant-expression");
2358                 return true;
2359               case NIC_DEC:
2360                 error ("an decrement "
2361                        "cannot appear in a constant-expression");
2362                 return true;
2363               case NIC_ARRAY_REF:
2364                 error ("an array reference "
2365                        "cannot appear in a constant-expression");
2366                 return true;
2367               case NIC_ADDR_LABEL:
2368                 error ("the address of a label "
2369                        "cannot appear in a constant-expression");
2370                 return true;
2371               case NIC_OVERLOADED:
2372                 error ("calls to overloaded operators "
2373                        "cannot appear in a constant-expression");
2374                 return true;
2375               case NIC_ASSIGNMENT:
2376                 error ("an assignment cannot appear in a constant-expression");
2377                 return true;
2378               case NIC_COMMA:
2379                 error ("a comma operator "
2380                        "cannot appear in a constant-expression");
2381                 return true;
2382               case NIC_CONSTRUCTOR:
2383                 error ("a call to a constructor "
2384                        "cannot appear in a constant-expression");
2385                 return true;
2386               case NIC_THIS:
2387                 msg = "this";
2388                 break;
2389               case NIC_FUNC_NAME:
2390                 msg = "__FUNCTION__";
2391                 break;
2392               case NIC_PRETTY_FUNC:
2393                 msg = "__PRETTY_FUNCTION__";
2394                 break;
2395               case NIC_C99_FUNC:
2396                 msg = "__func__";
2397                 break;
2398               case NIC_VA_ARG:
2399                 msg = "va_arg";
2400                 break;
2401               case NIC_ARROW:
2402                 msg = "->";
2403                 break;
2404               case NIC_POINT:
2405                 msg = ".";
2406                 break;
2407               case NIC_STAR:
2408                 msg = "*";
2409                 break;
2410               case NIC_ADDR:
2411                 msg = "&";
2412                 break;
2413               case NIC_PREINCREMENT:
2414                 msg = "++";
2415                 break;
2416               case NIC_PREDECREMENT:
2417                 msg = "--";
2418                 break;
2419               case NIC_NEW:
2420                 msg = "new";
2421                 break;
2422               case NIC_DEL:
2423                 msg = "delete";
2424                 break;
2425               default:
2426                 gcc_unreachable ();
2427             }
2428           if (msg)
2429             error ("%qs cannot appear in a constant-expression", msg);
2430           return true;
2431         }
2432     }
2433   return false;
2434 }
2435
2436 /* Emit a diagnostic for an invalid type name.  SCOPE is the
2437    qualifying scope (or NULL, if none) for ID.  This function commits
2438    to the current active tentative parse, if any.  (Otherwise, the
2439    problematic construct might be encountered again later, resulting
2440    in duplicate error messages.) LOCATION is the location of ID.  */
2441
2442 static void
2443 cp_parser_diagnose_invalid_type_name (cp_parser *parser,
2444                                       tree scope, tree id,
2445                                       location_t location)
2446 {
2447   tree decl, old_scope;
2448   cp_parser_commit_to_tentative_parse (parser);
2449   /* Try to lookup the identifier.  */
2450   old_scope = parser->scope;
2451   parser->scope = scope;
2452   decl = cp_parser_lookup_name_simple (parser, id, location);
2453   parser->scope = old_scope;
2454   /* If the lookup found a template-name, it means that the user forgot
2455   to specify an argument list. Emit a useful error message.  */
2456   if (TREE_CODE (decl) == TEMPLATE_DECL)
2457     error_at (location,
2458               "invalid use of template-name %qE without an argument list",
2459               decl);
2460   else if (TREE_CODE (id) == BIT_NOT_EXPR)
2461     error_at (location, "invalid use of destructor %qD as a type", id);
2462   else if (TREE_CODE (decl) == TYPE_DECL)
2463     /* Something like 'unsigned A a;'  */
2464     error_at (location, "invalid combination of multiple type-specifiers");
2465   else if (!parser->scope)
2466     {
2467       /* Issue an error message.  */
2468       error_at (location, "%qE does not name a type", id);
2469       /* If we're in a template class, it's possible that the user was
2470          referring to a type from a base class.  For example:
2471
2472            template <typename T> struct A { typedef T X; };
2473            template <typename T> struct B : public A<T> { X x; };
2474
2475          The user should have said "typename A<T>::X".  */
2476       if (cxx_dialect < cxx0x && id == ridpointers[(int)RID_CONSTEXPR])
2477         inform (location, "C++0x %<constexpr%> only available with "
2478                 "-std=c++0x or -std=gnu++0x");
2479       else if (processing_template_decl && current_class_type
2480                && TYPE_BINFO (current_class_type))
2481         {
2482           tree b;
2483
2484           for (b = TREE_CHAIN (TYPE_BINFO (current_class_type));
2485                b;
2486                b = TREE_CHAIN (b))
2487             {
2488               tree base_type = BINFO_TYPE (b);
2489               if (CLASS_TYPE_P (base_type)
2490                   && dependent_type_p (base_type))
2491                 {
2492                   tree field;
2493                   /* Go from a particular instantiation of the
2494                      template (which will have an empty TYPE_FIELDs),
2495                      to the main version.  */
2496                   base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
2497                   for (field = TYPE_FIELDS (base_type);
2498                        field;
2499                        field = DECL_CHAIN (field))
2500                     if (TREE_CODE (field) == TYPE_DECL
2501                         && DECL_NAME (field) == id)
2502                       {
2503                         inform (location, 
2504                                 "(perhaps %<typename %T::%E%> was intended)",
2505                                 BINFO_TYPE (b), id);
2506                         break;
2507                       }
2508                   if (field)
2509                     break;
2510                 }
2511             }
2512         }
2513     }
2514   /* Here we diagnose qualified-ids where the scope is actually correct,
2515      but the identifier does not resolve to a valid type name.  */
2516   else if (parser->scope != error_mark_node)
2517     {
2518       if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
2519         error_at (location, "%qE in namespace %qE does not name a type",
2520                   id, parser->scope);
2521       else if (CLASS_TYPE_P (parser->scope)
2522                && constructor_name_p (id, parser->scope))
2523         {
2524           /* A<T>::A<T>() */
2525           error_at (location, "%<%T::%E%> names the constructor, not"
2526                     " the type", parser->scope, id);
2527           if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
2528             error_at (location, "and %qT has no template constructors",
2529                       parser->scope);
2530         }
2531       else if (TYPE_P (parser->scope)
2532                && dependent_scope_p (parser->scope))
2533         error_at (location, "need %<typename%> before %<%T::%E%> because "
2534                   "%qT is a dependent scope",
2535                   parser->scope, id, parser->scope);
2536       else if (TYPE_P (parser->scope))
2537         error_at (location, "%qE in %q#T does not name a type",
2538                   id, parser->scope);
2539       else
2540         gcc_unreachable ();
2541     }
2542 }
2543
2544 /* Check for a common situation where a type-name should be present,
2545    but is not, and issue a sensible error message.  Returns true if an
2546    invalid type-name was detected.
2547
2548    The situation handled by this function are variable declarations of the
2549    form `ID a', where `ID' is an id-expression and `a' is a plain identifier.
2550    Usually, `ID' should name a type, but if we got here it means that it
2551    does not. We try to emit the best possible error message depending on
2552    how exactly the id-expression looks like.  */
2553
2554 static bool
2555 cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
2556 {
2557   tree id;
2558   cp_token *token = cp_lexer_peek_token (parser->lexer);
2559
2560   /* Avoid duplicate error about ambiguous lookup.  */
2561   if (token->type == CPP_NESTED_NAME_SPECIFIER)
2562     {
2563       cp_token *next = cp_lexer_peek_nth_token (parser->lexer, 2);
2564       if (next->type == CPP_NAME && next->ambiguous_p)
2565         goto out;
2566     }
2567
2568   cp_parser_parse_tentatively (parser);
2569   id = cp_parser_id_expression (parser,
2570                                 /*template_keyword_p=*/false,
2571                                 /*check_dependency_p=*/true,
2572                                 /*template_p=*/NULL,
2573                                 /*declarator_p=*/true,
2574                                 /*optional_p=*/false);
2575   /* If the next token is a (, this is a function with no explicit return
2576      type, i.e. constructor, destructor or conversion op.  */
2577   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
2578       || TREE_CODE (id) == TYPE_DECL)
2579     {
2580       cp_parser_abort_tentative_parse (parser);
2581       return false;
2582     }
2583   if (!cp_parser_parse_definitely (parser))
2584     return false;
2585
2586   /* Emit a diagnostic for the invalid type.  */
2587   cp_parser_diagnose_invalid_type_name (parser, parser->scope,
2588                                         id, token->location);
2589  out:
2590   /* If we aren't in the middle of a declarator (i.e. in a
2591      parameter-declaration-clause), skip to the end of the declaration;
2592      there's no point in trying to process it.  */
2593   if (!parser->in_declarator_p)
2594     cp_parser_skip_to_end_of_block_or_statement (parser);
2595   return true;
2596 }
2597
2598 /* Consume tokens up to, and including, the next non-nested closing `)'.
2599    Returns 1 iff we found a closing `)'.  RECOVERING is true, if we
2600    are doing error recovery. Returns -1 if OR_COMMA is true and we
2601    found an unnested comma.  */
2602
2603 static int
2604 cp_parser_skip_to_closing_parenthesis (cp_parser *parser,
2605                                        bool recovering,
2606                                        bool or_comma,
2607                                        bool consume_paren)
2608 {
2609   unsigned paren_depth = 0;
2610   unsigned brace_depth = 0;
2611   unsigned square_depth = 0;
2612
2613   if (recovering && !or_comma
2614       && cp_parser_uncommitted_to_tentative_parse_p (parser))
2615     return 0;
2616
2617   while (true)
2618     {
2619       cp_token * token = cp_lexer_peek_token (parser->lexer);
2620
2621       switch (token->type)
2622         {
2623         case CPP_EOF:
2624         case CPP_PRAGMA_EOL:
2625           /* If we've run out of tokens, then there is no closing `)'.  */
2626           return 0;
2627
2628         /* This is good for lambda expression capture-lists.  */
2629         case CPP_OPEN_SQUARE:
2630           ++square_depth;
2631           break;
2632         case CPP_CLOSE_SQUARE:
2633           if (!square_depth--)
2634             return 0;
2635           break;
2636
2637         case CPP_SEMICOLON:
2638           /* This matches the processing in skip_to_end_of_statement.  */
2639           if (!brace_depth)
2640             return 0;
2641           break;
2642
2643         case CPP_OPEN_BRACE:
2644           ++brace_depth;
2645           break;
2646         case CPP_CLOSE_BRACE:
2647           if (!brace_depth--)
2648             return 0;
2649           break;
2650
2651         case CPP_COMMA:
2652           if (recovering && or_comma && !brace_depth && !paren_depth
2653               && !square_depth)
2654             return -1;
2655           break;
2656
2657         case CPP_OPEN_PAREN:
2658           if (!brace_depth)
2659             ++paren_depth;
2660           break;
2661
2662         case CPP_CLOSE_PAREN:
2663           if (!brace_depth && !paren_depth--)
2664             {
2665               if (consume_paren)
2666                 cp_lexer_consume_token (parser->lexer);
2667               return 1;
2668             }
2669           break;
2670
2671         default:
2672           break;
2673         }
2674
2675       /* Consume the token.  */
2676       cp_lexer_consume_token (parser->lexer);
2677     }
2678 }
2679
2680 /* Consume tokens until we reach the end of the current statement.
2681    Normally, that will be just before consuming a `;'.  However, if a
2682    non-nested `}' comes first, then we stop before consuming that.  */
2683
2684 static void
2685 cp_parser_skip_to_end_of_statement (cp_parser* parser)
2686 {
2687   unsigned nesting_depth = 0;
2688
2689   while (true)
2690     {
2691       cp_token *token = cp_lexer_peek_token (parser->lexer);
2692
2693       switch (token->type)
2694         {
2695         case CPP_EOF:
2696         case CPP_PRAGMA_EOL:
2697           /* If we've run out of tokens, stop.  */
2698           return;
2699
2700         case CPP_SEMICOLON:
2701           /* If the next token is a `;', we have reached the end of the
2702              statement.  */
2703           if (!nesting_depth)
2704             return;
2705           break;
2706
2707         case CPP_CLOSE_BRACE:
2708           /* If this is a non-nested '}', stop before consuming it.
2709              That way, when confronted with something like:
2710
2711                { 3 + }
2712
2713              we stop before consuming the closing '}', even though we
2714              have not yet reached a `;'.  */
2715           if (nesting_depth == 0)
2716             return;
2717
2718           /* If it is the closing '}' for a block that we have
2719              scanned, stop -- but only after consuming the token.
2720              That way given:
2721
2722                 void f g () { ... }
2723                 typedef int I;
2724
2725              we will stop after the body of the erroneously declared
2726              function, but before consuming the following `typedef'
2727              declaration.  */
2728           if (--nesting_depth == 0)
2729             {
2730               cp_lexer_consume_token (parser->lexer);
2731               return;
2732             }
2733
2734         case CPP_OPEN_BRACE:
2735           ++nesting_depth;
2736           break;
2737
2738         default:
2739           break;
2740         }
2741
2742       /* Consume the token.  */
2743       cp_lexer_consume_token (parser->lexer);
2744     }
2745 }
2746
2747 /* This function is called at the end of a statement or declaration.
2748    If the next token is a semicolon, it is consumed; otherwise, error
2749    recovery is attempted.  */
2750
2751 static void
2752 cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
2753 {
2754   /* Look for the trailing `;'.  */
2755   if (!cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON))
2756     {
2757       /* If there is additional (erroneous) input, skip to the end of
2758          the statement.  */
2759       cp_parser_skip_to_end_of_statement (parser);
2760       /* If the next token is now a `;', consume it.  */
2761       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
2762         cp_lexer_consume_token (parser->lexer);
2763     }
2764 }
2765
2766 /* Skip tokens until we have consumed an entire block, or until we
2767    have consumed a non-nested `;'.  */
2768
2769 static void
2770 cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
2771 {
2772   int nesting_depth = 0;
2773
2774   while (nesting_depth >= 0)
2775     {
2776       cp_token *token = cp_lexer_peek_token (parser->lexer);
2777
2778       switch (token->type)
2779         {
2780         case CPP_EOF:
2781         case CPP_PRAGMA_EOL:
2782           /* If we've run out of tokens, stop.  */
2783           return;
2784
2785         case CPP_SEMICOLON:
2786           /* Stop if this is an unnested ';'. */
2787           if (!nesting_depth)
2788             nesting_depth = -1;
2789           break;
2790
2791         case CPP_CLOSE_BRACE:
2792           /* Stop if this is an unnested '}', or closes the outermost
2793              nesting level.  */
2794           nesting_depth--;
2795           if (nesting_depth < 0)
2796             return;
2797           if (!nesting_depth)
2798             nesting_depth = -1;
2799           break;
2800
2801         case CPP_OPEN_BRACE:
2802           /* Nest. */
2803           nesting_depth++;
2804           break;
2805
2806         default:
2807           break;
2808         }
2809
2810       /* Consume the token.  */
2811       cp_lexer_consume_token (parser->lexer);
2812     }
2813 }
2814
2815 /* Skip tokens until a non-nested closing curly brace is the next
2816    token, or there are no more tokens. Return true in the first case,
2817    false otherwise.  */
2818
2819 static bool
2820 cp_parser_skip_to_closing_brace (cp_parser *parser)
2821 {
2822   unsigned nesting_depth = 0;
2823
2824   while (true)
2825     {
2826       cp_token *token = cp_lexer_peek_token (parser->lexer);
2827
2828       switch (token->type)
2829         {
2830         case CPP_EOF:
2831         case CPP_PRAGMA_EOL:
2832           /* If we've run out of tokens, stop.  */
2833           return false;
2834
2835         case CPP_CLOSE_BRACE:
2836           /* If the next token is a non-nested `}', then we have reached
2837              the end of the current block.  */
2838           if (nesting_depth-- == 0)
2839             return true;
2840           break;
2841
2842         case CPP_OPEN_BRACE:
2843           /* If it the next token is a `{', then we are entering a new
2844              block.  Consume the entire block.  */
2845           ++nesting_depth;
2846           break;
2847
2848         default:
2849           break;
2850         }
2851
2852       /* Consume the token.  */
2853       cp_lexer_consume_token (parser->lexer);
2854     }
2855 }
2856
2857 /* Consume tokens until we reach the end of the pragma.  The PRAGMA_TOK
2858    parameter is the PRAGMA token, allowing us to purge the entire pragma
2859    sequence.  */
2860
2861 static void
2862 cp_parser_skip_to_pragma_eol (cp_parser* parser, cp_token *pragma_tok)
2863 {
2864   cp_token *token;
2865
2866   parser->lexer->in_pragma = false;
2867
2868   do
2869     token = cp_lexer_consume_token (parser->lexer);
2870   while (token->type != CPP_PRAGMA_EOL && token->type != CPP_EOF);
2871
2872   /* Ensure that the pragma is not parsed again.  */
2873   cp_lexer_purge_tokens_after (parser->lexer, pragma_tok);
2874 }
2875
2876 /* Require pragma end of line, resyncing with it as necessary.  The
2877    arguments are as for cp_parser_skip_to_pragma_eol.  */
2878
2879 static void
2880 cp_parser_require_pragma_eol (cp_parser *parser, cp_token *pragma_tok)
2881 {
2882   parser->lexer->in_pragma = false;
2883   if (!cp_parser_require (parser, CPP_PRAGMA_EOL, RT_PRAGMA_EOL))
2884     cp_parser_skip_to_pragma_eol (parser, pragma_tok);
2885 }
2886
2887 /* This is a simple wrapper around make_typename_type. When the id is
2888    an unresolved identifier node, we can provide a superior diagnostic
2889    using cp_parser_diagnose_invalid_type_name.  */
2890
2891 static tree
2892 cp_parser_make_typename_type (cp_parser *parser, tree scope,
2893                               tree id, location_t id_location)
2894 {
2895   tree result;
2896   if (TREE_CODE (id) == IDENTIFIER_NODE)
2897     {
2898       result = make_typename_type (scope, id, typename_type,
2899                                    /*complain=*/tf_none);
2900       if (result == error_mark_node)
2901         cp_parser_diagnose_invalid_type_name (parser, scope, id, id_location);
2902       return result;
2903     }
2904   return make_typename_type (scope, id, typename_type, tf_error);
2905 }
2906
2907 /* This is a wrapper around the
2908    make_{pointer,ptrmem,reference}_declarator functions that decides
2909    which one to call based on the CODE and CLASS_TYPE arguments. The
2910    CODE argument should be one of the values returned by
2911    cp_parser_ptr_operator. */
2912 static cp_declarator *
2913 cp_parser_make_indirect_declarator (enum tree_code code, tree class_type,
2914                                     cp_cv_quals cv_qualifiers,
2915                                     cp_declarator *target)
2916 {
2917   if (code == ERROR_MARK)
2918     return cp_error_declarator;
2919
2920   if (code == INDIRECT_REF)
2921     if (class_type == NULL_TREE)
2922       return make_pointer_declarator (cv_qualifiers, target);
2923     else
2924       return make_ptrmem_declarator (cv_qualifiers, class_type, target);
2925   else if (code == ADDR_EXPR && class_type == NULL_TREE)
2926     return make_reference_declarator (cv_qualifiers, target, false);
2927   else if (code == NON_LVALUE_EXPR && class_type == NULL_TREE)
2928     return make_reference_declarator (cv_qualifiers, target, true);
2929   gcc_unreachable ();
2930 }
2931
2932 /* Create a new C++ parser.  */
2933
2934 static cp_parser *
2935 cp_parser_new (void)
2936 {
2937   cp_parser *parser;
2938   cp_lexer *lexer;
2939   unsigned i;
2940
2941   /* cp_lexer_new_main is called before doing GC allocation because
2942      cp_lexer_new_main might load a PCH file.  */
2943   lexer = cp_lexer_new_main ();
2944
2945   /* Initialize the binops_by_token so that we can get the tree
2946      directly from the token.  */
2947   for (i = 0; i < sizeof (binops) / sizeof (binops[0]); i++)
2948     binops_by_token[binops[i].token_type] = binops[i];
2949
2950   parser = ggc_alloc_cleared_cp_parser ();
2951   parser->lexer = lexer;
2952   parser->context = cp_parser_context_new (NULL);
2953
2954   /* For now, we always accept GNU extensions.  */
2955   parser->allow_gnu_extensions_p = 1;
2956
2957   /* The `>' token is a greater-than operator, not the end of a
2958      template-id.  */
2959   parser->greater_than_is_operator_p = true;
2960
2961   parser->default_arg_ok_p = true;
2962
2963   /* We are not parsing a constant-expression.  */
2964   parser->integral_constant_expression_p = false;
2965   parser->allow_non_integral_constant_expression_p = false;
2966   parser->non_integral_constant_expression_p = false;
2967
2968   /* Local variable names are not forbidden.  */
2969   parser->local_variables_forbidden_p = false;
2970
2971   /* We are not processing an `extern "C"' declaration.  */
2972   parser->in_unbraced_linkage_specification_p = false;
2973
2974   /* We are not processing a declarator.  */
2975   parser->in_declarator_p = false;
2976
2977   /* We are not processing a template-argument-list.  */
2978   parser->in_template_argument_list_p = false;
2979
2980   /* We are not in an iteration statement.  */
2981   parser->in_statement = 0;
2982
2983   /* We are not in a switch statement.  */
2984   parser->in_switch_statement_p = false;
2985
2986   /* We are not parsing a type-id inside an expression.  */
2987   parser->in_type_id_in_expr_p = false;
2988
2989   /* Declarations aren't implicitly extern "C".  */
2990   parser->implicit_extern_c = false;
2991
2992   /* String literals should be translated to the execution character set.  */
2993   parser->translate_strings_p = true;
2994
2995   /* We are not parsing a function body.  */
2996   parser->in_function_body = false;
2997
2998   /* We can correct until told otherwise.  */
2999   parser->colon_corrects_to_scope_p = true;
3000
3001   /* The unparsed function queue is empty.  */
3002   push_unparsed_function_queues (parser);
3003
3004   /* There are no classes being defined.  */
3005   parser->num_classes_being_defined = 0;
3006
3007   /* No template parameters apply.  */
3008   parser->num_template_parameter_lists = 0;
3009
3010   return parser;
3011 }
3012
3013 /* Create a cp_lexer structure which will emit the tokens in CACHE
3014    and push it onto the parser's lexer stack.  This is used for delayed
3015    parsing of in-class method bodies and default arguments, and should
3016    not be confused with tentative parsing.  */
3017 static void
3018 cp_parser_push_lexer_for_tokens (cp_parser *parser, cp_token_cache *cache)
3019 {
3020   cp_lexer *lexer = cp_lexer_new_from_tokens (cache);
3021   lexer->next = parser->lexer;
3022   parser->lexer = lexer;
3023
3024   /* Move the current source position to that of the first token in the
3025      new lexer.  */
3026   cp_lexer_set_source_position_from_token (lexer->next_token);
3027 }
3028
3029 /* Pop the top lexer off the parser stack.  This is never used for the
3030    "main" lexer, only for those pushed by cp_parser_push_lexer_for_tokens.  */
3031 static void
3032 cp_parser_pop_lexer (cp_parser *parser)
3033 {
3034   cp_lexer *lexer = parser->lexer;
3035   parser->lexer = lexer->next;
3036   cp_lexer_destroy (lexer);
3037
3038   /* Put the current source position back where it was before this
3039      lexer was pushed.  */
3040   cp_lexer_set_source_position_from_token (parser->lexer->next_token);
3041 }
3042
3043 /* Lexical conventions [gram.lex]  */
3044
3045 /* Parse an identifier.  Returns an IDENTIFIER_NODE representing the
3046    identifier.  */
3047
3048 static tree
3049 cp_parser_identifier (cp_parser* parser)
3050 {
3051   cp_token *token;
3052
3053   /* Look for the identifier.  */
3054   token = cp_parser_require (parser, CPP_NAME, RT_NAME);
3055   /* Return the value.  */
3056   return token ? token->u.value : error_mark_node;
3057 }
3058
3059 /* Parse a sequence of adjacent string constants.  Returns a
3060    TREE_STRING representing the combined, nul-terminated string
3061    constant.  If TRANSLATE is true, translate the string to the
3062    execution character set.  If WIDE_OK is true, a wide string is
3063    invalid here.
3064
3065    C++98 [lex.string] says that if a narrow string literal token is
3066    adjacent to a wide string literal token, the behavior is undefined.
3067    However, C99 6.4.5p4 says that this results in a wide string literal.
3068    We follow C99 here, for consistency with the C front end.
3069
3070    This code is largely lifted from lex_string() in c-lex.c.
3071
3072    FUTURE: ObjC++ will need to handle @-strings here.  */
3073 static tree
3074 cp_parser_string_literal (cp_parser *parser, bool translate, bool wide_ok)
3075 {
3076   tree value;
3077   size_t count;
3078   struct obstack str_ob;
3079   cpp_string str, istr, *strs;
3080   cp_token *tok;
3081   enum cpp_ttype type;
3082
3083   tok = cp_lexer_peek_token (parser->lexer);
3084   if (!cp_parser_is_string_literal (tok))
3085     {
3086       cp_parser_error (parser, "expected string-literal");
3087       return error_mark_node;
3088     }
3089
3090   type = tok->type;
3091
3092   /* Try to avoid the overhead of creating and destroying an obstack
3093      for the common case of just one string.  */
3094   if (!cp_parser_is_string_literal
3095       (cp_lexer_peek_nth_token (parser->lexer, 2)))
3096     {
3097       cp_lexer_consume_token (parser->lexer);
3098
3099       str.text = (const unsigned char *)TREE_STRING_POINTER (tok->u.value);
3100       str.len = TREE_STRING_LENGTH (tok->u.value);
3101       count = 1;
3102
3103       strs = &str;
3104     }
3105   else
3106     {
3107       gcc_obstack_init (&str_ob);
3108       count = 0;
3109
3110       do
3111         {
3112           cp_lexer_consume_token (parser->lexer);
3113           count++;
3114           str.text = (const unsigned char *)TREE_STRING_POINTER (tok->u.value);
3115           str.len = TREE_STRING_LENGTH (tok->u.value);
3116
3117           if (type != tok->type)
3118             {
3119               if (type == CPP_STRING)
3120                 type = tok->type;
3121               else if (tok->type != CPP_STRING)
3122                 error_at (tok->location,
3123                           "unsupported non-standard concatenation "
3124                           "of string literals");
3125             }
3126
3127           obstack_grow (&str_ob, &str, sizeof (cpp_string));
3128
3129           tok = cp_lexer_peek_token (parser->lexer);
3130         }
3131       while (cp_parser_is_string_literal (tok));
3132
3133       strs = (cpp_string *) obstack_finish (&str_ob);
3134     }
3135
3136   if (type != CPP_STRING && !wide_ok)
3137     {
3138       cp_parser_error (parser, "a wide string is invalid in this context");
3139       type = CPP_STRING;
3140     }
3141
3142   if ((translate ? cpp_interpret_string : cpp_interpret_string_notranslate)
3143       (parse_in, strs, count, &istr, type))
3144     {
3145       value = build_string (istr.len, (const char *)istr.text);
3146       free (CONST_CAST (unsigned char *, istr.text));
3147
3148       switch (type)
3149         {
3150         default:
3151         case CPP_STRING:
3152         case CPP_UTF8STRING:
3153           TREE_TYPE (value) = char_array_type_node;
3154           break;
3155         case CPP_STRING16:
3156           TREE_TYPE (value) = char16_array_type_node;
3157           break;
3158         case CPP_STRING32:
3159           TREE_TYPE (value) = char32_array_type_node;
3160           break;
3161         case CPP_WSTRING:
3162           TREE_TYPE (value) = wchar_array_type_node;
3163           break;
3164         }
3165
3166       value = fix_string_type (value);
3167     }
3168   else
3169     /* cpp_interpret_string has issued an error.  */
3170     value = error_mark_node;
3171
3172   if (count > 1)
3173     obstack_free (&str_ob, 0);
3174
3175   return value;
3176 }
3177
3178
3179 /* Basic concepts [gram.basic]  */
3180
3181 /* Parse a translation-unit.
3182
3183    translation-unit:
3184      declaration-seq [opt]
3185
3186    Returns TRUE if all went well.  */
3187
3188 static bool
3189 cp_parser_translation_unit (cp_parser* parser)
3190 {
3191   /* The address of the first non-permanent object on the declarator
3192      obstack.  */
3193   static void *declarator_obstack_base;
3194
3195   bool success;
3196
3197   /* Create the declarator obstack, if necessary.  */
3198   if (!cp_error_declarator)
3199     {
3200       gcc_obstack_init (&declarator_obstack);
3201       /* Create the error declarator.  */
3202       cp_error_declarator = make_declarator (cdk_error);
3203       /* Create the empty parameter list.  */
3204       no_parameters = make_parameter_declarator (NULL, NULL, NULL_TREE);
3205       /* Remember where the base of the declarator obstack lies.  */
3206       declarator_obstack_base = obstack_next_free (&declarator_obstack);
3207     }
3208
3209   cp_parser_declaration_seq_opt (parser);
3210
3211   /* If there are no tokens left then all went well.  */
3212   if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
3213     {
3214       /* Get rid of the token array; we don't need it any more.  */
3215       cp_lexer_destroy (parser->lexer);
3216       parser->lexer = NULL;
3217
3218       /* This file might have been a context that's implicitly extern
3219          "C".  If so, pop the lang context.  (Only relevant for PCH.) */
3220       if (parser->implicit_extern_c)
3221         {
3222           pop_lang_context ();
3223           parser->implicit_extern_c = false;
3224         }
3225
3226       /* Finish up.  */
3227       finish_translation_unit ();
3228
3229       success = true;
3230     }
3231   else
3232     {
3233       cp_parser_error (parser, "expected declaration");
3234       success = false;
3235     }
3236
3237   /* Make sure the declarator obstack was fully cleaned up.  */
3238   gcc_assert (obstack_next_free (&declarator_obstack)
3239               == declarator_obstack_base);
3240
3241   /* All went well.  */
3242   return success;
3243 }
3244
3245 /* Expressions [gram.expr] */
3246
3247 /* Parse a primary-expression.
3248
3249    primary-expression:
3250      literal
3251      this
3252      ( expression )
3253      id-expression
3254
3255    GNU Extensions:
3256
3257    primary-expression:
3258      ( compound-statement )
3259      __builtin_va_arg ( assignment-expression , type-id )
3260      __builtin_offsetof ( type-id , offsetof-expression )
3261
3262    C++ Extensions:
3263      __has_nothrow_assign ( type-id )   
3264      __has_nothrow_constructor ( type-id )
3265      __has_nothrow_copy ( type-id )
3266      __has_trivial_assign ( type-id )   
3267      __has_trivial_constructor ( type-id )
3268      __has_trivial_copy ( type-id )
3269      __has_trivial_destructor ( type-id )
3270      __has_virtual_destructor ( type-id )     
3271      __is_abstract ( type-id )
3272      __is_base_of ( type-id , type-id )
3273      __is_class ( type-id )
3274      __is_convertible_to ( type-id , type-id )     
3275      __is_empty ( type-id )
3276      __is_enum ( type-id )
3277      __is_literal_type ( type-id )
3278      __is_pod ( type-id )
3279      __is_polymorphic ( type-id )
3280      __is_std_layout ( type-id )
3281      __is_trivial ( type-id )
3282      __is_union ( type-id )
3283
3284    Objective-C++ Extension:
3285
3286    primary-expression:
3287      objc-expression
3288
3289    literal:
3290      __null
3291
3292    ADDRESS_P is true iff this expression was immediately preceded by
3293    "&" and therefore might denote a pointer-to-member.  CAST_P is true
3294    iff this expression is the target of a cast.  TEMPLATE_ARG_P is
3295    true iff this expression is a template argument.
3296
3297    Returns a representation of the expression.  Upon return, *IDK
3298    indicates what kind of id-expression (if any) was present.  */
3299
3300 static tree
3301 cp_parser_primary_expression (cp_parser *parser,
3302                               bool address_p,
3303                               bool cast_p,
3304                               bool template_arg_p,
3305                               cp_id_kind *idk)
3306 {
3307   cp_token *token = NULL;
3308
3309   /* Assume the primary expression is not an id-expression.  */
3310   *idk = CP_ID_KIND_NONE;
3311
3312   /* Peek at the next token.  */
3313   token = cp_lexer_peek_token (parser->lexer);
3314   switch (token->type)
3315     {
3316       /* literal:
3317            integer-literal
3318            character-literal
3319            floating-literal
3320            string-literal
3321            boolean-literal  */
3322     case CPP_CHAR:
3323     case CPP_CHAR16:
3324     case CPP_CHAR32:
3325     case CPP_WCHAR:
3326     case CPP_NUMBER:
3327       token = cp_lexer_consume_token (parser->lexer);
3328       if (TREE_CODE (token->u.value) == FIXED_CST)
3329         {
3330           error_at (token->location,
3331                     "fixed-point types not supported in C++");
3332           return error_mark_node;
3333         }
3334       /* Floating-point literals are only allowed in an integral
3335          constant expression if they are cast to an integral or
3336          enumeration type.  */
3337       if (TREE_CODE (token->u.value) == REAL_CST
3338           && parser->integral_constant_expression_p
3339           && pedantic)
3340         {
3341           /* CAST_P will be set even in invalid code like "int(2.7 +
3342              ...)".   Therefore, we have to check that the next token
3343              is sure to end the cast.  */
3344           if (cast_p)
3345             {
3346               cp_token *next_token;
3347
3348               next_token = cp_lexer_peek_token (parser->lexer);
3349               if (/* The comma at the end of an
3350                      enumerator-definition.  */
3351                   next_token->type != CPP_COMMA
3352                   /* The curly brace at the end of an enum-specifier.  */
3353                   && next_token->type != CPP_CLOSE_BRACE
3354                   /* The end of a statement.  */
3355                   && next_token->type != CPP_SEMICOLON
3356                   /* The end of the cast-expression.  */
3357                   && next_token->type != CPP_CLOSE_PAREN
3358                   /* The end of an array bound.  */
3359                   && next_token->type != CPP_CLOSE_SQUARE
3360                   /* The closing ">" in a template-argument-list.  */
3361                   && (next_token->type != CPP_GREATER
3362                       || parser->greater_than_is_operator_p)
3363                   /* C++0x only: A ">>" treated like two ">" tokens,
3364                      in a template-argument-list.  */
3365                   && (next_token->type != CPP_RSHIFT
3366                       || (cxx_dialect == cxx98)
3367                       || parser->greater_than_is_operator_p))
3368                 cast_p = false;
3369             }
3370
3371           /* If we are within a cast, then the constraint that the
3372              cast is to an integral or enumeration type will be
3373              checked at that point.  If we are not within a cast, then
3374              this code is invalid.  */
3375           if (!cast_p)
3376             cp_parser_non_integral_constant_expression (parser, NIC_FLOAT);
3377         }
3378       return token->u.value;
3379
3380     case CPP_STRING:
3381     case CPP_STRING16:
3382     case CPP_STRING32:
3383     case CPP_WSTRING:
3384     case CPP_UTF8STRING:
3385       /* ??? Should wide strings be allowed when parser->translate_strings_p
3386          is false (i.e. in attributes)?  If not, we can kill the third
3387          argument to cp_parser_string_literal.  */
3388       return cp_parser_string_literal (parser,
3389                                        parser->translate_strings_p,
3390                                        true);
3391
3392     case CPP_OPEN_PAREN:
3393       {
3394         tree expr;
3395         bool saved_greater_than_is_operator_p;
3396
3397         /* Consume the `('.  */
3398         cp_lexer_consume_token (parser->lexer);
3399         /* Within a parenthesized expression, a `>' token is always
3400            the greater-than operator.  */
3401         saved_greater_than_is_operator_p
3402           = parser->greater_than_is_operator_p;
3403         parser->greater_than_is_operator_p = true;
3404         /* If we see `( { ' then we are looking at the beginning of
3405            a GNU statement-expression.  */
3406         if (cp_parser_allow_gnu_extensions_p (parser)
3407             && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
3408           {
3409             /* Statement-expressions are not allowed by the standard.  */
3410             pedwarn (token->location, OPT_pedantic, 
3411                      "ISO C++ forbids braced-groups within expressions");
3412
3413             /* And they're not allowed outside of a function-body; you
3414                cannot, for example, write:
3415
3416                  int i = ({ int j = 3; j + 1; });
3417
3418                at class or namespace scope.  */
3419             if (!parser->in_function_body
3420                 || parser->in_template_argument_list_p)
3421               {
3422                 error_at (token->location,
3423                           "statement-expressions are not allowed outside "
3424                           "functions nor in template-argument lists");
3425                 cp_parser_skip_to_end_of_block_or_statement (parser);
3426                 expr = error_mark_node;
3427               }
3428             else
3429               {
3430                 /* Start the statement-expression.  */
3431                 expr = begin_stmt_expr ();
3432                 /* Parse the compound-statement.  */
3433                 cp_parser_compound_statement (parser, expr, false, false);
3434                 /* Finish up.  */
3435                 expr = finish_stmt_expr (expr, false);
3436               }
3437           }
3438         else
3439           {
3440             /* Parse the parenthesized expression.  */
3441             expr = cp_parser_expression (parser, cast_p, idk);
3442             /* Let the front end know that this expression was
3443                enclosed in parentheses. This matters in case, for
3444                example, the expression is of the form `A::B', since
3445                `&A::B' might be a pointer-to-member, but `&(A::B)' is
3446                not.  */
3447             finish_parenthesized_expr (expr);
3448             /* DR 705: Wrapping an unqualified name in parentheses
3449                suppresses arg-dependent lookup.  We want to pass back
3450                CP_ID_KIND_QUALIFIED for suppressing vtable lookup
3451                (c++/37862), but none of the others.  */
3452             if (*idk != CP_ID_KIND_QUALIFIED)
3453               *idk = CP_ID_KIND_NONE;
3454           }
3455         /* The `>' token might be the end of a template-id or
3456            template-parameter-list now.  */
3457         parser->greater_than_is_operator_p
3458           = saved_greater_than_is_operator_p;
3459         /* Consume the `)'.  */
3460         if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
3461           cp_parser_skip_to_end_of_statement (parser);
3462
3463         return expr;
3464       }
3465
3466     case CPP_OPEN_SQUARE:
3467       if (c_dialect_objc ())
3468         /* We have an Objective-C++ message. */
3469         return cp_parser_objc_expression (parser);
3470       {
3471         tree lam = cp_parser_lambda_expression (parser);
3472         /* Don't warn about a failed tentative parse.  */
3473         if (cp_parser_error_occurred (parser))
3474           return error_mark_node;
3475         maybe_warn_cpp0x (CPP0X_LAMBDA_EXPR);
3476         return lam;
3477       }
3478
3479     case CPP_OBJC_STRING:
3480       if (c_dialect_objc ())
3481         /* We have an Objective-C++ string literal. */
3482         return cp_parser_objc_expression (parser);
3483       cp_parser_error (parser, "expected primary-expression");
3484       return error_mark_node;
3485
3486     case CPP_KEYWORD:
3487       switch (token->keyword)
3488         {
3489           /* These two are the boolean literals.  */
3490         case RID_TRUE:
3491           cp_lexer_consume_token (parser->lexer);
3492           return boolean_true_node;
3493         case RID_FALSE:
3494           cp_lexer_consume_token (parser->lexer);
3495           return boolean_false_node;
3496
3497           /* The `__null' literal.  */
3498         case RID_NULL:
3499           cp_lexer_consume_token (parser->lexer);
3500           return null_node;
3501
3502           /* The `nullptr' literal.  */
3503         case RID_NULLPTR:
3504           cp_lexer_consume_token (parser->lexer);
3505           return nullptr_node;
3506
3507           /* Recognize the `this' keyword.  */
3508         case RID_THIS:
3509           cp_lexer_consume_token (parser->lexer);
3510           if (parser->local_variables_forbidden_p)
3511             {
3512               error_at (token->location,
3513                         "%<this%> may not be used in this context");
3514               return error_mark_node;
3515             }
3516           /* Pointers cannot appear in constant-expressions.  */
3517           if (cp_parser_non_integral_constant_expression (parser, NIC_THIS))
3518             return error_mark_node;
3519           return finish_this_expr ();
3520
3521           /* The `operator' keyword can be the beginning of an
3522              id-expression.  */
3523         case RID_OPERATOR:
3524           goto id_expression;
3525
3526         case RID_FUNCTION_NAME:
3527         case RID_PRETTY_FUNCTION_NAME:
3528         case RID_C99_FUNCTION_NAME:
3529           {
3530             non_integral_constant name;
3531
3532             /* The symbols __FUNCTION__, __PRETTY_FUNCTION__, and
3533                __func__ are the names of variables -- but they are
3534                treated specially.  Therefore, they are handled here,
3535                rather than relying on the generic id-expression logic
3536                below.  Grammatically, these names are id-expressions.
3537
3538                Consume the token.  */
3539             token = cp_lexer_consume_token (parser->lexer);
3540
3541             switch (token->keyword)
3542               {
3543               case RID_FUNCTION_NAME:
3544                 name = NIC_FUNC_NAME;
3545                 break;
3546               case RID_PRETTY_FUNCTION_NAME:
3547                 name = NIC_PRETTY_FUNC;
3548                 break;
3549               case RID_C99_FUNCTION_NAME:
3550                 name = NIC_C99_FUNC;
3551                 break;
3552               default:
3553                 gcc_unreachable ();
3554               }
3555
3556             if (cp_parser_non_integral_constant_expression (parser, name))
3557               return error_mark_node;
3558
3559             /* Look up the name.  */
3560             return finish_fname (token->u.value);
3561           }
3562
3563         case RID_VA_ARG:
3564           {
3565             tree expression;
3566             tree type;
3567
3568             /* The `__builtin_va_arg' construct is used to handle
3569                `va_arg'.  Consume the `__builtin_va_arg' token.  */
3570             cp_lexer_consume_token (parser->lexer);
3571             /* Look for the opening `('.  */
3572             cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
3573             /* Now, parse the assignment-expression.  */
3574             expression = cp_parser_assignment_expression (parser,
3575                                                           /*cast_p=*/false, NULL);
3576             /* Look for the `,'.  */
3577             cp_parser_require (parser, CPP_COMMA, RT_COMMA);
3578             /* Parse the type-id.  */
3579             type = cp_parser_type_id (parser);
3580             /* Look for the closing `)'.  */
3581             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
3582             /* Using `va_arg' in a constant-expression is not
3583                allowed.  */
3584             if (cp_parser_non_integral_constant_expression (parser,
3585                                                             NIC_VA_ARG))
3586               return error_mark_node;
3587             return build_x_va_arg (expression, type);
3588           }
3589
3590         case RID_OFFSETOF:
3591           return cp_parser_builtin_offsetof (parser);
3592
3593         case RID_HAS_NOTHROW_ASSIGN:
3594         case RID_HAS_NOTHROW_CONSTRUCTOR:
3595         case RID_HAS_NOTHROW_COPY:        
3596         case RID_HAS_TRIVIAL_ASSIGN:
3597         case RID_HAS_TRIVIAL_CONSTRUCTOR:
3598         case RID_HAS_TRIVIAL_COPY:        
3599         case RID_HAS_TRIVIAL_DESTRUCTOR:
3600         case RID_HAS_VIRTUAL_DESTRUCTOR:
3601         case RID_IS_ABSTRACT:
3602         case RID_IS_BASE_OF:
3603         case RID_IS_CLASS:
3604         case RID_IS_CONVERTIBLE_TO:
3605         case RID_IS_EMPTY:
3606         case RID_IS_ENUM:
3607         case RID_IS_LITERAL_TYPE:
3608         case RID_IS_POD:
3609         case RID_IS_POLYMORPHIC:
3610         case RID_IS_STD_LAYOUT:
3611         case RID_IS_TRIVIAL:
3612         case RID_IS_UNION:
3613           return cp_parser_trait_expr (parser, token->keyword);
3614
3615         /* Objective-C++ expressions.  */
3616         case RID_AT_ENCODE:
3617         case RID_AT_PROTOCOL:
3618         case RID_AT_SELECTOR:
3619           return cp_parser_objc_expression (parser);
3620
3621         case RID_TEMPLATE:
3622           if (parser->in_function_body
3623               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
3624                   == CPP_LESS))
3625             {
3626               error_at (token->location,
3627                         "a template declaration cannot appear at block scope");
3628               cp_parser_skip_to_end_of_block_or_statement (parser);
3629               return error_mark_node;
3630             }
3631         default:
3632           cp_parser_error (parser, "expected primary-expression");
3633           return error_mark_node;
3634         }
3635
3636       /* An id-expression can start with either an identifier, a
3637          `::' as the beginning of a qualified-id, or the "operator"
3638          keyword.  */
3639     case CPP_NAME:
3640     case CPP_SCOPE:
3641     case CPP_TEMPLATE_ID:
3642     case CPP_NESTED_NAME_SPECIFIER:
3643       {
3644         tree id_expression;
3645         tree decl;
3646         const char *error_msg;
3647         bool template_p;
3648         bool done;
3649         cp_token *id_expr_token;
3650
3651       id_expression:
3652         /* Parse the id-expression.  */
3653         id_expression
3654           = cp_parser_id_expression (parser,
3655                                      /*template_keyword_p=*/false,
3656                                      /*check_dependency_p=*/true,
3657                                      &template_p,
3658                                      /*declarator_p=*/false,
3659                                      /*optional_p=*/false);
3660         if (id_expression == error_mark_node)
3661           return error_mark_node;
3662         id_expr_token = token;
3663         token = cp_lexer_peek_token (parser->lexer);
3664         done = (token->type != CPP_OPEN_SQUARE
3665                 && token->type != CPP_OPEN_PAREN
3666                 && token->type != CPP_DOT
3667                 && token->type != CPP_DEREF
3668                 && token->type != CPP_PLUS_PLUS
3669                 && token->type != CPP_MINUS_MINUS);
3670         /* If we have a template-id, then no further lookup is
3671            required.  If the template-id was for a template-class, we
3672            will sometimes have a TYPE_DECL at this point.  */
3673         if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR
3674                  || TREE_CODE (id_expression) == TYPE_DECL)
3675           decl = id_expression;
3676         /* Look up the name.  */
3677         else
3678           {
3679             tree ambiguous_decls;
3680
3681             /* If we already know that this lookup is ambiguous, then
3682                we've already issued an error message; there's no reason
3683                to check again.  */
3684             if (id_expr_token->type == CPP_NAME
3685                 && id_expr_token->ambiguous_p)
3686               {
3687                 cp_parser_simulate_error (parser);
3688                 return error_mark_node;
3689               }
3690
3691             decl = cp_parser_lookup_name (parser, id_expression,
3692                                           none_type,
3693                                           template_p,
3694                                           /*is_namespace=*/false,
3695                                           /*check_dependency=*/true,
3696                                           &ambiguous_decls,
3697                                           id_expr_token->location);
3698             /* If the lookup was ambiguous, an error will already have
3699                been issued.  */
3700             if (ambiguous_decls)
3701               return error_mark_node;
3702
3703             /* In Objective-C++, we may have an Objective-C 2.0
3704                dot-syntax for classes here.  */
3705             if (c_dialect_objc ()
3706                 && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT
3707                 && TREE_CODE (decl) == TYPE_DECL
3708                 && objc_is_class_name (decl))
3709               {
3710                 tree component;
3711                 cp_lexer_consume_token (parser->lexer);
3712                 component = cp_parser_identifier (parser);
3713                 if (component == error_mark_node)
3714                   return error_mark_node;
3715
3716                 return objc_build_class_component_ref (id_expression, component);
3717               }
3718
3719             /* In Objective-C++, an instance variable (ivar) may be preferred
3720                to whatever cp_parser_lookup_name() found.  */
3721             decl = objc_lookup_ivar (decl, id_expression);
3722
3723             /* If name lookup gives us a SCOPE_REF, then the
3724                qualifying scope was dependent.  */
3725             if (TREE_CODE (decl) == SCOPE_REF)
3726               {
3727                 /* At this point, we do not know if DECL is a valid
3728                    integral constant expression.  We assume that it is
3729                    in fact such an expression, so that code like:
3730
3731                       template <int N> struct A {
3732                         int a[B<N>::i];
3733                       };
3734                      
3735                    is accepted.  At template-instantiation time, we
3736                    will check that B<N>::i is actually a constant.  */
3737                 return decl;
3738               }
3739             /* Check to see if DECL is a local variable in a context
3740                where that is forbidden.  */
3741             if (parser->local_variables_forbidden_p
3742                 && local_variable_p (decl))
3743               {
3744                 /* It might be that we only found DECL because we are
3745                    trying to be generous with pre-ISO scoping rules.
3746                    For example, consider:
3747
3748                      int i;
3749                      void g() {
3750                        for (int i = 0; i < 10; ++i) {}
3751                        extern void f(int j = i);
3752                      }
3753
3754                    Here, name look up will originally find the out
3755                    of scope `i'.  We need to issue a warning message,
3756                    but then use the global `i'.  */
3757                 decl = check_for_out_of_scope_variable (decl);
3758                 if (local_variable_p (decl))
3759                   {
3760                     error_at (id_expr_token->location,
3761                               "local variable %qD may not appear in this context",
3762                               decl);
3763                     return error_mark_node;
3764                   }
3765               }
3766           }
3767
3768         decl = (finish_id_expression
3769                 (id_expression, decl, parser->scope,
3770                  idk,
3771                  parser->integral_constant_expression_p,
3772                  parser->allow_non_integral_constant_expression_p,
3773                  &parser->non_integral_constant_expression_p,
3774                  template_p, done, address_p,
3775                  template_arg_p,
3776                  &error_msg,
3777                  id_expr_token->location));
3778         if (error_msg)
3779           cp_parser_error (parser, error_msg);
3780         return decl;
3781       }
3782
3783       /* Anything else is an error.  */
3784     default:
3785       cp_parser_error (parser, "expected primary-expression");
3786       return error_mark_node;
3787     }
3788 }
3789
3790 /* Parse an id-expression.
3791
3792    id-expression:
3793      unqualified-id
3794      qualified-id
3795
3796    qualified-id:
3797      :: [opt] nested-name-specifier template [opt] unqualified-id
3798      :: identifier
3799      :: operator-function-id
3800      :: template-id
3801
3802    Return a representation of the unqualified portion of the
3803    identifier.  Sets PARSER->SCOPE to the qualifying scope if there is
3804    a `::' or nested-name-specifier.
3805
3806    Often, if the id-expression was a qualified-id, the caller will
3807    want to make a SCOPE_REF to represent the qualified-id.  This
3808    function does not do this in order to avoid wastefully creating
3809    SCOPE_REFs when they are not required.
3810
3811    If TEMPLATE_KEYWORD_P is true, then we have just seen the
3812    `template' keyword.
3813
3814    If CHECK_DEPENDENCY_P is false, then names are looked up inside
3815    uninstantiated templates.
3816
3817    If *TEMPLATE_P is non-NULL, it is set to true iff the
3818    `template' keyword is used to explicitly indicate that the entity
3819    named is a template.
3820
3821    If DECLARATOR_P is true, the id-expression is appearing as part of
3822    a declarator, rather than as part of an expression.  */
3823
3824 static tree
3825 cp_parser_id_expression (cp_parser *parser,
3826                          bool template_keyword_p,
3827                          bool check_dependency_p,
3828                          bool *template_p,
3829                          bool declarator_p,
3830                          bool optional_p)
3831 {
3832   bool global_scope_p;
3833   bool nested_name_specifier_p;
3834
3835   /* Assume the `template' keyword was not used.  */
3836   if (template_p)
3837     *template_p = template_keyword_p;
3838
3839   /* Look for the optional `::' operator.  */
3840   global_scope_p
3841     = (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false)
3842        != NULL_TREE);
3843   /* Look for the optional nested-name-specifier.  */
3844   nested_name_specifier_p
3845     = (cp_parser_nested_name_specifier_opt (parser,
3846                                             /*typename_keyword_p=*/false,
3847                                             check_dependency_p,
3848                                             /*type_p=*/false,
3849                                             declarator_p)
3850        != NULL_TREE);
3851   /* If there is a nested-name-specifier, then we are looking at
3852      the first qualified-id production.  */
3853   if (nested_name_specifier_p)
3854     {
3855       tree saved_scope;
3856       tree saved_object_scope;
3857       tree saved_qualifying_scope;
3858       tree unqualified_id;
3859       bool is_template;
3860
3861       /* See if the next token is the `template' keyword.  */
3862       if (!template_p)
3863         template_p = &is_template;
3864       *template_p = cp_parser_optional_template_keyword (parser);
3865       /* Name lookup we do during the processing of the
3866          unqualified-id might obliterate SCOPE.  */
3867       saved_scope = parser->scope;
3868       saved_object_scope = parser->object_scope;
3869       saved_qualifying_scope = parser->qualifying_scope;
3870       /* Process the final unqualified-id.  */
3871       unqualified_id = cp_parser_unqualified_id (parser, *template_p,
3872                                                  check_dependency_p,
3873                                                  declarator_p,
3874                                                  /*optional_p=*/false);
3875       /* Restore the SAVED_SCOPE for our caller.  */
3876       parser->scope = saved_scope;
3877       parser->object_scope = saved_object_scope;
3878       parser->qualifying_scope = saved_qualifying_scope;
3879
3880       return unqualified_id;
3881     }
3882   /* Otherwise, if we are in global scope, then we are looking at one
3883      of the other qualified-id productions.  */
3884   else if (global_scope_p)
3885     {
3886       cp_token *token;
3887       tree id;
3888
3889       /* Peek at the next token.  */
3890       token = cp_lexer_peek_token (parser->lexer);
3891
3892       /* If it's an identifier, and the next token is not a "<", then
3893          we can avoid the template-id case.  This is an optimization
3894          for this common case.  */
3895       if (token->type == CPP_NAME
3896           && !cp_parser_nth_token_starts_template_argument_list_p
3897                (parser, 2))
3898         return cp_parser_identifier (parser);
3899
3900       cp_parser_parse_tentatively (parser);
3901       /* Try a template-id.  */
3902       id = cp_parser_template_id (parser,
3903                                   /*template_keyword_p=*/false,
3904                                   /*check_dependency_p=*/true,
3905                                   declarator_p);
3906       /* If that worked, we're done.  */
3907       if (cp_parser_parse_definitely (parser))
3908         return id;
3909
3910       /* Peek at the next token.  (Changes in the token buffer may
3911          have invalidated the pointer obtained above.)  */
3912       token = cp_lexer_peek_token (parser->lexer);
3913
3914       switch (token->type)
3915         {
3916         case CPP_NAME:
3917           return cp_parser_identifier (parser);
3918
3919         case CPP_KEYWORD:
3920           if (token->keyword == RID_OPERATOR)
3921             return cp_parser_operator_function_id (parser);
3922           /* Fall through.  */
3923
3924         default:
3925           cp_parser_error (parser, "expected id-expression");
3926           return error_mark_node;
3927         }
3928     }
3929   else
3930     return cp_parser_unqualified_id (parser, template_keyword_p,
3931                                      /*check_dependency_p=*/true,
3932                                      declarator_p,
3933                                      optional_p);
3934 }
3935
3936 /* Parse an unqualified-id.
3937
3938    unqualified-id:
3939      identifier
3940      operator-function-id
3941      conversion-function-id
3942      ~ class-name
3943      template-id
3944
3945    If TEMPLATE_KEYWORD_P is TRUE, we have just seen the `template'
3946    keyword, in a construct like `A::template ...'.
3947
3948    Returns a representation of unqualified-id.  For the `identifier'
3949    production, an IDENTIFIER_NODE is returned.  For the `~ class-name'
3950    production a BIT_NOT_EXPR is returned; the operand of the
3951    BIT_NOT_EXPR is an IDENTIFIER_NODE for the class-name.  For the
3952    other productions, see the documentation accompanying the
3953    corresponding parsing functions.  If CHECK_DEPENDENCY_P is false,
3954    names are looked up in uninstantiated templates.  If DECLARATOR_P
3955    is true, the unqualified-id is appearing as part of a declarator,
3956    rather than as part of an expression.  */
3957
3958 static tree
3959 cp_parser_unqualified_id (cp_parser* parser,
3960                           bool template_keyword_p,
3961                           bool check_dependency_p,
3962                           bool declarator_p,
3963                           bool optional_p)
3964 {
3965   cp_token *token;
3966
3967   /* Peek at the next token.  */
3968   token = cp_lexer_peek_token (parser->lexer);
3969
3970   switch (token->type)
3971     {
3972     case CPP_NAME:
3973       {
3974         tree id;
3975
3976         /* We don't know yet whether or not this will be a
3977            template-id.  */
3978         cp_parser_parse_tentatively (parser);
3979         /* Try a template-id.  */
3980         id = cp_parser_template_id (parser, template_keyword_p,
3981                                     check_dependency_p,
3982                                     declarator_p);
3983         /* If it worked, we're done.  */
3984         if (cp_parser_parse_definitely (parser))
3985           return id;
3986         /* Otherwise, it's an ordinary identifier.  */
3987         return cp_parser_identifier (parser);
3988       }
3989
3990     case CPP_TEMPLATE_ID:
3991       return cp_parser_template_id (parser, template_keyword_p,
3992                                     check_dependency_p,
3993                                     declarator_p);
3994
3995     case CPP_COMPL:
3996       {
3997         tree type_decl;
3998         tree qualifying_scope;
3999         tree object_scope;
4000         tree scope;
4001         bool done;
4002
4003         /* Consume the `~' token.  */
4004         cp_lexer_consume_token (parser->lexer);
4005         /* Parse the class-name.  The standard, as written, seems to
4006            say that:
4007
4008              template <typename T> struct S { ~S (); };
4009              template <typename T> S<T>::~S() {}
4010
4011            is invalid, since `~' must be followed by a class-name, but
4012            `S<T>' is dependent, and so not known to be a class.
4013            That's not right; we need to look in uninstantiated
4014            templates.  A further complication arises from:
4015
4016              template <typename T> void f(T t) {
4017                t.T::~T();
4018              }
4019
4020            Here, it is not possible to look up `T' in the scope of `T'
4021            itself.  We must look in both the current scope, and the
4022            scope of the containing complete expression.
4023
4024            Yet another issue is:
4025
4026              struct S {
4027                int S;
4028                ~S();
4029              };
4030
4031              S::~S() {}
4032
4033            The standard does not seem to say that the `S' in `~S'
4034            should refer to the type `S' and not the data member
4035            `S::S'.  */
4036
4037         /* DR 244 says that we look up the name after the "~" in the
4038            same scope as we looked up the qualifying name.  That idea
4039            isn't fully worked out; it's more complicated than that.  */
4040         scope = parser->scope;
4041         object_scope = parser->object_scope;
4042         qualifying_scope = parser->qualifying_scope;
4043
4044         /* Check for invalid scopes.  */
4045         if (scope == error_mark_node)
4046           {
4047             if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
4048               cp_lexer_consume_token (parser->lexer);
4049             return error_mark_node;
4050           }
4051         if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
4052           {
4053             if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4054               error_at (token->location,
4055                         "scope %qT before %<~%> is not a class-name",
4056                         scope);
4057             cp_parser_simulate_error (parser);
4058             if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
4059               cp_lexer_consume_token (parser->lexer);
4060             return error_mark_node;
4061           }
4062         gcc_assert (!scope || TYPE_P (scope));
4063
4064         /* If the name is of the form "X::~X" it's OK even if X is a
4065            typedef.  */
4066         token = cp_lexer_peek_token (parser->lexer);
4067         if (scope
4068             && token->type == CPP_NAME
4069             && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4070                 != CPP_LESS)
4071             && (token->u.value == TYPE_IDENTIFIER (scope)
4072                 || (CLASS_TYPE_P (scope)
4073                     && constructor_name_p (token->u.value, scope))))
4074           {
4075             cp_lexer_consume_token (parser->lexer);
4076             return build_nt (BIT_NOT_EXPR, scope);
4077           }
4078
4079         /* If there was an explicit qualification (S::~T), first look
4080            in the scope given by the qualification (i.e., S).
4081
4082            Note: in the calls to cp_parser_class_name below we pass
4083            typename_type so that lookup finds the injected-class-name
4084            rather than the constructor.  */
4085         done = false;
4086         type_decl = NULL_TREE;
4087         if (scope)
4088           {
4089             cp_parser_parse_tentatively (parser);
4090             type_decl = cp_parser_class_name (parser,
4091                                               /*typename_keyword_p=*/false,
4092                                               /*template_keyword_p=*/false,
4093                                               typename_type,
4094                                               /*check_dependency=*/false,
4095                                               /*class_head_p=*/false,
4096                                               declarator_p);
4097             if (cp_parser_parse_definitely (parser))
4098               done = true;
4099           }
4100         /* In "N::S::~S", look in "N" as well.  */
4101         if (!done && scope && qualifying_scope)
4102           {
4103             cp_parser_parse_tentatively (parser);
4104             parser->scope = qualifying_scope;
4105             parser->object_scope = NULL_TREE;
4106             parser->qualifying_scope = NULL_TREE;
4107             type_decl
4108               = cp_parser_class_name (parser,
4109                                       /*typename_keyword_p=*/false,
4110                                       /*template_keyword_p=*/false,
4111                                       typename_type,
4112                                       /*check_dependency=*/false,
4113                                       /*class_head_p=*/false,
4114                                       declarator_p);
4115             if (cp_parser_parse_definitely (parser))
4116               done = true;
4117           }
4118         /* In "p->S::~T", look in the scope given by "*p" as well.  */
4119         else if (!done && object_scope)
4120           {
4121             cp_parser_parse_tentatively (parser);
4122             parser->scope = object_scope;
4123             parser->object_scope = NULL_TREE;
4124             parser->qualifying_scope = NULL_TREE;
4125             type_decl
4126               = cp_parser_class_name (parser,
4127                                       /*typename_keyword_p=*/false,
4128                                       /*template_keyword_p=*/false,
4129                                       typename_type,
4130                                       /*check_dependency=*/false,
4131                                       /*class_head_p=*/false,
4132                                       declarator_p);
4133             if (cp_parser_parse_definitely (parser))
4134               done = true;
4135           }
4136         /* Look in the surrounding context.  */
4137         if (!done)
4138           {
4139             parser->scope = NULL_TREE;
4140             parser->object_scope = NULL_TREE;
4141             parser->qualifying_scope = NULL_TREE;
4142             if (processing_template_decl)
4143               cp_parser_parse_tentatively (parser);
4144             type_decl
4145               = cp_parser_class_name (parser,
4146                                       /*typename_keyword_p=*/false,
4147                                       /*template_keyword_p=*/false,
4148                                       typename_type,
4149                                       /*check_dependency=*/false,
4150                                       /*class_head_p=*/false,
4151                                       declarator_p);
4152             if (processing_template_decl
4153                 && ! cp_parser_parse_definitely (parser))
4154               {
4155                 /* We couldn't find a type with this name, so just accept
4156                    it and check for a match at instantiation time.  */
4157                 type_decl = cp_parser_identifier (parser);
4158                 if (type_decl != error_mark_node)
4159                   type_decl = build_nt (BIT_NOT_EXPR, type_decl);
4160                 return type_decl;
4161               }
4162           }
4163         /* If an error occurred, assume that the name of the
4164            destructor is the same as the name of the qualifying
4165            class.  That allows us to keep parsing after running
4166            into ill-formed destructor names.  */
4167         if (type_decl == error_mark_node && scope)
4168           return build_nt (BIT_NOT_EXPR, scope);
4169         else if (type_decl == error_mark_node)
4170           return error_mark_node;
4171
4172         /* Check that destructor name and scope match.  */
4173         if (declarator_p && scope && !check_dtor_name (scope, type_decl))
4174           {
4175             if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
4176               error_at (token->location,
4177                         "declaration of %<~%T%> as member of %qT",
4178                         type_decl, scope);
4179             cp_parser_simulate_error (parser);
4180             return error_mark_node;
4181           }
4182
4183         /* [class.dtor]
4184
4185            A typedef-name that names a class shall not be used as the
4186            identifier in the declarator for a destructor declaration.  */
4187         if (declarator_p
4188             && !DECL_IMPLICIT_TYPEDEF_P (type_decl)
4189             && !DECL_SELF_REFERENCE_P (type_decl)
4190             && !cp_parser_uncommitted_to_tentative_parse_p (parser))
4191           error_at (token->location,
4192                     "typedef-name %qD used as destructor declarator",
4193                     type_decl);
4194
4195         return build_nt (BIT_NOT_EXPR, TREE_TYPE (type_decl));
4196       }
4197
4198     case CPP_KEYWORD:
4199       if (token->keyword == RID_OPERATOR)
4200         {
4201           tree id;
4202
4203           /* This could be a template-id, so we try that first.  */
4204           cp_parser_parse_tentatively (parser);
4205           /* Try a template-id.  */
4206           id = cp_parser_template_id (parser, template_keyword_p,
4207                                       /*check_dependency_p=*/true,
4208                                       declarator_p);
4209           /* If that worked, we're done.  */
4210           if (cp_parser_parse_definitely (parser))
4211             return id;
4212           /* We still don't know whether we're looking at an
4213              operator-function-id or a conversion-function-id.  */
4214           cp_parser_parse_tentatively (parser);
4215           /* Try an operator-function-id.  */
4216           id = cp_parser_operator_function_id (parser);
4217           /* If that didn't work, try a conversion-function-id.  */
4218           if (!cp_parser_parse_definitely (parser))
4219             id = cp_parser_conversion_function_id (parser);
4220
4221           return id;
4222         }
4223       /* Fall through.  */
4224
4225     default:
4226       if (optional_p)
4227         return NULL_TREE;
4228       cp_parser_error (parser, "expected unqualified-id");
4229       return error_mark_node;
4230     }
4231 }
4232
4233 /* Parse an (optional) nested-name-specifier.
4234
4235    nested-name-specifier: [C++98]
4236      class-or-namespace-name :: nested-name-specifier [opt]
4237      class-or-namespace-name :: template nested-name-specifier [opt]
4238
4239    nested-name-specifier: [C++0x]
4240      type-name ::
4241      namespace-name ::
4242      nested-name-specifier identifier ::
4243      nested-name-specifier template [opt] simple-template-id ::
4244
4245    PARSER->SCOPE should be set appropriately before this function is
4246    called.  TYPENAME_KEYWORD_P is TRUE if the `typename' keyword is in
4247    effect.  TYPE_P is TRUE if we non-type bindings should be ignored
4248    in name lookups.
4249
4250    Sets PARSER->SCOPE to the class (TYPE) or namespace
4251    (NAMESPACE_DECL) specified by the nested-name-specifier, or leaves
4252    it unchanged if there is no nested-name-specifier.  Returns the new
4253    scope iff there is a nested-name-specifier, or NULL_TREE otherwise.
4254
4255    If IS_DECLARATION is TRUE, the nested-name-specifier is known to be
4256    part of a declaration and/or decl-specifier.  */
4257
4258 static tree
4259 cp_parser_nested_name_specifier_opt (cp_parser *parser,
4260                                      bool typename_keyword_p,
4261                                      bool check_dependency_p,
4262                                      bool type_p,
4263                                      bool is_declaration)
4264 {
4265   bool success = false;
4266   cp_token_position start = 0;
4267   cp_token *token;
4268
4269   /* Remember where the nested-name-specifier starts.  */
4270   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
4271     {
4272       start = cp_lexer_token_position (parser->lexer, false);
4273       push_deferring_access_checks (dk_deferred);
4274     }
4275
4276   while (true)
4277     {
4278       tree new_scope;
4279       tree old_scope;
4280       tree saved_qualifying_scope;
4281       bool template_keyword_p;
4282
4283       /* Spot cases that cannot be the beginning of a
4284          nested-name-specifier.  */
4285       token = cp_lexer_peek_token (parser->lexer);
4286
4287       /* If the next token is CPP_NESTED_NAME_SPECIFIER, just process
4288          the already parsed nested-name-specifier.  */
4289       if (token->type == CPP_NESTED_NAME_SPECIFIER)
4290         {
4291           /* Grab the nested-name-specifier and continue the loop.  */
4292           cp_parser_pre_parsed_nested_name_specifier (parser);
4293           /* If we originally encountered this nested-name-specifier
4294              with IS_DECLARATION set to false, we will not have
4295              resolved TYPENAME_TYPEs, so we must do so here.  */
4296           if (is_declaration
4297               && TREE_CODE (parser->scope) == TYPENAME_TYPE)
4298             {
4299               new_scope = resolve_typename_type (parser->scope,
4300                                                  /*only_current_p=*/false);
4301               if (TREE_CODE (new_scope) != TYPENAME_TYPE)
4302                 parser->scope = new_scope;
4303             }
4304           success = true;
4305           continue;
4306         }
4307
4308       /* Spot cases that cannot be the beginning of a
4309          nested-name-specifier.  On the second and subsequent times
4310          through the loop, we look for the `template' keyword.  */
4311       if (success && token->keyword == RID_TEMPLATE)
4312         ;
4313       /* A template-id can start a nested-name-specifier.  */
4314       else if (token->type == CPP_TEMPLATE_ID)
4315         ;
4316       else
4317         {
4318           /* If the next token is not an identifier, then it is
4319              definitely not a type-name or namespace-name.  */
4320           if (token->type != CPP_NAME)
4321             break;
4322           /* If the following token is neither a `<' (to begin a
4323              template-id), nor a `::', then we are not looking at a
4324              nested-name-specifier.  */
4325           token = cp_lexer_peek_nth_token (parser->lexer, 2);
4326
4327           if (token->type == CPP_COLON
4328               && parser->colon_corrects_to_scope_p
4329               && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME)
4330             {
4331               error_at (token->location,
4332                         "found %<:%> in nested-name-specifier, expected %<::%>");
4333               token->type = CPP_SCOPE;
4334             }
4335
4336           if (token->type != CPP_SCOPE
4337               && !cp_parser_nth_token_starts_template_argument_list_p
4338                   (parser, 2))
4339             break;
4340         }
4341
4342       /* The nested-name-specifier is optional, so we parse
4343          tentatively.  */
4344       cp_parser_parse_tentatively (parser);
4345
4346       /* Look for the optional `template' keyword, if this isn't the
4347          first time through the loop.  */
4348       if (success)
4349         template_keyword_p = cp_parser_optional_template_keyword (parser);
4350       else
4351         template_keyword_p = false;
4352
4353       /* Save the old scope since the name lookup we are about to do
4354          might destroy it.  */
4355       old_scope = parser->scope;
4356       saved_qualifying_scope = parser->qualifying_scope;
4357       /* In a declarator-id like "X<T>::I::Y<T>" we must be able to
4358          look up names in "X<T>::I" in order to determine that "Y" is
4359          a template.  So, if we have a typename at this point, we make
4360          an effort to look through it.  */
4361       if (is_declaration
4362           && !typename_keyword_p
4363           && parser->scope
4364           && TREE_CODE (parser->scope) == TYPENAME_TYPE)
4365         parser->scope = resolve_typename_type (parser->scope,
4366                                                /*only_current_p=*/false);
4367       /* Parse the qualifying entity.  */
4368       new_scope
4369         = cp_parser_qualifying_entity (parser,
4370                                        typename_keyword_p,
4371                                        template_keyword_p,
4372                                        check_dependency_p,
4373                                        type_p,
4374                                        is_declaration);
4375       /* Look for the `::' token.  */
4376       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
4377
4378       /* If we found what we wanted, we keep going; otherwise, we're
4379          done.  */
4380       if (!cp_parser_parse_definitely (parser))
4381         {
4382           bool error_p = false;
4383
4384           /* Restore the OLD_SCOPE since it was valid before the
4385              failed attempt at finding the last
4386              class-or-namespace-name.  */
4387           parser->scope = old_scope;
4388           parser->qualifying_scope = saved_qualifying_scope;
4389           if (cp_parser_uncommitted_to_tentative_parse_p (parser))
4390             break;
4391           /* If the next token is an identifier, and the one after
4392              that is a `::', then any valid interpretation would have
4393              found a class-or-namespace-name.  */
4394           while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)
4395                  && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
4396                      == CPP_SCOPE)
4397                  && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
4398                      != CPP_COMPL))
4399             {
4400               token = cp_lexer_consume_token (parser->lexer);
4401               if (!error_p)
4402                 {
4403                   if (!token->ambiguous_p)
4404                     {
4405                       tree decl;
4406                       tree ambiguous_decls;
4407
4408                       decl = cp_parser_lookup_name (parser, token->u.value,
4409                                                     none_type,
4410                                                     /*is_template=*/false,
4411                                                     /*is_namespace=*/false,
4412                                                     /*check_dependency=*/true,
4413                                                     &ambiguous_decls,
4414                                                     token->location);
4415                       if (TREE_CODE (decl) == TEMPLATE_DECL)
4416                         error_at (token->location,
4417                                   "%qD used without template parameters",
4418                                   decl);
4419                       else if (ambiguous_decls)
4420                         {
4421                           error_at (token->location,
4422                                     "reference to %qD is ambiguous",
4423                                     token->u.value);
4424                           print_candidates (ambiguous_decls);
4425                           decl = error_mark_node;
4426                         }
4427                       else
4428                         {
4429                           if (cxx_dialect != cxx98)
4430                             cp_parser_name_lookup_error
4431                             (parser, token->u.value, decl, NLE_NOT_CXX98,
4432                              token->location);
4433                           else
4434                             cp_parser_name_lookup_error
4435                             (parser, token->u.value, decl, NLE_CXX98,
4436                              token->location);
4437                         }
4438                     }
4439                   parser->scope = error_mark_node;
4440                   error_p = true;
4441                   /* Treat this as a successful nested-name-specifier
4442                      due to:
4443
4444                      [basic.lookup.qual]
4445
4446                      If the name found is not a class-name (clause
4447                      _class_) or namespace-name (_namespace.def_), the
4448                      program is ill-formed.  */
4449                   success = true;
4450                 }
4451               cp_lexer_consume_token (parser->lexer);
4452             }
4453           break;
4454         }
4455       /* We've found one valid nested-name-specifier.  */
4456       success = true;
4457       /* Name lookup always gives us a DECL.  */
4458       if (TREE_CODE (new_scope) == TYPE_DECL)
4459         new_scope = TREE_TYPE (new_scope);
4460       /* Uses of "template" must be followed by actual templates.  */
4461       if (template_keyword_p
4462           && !(CLASS_TYPE_P (new_scope)
4463                && ((CLASSTYPE_USE_TEMPLATE (new_scope)
4464                     && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (new_scope)))
4465                    || CLASSTYPE_IS_TEMPLATE (new_scope)))
4466           && !(TREE_CODE (new_scope) == TYPENAME_TYPE
4467                && (TREE_CODE (TYPENAME_TYPE_FULLNAME (new_scope))
4468                    == TEMPLATE_ID_EXPR)))
4469         permerror (input_location, TYPE_P (new_scope)
4470                    ? "%qT is not a template"
4471                    : "%qD is not a template",
4472                    new_scope);
4473       /* If it is a class scope, try to complete it; we are about to
4474          be looking up names inside the class.  */
4475       if (TYPE_P (new_scope)
4476           /* Since checking types for dependency can be expensive,
4477              avoid doing it if the type is already complete.  */
4478           && !COMPLETE_TYPE_P (new_scope)
4479           /* Do not try to complete dependent types.  */
4480           && !dependent_type_p (new_scope))
4481         {
4482           new_scope = complete_type (new_scope);
4483           /* If it is a typedef to current class, use the current
4484              class instead, as the typedef won't have any names inside
4485              it yet.  */
4486           if (!COMPLETE_TYPE_P (new_scope)
4487               && currently_open_class (new_scope))
4488             new_scope = TYPE_MAIN_VARIANT (new_scope);
4489         }
4490       /* Make sure we look in the right scope the next time through
4491          the loop.  */
4492       parser->scope = new_scope;
4493     }
4494
4495   /* If parsing tentatively, replace the sequence of tokens that makes
4496      up the nested-name-specifier with a CPP_NESTED_NAME_SPECIFIER
4497      token.  That way, should we re-parse the token stream, we will
4498      not have to repeat the effort required to do the parse, nor will
4499      we issue duplicate error messages.  */
4500   if (success && start)
4501     {
4502       cp_token *token;
4503
4504       token = cp_lexer_token_at (parser->lexer, start);
4505       /* Reset the contents of the START token.  */
4506       token->type = CPP_NESTED_NAME_SPECIFIER;
4507       /* Retrieve any deferred checks.  Do not pop this access checks yet
4508          so the memory will not be reclaimed during token replacing below.  */
4509       token->u.tree_check_value = ggc_alloc_cleared_tree_check ();
4510       token->u.tree_check_value->value = parser->scope;
4511       token->u.tree_check_value->checks = get_deferred_access_checks ();
4512       token->u.tree_check_value->qualifying_scope =
4513         parser->qualifying_scope;
4514       token->keyword = RID_MAX;
4515
4516       /* Purge all subsequent tokens.  */
4517       cp_lexer_purge_tokens_after (parser->lexer, start);
4518     }
4519
4520   if (start)
4521     pop_to_parent_deferring_access_checks ();
4522
4523   return success ? parser->scope : NULL_TREE;
4524 }
4525
4526 /* Parse a nested-name-specifier.  See
4527    cp_parser_nested_name_specifier_opt for details.  This function
4528    behaves identically, except that it will an issue an error if no
4529    nested-name-specifier is present.  */
4530
4531 static tree
4532 cp_parser_nested_name_specifier (cp_parser *parser,
4533                                  bool typename_keyword_p,
4534                                  bool check_dependency_p,
4535                                  bool type_p,
4536                                  bool is_declaration)
4537 {
4538   tree scope;
4539
4540   /* Look for the nested-name-specifier.  */
4541   scope = cp_parser_nested_name_specifier_opt (parser,
4542                                                typename_keyword_p,
4543                                                check_dependency_p,
4544                                                type_p,
4545                                                is_declaration);
4546   /* If it was not present, issue an error message.  */
4547   if (!scope)
4548     {
4549       cp_parser_error (parser, "expected nested-name-specifier");
4550       parser->scope = NULL_TREE;
4551     }
4552
4553   return scope;
4554 }
4555
4556 /* Parse the qualifying entity in a nested-name-specifier. For C++98,
4557    this is either a class-name or a namespace-name (which corresponds
4558    to the class-or-namespace-name production in the grammar). For
4559    C++0x, it can also be a type-name that refers to an enumeration
4560    type.
4561
4562    TYPENAME_KEYWORD_P is TRUE iff the `typename' keyword is in effect.
4563    TEMPLATE_KEYWORD_P is TRUE iff the `template' keyword is in effect.
4564    CHECK_DEPENDENCY_P is FALSE iff dependent names should be looked up.
4565    TYPE_P is TRUE iff the next name should be taken as a class-name,
4566    even the same name is declared to be another entity in the same
4567    scope.
4568
4569    Returns the class (TYPE_DECL) or namespace (NAMESPACE_DECL)
4570    specified by the class-or-namespace-name.  If neither is found the
4571    ERROR_MARK_NODE is returned.  */
4572
4573 static tree
4574 cp_parser_qualifying_entity (cp_parser *parser,
4575                              bool typename_keyword_p,
4576                              bool template_keyword_p,
4577                              bool check_dependency_p,
4578                              bool type_p,
4579                              bool is_declaration)
4580 {
4581   tree saved_scope;
4582   tree saved_qualifying_scope;
4583   tree saved_object_scope;
4584   tree scope;
4585   bool only_class_p;
4586   bool successful_parse_p;
4587
4588   /* Before we try to parse the class-name, we must save away the
4589      current PARSER->SCOPE since cp_parser_class_name will destroy
4590      it.  */
4591   saved_scope = parser->scope;
4592   saved_qualifying_scope = parser->qualifying_scope;
4593   saved_object_scope = parser->object_scope;
4594   /* Try for a class-name first.  If the SAVED_SCOPE is a type, then
4595      there is no need to look for a namespace-name.  */
4596   only_class_p = template_keyword_p 
4597     || (saved_scope && TYPE_P (saved_scope) && cxx_dialect == cxx98);
4598   if (!only_class_p)
4599     cp_parser_parse_tentatively (parser);
4600   scope = cp_parser_class_name (parser,
4601                                 typename_keyword_p,
4602                                 template_keyword_p,
4603                                 type_p ? class_type : none_type,
4604                                 check_dependency_p,
4605                                 /*class_head_p=*/false,
4606                                 is_declaration);
4607   successful_parse_p = only_class_p || cp_parser_parse_definitely (parser);
4608   /* If that didn't work and we're in C++0x mode, try for a type-name.  */
4609   if (!only_class_p 
4610       && cxx_dialect != cxx98
4611       && !successful_parse_p)
4612     {
4613       /* Restore the saved scope.  */
4614       parser->scope = saved_scope;
4615       parser->qualifying_scope = saved_qualifying_scope;
4616       parser->object_scope = saved_object_scope;
4617
4618       /* Parse tentatively.  */
4619       cp_parser_parse_tentatively (parser);
4620      
4621       /* Parse a typedef-name or enum-name.  */
4622       scope = cp_parser_nonclass_name (parser);
4623
4624       /* "If the name found does not designate a namespace or a class,
4625          enumeration, or dependent type, the program is ill-formed."
4626
4627          We cover classes and dependent types above and namespaces below,
4628          so this code is only looking for enums.  */
4629       if (!scope || TREE_CODE (scope) != TYPE_DECL
4630           || TREE_CODE (TREE_TYPE (scope)) != ENUMERAL_TYPE)
4631         cp_parser_simulate_error (parser);
4632
4633       successful_parse_p = cp_parser_parse_definitely (parser);
4634     }
4635   /* If that didn't work, try for a namespace-name.  */
4636   if (!only_class_p && !successful_parse_p)
4637     {
4638       /* Restore the saved scope.  */
4639       parser->scope = saved_scope;
4640       parser->qualifying_scope = saved_qualifying_scope;
4641       parser->object_scope = saved_object_scope;
4642       /* If we are not looking at an identifier followed by the scope
4643          resolution operator, then this is not part of a
4644          nested-name-specifier.  (Note that this function is only used
4645          to parse the components of a nested-name-specifier.)  */
4646       if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME)
4647           || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE)
4648         return error_mark_node;
4649       scope = cp_parser_namespace_name (parser);
4650     }
4651
4652   return scope;
4653 }
4654
4655 /* Parse a postfix-expression.
4656
4657    postfix-expression:
4658      primary-expression
4659      postfix-expression [ expression ]
4660      postfix-expression ( expression-list [opt] )
4661      simple-type-specifier ( expression-list [opt] )
4662      typename :: [opt] nested-name-specifier identifier
4663        ( expression-list [opt] )
4664      typename :: [opt] nested-name-specifier template [opt] template-id
4665        ( expression-list [opt] )
4666      postfix-expression . template [opt] id-expression
4667      postfix-expression -> template [opt] id-expression
4668      postfix-expression . pseudo-destructor-name
4669      postfix-expression -> pseudo-destructor-name
4670      postfix-expression ++
4671      postfix-expression --
4672      dynamic_cast < type-id > ( expression )
4673      static_cast < type-id > ( expression )
4674      reinterpret_cast < type-id > ( expression )
4675      const_cast < type-id > ( expression )
4676      typeid ( expression )
4677      typeid ( type-id )
4678
4679    GNU Extension:
4680
4681    postfix-expression:
4682      ( type-id ) { initializer-list , [opt] }
4683
4684    This extension is a GNU version of the C99 compound-literal
4685    construct.  (The C99 grammar uses `type-name' instead of `type-id',
4686    but they are essentially the same concept.)
4687
4688    If ADDRESS_P is true, the postfix expression is the operand of the
4689    `&' operator.  CAST_P is true if this expression is the target of a
4690    cast.
4691
4692    If MEMBER_ACCESS_ONLY_P, we only allow postfix expressions that are
4693    class member access expressions [expr.ref].
4694
4695    Returns a representation of the expression.  */
4696
4697 static tree
4698 cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
4699                               bool member_access_only_p,
4700                               cp_id_kind * pidk_return)
4701 {
4702   cp_token *token;
4703   enum rid keyword;
4704   cp_id_kind idk = CP_ID_KIND_NONE;
4705   tree postfix_expression = NULL_TREE;
4706   bool is_member_access = false;
4707
4708   /* Peek at the next token.  */
4709   token = cp_lexer_peek_token (parser->lexer);
4710   /* Some of the productions are determined by keywords.  */
4711   keyword = token->keyword;
4712   switch (keyword)
4713     {
4714     case RID_DYNCAST:
4715     case RID_STATCAST:
4716     case RID_REINTCAST:
4717     case RID_CONSTCAST:
4718       {
4719         tree type;
4720         tree expression;
4721         const char *saved_message;
4722
4723         /* All of these can be handled in the same way from the point
4724            of view of parsing.  Begin by consuming the token
4725            identifying the cast.  */
4726         cp_lexer_consume_token (parser->lexer);
4727
4728         /* New types cannot be defined in the cast.  */
4729         saved_message = parser->type_definition_forbidden_message;
4730         parser->type_definition_forbidden_message
4731           = G_("types may not be defined in casts");
4732
4733         /* Look for the opening `<'.  */
4734         cp_parser_require (parser, CPP_LESS, RT_LESS);
4735         /* Parse the type to which we are casting.  */
4736         type = cp_parser_type_id (parser);
4737         /* Look for the closing `>'.  */
4738         cp_parser_require (parser, CPP_GREATER, RT_GREATER);
4739         /* Restore the old message.  */
4740         parser->type_definition_forbidden_message = saved_message;
4741
4742         /* And the expression which is being cast.  */
4743         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
4744         expression = cp_parser_expression (parser, /*cast_p=*/true, & idk);
4745         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4746
4747         /* Only type conversions to integral or enumeration types
4748            can be used in constant-expressions.  */
4749         if (!cast_valid_in_integral_constant_expression_p (type)
4750             && cp_parser_non_integral_constant_expression (parser, NIC_CAST))
4751           return error_mark_node;
4752
4753         switch (keyword)
4754           {
4755           case RID_DYNCAST:
4756             postfix_expression
4757               = build_dynamic_cast (type, expression, tf_warning_or_error);
4758             break;
4759           case RID_STATCAST:
4760             postfix_expression
4761               = build_static_cast (type, expression, tf_warning_or_error);
4762             break;
4763           case RID_REINTCAST:
4764             postfix_expression
4765               = build_reinterpret_cast (type, expression, 
4766                                         tf_warning_or_error);
4767             break;
4768           case RID_CONSTCAST:
4769             postfix_expression
4770               = build_const_cast (type, expression, tf_warning_or_error);
4771             break;
4772           default:
4773             gcc_unreachable ();
4774           }
4775       }
4776       break;
4777
4778     case RID_TYPEID:
4779       {
4780         tree type;
4781         const char *saved_message;
4782         bool saved_in_type_id_in_expr_p;
4783
4784         /* Consume the `typeid' token.  */
4785         cp_lexer_consume_token (parser->lexer);
4786         /* Look for the `(' token.  */
4787         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
4788         /* Types cannot be defined in a `typeid' expression.  */
4789         saved_message = parser->type_definition_forbidden_message;
4790         parser->type_definition_forbidden_message
4791           = G_("types may not be defined in a %<typeid%> expression");
4792         /* We can't be sure yet whether we're looking at a type-id or an
4793            expression.  */
4794         cp_parser_parse_tentatively (parser);
4795         /* Try a type-id first.  */
4796         saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
4797         parser->in_type_id_in_expr_p = true;
4798         type = cp_parser_type_id (parser);
4799         parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
4800         /* Look for the `)' token.  Otherwise, we can't be sure that
4801            we're not looking at an expression: consider `typeid (int
4802            (3))', for example.  */
4803         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4804         /* If all went well, simply lookup the type-id.  */
4805         if (cp_parser_parse_definitely (parser))
4806           postfix_expression = get_typeid (type);
4807         /* Otherwise, fall back to the expression variant.  */
4808         else
4809           {
4810             tree expression;
4811
4812             /* Look for an expression.  */
4813             expression = cp_parser_expression (parser, /*cast_p=*/false, & idk);
4814             /* Compute its typeid.  */
4815             postfix_expression = build_typeid (expression);
4816             /* Look for the `)' token.  */
4817             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4818           }
4819         /* Restore the saved message.  */
4820         parser->type_definition_forbidden_message = saved_message;
4821         /* `typeid' may not appear in an integral constant expression.  */
4822         if (cp_parser_non_integral_constant_expression(parser, NIC_TYPEID))
4823           return error_mark_node;
4824       }
4825       break;
4826
4827     case RID_TYPENAME:
4828       {
4829         tree type;
4830         /* The syntax permitted here is the same permitted for an
4831            elaborated-type-specifier.  */
4832         type = cp_parser_elaborated_type_specifier (parser,
4833                                                     /*is_friend=*/false,
4834                                                     /*is_declaration=*/false);
4835         postfix_expression = cp_parser_functional_cast (parser, type);
4836       }
4837       break;
4838
4839     default:
4840       {
4841         tree type;
4842
4843         /* If the next thing is a simple-type-specifier, we may be
4844            looking at a functional cast.  We could also be looking at
4845            an id-expression.  So, we try the functional cast, and if
4846            that doesn't work we fall back to the primary-expression.  */
4847         cp_parser_parse_tentatively (parser);
4848         /* Look for the simple-type-specifier.  */
4849         type = cp_parser_simple_type_specifier (parser,
4850                                                 /*decl_specs=*/NULL,
4851                                                 CP_PARSER_FLAGS_NONE);
4852         /* Parse the cast itself.  */
4853         if (!cp_parser_error_occurred (parser))
4854           postfix_expression
4855             = cp_parser_functional_cast (parser, type);
4856         /* If that worked, we're done.  */
4857         if (cp_parser_parse_definitely (parser))
4858           break;
4859
4860         /* If the functional-cast didn't work out, try a
4861            compound-literal.  */
4862         if (cp_parser_allow_gnu_extensions_p (parser)
4863             && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
4864           {
4865             VEC(constructor_elt,gc) *initializer_list = NULL;
4866             bool saved_in_type_id_in_expr_p;
4867
4868             cp_parser_parse_tentatively (parser);
4869             /* Consume the `('.  */
4870             cp_lexer_consume_token (parser->lexer);
4871             /* Parse the type.  */
4872             saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
4873             parser->in_type_id_in_expr_p = true;
4874             type = cp_parser_type_id (parser);
4875             parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
4876             /* Look for the `)'.  */
4877             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
4878             /* Look for the `{'.  */
4879             cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
4880             /* If things aren't going well, there's no need to
4881                keep going.  */
4882             if (!cp_parser_error_occurred (parser))
4883               {
4884                 bool non_constant_p;
4885                 /* Parse the initializer-list.  */
4886                 initializer_list
4887                   = cp_parser_initializer_list (parser, &non_constant_p);
4888                 /* Allow a trailing `,'.  */
4889                 if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
4890                   cp_lexer_consume_token (parser->lexer);
4891                 /* Look for the final `}'.  */
4892                 cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
4893               }
4894             /* If that worked, we're definitely looking at a
4895                compound-literal expression.  */
4896             if (cp_parser_parse_definitely (parser))
4897               {
4898                 /* Warn the user that a compound literal is not
4899                    allowed in standard C++.  */
4900                 pedwarn (input_location, OPT_pedantic, "ISO C++ forbids compound-literals");
4901                 /* For simplicity, we disallow compound literals in
4902                    constant-expressions.  We could
4903                    allow compound literals of integer type, whose
4904                    initializer was a constant, in constant
4905                    expressions.  Permitting that usage, as a further
4906                    extension, would not change the meaning of any
4907                    currently accepted programs.  (Of course, as
4908                    compound literals are not part of ISO C++, the
4909                    standard has nothing to say.)  */
4910                 if (cp_parser_non_integral_constant_expression (parser,
4911                                                                 NIC_NCC))
4912                   {
4913                     postfix_expression = error_mark_node;
4914                     break;
4915                   }
4916                 /* Form the representation of the compound-literal.  */
4917                 postfix_expression
4918                   = (finish_compound_literal
4919                      (type, build_constructor (init_list_type_node,
4920                                                initializer_list),
4921                       tf_warning_or_error));
4922                 break;
4923               }
4924           }
4925
4926         /* It must be a primary-expression.  */
4927         postfix_expression
4928           = cp_parser_primary_expression (parser, address_p, cast_p,
4929                                           /*template_arg_p=*/false,
4930                                           &idk);
4931       }
4932       break;
4933     }
4934
4935   /* Keep looping until the postfix-expression is complete.  */
4936   while (true)
4937     {
4938       if (idk == CP_ID_KIND_UNQUALIFIED
4939           && TREE_CODE (postfix_expression) == IDENTIFIER_NODE
4940           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
4941         /* It is not a Koenig lookup function call.  */
4942         postfix_expression
4943           = unqualified_name_lookup_error (postfix_expression);
4944
4945       /* Peek at the next token.  */
4946       token = cp_lexer_peek_token (parser->lexer);
4947
4948       switch (token->type)
4949         {
4950         case CPP_OPEN_SQUARE:
4951           postfix_expression
4952             = cp_parser_postfix_open_square_expression (parser,
4953                                                         postfix_expression,
4954                                                         false);
4955           idk = CP_ID_KIND_NONE;
4956           is_member_access = false;
4957           break;
4958
4959         case CPP_OPEN_PAREN:
4960           /* postfix-expression ( expression-list [opt] ) */
4961           {
4962             bool koenig_p;
4963             bool is_builtin_constant_p;
4964             bool saved_integral_constant_expression_p = false;
4965             bool saved_non_integral_constant_expression_p = false;
4966             VEC(tree,gc) *args;
4967
4968             is_member_access = false;
4969
4970             is_builtin_constant_p
4971               = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
4972             if (is_builtin_constant_p)
4973               {
4974                 /* The whole point of __builtin_constant_p is to allow
4975                    non-constant expressions to appear as arguments.  */
4976                 saved_integral_constant_expression_p
4977                   = parser->integral_constant_expression_p;
4978                 saved_non_integral_constant_expression_p
4979                   = parser->non_integral_constant_expression_p;
4980                 parser->integral_constant_expression_p = false;
4981               }
4982             args = (cp_parser_parenthesized_expression_list
4983                     (parser, non_attr,
4984                      /*cast_p=*/false, /*allow_expansion_p=*/true,
4985                      /*non_constant_p=*/NULL));
4986             if (is_builtin_constant_p)
4987               {
4988                 parser->integral_constant_expression_p
4989                   = saved_integral_constant_expression_p;
4990                 parser->non_integral_constant_expression_p
4991                   = saved_non_integral_constant_expression_p;
4992               }
4993
4994             if (args == NULL)
4995               {
4996                 postfix_expression = error_mark_node;
4997                 break;
4998               }
4999
5000             /* Function calls are not permitted in
5001                constant-expressions.  */
5002             if (! builtin_valid_in_constant_expr_p (postfix_expression)
5003                 && cp_parser_non_integral_constant_expression (parser,
5004                                                                NIC_FUNC_CALL))
5005               {
5006                 postfix_expression = error_mark_node;
5007                 release_tree_vector (args);
5008                 break;
5009               }
5010
5011             koenig_p = false;
5012             if (idk == CP_ID_KIND_UNQUALIFIED
5013                 || idk == CP_ID_KIND_TEMPLATE_ID)
5014               {
5015                 if (TREE_CODE (postfix_expression) == IDENTIFIER_NODE)
5016                   {
5017                     if (!VEC_empty (tree, args))
5018                       {
5019                         koenig_p = true;
5020                         if (!any_type_dependent_arguments_p (args))
5021                           postfix_expression
5022                             = perform_koenig_lookup (postfix_expression, args,
5023                                                      /*include_std=*/false,
5024                                                      tf_warning_or_error);
5025                       }
5026                     else
5027                       postfix_expression
5028                         = unqualified_fn_lookup_error (postfix_expression);
5029                   }
5030                 /* We do not perform argument-dependent lookup if
5031                    normal lookup finds a non-function, in accordance
5032                    with the expected resolution of DR 218.  */
5033                 else if (!VEC_empty (tree, args)
5034                          && is_overloaded_fn (postfix_expression))
5035                   {
5036                     tree fn = get_first_fn (postfix_expression);
5037                     fn = STRIP_TEMPLATE (fn);
5038
5039                     /* Do not do argument dependent lookup if regular
5040                        lookup finds a member function or a block-scope
5041                        function declaration.  [basic.lookup.argdep]/3  */
5042                     if (!DECL_FUNCTION_MEMBER_P (fn)
5043                         && !DECL_LOCAL_FUNCTION_P (fn))
5044                       {
5045                         koenig_p = true;
5046                         if (!any_type_dependent_arguments_p (args))
5047                           postfix_expression
5048                             = perform_koenig_lookup (postfix_expression, args,
5049                                                      /*include_std=*/false,
5050                                                      tf_warning_or_error);
5051                       }
5052                   }
5053               }
5054
5055             if (TREE_CODE (postfix_expression) == COMPONENT_REF)
5056               {
5057                 tree instance = TREE_OPERAND (postfix_expression, 0);
5058                 tree fn = TREE_OPERAND (postfix_expression, 1);
5059
5060                 if (processing_template_decl
5061                     && (type_dependent_expression_p (instance)
5062                         || (!BASELINK_P (fn)
5063                             && TREE_CODE (fn) != FIELD_DECL)
5064                         || type_dependent_expression_p (fn)
5065                         || any_type_dependent_arguments_p (args)))
5066                   {
5067                     postfix_expression
5068                       = build_nt_call_vec (postfix_expression, args);
5069                     release_tree_vector (args);
5070                     break;
5071                   }
5072
5073                 if (BASELINK_P (fn))
5074                   {
5075                   postfix_expression
5076                     = (build_new_method_call
5077                        (instance, fn, &args, NULL_TREE,
5078                         (idk == CP_ID_KIND_QUALIFIED
5079                          ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
5080                          : LOOKUP_NORMAL),
5081                         /*fn_p=*/NULL,
5082                         tf_warning_or_error));
5083                   }
5084                 else
5085                   postfix_expression
5086                     = finish_call_expr (postfix_expression, &args,
5087                                         /*disallow_virtual=*/false,
5088                                         /*koenig_p=*/false,
5089                                         tf_warning_or_error);
5090               }
5091             else if (TREE_CODE (postfix_expression) == OFFSET_REF
5092                      || TREE_CODE (postfix_expression) == MEMBER_REF
5093                      || TREE_CODE (postfix_expression) == DOTSTAR_EXPR)
5094               postfix_expression = (build_offset_ref_call_from_tree
5095                                     (postfix_expression, &args));
5096             else if (idk == CP_ID_KIND_QUALIFIED)
5097               /* A call to a static class member, or a namespace-scope
5098                  function.  */
5099               postfix_expression
5100                 = finish_call_expr (postfix_expression, &args,
5101                                     /*disallow_virtual=*/true,
5102                                     koenig_p,
5103                                     tf_warning_or_error);
5104             else
5105               /* All other function calls.  */
5106               postfix_expression
5107                 = finish_call_expr (postfix_expression, &args,
5108                                     /*disallow_virtual=*/false,
5109                                     koenig_p,
5110                                     tf_warning_or_error);
5111
5112             /* The POSTFIX_EXPRESSION is certainly no longer an id.  */
5113             idk = CP_ID_KIND_NONE;
5114
5115             release_tree_vector (args);
5116           }
5117           break;
5118
5119         case CPP_DOT:
5120         case CPP_DEREF:
5121           /* postfix-expression . template [opt] id-expression
5122              postfix-expression . pseudo-destructor-name
5123              postfix-expression -> template [opt] id-expression
5124              postfix-expression -> pseudo-destructor-name */
5125
5126           /* Consume the `.' or `->' operator.  */
5127           cp_lexer_consume_token (parser->lexer);
5128
5129           postfix_expression
5130             = cp_parser_postfix_dot_deref_expression (parser, token->type,
5131                                                       postfix_expression,
5132                                                       false, &idk,
5133                                                       token->location);
5134
5135           is_member_access = true;
5136           break;
5137
5138         case CPP_PLUS_PLUS:
5139           /* postfix-expression ++  */
5140           /* Consume the `++' token.  */
5141           cp_lexer_consume_token (parser->lexer);
5142           /* Generate a representation for the complete expression.  */
5143           postfix_expression
5144             = finish_increment_expr (postfix_expression,
5145                                      POSTINCREMENT_EXPR);
5146           /* Increments may not appear in constant-expressions.  */
5147           if (cp_parser_non_integral_constant_expression (parser, NIC_INC))
5148             postfix_expression = error_mark_node;
5149           idk = CP_ID_KIND_NONE;
5150           is_member_access = false;
5151           break;
5152
5153         case CPP_MINUS_MINUS:
5154           /* postfix-expression -- */
5155           /* Consume the `--' token.  */
5156           cp_lexer_consume_token (parser->lexer);
5157           /* Generate a representation for the complete expression.  */
5158           postfix_expression
5159             = finish_increment_expr (postfix_expression,
5160                                      POSTDECREMENT_EXPR);
5161           /* Decrements may not appear in constant-expressions.  */
5162           if (cp_parser_non_integral_constant_expression (parser, NIC_DEC))
5163             postfix_expression = error_mark_node;
5164           idk = CP_ID_KIND_NONE;
5165           is_member_access = false;
5166           break;
5167
5168         default:
5169           if (pidk_return != NULL)
5170             * pidk_return = idk;
5171           if (member_access_only_p)
5172             return is_member_access? postfix_expression : error_mark_node;
5173           else
5174             return postfix_expression;
5175         }
5176     }
5177
5178   /* We should never get here.  */
5179   gcc_unreachable ();
5180   return error_mark_node;
5181 }
5182
5183 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
5184    by cp_parser_builtin_offsetof.  We're looking for
5185
5186      postfix-expression [ expression ]
5187
5188    FOR_OFFSETOF is set if we're being called in that context, which
5189    changes how we deal with integer constant expressions.  */
5190
5191 static tree
5192 cp_parser_postfix_open_square_expression (cp_parser *parser,
5193                                           tree postfix_expression,
5194                                           bool for_offsetof)
5195 {
5196   tree index;
5197
5198   /* Consume the `[' token.  */
5199   cp_lexer_consume_token (parser->lexer);
5200
5201   /* Parse the index expression.  */
5202   /* ??? For offsetof, there is a question of what to allow here.  If
5203      offsetof is not being used in an integral constant expression context,
5204      then we *could* get the right answer by computing the value at runtime.
5205      If we are in an integral constant expression context, then we might
5206      could accept any constant expression; hard to say without analysis.
5207      Rather than open the barn door too wide right away, allow only integer
5208      constant expressions here.  */
5209   if (for_offsetof)
5210     index = cp_parser_constant_expression (parser, false, NULL);
5211   else
5212     index = cp_parser_expression (parser, /*cast_p=*/false, NULL);
5213
5214   /* Look for the closing `]'.  */
5215   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
5216
5217   /* Build the ARRAY_REF.  */
5218   postfix_expression = grok_array_decl (postfix_expression, index);
5219
5220   /* When not doing offsetof, array references are not permitted in
5221      constant-expressions.  */
5222   if (!for_offsetof
5223       && (cp_parser_non_integral_constant_expression (parser, NIC_ARRAY_REF)))
5224     postfix_expression = error_mark_node;
5225
5226   return postfix_expression;
5227 }
5228
5229 /* A subroutine of cp_parser_postfix_expression that also gets hijacked
5230    by cp_parser_builtin_offsetof.  We're looking for
5231
5232      postfix-expression . template [opt] id-expression
5233      postfix-expression . pseudo-destructor-name
5234      postfix-expression -> template [opt] id-expression
5235      postfix-expression -> pseudo-destructor-name
5236
5237    FOR_OFFSETOF is set if we're being called in that context.  That sorta
5238    limits what of the above we'll actually accept, but nevermind.
5239    TOKEN_TYPE is the "." or "->" token, which will already have been
5240    removed from the stream.  */
5241
5242 static tree
5243 cp_parser_postfix_dot_deref_expression (cp_parser *parser,
5244                                         enum cpp_ttype token_type,
5245                                         tree postfix_expression,
5246                                         bool for_offsetof, cp_id_kind *idk,
5247                                         location_t location)
5248 {
5249   tree name;
5250   bool dependent_p;
5251   bool pseudo_destructor_p;
5252   tree scope = NULL_TREE;
5253
5254   /* If this is a `->' operator, dereference the pointer.  */
5255   if (token_type == CPP_DEREF)
5256     postfix_expression = build_x_arrow (postfix_expression);
5257   /* Check to see whether or not the expression is type-dependent.  */
5258   dependent_p = type_dependent_expression_p (postfix_expression);
5259   /* The identifier following the `->' or `.' is not qualified.  */
5260   parser->scope = NULL_TREE;
5261   parser->qualifying_scope = NULL_TREE;
5262   parser->object_scope = NULL_TREE;
5263   *idk = CP_ID_KIND_NONE;
5264
5265   /* Enter the scope corresponding to the type of the object
5266      given by the POSTFIX_EXPRESSION.  */
5267   if (!dependent_p && TREE_TYPE (postfix_expression) != NULL_TREE)
5268     {
5269       scope = TREE_TYPE (postfix_expression);
5270       /* According to the standard, no expression should ever have
5271          reference type.  Unfortunately, we do not currently match
5272          the standard in this respect in that our internal representation
5273          of an expression may have reference type even when the standard
5274          says it does not.  Therefore, we have to manually obtain the
5275          underlying type here.  */
5276       scope = non_reference (scope);
5277       /* The type of the POSTFIX_EXPRESSION must be complete.  */
5278       if (scope == unknown_type_node)
5279         {
5280           error_at (location, "%qE does not have class type",
5281                     postfix_expression);
5282           scope = NULL_TREE;
5283         }
5284       else
5285         scope = complete_type_or_else (scope, NULL_TREE);
5286       /* Let the name lookup machinery know that we are processing a
5287          class member access expression.  */
5288       parser->context->object_type = scope;
5289       /* If something went wrong, we want to be able to discern that case,
5290          as opposed to the case where there was no SCOPE due to the type
5291          of expression being dependent.  */
5292       if (!scope)
5293         scope = error_mark_node;
5294       /* If the SCOPE was erroneous, make the various semantic analysis
5295          functions exit quickly -- and without issuing additional error
5296          messages.  */
5297       if (scope == error_mark_node)
5298         postfix_expression = error_mark_node;
5299     }
5300
5301   /* Assume this expression is not a pseudo-destructor access.  */
5302   pseudo_destructor_p = false;
5303
5304   /* If the SCOPE is a scalar type, then, if this is a valid program,
5305      we must be looking at a pseudo-destructor-name.  If POSTFIX_EXPRESSION
5306      is type dependent, it can be pseudo-destructor-name or something else.
5307      Try to parse it as pseudo-destructor-name first.  */
5308   if ((scope && SCALAR_TYPE_P (scope)) || dependent_p)
5309     {
5310       tree s;
5311       tree type;
5312
5313       cp_parser_parse_tentatively (parser);
5314       /* Parse the pseudo-destructor-name.  */
5315       s = NULL_TREE;
5316       cp_parser_pseudo_destructor_name (parser, &s, &type);
5317       if (dependent_p
5318           && (cp_parser_error_occurred (parser)
5319               || TREE_CODE (type) != TYPE_DECL
5320               || !SCALAR_TYPE_P (TREE_TYPE (type))))
5321         cp_parser_abort_tentative_parse (parser);
5322       else if (cp_parser_parse_definitely (parser))
5323         {
5324           pseudo_destructor_p = true;
5325           postfix_expression
5326             = finish_pseudo_destructor_expr (postfix_expression,
5327                                              s, TREE_TYPE (type));
5328         }
5329     }
5330
5331   if (!pseudo_destructor_p)
5332     {
5333       /* If the SCOPE is not a scalar type, we are looking at an
5334          ordinary class member access expression, rather than a
5335          pseudo-destructor-name.  */
5336       bool template_p;
5337       cp_token *token = cp_lexer_peek_token (parser->lexer);
5338       /* Parse the id-expression.  */
5339       name = (cp_parser_id_expression
5340               (parser,
5341                cp_parser_optional_template_keyword (parser),
5342                /*check_dependency_p=*/true,
5343                &template_p,
5344                /*declarator_p=*/false,
5345                /*optional_p=*/false));
5346       /* In general, build a SCOPE_REF if the member name is qualified.
5347          However, if the name was not dependent and has already been
5348          resolved; there is no need to build the SCOPE_REF.  For example;
5349
5350              struct X { void f(); };
5351              template <typename T> void f(T* t) { t->X::f(); }
5352
5353          Even though "t" is dependent, "X::f" is not and has been resolved
5354          to a BASELINK; there is no need to include scope information.  */
5355
5356       /* But we do need to remember that there was an explicit scope for
5357          virtual function calls.  */
5358       if (parser->scope)
5359         *idk = CP_ID_KIND_QUALIFIED;
5360
5361       /* If the name is a template-id that names a type, we will get a
5362          TYPE_DECL here.  That is invalid code.  */
5363       if (TREE_CODE (name) == TYPE_DECL)
5364         {
5365           error_at (token->location, "invalid use of %qD", name);
5366           postfix_expression = error_mark_node;
5367         }
5368       else
5369         {
5370           if (name != error_mark_node && !BASELINK_P (name) && parser->scope)
5371             {
5372               name = build_qualified_name (/*type=*/NULL_TREE,
5373                                            parser->scope,
5374                                            name,
5375                                            template_p);
5376               parser->scope = NULL_TREE;
5377               parser->qualifying_scope = NULL_TREE;
5378               parser->object_scope = NULL_TREE;
5379             }
5380           if (scope && name && BASELINK_P (name))
5381             adjust_result_of_qualified_name_lookup
5382               (name, BINFO_TYPE (BASELINK_ACCESS_BINFO (name)), scope);
5383           postfix_expression
5384             = finish_class_member_access_expr (postfix_expression, name,
5385                                                template_p, 
5386                                                tf_warning_or_error);
5387         }
5388     }
5389
5390   /* We no longer need to look up names in the scope of the object on
5391      the left-hand side of the `.' or `->' operator.  */
5392   parser->context->object_type = NULL_TREE;
5393
5394   /* Outside of offsetof, these operators may not appear in
5395      constant-expressions.  */
5396   if (!for_offsetof
5397       && (cp_parser_non_integral_constant_expression
5398           (parser, token_type == CPP_DEREF ? NIC_ARROW : NIC_POINT)))
5399     postfix_expression = error_mark_node;
5400
5401   return postfix_expression;
5402 }
5403
5404 /* Parse a parenthesized expression-list.
5405
5406    expression-list:
5407      assignment-expression
5408      expression-list, assignment-expression
5409
5410    attribute-list:
5411      expression-list
5412      identifier
5413      identifier, expression-list
5414
5415    CAST_P is true if this expression is the target of a cast.
5416
5417    ALLOW_EXPANSION_P is true if this expression allows expansion of an
5418    argument pack.
5419
5420    Returns a vector of trees.  Each element is a representation of an
5421    assignment-expression.  NULL is returned if the ( and or ) are
5422    missing.  An empty, but allocated, vector is returned on no
5423    expressions.  The parentheses are eaten.  IS_ATTRIBUTE_LIST is id_attr
5424    if we are parsing an attribute list for an attribute that wants a
5425    plain identifier argument, normal_attr for an attribute that wants
5426    an expression, or non_attr if we aren't parsing an attribute list.  If
5427    NON_CONSTANT_P is non-NULL, *NON_CONSTANT_P indicates whether or
5428    not all of the expressions in the list were constant.  */
5429
5430 static VEC(tree,gc) *
5431 cp_parser_parenthesized_expression_list (cp_parser* parser,
5432                                          int is_attribute_list,
5433                                          bool cast_p,
5434                                          bool allow_expansion_p,
5435                                          bool *non_constant_p)
5436 {
5437   VEC(tree,gc) *expression_list;
5438   bool fold_expr_p = is_attribute_list != non_attr;
5439   tree identifier = NULL_TREE;
5440   bool saved_greater_than_is_operator_p;
5441
5442   /* Assume all the expressions will be constant.  */
5443   if (non_constant_p)
5444     *non_constant_p = false;
5445
5446   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
5447     return NULL;
5448
5449   expression_list = make_tree_vector ();
5450
5451   /* Within a parenthesized expression, a `>' token is always
5452      the greater-than operator.  */
5453   saved_greater_than_is_operator_p
5454     = parser->greater_than_is_operator_p;
5455   parser->greater_than_is_operator_p = true;
5456
5457   /* Consume expressions until there are no more.  */
5458   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
5459     while (true)
5460       {
5461         tree expr;
5462
5463         /* At the beginning of attribute lists, check to see if the
5464            next token is an identifier.  */
5465         if (is_attribute_list == id_attr
5466             && cp_lexer_peek_token (parser->lexer)->type == CPP_NAME)
5467           {
5468             cp_token *token;
5469
5470             /* Consume the identifier.  */
5471             token = cp_lexer_consume_token (parser->lexer);
5472             /* Save the identifier.  */
5473             identifier = token->u.value;
5474           }
5475         else
5476           {
5477             bool expr_non_constant_p;
5478
5479             /* Parse the next assignment-expression.  */
5480             if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
5481               {
5482                 /* A braced-init-list.  */
5483                 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
5484                 expr = cp_parser_braced_list (parser, &expr_non_constant_p);
5485                 if (non_constant_p && expr_non_constant_p)
5486                   *non_constant_p = true;
5487               }
5488             else if (non_constant_p)
5489               {
5490                 expr = (cp_parser_constant_expression
5491                         (parser, /*allow_non_constant_p=*/true,
5492                          &expr_non_constant_p));
5493                 if (expr_non_constant_p)
5494                   *non_constant_p = true;
5495               }
5496             else
5497               expr = cp_parser_assignment_expression (parser, cast_p, NULL);
5498
5499             if (fold_expr_p)
5500               expr = fold_non_dependent_expr (expr);
5501
5502             /* If we have an ellipsis, then this is an expression
5503                expansion.  */
5504             if (allow_expansion_p
5505                 && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
5506               {
5507                 /* Consume the `...'.  */
5508                 cp_lexer_consume_token (parser->lexer);
5509
5510                 /* Build the argument pack.  */
5511                 expr = make_pack_expansion (expr);
5512               }
5513
5514              /* Add it to the list.  We add error_mark_node
5515                 expressions to the list, so that we can still tell if
5516                 the correct form for a parenthesized expression-list
5517                 is found. That gives better errors.  */
5518             VEC_safe_push (tree, gc, expression_list, expr);
5519
5520             if (expr == error_mark_node)
5521               goto skip_comma;
5522           }
5523
5524         /* After the first item, attribute lists look the same as
5525            expression lists.  */
5526         is_attribute_list = non_attr;
5527
5528       get_comma:;
5529         /* If the next token isn't a `,', then we are done.  */
5530         if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
5531           break;
5532
5533         /* Otherwise, consume the `,' and keep going.  */
5534         cp_lexer_consume_token (parser->lexer);
5535       }
5536
5537   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
5538     {
5539       int ending;
5540
5541     skip_comma:;
5542       /* We try and resync to an unnested comma, as that will give the
5543          user better diagnostics.  */
5544       ending = cp_parser_skip_to_closing_parenthesis (parser,
5545                                                       /*recovering=*/true,
5546                                                       /*or_comma=*/true,
5547                                                       /*consume_paren=*/true);
5548       if (ending < 0)
5549         goto get_comma;
5550       if (!ending)
5551         {
5552           parser->greater_than_is_operator_p
5553             = saved_greater_than_is_operator_p;
5554           return NULL;
5555         }
5556     }
5557
5558   parser->greater_than_is_operator_p
5559     = saved_greater_than_is_operator_p;
5560
5561   if (identifier)
5562     VEC_safe_insert (tree, gc, expression_list, 0, identifier);
5563
5564   return expression_list;
5565 }
5566
5567 /* Parse a pseudo-destructor-name.
5568
5569    pseudo-destructor-name:
5570      :: [opt] nested-name-specifier [opt] type-name :: ~ type-name
5571      :: [opt] nested-name-specifier template template-id :: ~ type-name
5572      :: [opt] nested-name-specifier [opt] ~ type-name
5573
5574    If either of the first two productions is used, sets *SCOPE to the
5575    TYPE specified before the final `::'.  Otherwise, *SCOPE is set to
5576    NULL_TREE.  *TYPE is set to the TYPE_DECL for the final type-name,
5577    or ERROR_MARK_NODE if the parse fails.  */
5578
5579 static void
5580 cp_parser_pseudo_destructor_name (cp_parser* parser,
5581                                   tree* scope,
5582                                   tree* type)
5583 {
5584   bool nested_name_specifier_p;
5585
5586   /* Assume that things will not work out.  */
5587   *type = error_mark_node;
5588
5589   /* Look for the optional `::' operator.  */
5590   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/true);
5591   /* Look for the optional nested-name-specifier.  */
5592   nested_name_specifier_p
5593     = (cp_parser_nested_name_specifier_opt (parser,
5594                                             /*typename_keyword_p=*/false,
5595                                             /*check_dependency_p=*/true,
5596                                             /*type_p=*/false,
5597                                             /*is_declaration=*/false)
5598        != NULL_TREE);
5599   /* Now, if we saw a nested-name-specifier, we might be doing the
5600      second production.  */
5601   if (nested_name_specifier_p
5602       && cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
5603     {
5604       /* Consume the `template' keyword.  */
5605       cp_lexer_consume_token (parser->lexer);
5606       /* Parse the template-id.  */
5607       cp_parser_template_id (parser,
5608                              /*template_keyword_p=*/true,
5609                              /*check_dependency_p=*/false,
5610                              /*is_declaration=*/true);
5611       /* Look for the `::' token.  */
5612       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
5613     }
5614   /* If the next token is not a `~', then there might be some
5615      additional qualification.  */
5616   else if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMPL))
5617     {
5618       /* At this point, we're looking for "type-name :: ~".  The type-name
5619          must not be a class-name, since this is a pseudo-destructor.  So,
5620          it must be either an enum-name, or a typedef-name -- both of which
5621          are just identifiers.  So, we peek ahead to check that the "::"
5622          and "~" tokens are present; if they are not, then we can avoid
5623          calling type_name.  */
5624       if (cp_lexer_peek_token (parser->lexer)->type != CPP_NAME
5625           || cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SCOPE
5626           || cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_COMPL)
5627         {
5628           cp_parser_error (parser, "non-scalar type");
5629           return;
5630         }
5631
5632       /* Look for the type-name.  */
5633       *scope = TREE_TYPE (cp_parser_nonclass_name (parser));
5634       if (*scope == error_mark_node)
5635         return;
5636
5637       /* Look for the `::' token.  */
5638       cp_parser_require (parser, CPP_SCOPE, RT_SCOPE);
5639     }
5640   else
5641     *scope = NULL_TREE;
5642
5643   /* Look for the `~'.  */
5644   cp_parser_require (parser, CPP_COMPL, RT_COMPL);
5645
5646   /* Once we see the ~, this has to be a pseudo-destructor.  */
5647   if (!processing_template_decl && !cp_parser_error_occurred (parser))
5648     cp_parser_commit_to_tentative_parse (parser);
5649
5650   /* Look for the type-name again.  We are not responsible for
5651      checking that it matches the first type-name.  */
5652   *type = cp_parser_nonclass_name (parser);
5653 }
5654
5655 /* Parse a unary-expression.
5656
5657    unary-expression:
5658      postfix-expression
5659      ++ cast-expression
5660      -- cast-expression
5661      unary-operator cast-expression
5662      sizeof unary-expression
5663      sizeof ( type-id )
5664      alignof ( type-id )  [C++0x]
5665      new-expression
5666      delete-expression
5667
5668    GNU Extensions:
5669
5670    unary-expression:
5671      __extension__ cast-expression
5672      __alignof__ unary-expression
5673      __alignof__ ( type-id )
5674      alignof unary-expression  [C++0x]
5675      __real__ cast-expression
5676      __imag__ cast-expression
5677      && identifier
5678
5679    ADDRESS_P is true iff the unary-expression is appearing as the
5680    operand of the `&' operator.   CAST_P is true if this expression is
5681    the target of a cast.
5682
5683    Returns a representation of the expression.  */
5684
5685 static tree
5686 cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p,
5687                             cp_id_kind * pidk)
5688 {
5689   cp_token *token;
5690   enum tree_code unary_operator;
5691
5692   /* Peek at the next token.  */
5693   token = cp_lexer_peek_token (parser->lexer);
5694   /* Some keywords give away the kind of expression.  */
5695   if (token->type == CPP_KEYWORD)
5696     {
5697       enum rid keyword = token->keyword;
5698
5699       switch (keyword)
5700         {
5701         case RID_ALIGNOF:
5702         case RID_SIZEOF:
5703           {
5704             tree operand;
5705             enum tree_code op;
5706
5707             op = keyword == RID_ALIGNOF ? ALIGNOF_EXPR : SIZEOF_EXPR;
5708             /* Consume the token.  */
5709             cp_lexer_consume_token (parser->lexer);
5710             /* Parse the operand.  */
5711             operand = cp_parser_sizeof_operand (parser, keyword);
5712
5713             if (TYPE_P (operand))
5714               return cxx_sizeof_or_alignof_type (operand, op, true);
5715             else
5716               {
5717                 /* ISO C++ defines alignof only with types, not with
5718                    expressions. So pedwarn if alignof is used with a non-
5719                    type expression. However, __alignof__ is ok.  */
5720                 if (!strcmp (IDENTIFIER_POINTER (token->u.value), "alignof"))
5721                   pedwarn (token->location, OPT_pedantic,
5722                            "ISO C++ does not allow %<alignof%> "
5723                            "with a non-type");
5724
5725                 return cxx_sizeof_or_alignof_expr (operand, op, true);
5726               }
5727           }
5728
5729         case RID_NEW:
5730           return cp_parser_new_expression (parser);
5731
5732         case RID_DELETE:
5733           return cp_parser_delete_expression (parser);
5734
5735         case RID_EXTENSION:
5736           {
5737             /* The saved value of the PEDANTIC flag.  */
5738             int saved_pedantic;
5739             tree expr;
5740
5741             /* Save away the PEDANTIC flag.  */
5742             cp_parser_extension_opt (parser, &saved_pedantic);
5743             /* Parse the cast-expression.  */
5744             expr = cp_parser_simple_cast_expression (parser);
5745             /* Restore the PEDANTIC flag.  */
5746             pedantic = saved_pedantic;
5747
5748             return expr;
5749           }
5750
5751         case RID_REALPART:
5752         case RID_IMAGPART:
5753           {
5754             tree expression;
5755
5756             /* Consume the `__real__' or `__imag__' token.  */
5757             cp_lexer_consume_token (parser->lexer);
5758             /* Parse the cast-expression.  */
5759             expression = cp_parser_simple_cast_expression (parser);
5760             /* Create the complete representation.  */
5761             return build_x_unary_op ((keyword == RID_REALPART
5762                                       ? REALPART_EXPR : IMAGPART_EXPR),
5763                                      expression,
5764                                      tf_warning_or_error);
5765           }
5766           break;
5767
5768         case RID_NOEXCEPT:
5769           {
5770             tree expr;
5771             const char *saved_message;
5772             bool saved_integral_constant_expression_p;
5773             bool saved_non_integral_constant_expression_p;
5774             bool saved_greater_than_is_operator_p;
5775
5776             cp_lexer_consume_token (parser->lexer);
5777             cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
5778
5779             saved_message = parser->type_definition_forbidden_message;
5780             parser->type_definition_forbidden_message
5781               = G_("types may not be defined in %<noexcept%> expressions");
5782
5783             saved_integral_constant_expression_p
5784               = parser->integral_constant_expression_p;
5785             saved_non_integral_constant_expression_p
5786               = parser->non_integral_constant_expression_p;
5787             parser->integral_constant_expression_p = false;
5788
5789             saved_greater_than_is_operator_p
5790               = parser->greater_than_is_operator_p;
5791             parser->greater_than_is_operator_p = true;
5792
5793             ++cp_unevaluated_operand;
5794             ++c_inhibit_evaluation_warnings;
5795             expr = cp_parser_expression (parser, false, NULL);
5796             --c_inhibit_evaluation_warnings;
5797             --cp_unevaluated_operand;
5798
5799             parser->greater_than_is_operator_p
5800               = saved_greater_than_is_operator_p;
5801
5802             parser->integral_constant_expression_p
5803               = saved_integral_constant_expression_p;
5804             parser->non_integral_constant_expression_p
5805               = saved_non_integral_constant_expression_p;
5806
5807             parser->type_definition_forbidden_message = saved_message;
5808
5809             cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
5810             return finish_noexcept_expr (expr, tf_warning_or_error);
5811           }
5812
5813         default:
5814           break;
5815         }
5816     }
5817
5818   /* Look for the `:: new' and `:: delete', which also signal the
5819      beginning of a new-expression, or delete-expression,
5820      respectively.  If the next token is `::', then it might be one of
5821      these.  */
5822   if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
5823     {
5824       enum rid keyword;
5825
5826       /* See if the token after the `::' is one of the keywords in
5827          which we're interested.  */
5828       keyword = cp_lexer_peek_nth_token (parser->lexer, 2)->keyword;
5829       /* If it's `new', we have a new-expression.  */
5830       if (keyword == RID_NEW)
5831         return cp_parser_new_expression (parser);
5832       /* Similarly, for `delete'.  */
5833       else if (keyword == RID_DELETE)
5834         return cp_parser_delete_expression (parser);
5835     }
5836
5837   /* Look for a unary operator.  */
5838   unary_operator = cp_parser_unary_operator (token);
5839   /* The `++' and `--' operators can be handled similarly, even though
5840      they are not technically unary-operators in the grammar.  */
5841   if (unary_operator == ERROR_MARK)
5842     {
5843       if (token->type == CPP_PLUS_PLUS)
5844         unary_operator = PREINCREMENT_EXPR;
5845       else if (token->type == CPP_MINUS_MINUS)
5846         unary_operator = PREDECREMENT_EXPR;
5847       /* Handle the GNU address-of-label extension.  */
5848       else if (cp_parser_allow_gnu_extensions_p (parser)
5849                && token->type == CPP_AND_AND)
5850         {
5851           tree identifier;
5852           tree expression;
5853           location_t loc = cp_lexer_peek_token (parser->lexer)->location;
5854
5855           /* Consume the '&&' token.  */
5856           cp_lexer_consume_token (parser->lexer);
5857           /* Look for the identifier.  */
5858           identifier = cp_parser_identifier (parser);
5859           /* Create an expression representing the address.  */
5860           expression = finish_label_address_expr (identifier, loc);
5861           if (cp_parser_non_integral_constant_expression (parser,
5862                                                           NIC_ADDR_LABEL))
5863             expression = error_mark_node;
5864           return expression;
5865         }
5866     }
5867   if (unary_operator != ERROR_MARK)
5868     {
5869       tree cast_expression;
5870       tree expression = error_mark_node;
5871       non_integral_constant non_constant_p = NIC_NONE;
5872
5873       /* Consume the operator token.  */
5874       token = cp_lexer_consume_token (parser->lexer);
5875       /* Parse the cast-expression.  */
5876       cast_expression
5877         = cp_parser_cast_expression (parser,
5878                                      unary_operator == ADDR_EXPR,
5879                                      /*cast_p=*/false, pidk);
5880       /* Now, build an appropriate representation.  */
5881       switch (unary_operator)
5882         {
5883         case INDIRECT_REF:
5884           non_constant_p = NIC_STAR;
5885           expression = build_x_indirect_ref (cast_expression, RO_UNARY_STAR,
5886                                              tf_warning_or_error);
5887           break;
5888
5889         case ADDR_EXPR:
5890            non_constant_p = NIC_ADDR;
5891           /* Fall through.  */
5892         case BIT_NOT_EXPR:
5893           expression = build_x_unary_op (unary_operator, cast_expression,
5894                                          tf_warning_or_error);
5895           break;
5896
5897         case PREINCREMENT_EXPR:
5898         case PREDECREMENT_EXPR:
5899           non_constant_p = unary_operator == PREINCREMENT_EXPR
5900                            ? NIC_PREINCREMENT : NIC_PREDECREMENT;
5901           /* Fall through.  */
5902         case UNARY_PLUS_EXPR:
5903         case NEGATE_EXPR:
5904         case TRUTH_NOT_EXPR:
5905           expression = finish_unary_op_expr (unary_operator, cast_expression);
5906           break;
5907
5908         default:
5909           gcc_unreachable ();
5910         }
5911
5912       if (non_constant_p != NIC_NONE
5913           && cp_parser_non_integral_constant_expression (parser,
5914                                                          non_constant_p))
5915         expression = error_mark_node;
5916
5917       return expression;
5918     }
5919
5920   return cp_parser_postfix_expression (parser, address_p, cast_p,
5921                                        /*member_access_only_p=*/false,
5922                                        pidk);
5923 }
5924
5925 /* Returns ERROR_MARK if TOKEN is not a unary-operator.  If TOKEN is a
5926    unary-operator, the corresponding tree code is returned.  */
5927
5928 static enum tree_code
5929 cp_parser_unary_operator (cp_token* token)
5930 {
5931   switch (token->type)
5932     {
5933     case CPP_MULT:
5934       return INDIRECT_REF;
5935
5936     case CPP_AND:
5937       return ADDR_EXPR;
5938
5939     case CPP_PLUS:
5940       return UNARY_PLUS_EXPR;
5941
5942     case CPP_MINUS:
5943       return NEGATE_EXPR;
5944
5945     case CPP_NOT:
5946       return TRUTH_NOT_EXPR;
5947
5948     case CPP_COMPL:
5949       return BIT_NOT_EXPR;
5950
5951     default:
5952       return ERROR_MARK;
5953     }
5954 }
5955
5956 /* Parse a new-expression.
5957
5958    new-expression:
5959      :: [opt] new new-placement [opt] new-type-id new-initializer [opt]
5960      :: [opt] new new-placement [opt] ( type-id ) new-initializer [opt]
5961
5962    Returns a representation of the expression.  */
5963
5964 static tree
5965 cp_parser_new_expression (cp_parser* parser)
5966 {
5967   bool global_scope_p;
5968   VEC(tree,gc) *placement;
5969   tree type;
5970   VEC(tree,gc) *initializer;
5971   tree nelts;
5972   tree ret;
5973
5974   /* Look for the optional `::' operator.  */
5975   global_scope_p
5976     = (cp_parser_global_scope_opt (parser,
5977                                    /*current_scope_valid_p=*/false)
5978        != NULL_TREE);
5979   /* Look for the `new' operator.  */
5980   cp_parser_require_keyword (parser, RID_NEW, RT_NEW);
5981   /* There's no easy way to tell a new-placement from the
5982      `( type-id )' construct.  */
5983   cp_parser_parse_tentatively (parser);
5984   /* Look for a new-placement.  */
5985   placement = cp_parser_new_placement (parser);
5986   /* If that didn't work out, there's no new-placement.  */
5987   if (!cp_parser_parse_definitely (parser))
5988     {
5989       if (placement != NULL)
5990         release_tree_vector (placement);
5991       placement = NULL;
5992     }
5993
5994   /* If the next token is a `(', then we have a parenthesized
5995      type-id.  */
5996   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
5997     {
5998       cp_token *token;
5999       /* Consume the `('.  */
6000       cp_lexer_consume_token (parser->lexer);
6001       /* Parse the type-id.  */
6002       type = cp_parser_type_id (parser);
6003       /* Look for the closing `)'.  */
6004       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
6005       token = cp_lexer_peek_token (parser->lexer);
6006       /* There should not be a direct-new-declarator in this production,
6007          but GCC used to allowed this, so we check and emit a sensible error
6008          message for this case.  */
6009       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6010         {
6011           error_at (token->location,
6012                     "array bound forbidden after parenthesized type-id");
6013           inform (token->location, 
6014                   "try removing the parentheses around the type-id");
6015           cp_parser_direct_new_declarator (parser);
6016         }
6017       nelts = NULL_TREE;
6018     }
6019   /* Otherwise, there must be a new-type-id.  */
6020   else
6021     type = cp_parser_new_type_id (parser, &nelts);
6022
6023   /* If the next token is a `(' or '{', then we have a new-initializer.  */
6024   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)
6025       || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6026     initializer = cp_parser_new_initializer (parser);
6027   else
6028     initializer = NULL;
6029
6030   /* A new-expression may not appear in an integral constant
6031      expression.  */
6032   if (cp_parser_non_integral_constant_expression (parser, NIC_NEW))
6033     ret = error_mark_node;
6034   else
6035     {
6036       /* Create a representation of the new-expression.  */
6037       ret = build_new (&placement, type, nelts, &initializer, global_scope_p,
6038                        tf_warning_or_error);
6039     }
6040
6041   if (placement != NULL)
6042     release_tree_vector (placement);
6043   if (initializer != NULL)
6044     release_tree_vector (initializer);
6045
6046   return ret;
6047 }
6048
6049 /* Parse a new-placement.
6050
6051    new-placement:
6052      ( expression-list )
6053
6054    Returns the same representation as for an expression-list.  */
6055
6056 static VEC(tree,gc) *
6057 cp_parser_new_placement (cp_parser* parser)
6058 {
6059   VEC(tree,gc) *expression_list;
6060
6061   /* Parse the expression-list.  */
6062   expression_list = (cp_parser_parenthesized_expression_list
6063                      (parser, non_attr, /*cast_p=*/false,
6064                       /*allow_expansion_p=*/true,
6065                       /*non_constant_p=*/NULL));
6066
6067   return expression_list;
6068 }
6069
6070 /* Parse a new-type-id.
6071
6072    new-type-id:
6073      type-specifier-seq new-declarator [opt]
6074
6075    Returns the TYPE allocated.  If the new-type-id indicates an array
6076    type, *NELTS is set to the number of elements in the last array
6077    bound; the TYPE will not include the last array bound.  */
6078
6079 static tree
6080 cp_parser_new_type_id (cp_parser* parser, tree *nelts)
6081 {
6082   cp_decl_specifier_seq type_specifier_seq;
6083   cp_declarator *new_declarator;
6084   cp_declarator *declarator;
6085   cp_declarator *outer_declarator;
6086   const char *saved_message;
6087   tree type;
6088
6089   /* The type-specifier sequence must not contain type definitions.
6090      (It cannot contain declarations of new types either, but if they
6091      are not definitions we will catch that because they are not
6092      complete.)  */
6093   saved_message = parser->type_definition_forbidden_message;
6094   parser->type_definition_forbidden_message
6095     = G_("types may not be defined in a new-type-id");
6096   /* Parse the type-specifier-seq.  */
6097   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
6098                                 /*is_trailing_return=*/false,
6099                                 &type_specifier_seq);
6100   /* Restore the old message.  */
6101   parser->type_definition_forbidden_message = saved_message;
6102   /* Parse the new-declarator.  */
6103   new_declarator = cp_parser_new_declarator_opt (parser);
6104
6105   /* Determine the number of elements in the last array dimension, if
6106      any.  */
6107   *nelts = NULL_TREE;
6108   /* Skip down to the last array dimension.  */
6109   declarator = new_declarator;
6110   outer_declarator = NULL;
6111   while (declarator && (declarator->kind == cdk_pointer
6112                         || declarator->kind == cdk_ptrmem))
6113     {
6114       outer_declarator = declarator;
6115       declarator = declarator->declarator;
6116     }
6117   while (declarator
6118          && declarator->kind == cdk_array
6119          && declarator->declarator
6120          && declarator->declarator->kind == cdk_array)
6121     {
6122       outer_declarator = declarator;
6123       declarator = declarator->declarator;
6124     }
6125
6126   if (declarator && declarator->kind == cdk_array)
6127     {
6128       *nelts = declarator->u.array.bounds;
6129       if (*nelts == error_mark_node)
6130         *nelts = integer_one_node;
6131
6132       if (outer_declarator)
6133         outer_declarator->declarator = declarator->declarator;
6134       else
6135         new_declarator = NULL;
6136     }
6137
6138   type = groktypename (&type_specifier_seq, new_declarator, false);
6139   return type;
6140 }
6141
6142 /* Parse an (optional) new-declarator.
6143
6144    new-declarator:
6145      ptr-operator new-declarator [opt]
6146      direct-new-declarator
6147
6148    Returns the declarator.  */
6149
6150 static cp_declarator *
6151 cp_parser_new_declarator_opt (cp_parser* parser)
6152 {
6153   enum tree_code code;
6154   tree type;
6155   cp_cv_quals cv_quals;
6156
6157   /* We don't know if there's a ptr-operator next, or not.  */
6158   cp_parser_parse_tentatively (parser);
6159   /* Look for a ptr-operator.  */
6160   code = cp_parser_ptr_operator (parser, &type, &cv_quals);
6161   /* If that worked, look for more new-declarators.  */
6162   if (cp_parser_parse_definitely (parser))
6163     {
6164       cp_declarator *declarator;
6165
6166       /* Parse another optional declarator.  */
6167       declarator = cp_parser_new_declarator_opt (parser);
6168
6169       return cp_parser_make_indirect_declarator
6170         (code, type, cv_quals, declarator);
6171     }
6172
6173   /* If the next token is a `[', there is a direct-new-declarator.  */
6174   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6175     return cp_parser_direct_new_declarator (parser);
6176
6177   return NULL;
6178 }
6179
6180 /* Parse a direct-new-declarator.
6181
6182    direct-new-declarator:
6183      [ expression ]
6184      direct-new-declarator [constant-expression]
6185
6186    */
6187
6188 static cp_declarator *
6189 cp_parser_direct_new_declarator (cp_parser* parser)
6190 {
6191   cp_declarator *declarator = NULL;
6192
6193   while (true)
6194     {
6195       tree expression;
6196
6197       /* Look for the opening `['.  */
6198       cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
6199       /* The first expression is not required to be constant.  */
6200       if (!declarator)
6201         {
6202           cp_token *token = cp_lexer_peek_token (parser->lexer);
6203           expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
6204           /* The standard requires that the expression have integral
6205              type.  DR 74 adds enumeration types.  We believe that the
6206              real intent is that these expressions be handled like the
6207              expression in a `switch' condition, which also allows
6208              classes with a single conversion to integral or
6209              enumeration type.  */
6210           if (!processing_template_decl)
6211             {
6212               expression
6213                 = build_expr_type_conversion (WANT_INT | WANT_ENUM,
6214                                               expression,
6215                                               /*complain=*/true);
6216               if (!expression)
6217                 {
6218                   error_at (token->location,
6219                             "expression in new-declarator must have integral "
6220                             "or enumeration type");
6221                   expression = error_mark_node;
6222                 }
6223             }
6224         }
6225       /* But all the other expressions must be.  */
6226       else
6227         expression
6228           = cp_parser_constant_expression (parser,
6229                                            /*allow_non_constant=*/false,
6230                                            NULL);
6231       /* Look for the closing `]'.  */
6232       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6233
6234       /* Add this bound to the declarator.  */
6235       declarator = make_array_declarator (declarator, expression);
6236
6237       /* If the next token is not a `[', then there are no more
6238          bounds.  */
6239       if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_SQUARE))
6240         break;
6241     }
6242
6243   return declarator;
6244 }
6245
6246 /* Parse a new-initializer.
6247
6248    new-initializer:
6249      ( expression-list [opt] )
6250      braced-init-list
6251
6252    Returns a representation of the expression-list.  */
6253
6254 static VEC(tree,gc) *
6255 cp_parser_new_initializer (cp_parser* parser)
6256 {
6257   VEC(tree,gc) *expression_list;
6258
6259   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
6260     {
6261       tree t;
6262       bool expr_non_constant_p;
6263       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6264       t = cp_parser_braced_list (parser, &expr_non_constant_p);
6265       CONSTRUCTOR_IS_DIRECT_INIT (t) = 1;
6266       expression_list = make_tree_vector_single (t);
6267     }
6268   else
6269     expression_list = (cp_parser_parenthesized_expression_list
6270                        (parser, non_attr, /*cast_p=*/false,
6271                         /*allow_expansion_p=*/true,
6272                         /*non_constant_p=*/NULL));
6273
6274   return expression_list;
6275 }
6276
6277 /* Parse a delete-expression.
6278
6279    delete-expression:
6280      :: [opt] delete cast-expression
6281      :: [opt] delete [ ] cast-expression
6282
6283    Returns a representation of the expression.  */
6284
6285 static tree
6286 cp_parser_delete_expression (cp_parser* parser)
6287 {
6288   bool global_scope_p;
6289   bool array_p;
6290   tree expression;
6291
6292   /* Look for the optional `::' operator.  */
6293   global_scope_p
6294     = (cp_parser_global_scope_opt (parser,
6295                                    /*current_scope_valid_p=*/false)
6296        != NULL_TREE);
6297   /* Look for the `delete' keyword.  */
6298   cp_parser_require_keyword (parser, RID_DELETE, RT_DELETE);
6299   /* See if the array syntax is in use.  */
6300   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
6301     {
6302       /* Consume the `[' token.  */
6303       cp_lexer_consume_token (parser->lexer);
6304       /* Look for the `]' token.  */
6305       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
6306       /* Remember that this is the `[]' construct.  */
6307       array_p = true;
6308     }
6309   else
6310     array_p = false;
6311
6312   /* Parse the cast-expression.  */
6313   expression = cp_parser_simple_cast_expression (parser);
6314
6315   /* A delete-expression may not appear in an integral constant
6316      expression.  */
6317   if (cp_parser_non_integral_constant_expression (parser, NIC_DEL))
6318     return error_mark_node;
6319
6320   return delete_sanity (expression, NULL_TREE, array_p, global_scope_p,
6321                         tf_warning_or_error);
6322 }
6323
6324 /* Returns true if TOKEN may start a cast-expression and false
6325    otherwise.  */
6326
6327 static bool
6328 cp_parser_token_starts_cast_expression (cp_token *token)
6329 {
6330   switch (token->type)
6331     {
6332     case CPP_COMMA:
6333     case CPP_SEMICOLON:
6334     case CPP_QUERY:
6335     case CPP_COLON:
6336     case CPP_CLOSE_SQUARE:
6337     case CPP_CLOSE_PAREN:
6338     case CPP_CLOSE_BRACE:
6339     case CPP_DOT:
6340     case CPP_DOT_STAR:
6341     case CPP_DEREF:
6342     case CPP_DEREF_STAR:
6343     case CPP_DIV:
6344     case CPP_MOD:
6345     case CPP_LSHIFT:
6346     case CPP_RSHIFT:
6347     case CPP_LESS:
6348     case CPP_GREATER:
6349     case CPP_LESS_EQ:
6350     case CPP_GREATER_EQ:
6351     case CPP_EQ_EQ:
6352     case CPP_NOT_EQ:
6353     case CPP_EQ:
6354     case CPP_MULT_EQ:
6355     case CPP_DIV_EQ:
6356     case CPP_MOD_EQ:
6357     case CPP_PLUS_EQ:
6358     case CPP_MINUS_EQ:
6359     case CPP_RSHIFT_EQ:
6360     case CPP_LSHIFT_EQ:
6361     case CPP_AND_EQ:
6362     case CPP_XOR_EQ:
6363     case CPP_OR_EQ:
6364     case CPP_XOR:
6365     case CPP_OR:
6366     case CPP_OR_OR:
6367     case CPP_EOF:
6368       return false;
6369
6370       /* '[' may start a primary-expression in obj-c++.  */
6371     case CPP_OPEN_SQUARE:
6372       return c_dialect_objc ();
6373
6374     default:
6375       return true;
6376     }
6377 }
6378
6379 /* Parse a cast-expression.
6380
6381    cast-expression:
6382      unary-expression
6383      ( type-id ) cast-expression
6384
6385    ADDRESS_P is true iff the unary-expression is appearing as the
6386    operand of the `&' operator.   CAST_P is true if this expression is
6387    the target of a cast.
6388
6389    Returns a representation of the expression.  */
6390
6391 static tree
6392 cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p,
6393                            cp_id_kind * pidk)
6394 {
6395   /* If it's a `(', then we might be looking at a cast.  */
6396   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
6397     {
6398       tree type = NULL_TREE;
6399       tree expr = NULL_TREE;
6400       bool compound_literal_p;
6401       const char *saved_message;
6402
6403       /* There's no way to know yet whether or not this is a cast.
6404          For example, `(int (3))' is a unary-expression, while `(int)
6405          3' is a cast.  So, we resort to parsing tentatively.  */
6406       cp_parser_parse_tentatively (parser);
6407       /* Types may not be defined in a cast.  */
6408       saved_message = parser->type_definition_forbidden_message;
6409       parser->type_definition_forbidden_message
6410         = G_("types may not be defined in casts");
6411       /* Consume the `('.  */
6412       cp_lexer_consume_token (parser->lexer);
6413       /* A very tricky bit is that `(struct S) { 3 }' is a
6414          compound-literal (which we permit in C++ as an extension).
6415          But, that construct is not a cast-expression -- it is a
6416          postfix-expression.  (The reason is that `(struct S) { 3 }.i'
6417          is legal; if the compound-literal were a cast-expression,
6418          you'd need an extra set of parentheses.)  But, if we parse
6419          the type-id, and it happens to be a class-specifier, then we
6420          will commit to the parse at that point, because we cannot
6421          undo the action that is done when creating a new class.  So,
6422          then we cannot back up and do a postfix-expression.
6423
6424          Therefore, we scan ahead to the closing `)', and check to see
6425          if the token after the `)' is a `{'.  If so, we are not
6426          looking at a cast-expression.
6427
6428          Save tokens so that we can put them back.  */
6429       cp_lexer_save_tokens (parser->lexer);
6430       /* Skip tokens until the next token is a closing parenthesis.
6431          If we find the closing `)', and the next token is a `{', then
6432          we are looking at a compound-literal.  */
6433       compound_literal_p
6434         = (cp_parser_skip_to_closing_parenthesis (parser, false, false,
6435                                                   /*consume_paren=*/true)
6436            && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE));
6437       /* Roll back the tokens we skipped.  */
6438       cp_lexer_rollback_tokens (parser->lexer);
6439       /* If we were looking at a compound-literal, simulate an error
6440          so that the call to cp_parser_parse_definitely below will
6441          fail.  */
6442       if (compound_literal_p)
6443         cp_parser_simulate_error (parser);
6444       else
6445         {
6446           bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
6447           parser->in_type_id_in_expr_p = true;
6448           /* Look for the type-id.  */
6449           type = cp_parser_type_id (parser);
6450           /* Look for the closing `)'.  */
6451           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
6452           parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
6453         }
6454
6455       /* Restore the saved message.  */
6456       parser->type_definition_forbidden_message = saved_message;
6457
6458       /* At this point this can only be either a cast or a
6459          parenthesized ctor such as `(T ())' that looks like a cast to
6460          function returning T.  */
6461       if (!cp_parser_error_occurred (parser)
6462           && cp_parser_token_starts_cast_expression (cp_lexer_peek_token
6463                                                      (parser->lexer)))
6464         {
6465           cp_parser_parse_definitely (parser);
6466           expr = cp_parser_cast_expression (parser,
6467                                             /*address_p=*/false,
6468                                             /*cast_p=*/true, pidk);
6469
6470           /* Warn about old-style casts, if so requested.  */
6471           if (warn_old_style_cast
6472               && !in_system_header
6473               && !VOID_TYPE_P (type)
6474               && current_lang_name != lang_name_c)
6475             warning (OPT_Wold_style_cast, "use of old-style cast");
6476
6477           /* Only type conversions to integral or enumeration types
6478              can be used in constant-expressions.  */
6479           if (!cast_valid_in_integral_constant_expression_p (type)
6480               && cp_parser_non_integral_constant_expression (parser,
6481                                                              NIC_CAST))
6482             return error_mark_node;
6483
6484           /* Perform the cast.  */
6485           expr = build_c_cast (input_location, type, expr);
6486           return expr;
6487         }
6488       else 
6489         cp_parser_abort_tentative_parse (parser);
6490     }
6491
6492   /* If we get here, then it's not a cast, so it must be a
6493      unary-expression.  */
6494   return cp_parser_unary_expression (parser, address_p, cast_p, pidk);
6495 }
6496
6497 /* Parse a binary expression of the general form:
6498
6499    pm-expression:
6500      cast-expression
6501      pm-expression .* cast-expression
6502      pm-expression ->* cast-expression
6503
6504    multiplicative-expression:
6505      pm-expression
6506      multiplicative-expression * pm-expression
6507      multiplicative-expression / pm-expression
6508      multiplicative-expression % pm-expression
6509
6510    additive-expression:
6511      multiplicative-expression
6512      additive-expression + multiplicative-expression
6513      additive-expression - multiplicative-expression
6514
6515    shift-expression:
6516      additive-expression
6517      shift-expression << additive-expression
6518      shift-expression >> additive-expression
6519
6520    relational-expression:
6521      shift-expression
6522      relational-expression < shift-expression
6523      relational-expression > shift-expression
6524      relational-expression <= shift-expression
6525      relational-expression >= shift-expression
6526
6527   GNU Extension:
6528
6529    relational-expression:
6530      relational-expression <? shift-expression
6531      relational-expression >? shift-expression
6532
6533    equality-expression:
6534      relational-expression
6535      equality-expression == relational-expression
6536      equality-expression != relational-expression
6537
6538    and-expression:
6539      equality-expression
6540      and-expression & equality-expression
6541
6542    exclusive-or-expression:
6543      and-expression
6544      exclusive-or-expression ^ and-expression
6545
6546    inclusive-or-expression:
6547      exclusive-or-expression
6548      inclusive-or-expression | exclusive-or-expression
6549
6550    logical-and-expression:
6551      inclusive-or-expression
6552      logical-and-expression && inclusive-or-expression
6553
6554    logical-or-expression:
6555      logical-and-expression
6556      logical-or-expression || logical-and-expression
6557
6558    All these are implemented with a single function like:
6559
6560    binary-expression:
6561      simple-cast-expression
6562      binary-expression <token> binary-expression
6563
6564    CAST_P is true if this expression is the target of a cast.
6565
6566    The binops_by_token map is used to get the tree codes for each <token> type.
6567    binary-expressions are associated according to a precedence table.  */
6568
6569 #define TOKEN_PRECEDENCE(token)                              \
6570 (((token->type == CPP_GREATER                                \
6571    || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT)) \
6572   && !parser->greater_than_is_operator_p)                    \
6573  ? PREC_NOT_OPERATOR                                         \
6574  : binops_by_token[token->type].prec)
6575
6576 static tree
6577 cp_parser_binary_expression (cp_parser* parser, bool cast_p,
6578                              bool no_toplevel_fold_p,
6579                              enum cp_parser_prec prec,
6580                              cp_id_kind * pidk)
6581 {
6582   cp_parser_expression_stack stack;
6583   cp_parser_expression_stack_entry *sp = &stack[0];
6584   tree lhs, rhs;
6585   cp_token *token;
6586   enum tree_code tree_type, lhs_type, rhs_type;
6587   enum cp_parser_prec new_prec, lookahead_prec;
6588   tree overload;
6589
6590   /* Parse the first expression.  */
6591   lhs = cp_parser_cast_expression (parser, /*address_p=*/false, cast_p, pidk);
6592   lhs_type = ERROR_MARK;
6593
6594   for (;;)
6595     {
6596       /* Get an operator token.  */
6597       token = cp_lexer_peek_token (parser->lexer);
6598
6599       if (warn_cxx0x_compat
6600           && token->type == CPP_RSHIFT
6601           && !parser->greater_than_is_operator_p)
6602         {
6603           if (warning_at (token->location, OPT_Wc__0x_compat, 
6604                           "%<>>%> operator will be treated as"
6605                           " two right angle brackets in C++0x"))
6606             inform (token->location,
6607                     "suggest parentheses around %<>>%> expression");
6608         }
6609
6610       new_prec = TOKEN_PRECEDENCE (token);
6611
6612       /* Popping an entry off the stack means we completed a subexpression:
6613          - either we found a token which is not an operator (`>' where it is not
6614            an operator, or prec == PREC_NOT_OPERATOR), in which case popping
6615            will happen repeatedly;
6616          - or, we found an operator which has lower priority.  This is the case
6617            where the recursive descent *ascends*, as in `3 * 4 + 5' after
6618            parsing `3 * 4'.  */
6619       if (new_prec <= prec)
6620         {
6621           if (sp == stack)
6622             break;
6623           else
6624             goto pop;
6625         }
6626
6627      get_rhs:
6628       tree_type = binops_by_token[token->type].tree_type;
6629
6630       /* We used the operator token.  */
6631       cp_lexer_consume_token (parser->lexer);
6632
6633       /* For "false && x" or "true || x", x will never be executed;
6634          disable warnings while evaluating it.  */
6635       if (tree_type == TRUTH_ANDIF_EXPR)
6636         c_inhibit_evaluation_warnings += lhs == truthvalue_false_node;
6637       else if (tree_type == TRUTH_ORIF_EXPR)
6638         c_inhibit_evaluation_warnings += lhs == truthvalue_true_node;
6639
6640       /* Extract another operand.  It may be the RHS of this expression
6641          or the LHS of a new, higher priority expression.  */
6642       rhs = cp_parser_simple_cast_expression (parser);
6643       rhs_type = ERROR_MARK;
6644
6645       /* Get another operator token.  Look up its precedence to avoid
6646          building a useless (immediately popped) stack entry for common
6647          cases such as 3 + 4 + 5 or 3 * 4 + 5.  */
6648       token = cp_lexer_peek_token (parser->lexer);
6649       lookahead_prec = TOKEN_PRECEDENCE (token);
6650       if (lookahead_prec > new_prec)
6651         {
6652           /* ... and prepare to parse the RHS of the new, higher priority
6653              expression.  Since precedence levels on the stack are
6654              monotonically increasing, we do not have to care about
6655              stack overflows.  */
6656           sp->prec = prec;
6657           sp->tree_type = tree_type;
6658           sp->lhs = lhs;
6659           sp->lhs_type = lhs_type;
6660           sp++;
6661           lhs = rhs;
6662           lhs_type = rhs_type;
6663           prec = new_prec;
6664           new_prec = lookahead_prec;
6665           goto get_rhs;
6666
6667          pop:
6668           lookahead_prec = new_prec;
6669           /* If the stack is not empty, we have parsed into LHS the right side
6670              (`4' in the example above) of an expression we had suspended.
6671              We can use the information on the stack to recover the LHS (`3')
6672              from the stack together with the tree code (`MULT_EXPR'), and
6673              the precedence of the higher level subexpression
6674              (`PREC_ADDITIVE_EXPRESSION').  TOKEN is the CPP_PLUS token,
6675              which will be used to actually build the additive expression.  */
6676           --sp;
6677           prec = sp->prec;
6678           tree_type = sp->tree_type;
6679           rhs = lhs;
6680           rhs_type = lhs_type;
6681           lhs = sp->lhs;
6682           lhs_type = sp->lhs_type;
6683         }
6684
6685       /* Undo the disabling of warnings done above.  */
6686       if (tree_type == TRUTH_ANDIF_EXPR)
6687         c_inhibit_evaluation_warnings -= lhs == truthvalue_false_node;
6688       else if (tree_type == TRUTH_ORIF_EXPR)
6689         c_inhibit_evaluation_warnings -= lhs == truthvalue_true_node;
6690
6691       overload = NULL;
6692       /* ??? Currently we pass lhs_type == ERROR_MARK and rhs_type ==
6693          ERROR_MARK for everything that is not a binary expression.
6694          This makes warn_about_parentheses miss some warnings that
6695          involve unary operators.  For unary expressions we should
6696          pass the correct tree_code unless the unary expression was
6697          surrounded by parentheses.
6698       */
6699       if (no_toplevel_fold_p
6700           && lookahead_prec <= prec
6701           && sp == stack
6702           && TREE_CODE_CLASS (tree_type) == tcc_comparison)
6703         lhs = build2 (tree_type, boolean_type_node, lhs, rhs);
6704       else
6705         lhs = build_x_binary_op (tree_type, lhs, lhs_type, rhs, rhs_type,
6706                                  &overload, tf_warning_or_error);
6707       lhs_type = tree_type;
6708
6709       /* If the binary operator required the use of an overloaded operator,
6710          then this expression cannot be an integral constant-expression.
6711          An overloaded operator can be used even if both operands are
6712          otherwise permissible in an integral constant-expression if at
6713          least one of the operands is of enumeration type.  */
6714
6715       if (overload
6716           && cp_parser_non_integral_constant_expression (parser,
6717                                                          NIC_OVERLOADED))
6718         return error_mark_node;
6719     }
6720
6721   return lhs;
6722 }
6723
6724
6725 /* Parse the `? expression : assignment-expression' part of a
6726    conditional-expression.  The LOGICAL_OR_EXPR is the
6727    logical-or-expression that started the conditional-expression.
6728    Returns a representation of the entire conditional-expression.
6729
6730    This routine is used by cp_parser_assignment_expression.
6731
6732      ? expression : assignment-expression
6733
6734    GNU Extensions:
6735
6736      ? : assignment-expression */
6737
6738 static tree
6739 cp_parser_question_colon_clause (cp_parser* parser, tree logical_or_expr)
6740 {
6741   tree expr;
6742   tree assignment_expr;
6743   struct cp_token *token;
6744
6745   /* Consume the `?' token.  */
6746   cp_lexer_consume_token (parser->lexer);
6747   token = cp_lexer_peek_token (parser->lexer);
6748   if (cp_parser_allow_gnu_extensions_p (parser)
6749       && token->type == CPP_COLON)
6750     {
6751       pedwarn (token->location, OPT_pedantic, 
6752                "ISO C++ does not allow ?: with omitted middle operand");
6753       /* Implicit true clause.  */
6754       expr = NULL_TREE;
6755       c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_true_node;
6756       warn_for_omitted_condop (token->location, logical_or_expr);
6757     }
6758   else
6759     {
6760       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
6761       parser->colon_corrects_to_scope_p = false;
6762       /* Parse the expression.  */
6763       c_inhibit_evaluation_warnings += logical_or_expr == truthvalue_false_node;
6764       expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
6765       c_inhibit_evaluation_warnings +=
6766         ((logical_or_expr == truthvalue_true_node)
6767          - (logical_or_expr == truthvalue_false_node));
6768       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
6769     }
6770
6771   /* The next token should be a `:'.  */
6772   cp_parser_require (parser, CPP_COLON, RT_COLON);
6773   /* Parse the assignment-expression.  */
6774   assignment_expr = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
6775   c_inhibit_evaluation_warnings -= logical_or_expr == truthvalue_true_node;
6776
6777   /* Build the conditional-expression.  */
6778   return build_x_conditional_expr (logical_or_expr,
6779                                    expr,
6780                                    assignment_expr,
6781                                    tf_warning_or_error);
6782 }
6783
6784 /* Parse an assignment-expression.
6785
6786    assignment-expression:
6787      conditional-expression
6788      logical-or-expression assignment-operator assignment_expression
6789      throw-expression
6790
6791    CAST_P is true if this expression is the target of a cast.
6792
6793    Returns a representation for the expression.  */
6794
6795 static tree
6796 cp_parser_assignment_expression (cp_parser* parser, bool cast_p,
6797                                  cp_id_kind * pidk)
6798 {
6799   tree expr;
6800
6801   /* If the next token is the `throw' keyword, then we're looking at
6802      a throw-expression.  */
6803   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THROW))
6804     expr = cp_parser_throw_expression (parser);
6805   /* Otherwise, it must be that we are looking at a
6806      logical-or-expression.  */
6807   else
6808     {
6809       /* Parse the binary expressions (logical-or-expression).  */
6810       expr = cp_parser_binary_expression (parser, cast_p, false,
6811                                           PREC_NOT_OPERATOR, pidk);
6812       /* If the next token is a `?' then we're actually looking at a
6813          conditional-expression.  */
6814       if (cp_lexer_next_token_is (parser->lexer, CPP_QUERY))
6815         return cp_parser_question_colon_clause (parser, expr);
6816       else
6817         {
6818           enum tree_code assignment_operator;
6819
6820           /* If it's an assignment-operator, we're using the second
6821              production.  */
6822           assignment_operator
6823             = cp_parser_assignment_operator_opt (parser);
6824           if (assignment_operator != ERROR_MARK)
6825             {
6826               bool non_constant_p;
6827
6828               /* Parse the right-hand side of the assignment.  */
6829               tree rhs = cp_parser_initializer_clause (parser, &non_constant_p);
6830
6831               if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
6832                 maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
6833
6834               /* An assignment may not appear in a
6835                  constant-expression.  */
6836               if (cp_parser_non_integral_constant_expression (parser,
6837                                                               NIC_ASSIGNMENT))
6838                 return error_mark_node;
6839               /* Build the assignment expression.  */
6840               expr = build_x_modify_expr (expr,
6841                                           assignment_operator,
6842                                           rhs,
6843                                           tf_warning_or_error);
6844             }
6845         }
6846     }
6847
6848   return expr;
6849 }
6850
6851 /* Parse an (optional) assignment-operator.
6852
6853    assignment-operator: one of
6854      = *= /= %= += -= >>= <<= &= ^= |=
6855
6856    GNU Extension:
6857
6858    assignment-operator: one of
6859      <?= >?=
6860
6861    If the next token is an assignment operator, the corresponding tree
6862    code is returned, and the token is consumed.  For example, for
6863    `+=', PLUS_EXPR is returned.  For `=' itself, the code returned is
6864    NOP_EXPR.  For `/', TRUNC_DIV_EXPR is returned; for `%',
6865    TRUNC_MOD_EXPR is returned.  If TOKEN is not an assignment
6866    operator, ERROR_MARK is returned.  */
6867
6868 static enum tree_code
6869 cp_parser_assignment_operator_opt (cp_parser* parser)
6870 {
6871   enum tree_code op;
6872   cp_token *token;
6873
6874   /* Peek at the next token.  */
6875   token = cp_lexer_peek_token (parser->lexer);
6876
6877   switch (token->type)
6878     {
6879     case CPP_EQ:
6880       op = NOP_EXPR;
6881       break;
6882
6883     case CPP_MULT_EQ:
6884       op = MULT_EXPR;
6885       break;
6886
6887     case CPP_DIV_EQ:
6888       op = TRUNC_DIV_EXPR;
6889       break;
6890
6891     case CPP_MOD_EQ:
6892       op = TRUNC_MOD_EXPR;
6893       break;
6894
6895     case CPP_PLUS_EQ:
6896       op = PLUS_EXPR;
6897       break;
6898
6899     case CPP_MINUS_EQ:
6900       op = MINUS_EXPR;
6901       break;
6902
6903     case CPP_RSHIFT_EQ:
6904       op = RSHIFT_EXPR;
6905       break;
6906
6907     case CPP_LSHIFT_EQ:
6908       op = LSHIFT_EXPR;
6909       break;
6910
6911     case CPP_AND_EQ:
6912       op = BIT_AND_EXPR;
6913       break;
6914
6915     case CPP_XOR_EQ:
6916       op = BIT_XOR_EXPR;
6917       break;
6918
6919     case CPP_OR_EQ:
6920       op = BIT_IOR_EXPR;
6921       break;
6922
6923     default:
6924       /* Nothing else is an assignment operator.  */
6925       op = ERROR_MARK;
6926     }
6927
6928   /* If it was an assignment operator, consume it.  */
6929   if (op != ERROR_MARK)
6930     cp_lexer_consume_token (parser->lexer);
6931
6932   return op;
6933 }
6934
6935 /* Parse an expression.
6936
6937    expression:
6938      assignment-expression
6939      expression , assignment-expression
6940
6941    CAST_P is true if this expression is the target of a cast.
6942
6943    Returns a representation of the expression.  */
6944
6945 static tree
6946 cp_parser_expression (cp_parser* parser, bool cast_p, cp_id_kind * pidk)
6947 {
6948   tree expression = NULL_TREE;
6949
6950   while (true)
6951     {
6952       tree assignment_expression;
6953
6954       /* Parse the next assignment-expression.  */
6955       assignment_expression
6956         = cp_parser_assignment_expression (parser, cast_p, pidk);
6957       /* If this is the first assignment-expression, we can just
6958          save it away.  */
6959       if (!expression)
6960         expression = assignment_expression;
6961       else
6962         expression = build_x_compound_expr (expression,
6963                                             assignment_expression,
6964                                             tf_warning_or_error);
6965       /* If the next token is not a comma, then we are done with the
6966          expression.  */
6967       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
6968         break;
6969       /* Consume the `,'.  */
6970       cp_lexer_consume_token (parser->lexer);
6971       /* A comma operator cannot appear in a constant-expression.  */
6972       if (cp_parser_non_integral_constant_expression (parser, NIC_COMMA))
6973         expression = error_mark_node;
6974     }
6975
6976   return expression;
6977 }
6978
6979 /* Parse a constant-expression.
6980
6981    constant-expression:
6982      conditional-expression
6983
6984   If ALLOW_NON_CONSTANT_P a non-constant expression is silently
6985   accepted.  If ALLOW_NON_CONSTANT_P is true and the expression is not
6986   constant, *NON_CONSTANT_P is set to TRUE.  If ALLOW_NON_CONSTANT_P
6987   is false, NON_CONSTANT_P should be NULL.  */
6988
6989 static tree
6990 cp_parser_constant_expression (cp_parser* parser,
6991                                bool allow_non_constant_p,
6992                                bool *non_constant_p)
6993 {
6994   bool saved_integral_constant_expression_p;
6995   bool saved_allow_non_integral_constant_expression_p;
6996   bool saved_non_integral_constant_expression_p;
6997   tree expression;
6998
6999   /* It might seem that we could simply parse the
7000      conditional-expression, and then check to see if it were
7001      TREE_CONSTANT.  However, an expression that is TREE_CONSTANT is
7002      one that the compiler can figure out is constant, possibly after
7003      doing some simplifications or optimizations.  The standard has a
7004      precise definition of constant-expression, and we must honor
7005      that, even though it is somewhat more restrictive.
7006
7007      For example:
7008
7009        int i[(2, 3)];
7010
7011      is not a legal declaration, because `(2, 3)' is not a
7012      constant-expression.  The `,' operator is forbidden in a
7013      constant-expression.  However, GCC's constant-folding machinery
7014      will fold this operation to an INTEGER_CST for `3'.  */
7015
7016   /* Save the old settings.  */
7017   saved_integral_constant_expression_p = parser->integral_constant_expression_p;
7018   saved_allow_non_integral_constant_expression_p
7019     = parser->allow_non_integral_constant_expression_p;
7020   saved_non_integral_constant_expression_p = parser->non_integral_constant_expression_p;
7021   /* We are now parsing a constant-expression.  */
7022   parser->integral_constant_expression_p = true;
7023   parser->allow_non_integral_constant_expression_p
7024     = (allow_non_constant_p || cxx_dialect >= cxx0x);
7025   parser->non_integral_constant_expression_p = false;
7026   /* Although the grammar says "conditional-expression", we parse an
7027      "assignment-expression", which also permits "throw-expression"
7028      and the use of assignment operators.  In the case that
7029      ALLOW_NON_CONSTANT_P is false, we get better errors than we would
7030      otherwise.  In the case that ALLOW_NON_CONSTANT_P is true, it is
7031      actually essential that we look for an assignment-expression.
7032      For example, cp_parser_initializer_clauses uses this function to
7033      determine whether a particular assignment-expression is in fact
7034      constant.  */
7035   expression = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
7036   /* Restore the old settings.  */
7037   parser->integral_constant_expression_p
7038     = saved_integral_constant_expression_p;
7039   parser->allow_non_integral_constant_expression_p
7040     = saved_allow_non_integral_constant_expression_p;
7041   if (cxx_dialect >= cxx0x)
7042     {
7043       /* Require an rvalue constant expression here; that's what our
7044          callers expect.  Reference constant expressions are handled
7045          separately in e.g. cp_parser_template_argument.  */
7046       bool is_const = potential_rvalue_constant_expression (expression);
7047       parser->non_integral_constant_expression_p = !is_const;
7048       if (!is_const && !allow_non_constant_p)
7049         require_potential_rvalue_constant_expression (expression);
7050     }
7051   if (allow_non_constant_p)
7052     *non_constant_p = parser->non_integral_constant_expression_p;
7053   parser->non_integral_constant_expression_p
7054     = saved_non_integral_constant_expression_p;
7055
7056   return expression;
7057 }
7058
7059 /* Parse __builtin_offsetof.
7060
7061    offsetof-expression:
7062      "__builtin_offsetof" "(" type-id "," offsetof-member-designator ")"
7063
7064    offsetof-member-designator:
7065      id-expression
7066      | offsetof-member-designator "." id-expression
7067      | offsetof-member-designator "[" expression "]"
7068      | offsetof-member-designator "->" id-expression  */
7069
7070 static tree
7071 cp_parser_builtin_offsetof (cp_parser *parser)
7072 {
7073   int save_ice_p, save_non_ice_p;
7074   tree type, expr;
7075   cp_id_kind dummy;
7076   cp_token *token;
7077
7078   /* We're about to accept non-integral-constant things, but will
7079      definitely yield an integral constant expression.  Save and
7080      restore these values around our local parsing.  */
7081   save_ice_p = parser->integral_constant_expression_p;
7082   save_non_ice_p = parser->non_integral_constant_expression_p;
7083
7084   /* Consume the "__builtin_offsetof" token.  */
7085   cp_lexer_consume_token (parser->lexer);
7086   /* Consume the opening `('.  */
7087   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
7088   /* Parse the type-id.  */
7089   type = cp_parser_type_id (parser);
7090   /* Look for the `,'.  */
7091   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7092   token = cp_lexer_peek_token (parser->lexer);
7093
7094   /* Build the (type *)null that begins the traditional offsetof macro.  */
7095   expr = build_static_cast (build_pointer_type (type), null_pointer_node,
7096                             tf_warning_or_error);
7097
7098   /* Parse the offsetof-member-designator.  We begin as if we saw "expr->".  */
7099   expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DEREF, expr,
7100                                                  true, &dummy, token->location);
7101   while (true)
7102     {
7103       token = cp_lexer_peek_token (parser->lexer);
7104       switch (token->type)
7105         {
7106         case CPP_OPEN_SQUARE:
7107           /* offsetof-member-designator "[" expression "]" */
7108           expr = cp_parser_postfix_open_square_expression (parser, expr, true);
7109           break;
7110
7111         case CPP_DEREF:
7112           /* offsetof-member-designator "->" identifier */
7113           expr = grok_array_decl (expr, integer_zero_node);
7114           /* FALLTHRU */
7115
7116         case CPP_DOT:
7117           /* offsetof-member-designator "." identifier */
7118           cp_lexer_consume_token (parser->lexer);
7119           expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT,
7120                                                          expr, true, &dummy,
7121                                                          token->location);
7122           break;
7123
7124         case CPP_CLOSE_PAREN:
7125           /* Consume the ")" token.  */
7126           cp_lexer_consume_token (parser->lexer);
7127           goto success;
7128
7129         default:
7130           /* Error.  We know the following require will fail, but
7131              that gives the proper error message.  */
7132           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7133           cp_parser_skip_to_closing_parenthesis (parser, true, false, true);
7134           expr = error_mark_node;
7135           goto failure;
7136         }
7137     }
7138
7139  success:
7140   /* If we're processing a template, we can't finish the semantics yet.
7141      Otherwise we can fold the entire expression now.  */
7142   if (processing_template_decl)
7143     expr = build1 (OFFSETOF_EXPR, size_type_node, expr);
7144   else
7145     expr = finish_offsetof (expr);
7146
7147  failure:
7148   parser->integral_constant_expression_p = save_ice_p;
7149   parser->non_integral_constant_expression_p = save_non_ice_p;
7150
7151   return expr;
7152 }
7153
7154 /* Parse a trait expression.
7155
7156    Returns a representation of the expression, the underlying type
7157    of the type at issue when KEYWORD is RID_UNDERLYING_TYPE.  */
7158
7159 static tree
7160 cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
7161 {
7162   cp_trait_kind kind;
7163   tree type1, type2 = NULL_TREE;
7164   bool binary = false;
7165   cp_decl_specifier_seq decl_specs;
7166
7167   switch (keyword)
7168     {
7169     case RID_HAS_NOTHROW_ASSIGN:
7170       kind = CPTK_HAS_NOTHROW_ASSIGN;
7171       break;
7172     case RID_HAS_NOTHROW_CONSTRUCTOR:
7173       kind = CPTK_HAS_NOTHROW_CONSTRUCTOR;
7174       break;
7175     case RID_HAS_NOTHROW_COPY:
7176       kind = CPTK_HAS_NOTHROW_COPY;
7177       break;
7178     case RID_HAS_TRIVIAL_ASSIGN:
7179       kind = CPTK_HAS_TRIVIAL_ASSIGN;
7180       break;
7181     case RID_HAS_TRIVIAL_CONSTRUCTOR:
7182       kind = CPTK_HAS_TRIVIAL_CONSTRUCTOR;
7183       break;
7184     case RID_HAS_TRIVIAL_COPY:
7185       kind = CPTK_HAS_TRIVIAL_COPY;
7186       break;
7187     case RID_HAS_TRIVIAL_DESTRUCTOR:
7188       kind = CPTK_HAS_TRIVIAL_DESTRUCTOR;
7189       break;
7190     case RID_HAS_VIRTUAL_DESTRUCTOR:
7191       kind = CPTK_HAS_VIRTUAL_DESTRUCTOR;
7192       break;
7193     case RID_IS_ABSTRACT:
7194       kind = CPTK_IS_ABSTRACT;
7195       break;
7196     case RID_IS_BASE_OF:
7197       kind = CPTK_IS_BASE_OF;
7198       binary = true;
7199       break;
7200     case RID_IS_CLASS:
7201       kind = CPTK_IS_CLASS;
7202       break;
7203     case RID_IS_CONVERTIBLE_TO:
7204       kind = CPTK_IS_CONVERTIBLE_TO;
7205       binary = true;
7206       break;
7207     case RID_IS_EMPTY:
7208       kind = CPTK_IS_EMPTY;
7209       break;
7210     case RID_IS_ENUM:
7211       kind = CPTK_IS_ENUM;
7212       break;
7213     case RID_IS_LITERAL_TYPE:
7214       kind = CPTK_IS_LITERAL_TYPE;
7215       break;
7216     case RID_IS_POD:
7217       kind = CPTK_IS_POD;
7218       break;
7219     case RID_IS_POLYMORPHIC:
7220       kind = CPTK_IS_POLYMORPHIC;
7221       break;
7222     case RID_IS_STD_LAYOUT:
7223       kind = CPTK_IS_STD_LAYOUT;
7224       break;
7225     case RID_IS_TRIVIAL:
7226       kind = CPTK_IS_TRIVIAL;
7227       break;
7228     case RID_IS_UNION:
7229       kind = CPTK_IS_UNION;
7230       break;
7231     case RID_UNDERLYING_TYPE:
7232       kind = CPTK_UNDERLYING_TYPE;
7233       break;
7234     default:
7235       gcc_unreachable ();
7236     }
7237
7238   /* Consume the token.  */
7239   cp_lexer_consume_token (parser->lexer);
7240
7241   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
7242
7243   type1 = cp_parser_type_id (parser);
7244
7245   if (type1 == error_mark_node)
7246     return error_mark_node;
7247
7248   /* Build a trivial decl-specifier-seq.  */
7249   clear_decl_specs (&decl_specs);
7250   decl_specs.type = type1;
7251
7252   /* Call grokdeclarator to figure out what type this is.  */
7253   type1 = grokdeclarator (NULL, &decl_specs, TYPENAME,
7254                           /*initialized=*/0, /*attrlist=*/NULL);
7255
7256   if (binary)
7257     {
7258       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7259  
7260       type2 = cp_parser_type_id (parser);
7261
7262       if (type2 == error_mark_node)
7263         return error_mark_node;
7264
7265       /* Build a trivial decl-specifier-seq.  */
7266       clear_decl_specs (&decl_specs);
7267       decl_specs.type = type2;
7268
7269       /* Call grokdeclarator to figure out what type this is.  */
7270       type2 = grokdeclarator (NULL, &decl_specs, TYPENAME,
7271                               /*initialized=*/0, /*attrlist=*/NULL);
7272     }
7273
7274   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7275
7276   /* Complete the trait expression, which may mean either processing
7277      the trait expr now or saving it for template instantiation.  */
7278   return kind != CPTK_UNDERLYING_TYPE
7279     ? finish_trait_expr (kind, type1, type2)
7280     : finish_underlying_type (type1);
7281 }
7282
7283 /* Lambdas that appear in variable initializer or default argument scope
7284    get that in their mangling, so we need to record it.  We might as well
7285    use the count for function and namespace scopes as well.  */
7286 static GTY(()) tree lambda_scope;
7287 static GTY(()) int lambda_count;
7288 typedef struct GTY(()) tree_int
7289 {
7290   tree t;
7291   int i;
7292 } tree_int;
7293 DEF_VEC_O(tree_int);
7294 DEF_VEC_ALLOC_O(tree_int,gc);
7295 static GTY(()) VEC(tree_int,gc) *lambda_scope_stack;
7296
7297 static void
7298 start_lambda_scope (tree decl)
7299 {
7300   tree_int ti;
7301   gcc_assert (decl);
7302   /* Once we're inside a function, we ignore other scopes and just push
7303      the function again so that popping works properly.  */
7304   if (current_function_decl && TREE_CODE (decl) != FUNCTION_DECL)
7305     decl = current_function_decl;
7306   ti.t = lambda_scope;
7307   ti.i = lambda_count;
7308   VEC_safe_push (tree_int, gc, lambda_scope_stack, &ti);
7309   if (lambda_scope != decl)
7310     {
7311       /* Don't reset the count if we're still in the same function.  */
7312       lambda_scope = decl;
7313       lambda_count = 0;
7314     }
7315 }
7316
7317 static void
7318 record_lambda_scope (tree lambda)
7319 {
7320   LAMBDA_EXPR_EXTRA_SCOPE (lambda) = lambda_scope;
7321   LAMBDA_EXPR_DISCRIMINATOR (lambda) = lambda_count++;
7322 }
7323
7324 static void
7325 finish_lambda_scope (void)
7326 {
7327   tree_int *p = VEC_last (tree_int, lambda_scope_stack);
7328   if (lambda_scope != p->t)
7329     {
7330       lambda_scope = p->t;
7331       lambda_count = p->i;
7332     }
7333   VEC_pop (tree_int, lambda_scope_stack);
7334 }
7335
7336 /* Parse a lambda expression.
7337
7338    lambda-expression:
7339      lambda-introducer lambda-declarator [opt] compound-statement
7340
7341    Returns a representation of the expression.  */
7342
7343 static tree
7344 cp_parser_lambda_expression (cp_parser* parser)
7345 {
7346   tree lambda_expr = build_lambda_expr ();
7347   tree type;
7348   bool ok;
7349
7350   LAMBDA_EXPR_LOCATION (lambda_expr)
7351     = cp_lexer_peek_token (parser->lexer)->location;
7352
7353   if (cp_unevaluated_operand)
7354     error_at (LAMBDA_EXPR_LOCATION (lambda_expr),
7355               "lambda-expression in unevaluated context");
7356
7357   /* We may be in the middle of deferred access check.  Disable
7358      it now.  */
7359   push_deferring_access_checks (dk_no_deferred);
7360
7361   cp_parser_lambda_introducer (parser, lambda_expr);
7362
7363   type = begin_lambda_type (lambda_expr);
7364
7365   record_lambda_scope (lambda_expr);
7366
7367   /* Do this again now that LAMBDA_EXPR_EXTRA_SCOPE is set.  */
7368   determine_visibility (TYPE_NAME (type));
7369
7370   /* Now that we've started the type, add the capture fields for any
7371      explicit captures.  */
7372   register_capture_members (LAMBDA_EXPR_CAPTURE_LIST (lambda_expr));
7373
7374   {
7375     /* Inside the class, surrounding template-parameter-lists do not apply.  */
7376     unsigned int saved_num_template_parameter_lists
7377         = parser->num_template_parameter_lists;
7378
7379     parser->num_template_parameter_lists = 0;
7380
7381     /* By virtue of defining a local class, a lambda expression has access to
7382        the private variables of enclosing classes.  */
7383
7384     ok = cp_parser_lambda_declarator_opt (parser, lambda_expr);
7385
7386     if (ok)
7387       cp_parser_lambda_body (parser, lambda_expr);
7388     else if (cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
7389       cp_parser_skip_to_end_of_block_or_statement (parser);
7390
7391     /* The capture list was built up in reverse order; fix that now.  */
7392     {
7393       tree newlist = NULL_TREE;
7394       tree elt, next;
7395
7396       for (elt = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr);
7397            elt; elt = next)
7398         {
7399           next = TREE_CHAIN (elt);
7400           TREE_CHAIN (elt) = newlist;
7401           newlist = elt;
7402         }
7403       LAMBDA_EXPR_CAPTURE_LIST (lambda_expr) = newlist;
7404     }
7405
7406     if (ok)
7407       maybe_add_lambda_conv_op (type);
7408
7409     type = finish_struct (type, /*attributes=*/NULL_TREE);
7410
7411     parser->num_template_parameter_lists = saved_num_template_parameter_lists;
7412   }
7413
7414   pop_deferring_access_checks ();
7415
7416   /* This field is only used during parsing of the lambda.  */
7417   LAMBDA_EXPR_THIS_CAPTURE (lambda_expr) = NULL_TREE;
7418
7419   /* This lambda shouldn't have any proxies left at this point.  */
7420   gcc_assert (LAMBDA_EXPR_PENDING_PROXIES (lambda_expr) == NULL);
7421   /* And now that we're done, push proxies for an enclosing lambda.  */
7422   insert_pending_capture_proxies ();
7423
7424   if (ok)
7425     return build_lambda_object (lambda_expr);
7426   else
7427     return error_mark_node;
7428 }
7429
7430 /* Parse the beginning of a lambda expression.
7431
7432    lambda-introducer:
7433      [ lambda-capture [opt] ]
7434
7435    LAMBDA_EXPR is the current representation of the lambda expression.  */
7436
7437 static void
7438 cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
7439 {
7440   /* Need commas after the first capture.  */
7441   bool first = true;
7442
7443   /* Eat the leading `['.  */
7444   cp_parser_require (parser, CPP_OPEN_SQUARE, RT_OPEN_SQUARE);
7445
7446   /* Record default capture mode.  "[&" "[=" "[&," "[=,"  */
7447   if (cp_lexer_next_token_is (parser->lexer, CPP_AND)
7448       && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_NAME)
7449     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_REFERENCE;
7450   else if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
7451     LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) = CPLD_COPY;
7452
7453   if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE)
7454     {
7455       cp_lexer_consume_token (parser->lexer);
7456       first = false;
7457     }
7458
7459   while (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_SQUARE))
7460     {
7461       cp_token* capture_token;
7462       tree capture_id;
7463       tree capture_init_expr;
7464       cp_id_kind idk = CP_ID_KIND_NONE;
7465       bool explicit_init_p = false;
7466
7467       enum capture_kind_type
7468       {
7469         BY_COPY,
7470         BY_REFERENCE
7471       };
7472       enum capture_kind_type capture_kind = BY_COPY;
7473
7474       if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
7475         {
7476           error ("expected end of capture-list");
7477           return;
7478         }
7479
7480       if (first)
7481         first = false;
7482       else
7483         cp_parser_require (parser, CPP_COMMA, RT_COMMA);
7484
7485       /* Possibly capture `this'.  */
7486       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_THIS))
7487         {
7488           location_t loc = cp_lexer_peek_token (parser->lexer)->location;
7489           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY)
7490             pedwarn (loc, 0, "explicit by-copy capture of %<this%> redundant "
7491                      "with by-copy capture default");
7492           cp_lexer_consume_token (parser->lexer);
7493           add_capture (lambda_expr,
7494                        /*id=*/this_identifier,
7495                        /*initializer=*/finish_this_expr(),
7496                        /*by_reference_p=*/false,
7497                        explicit_init_p);
7498           continue;
7499         }
7500
7501       /* Remember whether we want to capture as a reference or not.  */
7502       if (cp_lexer_next_token_is (parser->lexer, CPP_AND))
7503         {
7504           capture_kind = BY_REFERENCE;
7505           cp_lexer_consume_token (parser->lexer);
7506         }
7507
7508       /* Get the identifier.  */
7509       capture_token = cp_lexer_peek_token (parser->lexer);
7510       capture_id = cp_parser_identifier (parser);
7511
7512       if (capture_id == error_mark_node)
7513         /* Would be nice to have a cp_parser_skip_to_closing_x for general
7514            delimiters, but I modified this to stop on unnested ']' as well.  It
7515            was already changed to stop on unnested '}', so the
7516            "closing_parenthesis" name is no more misleading with my change.  */
7517         {
7518           cp_parser_skip_to_closing_parenthesis (parser,
7519                                                  /*recovering=*/true,
7520                                                  /*or_comma=*/true,
7521                                                  /*consume_paren=*/true);
7522           break;
7523         }
7524
7525       /* Find the initializer for this capture.  */
7526       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
7527         {
7528           /* An explicit expression exists.  */
7529           cp_lexer_consume_token (parser->lexer);
7530           pedwarn (input_location, OPT_pedantic,
7531                    "ISO C++ does not allow initializers "
7532                    "in lambda expression capture lists");
7533           capture_init_expr = cp_parser_assignment_expression (parser,
7534                                                                /*cast_p=*/true,
7535                                                                &idk);
7536           explicit_init_p = true;
7537         }
7538       else
7539         {
7540           const char* error_msg;
7541
7542           /* Turn the identifier into an id-expression.  */
7543           capture_init_expr
7544             = cp_parser_lookup_name
7545                 (parser,
7546                  capture_id,
7547                  none_type,
7548                  /*is_template=*/false,
7549                  /*is_namespace=*/false,
7550                  /*check_dependency=*/true,
7551                  /*ambiguous_decls=*/NULL,
7552                  capture_token->location);
7553
7554           capture_init_expr
7555             = finish_id_expression
7556                 (capture_id,
7557                  capture_init_expr,
7558                  parser->scope,
7559                  &idk,
7560                  /*integral_constant_expression_p=*/false,
7561                  /*allow_non_integral_constant_expression_p=*/false,
7562                  /*non_integral_constant_expression_p=*/NULL,
7563                  /*template_p=*/false,
7564                  /*done=*/true,
7565                  /*address_p=*/false,
7566                  /*template_arg_p=*/false,
7567                  &error_msg,
7568                  capture_token->location);
7569         }
7570
7571       if (TREE_CODE (capture_init_expr) == IDENTIFIER_NODE)
7572         capture_init_expr
7573           = unqualified_name_lookup_error (capture_init_expr);
7574
7575       if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE
7576           && !explicit_init_p)
7577         {
7578           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_COPY
7579               && capture_kind == BY_COPY)
7580             pedwarn (capture_token->location, 0, "explicit by-copy capture "
7581                      "of %qD redundant with by-copy capture default",
7582                      capture_id);
7583           if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_REFERENCE
7584               && capture_kind == BY_REFERENCE)
7585             pedwarn (capture_token->location, 0, "explicit by-reference "
7586                      "capture of %qD redundant with by-reference capture "
7587                      "default", capture_id);
7588         }
7589
7590       add_capture (lambda_expr,
7591                    capture_id,
7592                    capture_init_expr,
7593                    /*by_reference_p=*/capture_kind == BY_REFERENCE,
7594                    explicit_init_p);
7595     }
7596
7597   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7598 }
7599
7600 /* Parse the (optional) middle of a lambda expression.
7601
7602    lambda-declarator:
7603      ( parameter-declaration-clause [opt] )
7604        attribute-specifier [opt]
7605        mutable [opt]
7606        exception-specification [opt]
7607        lambda-return-type-clause [opt]
7608
7609    LAMBDA_EXPR is the current representation of the lambda expression.  */
7610
7611 static bool
7612 cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
7613 {
7614   /* 5.1.1.4 of the standard says:
7615        If a lambda-expression does not include a lambda-declarator, it is as if
7616        the lambda-declarator were ().
7617      This means an empty parameter list, no attributes, and no exception
7618      specification.  */
7619   tree param_list = void_list_node;
7620   tree attributes = NULL_TREE;
7621   tree exception_spec = NULL_TREE;
7622   tree t;
7623
7624   /* The lambda-declarator is optional, but must begin with an opening
7625      parenthesis if present.  */
7626   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
7627     {
7628       cp_lexer_consume_token (parser->lexer);
7629
7630       begin_scope (sk_function_parms, /*entity=*/NULL_TREE);
7631
7632       /* Parse parameters.  */
7633       param_list = cp_parser_parameter_declaration_clause (parser);
7634
7635       /* Default arguments shall not be specified in the
7636          parameter-declaration-clause of a lambda-declarator.  */
7637       for (t = param_list; t; t = TREE_CHAIN (t))
7638         if (TREE_PURPOSE (t))
7639           pedwarn (DECL_SOURCE_LOCATION (TREE_VALUE (t)), OPT_pedantic,
7640                    "default argument specified for lambda parameter");
7641
7642       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7643
7644       attributes = cp_parser_attributes_opt (parser);
7645
7646       /* Parse optional `mutable' keyword.  */
7647       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_MUTABLE))
7648         {
7649           cp_lexer_consume_token (parser->lexer);
7650           LAMBDA_EXPR_MUTABLE_P (lambda_expr) = 1;
7651         }
7652
7653       /* Parse optional exception specification.  */
7654       exception_spec = cp_parser_exception_specification_opt (parser);
7655
7656       /* Parse optional trailing return type.  */
7657       if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
7658         {
7659           cp_lexer_consume_token (parser->lexer);
7660           LAMBDA_EXPR_RETURN_TYPE (lambda_expr) = cp_parser_type_id (parser);
7661         }
7662
7663       /* The function parameters must be in scope all the way until after the
7664          trailing-return-type in case of decltype.  */
7665       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
7666         pop_binding (DECL_NAME (t), t);
7667
7668       leave_scope ();
7669     }
7670
7671   /* Create the function call operator.
7672
7673      Messing with declarators like this is no uglier than building up the
7674      FUNCTION_DECL by hand, and this is less likely to get out of sync with
7675      other code.  */
7676   {
7677     cp_decl_specifier_seq return_type_specs;
7678     cp_declarator* declarator;
7679     tree fco;
7680     int quals;
7681     void *p;
7682
7683     clear_decl_specs (&return_type_specs);
7684     if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7685       return_type_specs.type = LAMBDA_EXPR_RETURN_TYPE (lambda_expr);
7686     else
7687       /* Maybe we will deduce the return type later, but we can use void
7688          as a placeholder return type anyways.  */
7689       return_type_specs.type = void_type_node;
7690
7691     p = obstack_alloc (&declarator_obstack, 0);
7692
7693     declarator = make_id_declarator (NULL_TREE, ansi_opname (CALL_EXPR),
7694                                      sfk_none);
7695
7696     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
7697              ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
7698     declarator = make_call_declarator (declarator, param_list, quals,
7699                                        VIRT_SPEC_UNSPECIFIED,
7700                                        exception_spec,
7701                                        /*late_return_type=*/NULL_TREE);
7702     declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
7703
7704     fco = grokmethod (&return_type_specs,
7705                       declarator,
7706                       attributes);
7707     if (fco != error_mark_node)
7708       {
7709         DECL_INITIALIZED_IN_CLASS_P (fco) = 1;
7710         DECL_ARTIFICIAL (fco) = 1;
7711         /* Give the object parameter a different name.  */
7712         DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure");
7713       }
7714
7715     finish_member_declaration (fco);
7716
7717     obstack_free (&declarator_obstack, p);
7718
7719     return (fco != error_mark_node);
7720   }
7721 }
7722
7723 /* Parse the body of a lambda expression, which is simply
7724
7725    compound-statement
7726
7727    but which requires special handling.
7728    LAMBDA_EXPR is the current representation of the lambda expression.  */
7729
7730 static void
7731 cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
7732 {
7733   bool nested = (current_function_decl != NULL_TREE);
7734   if (nested)
7735     push_function_context ();
7736
7737   /* Finish the function call operator
7738      - class_specifier
7739      + late_parsing_for_member
7740      + function_definition_after_declarator
7741      + ctor_initializer_opt_and_function_body  */
7742   {
7743     tree fco = lambda_function (lambda_expr);
7744     tree body;
7745     bool done = false;
7746     tree compound_stmt;
7747     tree cap;
7748
7749     /* Let the front end know that we are going to be defining this
7750        function.  */
7751     start_preparsed_function (fco,
7752                               NULL_TREE,
7753                               SF_PRE_PARSED | SF_INCLASS_INLINE);
7754
7755     start_lambda_scope (fco);
7756     body = begin_function_body ();
7757
7758     if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
7759       goto out;
7760
7761     /* Push the proxies for any explicit captures.  */
7762     for (cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
7763          cap = TREE_CHAIN (cap))
7764       build_capture_proxy (TREE_PURPOSE (cap));
7765
7766     compound_stmt = begin_compound_stmt (0);
7767
7768     /* 5.1.1.4 of the standard says:
7769          If a lambda-expression does not include a trailing-return-type, it
7770          is as if the trailing-return-type denotes the following type:
7771           * if the compound-statement is of the form
7772                { return attribute-specifier [opt] expression ; }
7773              the type of the returned expression after lvalue-to-rvalue
7774              conversion (_conv.lval_ 4.1), array-to-pointer conversion
7775              (_conv.array_ 4.2), and function-to-pointer conversion
7776              (_conv.func_ 4.3);
7777           * otherwise, void.  */
7778
7779     /* In a lambda that has neither a lambda-return-type-clause
7780        nor a deducible form, errors should be reported for return statements
7781        in the body.  Since we used void as the placeholder return type, parsing
7782        the body as usual will give such desired behavior.  */
7783     if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
7784         && cp_lexer_peek_nth_token (parser->lexer, 1)->keyword == RID_RETURN
7785         && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SEMICOLON)
7786       {
7787         tree expr = NULL_TREE;
7788         cp_id_kind idk = CP_ID_KIND_NONE;
7789
7790         /* Parse tentatively in case there's more after the initial return
7791            statement.  */
7792         cp_parser_parse_tentatively (parser);
7793
7794         cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN);
7795
7796         expr = cp_parser_expression (parser, /*cast_p=*/false, &idk);
7797
7798         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
7799         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7800
7801         if (cp_parser_parse_definitely (parser))
7802           {
7803             apply_lambda_return_type (lambda_expr, lambda_return_type (expr));
7804
7805             /* Will get error here if type not deduced yet.  */
7806             finish_return_stmt (expr);
7807
7808             done = true;
7809           }
7810       }
7811
7812     if (!done)
7813       {
7814         if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7815           LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true;
7816         while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
7817           cp_parser_label_declaration (parser);
7818         cp_parser_statement_seq_opt (parser, NULL_TREE);
7819         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7820         LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = false;
7821       }
7822
7823     finish_compound_stmt (compound_stmt);
7824
7825   out:
7826     finish_function_body (body);
7827     finish_lambda_scope ();
7828
7829     /* Finish the function and generate code for it if necessary.  */
7830     expand_or_defer_fn (finish_function (/*inline*/2));
7831   }
7832
7833   if (nested)
7834     pop_function_context();
7835 }
7836
7837 /* Statements [gram.stmt.stmt]  */
7838
7839 /* Parse a statement.
7840
7841    statement:
7842      labeled-statement
7843      expression-statement
7844      compound-statement
7845      selection-statement
7846      iteration-statement
7847      jump-statement
7848      declaration-statement
7849      try-block
7850
7851   IN_COMPOUND is true when the statement is nested inside a
7852   cp_parser_compound_statement; this matters for certain pragmas.
7853
7854   If IF_P is not NULL, *IF_P is set to indicate whether the statement
7855   is a (possibly labeled) if statement which is not enclosed in braces
7856   and has an else clause.  This is used to implement -Wparentheses.  */
7857
7858 static void
7859 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
7860                      bool in_compound, bool *if_p)
7861 {
7862   tree statement;
7863   cp_token *token;
7864   location_t statement_location;
7865
7866  restart:
7867   if (if_p != NULL)
7868     *if_p = false;
7869   /* There is no statement yet.  */
7870   statement = NULL_TREE;
7871   /* Peek at the next token.  */
7872   token = cp_lexer_peek_token (parser->lexer);
7873   /* Remember the location of the first token in the statement.  */
7874   statement_location = token->location;
7875   /* If this is a keyword, then that will often determine what kind of
7876      statement we have.  */
7877   if (token->type == CPP_KEYWORD)
7878     {
7879       enum rid keyword = token->keyword;
7880
7881       switch (keyword)
7882         {
7883         case RID_CASE:
7884         case RID_DEFAULT:
7885           /* Looks like a labeled-statement with a case label.
7886              Parse the label, and then use tail recursion to parse
7887              the statement.  */
7888           cp_parser_label_for_labeled_statement (parser);
7889           goto restart;
7890
7891         case RID_IF:
7892         case RID_SWITCH:
7893           statement = cp_parser_selection_statement (parser, if_p);
7894           break;
7895
7896         case RID_WHILE:
7897         case RID_DO:
7898         case RID_FOR:
7899           statement = cp_parser_iteration_statement (parser);
7900           break;
7901
7902         case RID_BREAK:
7903         case RID_CONTINUE:
7904         case RID_RETURN:
7905         case RID_GOTO:
7906           statement = cp_parser_jump_statement (parser);
7907           break;
7908
7909           /* Objective-C++ exception-handling constructs.  */
7910         case RID_AT_TRY:
7911         case RID_AT_CATCH:
7912         case RID_AT_FINALLY:
7913         case RID_AT_SYNCHRONIZED:
7914         case RID_AT_THROW:
7915           statement = cp_parser_objc_statement (parser);
7916           break;
7917
7918         case RID_TRY:
7919           statement = cp_parser_try_block (parser);
7920           break;
7921
7922         case RID_NAMESPACE:
7923           /* This must be a namespace alias definition.  */
7924           cp_parser_declaration_statement (parser);
7925           return;
7926           
7927         default:
7928           /* It might be a keyword like `int' that can start a
7929              declaration-statement.  */
7930           break;
7931         }
7932     }
7933   else if (token->type == CPP_NAME)
7934     {
7935       /* If the next token is a `:', then we are looking at a
7936          labeled-statement.  */
7937       token = cp_lexer_peek_nth_token (parser->lexer, 2);
7938       if (token->type == CPP_COLON)
7939         {
7940           /* Looks like a labeled-statement with an ordinary label.
7941              Parse the label, and then use tail recursion to parse
7942              the statement.  */
7943           cp_parser_label_for_labeled_statement (parser);
7944           goto restart;
7945         }
7946     }
7947   /* Anything that starts with a `{' must be a compound-statement.  */
7948   else if (token->type == CPP_OPEN_BRACE)
7949     statement = cp_parser_compound_statement (parser, NULL, false, false);
7950   /* CPP_PRAGMA is a #pragma inside a function body, which constitutes
7951      a statement all its own.  */
7952   else if (token->type == CPP_PRAGMA)
7953     {
7954       /* Only certain OpenMP pragmas are attached to statements, and thus
7955          are considered statements themselves.  All others are not.  In
7956          the context of a compound, accept the pragma as a "statement" and
7957          return so that we can check for a close brace.  Otherwise we
7958          require a real statement and must go back and read one.  */
7959       if (in_compound)
7960         cp_parser_pragma (parser, pragma_compound);
7961       else if (!cp_parser_pragma (parser, pragma_stmt))
7962         goto restart;
7963       return;
7964     }
7965   else if (token->type == CPP_EOF)
7966     {
7967       cp_parser_error (parser, "expected statement");
7968       return;
7969     }
7970
7971   /* Everything else must be a declaration-statement or an
7972      expression-statement.  Try for the declaration-statement
7973      first, unless we are looking at a `;', in which case we know that
7974      we have an expression-statement.  */
7975   if (!statement)
7976     {
7977       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
7978         {
7979           cp_parser_parse_tentatively (parser);
7980           /* Try to parse the declaration-statement.  */
7981           cp_parser_declaration_statement (parser);
7982           /* If that worked, we're done.  */
7983           if (cp_parser_parse_definitely (parser))
7984             return;
7985         }
7986       /* Look for an expression-statement instead.  */
7987       statement = cp_parser_expression_statement (parser, in_statement_expr);
7988     }
7989
7990   /* Set the line number for the statement.  */
7991   if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
7992     SET_EXPR_LOCATION (statement, statement_location);
7993 }
7994
7995 /* Parse the label for a labeled-statement, i.e.
7996
7997    identifier :
7998    case constant-expression :
7999    default :
8000
8001    GNU Extension:
8002    case constant-expression ... constant-expression : statement
8003
8004    When a label is parsed without errors, the label is added to the
8005    parse tree by the finish_* functions, so this function doesn't
8006    have to return the label.  */
8007
8008 static void
8009 cp_parser_label_for_labeled_statement (cp_parser* parser)
8010 {
8011   cp_token *token;
8012   tree label = NULL_TREE;
8013   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
8014
8015   /* The next token should be an identifier.  */
8016   token = cp_lexer_peek_token (parser->lexer);
8017   if (token->type != CPP_NAME
8018       && token->type != CPP_KEYWORD)
8019     {
8020       cp_parser_error (parser, "expected labeled-statement");
8021       return;
8022     }
8023
8024   parser->colon_corrects_to_scope_p = false;
8025   switch (token->keyword)
8026     {
8027     case RID_CASE:
8028       {
8029         tree expr, expr_hi;
8030         cp_token *ellipsis;
8031
8032         /* Consume the `case' token.  */
8033         cp_lexer_consume_token (parser->lexer);
8034         /* Parse the constant-expression.  */
8035         expr = cp_parser_constant_expression (parser,
8036                                               /*allow_non_constant_p=*/false,
8037                                               NULL);
8038
8039         ellipsis = cp_lexer_peek_token (parser->lexer);
8040         if (ellipsis->type == CPP_ELLIPSIS)
8041           {
8042             /* Consume the `...' token.  */
8043             cp_lexer_consume_token (parser->lexer);
8044             expr_hi =
8045               cp_parser_constant_expression (parser,
8046                                              /*allow_non_constant_p=*/false,
8047                                              NULL);
8048             /* We don't need to emit warnings here, as the common code
8049                will do this for us.  */
8050           }
8051         else
8052           expr_hi = NULL_TREE;
8053
8054         if (parser->in_switch_statement_p)
8055           finish_case_label (token->location, expr, expr_hi);
8056         else
8057           error_at (token->location,
8058                     "case label %qE not within a switch statement",
8059                     expr);
8060       }
8061       break;
8062
8063     case RID_DEFAULT:
8064       /* Consume the `default' token.  */
8065       cp_lexer_consume_token (parser->lexer);
8066
8067       if (parser->in_switch_statement_p)
8068         finish_case_label (token->location, NULL_TREE, NULL_TREE);
8069       else
8070         error_at (token->location, "case label not within a switch statement");
8071       break;
8072
8073     default:
8074       /* Anything else must be an ordinary label.  */
8075       label = finish_label_stmt (cp_parser_identifier (parser));
8076       break;
8077     }
8078
8079   /* Require the `:' token.  */
8080   cp_parser_require (parser, CPP_COLON, RT_COLON);
8081
8082   /* An ordinary label may optionally be followed by attributes.
8083      However, this is only permitted if the attributes are then
8084      followed by a semicolon.  This is because, for backward
8085      compatibility, when parsing
8086        lab: __attribute__ ((unused)) int i;
8087      we want the attribute to attach to "i", not "lab".  */
8088   if (label != NULL_TREE
8089       && cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
8090     {
8091       tree attrs;
8092
8093       cp_parser_parse_tentatively (parser);
8094       attrs = cp_parser_attributes_opt (parser);
8095       if (attrs == NULL_TREE
8096           || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8097         cp_parser_abort_tentative_parse (parser);
8098       else if (!cp_parser_parse_definitely (parser))
8099         ;
8100       else
8101         cplus_decl_attributes (&label, attrs, 0);
8102     }
8103
8104   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8105 }
8106
8107 /* Parse an expression-statement.
8108
8109    expression-statement:
8110      expression [opt] ;
8111
8112    Returns the new EXPR_STMT -- or NULL_TREE if the expression
8113    statement consists of nothing more than an `;'. IN_STATEMENT_EXPR_P
8114    indicates whether this expression-statement is part of an
8115    expression statement.  */
8116
8117 static tree
8118 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
8119 {
8120   tree statement = NULL_TREE;
8121   cp_token *token = cp_lexer_peek_token (parser->lexer);
8122
8123   /* If the next token is a ';', then there is no expression
8124      statement.  */
8125   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8126     statement = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8127
8128   /* Give a helpful message for "A<T>::type t;" and the like.  */
8129   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
8130       && !cp_parser_uncommitted_to_tentative_parse_p (parser))
8131     {
8132       if (TREE_CODE (statement) == SCOPE_REF)
8133         error_at (token->location, "need %<typename%> before %qE because "
8134                   "%qT is a dependent scope",
8135                   statement, TREE_OPERAND (statement, 0));
8136       else if (is_overloaded_fn (statement)
8137                && DECL_CONSTRUCTOR_P (get_first_fn (statement)))
8138         {
8139           /* A::A a; */
8140           tree fn = get_first_fn (statement);
8141           error_at (token->location,
8142                     "%<%T::%D%> names the constructor, not the type",
8143                     DECL_CONTEXT (fn), DECL_NAME (fn));
8144         }
8145     }
8146
8147   /* Consume the final `;'.  */
8148   cp_parser_consume_semicolon_at_end_of_statement (parser);
8149
8150   if (in_statement_expr
8151       && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
8152     /* This is the final expression statement of a statement
8153        expression.  */
8154     statement = finish_stmt_expr_expr (statement, in_statement_expr);
8155   else if (statement)
8156     statement = finish_expr_stmt (statement);
8157   else
8158     finish_stmt ();
8159
8160   return statement;
8161 }
8162
8163 /* Parse a compound-statement.
8164
8165    compound-statement:
8166      { statement-seq [opt] }
8167
8168    GNU extension:
8169
8170    compound-statement:
8171      { label-declaration-seq [opt] statement-seq [opt] }
8172
8173    label-declaration-seq:
8174      label-declaration
8175      label-declaration-seq label-declaration
8176
8177    Returns a tree representing the statement.  */
8178
8179 static tree
8180 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
8181                               bool in_try, bool function_body)
8182 {
8183   tree compound_stmt;
8184
8185   /* Consume the `{'.  */
8186   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
8187     return error_mark_node;
8188   if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
8189       && !function_body)
8190     pedwarn (input_location, OPT_pedantic,
8191              "compound-statement in constexpr function");
8192   /* Begin the compound-statement.  */
8193   compound_stmt = begin_compound_stmt (in_try ? BCS_TRY_BLOCK : 0);
8194   /* If the next keyword is `__label__' we have a label declaration.  */
8195   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
8196     cp_parser_label_declaration (parser);
8197   /* Parse an (optional) statement-seq.  */
8198   cp_parser_statement_seq_opt (parser, in_statement_expr);
8199   /* Finish the compound-statement.  */
8200   finish_compound_stmt (compound_stmt);
8201   /* Consume the `}'.  */
8202   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
8203
8204   return compound_stmt;
8205 }
8206
8207 /* Parse an (optional) statement-seq.
8208
8209    statement-seq:
8210      statement
8211      statement-seq [opt] statement  */
8212
8213 static void
8214 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
8215 {
8216   /* Scan statements until there aren't any more.  */
8217   while (true)
8218     {
8219       cp_token *token = cp_lexer_peek_token (parser->lexer);
8220
8221       /* If we are looking at a `}', then we have run out of
8222          statements; the same is true if we have reached the end
8223          of file, or have stumbled upon a stray '@end'.  */
8224       if (token->type == CPP_CLOSE_BRACE
8225           || token->type == CPP_EOF
8226           || token->type == CPP_PRAGMA_EOL
8227           || (token->type == CPP_KEYWORD && token->keyword == RID_AT_END))
8228         break;
8229       
8230       /* If we are in a compound statement and find 'else' then
8231          something went wrong.  */
8232       else if (token->type == CPP_KEYWORD && token->keyword == RID_ELSE)
8233         {
8234           if (parser->in_statement & IN_IF_STMT) 
8235             break;
8236           else
8237             {
8238               token = cp_lexer_consume_token (parser->lexer);
8239               error_at (token->location, "%<else%> without a previous %<if%>");
8240             }
8241         }
8242
8243       /* Parse the statement.  */
8244       cp_parser_statement (parser, in_statement_expr, true, NULL);
8245     }
8246 }
8247
8248 /* Parse a selection-statement.
8249
8250    selection-statement:
8251      if ( condition ) statement
8252      if ( condition ) statement else statement
8253      switch ( condition ) statement
8254
8255    Returns the new IF_STMT or SWITCH_STMT.
8256
8257    If IF_P is not NULL, *IF_P is set to indicate whether the statement
8258    is a (possibly labeled) if statement which is not enclosed in
8259    braces and has an else clause.  This is used to implement
8260    -Wparentheses.  */
8261
8262 static tree
8263 cp_parser_selection_statement (cp_parser* parser, bool *if_p)
8264 {
8265   cp_token *token;
8266   enum rid keyword;
8267
8268   if (if_p != NULL)
8269     *if_p = false;
8270
8271   /* Peek at the next token.  */
8272   token = cp_parser_require (parser, CPP_KEYWORD, RT_SELECT);
8273
8274   /* See what kind of keyword it is.  */
8275   keyword = token->keyword;
8276   switch (keyword)
8277     {
8278     case RID_IF:
8279     case RID_SWITCH:
8280       {
8281         tree statement;
8282         tree condition;
8283
8284         /* Look for the `('.  */
8285         if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
8286           {
8287             cp_parser_skip_to_end_of_statement (parser);
8288             return error_mark_node;
8289           }
8290
8291         /* Begin the selection-statement.  */
8292         if (keyword == RID_IF)
8293           statement = begin_if_stmt ();
8294         else
8295           statement = begin_switch_stmt ();
8296
8297         /* Parse the condition.  */
8298         condition = cp_parser_condition (parser);
8299         /* Look for the `)'.  */
8300         if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
8301           cp_parser_skip_to_closing_parenthesis (parser, true, false,
8302                                                  /*consume_paren=*/true);
8303
8304         if (keyword == RID_IF)
8305           {
8306             bool nested_if;
8307             unsigned char in_statement;
8308
8309             /* Add the condition.  */
8310             finish_if_stmt_cond (condition, statement);
8311
8312             /* Parse the then-clause.  */
8313             in_statement = parser->in_statement;
8314             parser->in_statement |= IN_IF_STMT;
8315             if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8316               {
8317                 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8318                 add_stmt (build_empty_stmt (loc));
8319                 cp_lexer_consume_token (parser->lexer);
8320                 if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_ELSE))
8321                   warning_at (loc, OPT_Wempty_body, "suggest braces around "
8322                               "empty body in an %<if%> statement");
8323                 nested_if = false;
8324               }
8325             else
8326               cp_parser_implicitly_scoped_statement (parser, &nested_if);
8327             parser->in_statement = in_statement;
8328
8329             finish_then_clause (statement);
8330
8331             /* If the next token is `else', parse the else-clause.  */
8332             if (cp_lexer_next_token_is_keyword (parser->lexer,
8333                                                 RID_ELSE))
8334               {
8335                 /* Consume the `else' keyword.  */
8336                 cp_lexer_consume_token (parser->lexer);
8337                 begin_else_clause (statement);
8338                 /* Parse the else-clause.  */
8339                 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8340                   {
8341                     location_t loc;
8342                     loc = cp_lexer_peek_token (parser->lexer)->location;
8343                     warning_at (loc,
8344                                 OPT_Wempty_body, "suggest braces around "
8345                                 "empty body in an %<else%> statement");
8346                     add_stmt (build_empty_stmt (loc));
8347                     cp_lexer_consume_token (parser->lexer);
8348                   }
8349                 else
8350                   cp_parser_implicitly_scoped_statement (parser, NULL);
8351
8352                 finish_else_clause (statement);
8353
8354                 /* If we are currently parsing a then-clause, then
8355                    IF_P will not be NULL.  We set it to true to
8356                    indicate that this if statement has an else clause.
8357                    This may trigger the Wparentheses warning below
8358                    when we get back up to the parent if statement.  */
8359                 if (if_p != NULL)
8360                   *if_p = true;
8361               }
8362             else
8363               {
8364                 /* This if statement does not have an else clause.  If
8365                    NESTED_IF is true, then the then-clause is an if
8366                    statement which does have an else clause.  We warn
8367                    about the potential ambiguity.  */
8368                 if (nested_if)
8369                   warning_at (EXPR_LOCATION (statement), OPT_Wparentheses,
8370                               "suggest explicit braces to avoid ambiguous"
8371                               " %<else%>");
8372               }
8373
8374             /* Now we're all done with the if-statement.  */
8375             finish_if_stmt (statement);
8376           }
8377         else
8378           {
8379             bool in_switch_statement_p;
8380             unsigned char in_statement;
8381
8382             /* Add the condition.  */
8383             finish_switch_cond (condition, statement);
8384
8385             /* Parse the body of the switch-statement.  */
8386             in_switch_statement_p = parser->in_switch_statement_p;
8387             in_statement = parser->in_statement;
8388             parser->in_switch_statement_p = true;
8389             parser->in_statement |= IN_SWITCH_STMT;
8390             cp_parser_implicitly_scoped_statement (parser, NULL);
8391             parser->in_switch_statement_p = in_switch_statement_p;
8392             parser->in_statement = in_statement;
8393
8394             /* Now we're all done with the switch-statement.  */
8395             finish_switch_stmt (statement);
8396           }
8397
8398         return statement;
8399       }
8400       break;
8401
8402     default:
8403       cp_parser_error (parser, "expected selection-statement");
8404       return error_mark_node;
8405     }
8406 }
8407
8408 /* Parse a condition.
8409
8410    condition:
8411      expression
8412      type-specifier-seq declarator = initializer-clause
8413      type-specifier-seq declarator braced-init-list
8414
8415    GNU Extension:
8416
8417    condition:
8418      type-specifier-seq declarator asm-specification [opt]
8419        attributes [opt] = assignment-expression
8420
8421    Returns the expression that should be tested.  */
8422
8423 static tree
8424 cp_parser_condition (cp_parser* parser)
8425 {
8426   cp_decl_specifier_seq type_specifiers;
8427   const char *saved_message;
8428   int declares_class_or_enum;
8429
8430   /* Try the declaration first.  */
8431   cp_parser_parse_tentatively (parser);
8432   /* New types are not allowed in the type-specifier-seq for a
8433      condition.  */
8434   saved_message = parser->type_definition_forbidden_message;
8435   parser->type_definition_forbidden_message
8436     = G_("types may not be defined in conditions");
8437   /* Parse the type-specifier-seq.  */
8438   cp_parser_decl_specifier_seq (parser,
8439                                 CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR,
8440                                 &type_specifiers,
8441                                 &declares_class_or_enum);
8442   /* Restore the saved message.  */
8443   parser->type_definition_forbidden_message = saved_message;
8444   /* If all is well, we might be looking at a declaration.  */
8445   if (!cp_parser_error_occurred (parser))
8446     {
8447       tree decl;
8448       tree asm_specification;
8449       tree attributes;
8450       cp_declarator *declarator;
8451       tree initializer = NULL_TREE;
8452
8453       /* Parse the declarator.  */
8454       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
8455                                          /*ctor_dtor_or_conv_p=*/NULL,
8456                                          /*parenthesized_p=*/NULL,
8457                                          /*member_p=*/false);
8458       /* Parse the attributes.  */
8459       attributes = cp_parser_attributes_opt (parser);
8460       /* Parse the asm-specification.  */
8461       asm_specification = cp_parser_asm_specification_opt (parser);
8462       /* If the next token is not an `=' or '{', then we might still be
8463          looking at an expression.  For example:
8464
8465            if (A(a).x)
8466
8467          looks like a decl-specifier-seq and a declarator -- but then
8468          there is no `=', so this is an expression.  */
8469       if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
8470           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
8471         cp_parser_simulate_error (parser);
8472         
8473       /* If we did see an `=' or '{', then we are looking at a declaration
8474          for sure.  */
8475       if (cp_parser_parse_definitely (parser))
8476         {
8477           tree pushed_scope;
8478           bool non_constant_p;
8479           bool flags = LOOKUP_ONLYCONVERTING;
8480
8481           /* Create the declaration.  */
8482           decl = start_decl (declarator, &type_specifiers,
8483                              /*initialized_p=*/true,
8484                              attributes, /*prefix_attributes=*/NULL_TREE,
8485                              &pushed_scope);
8486
8487           /* Parse the initializer.  */
8488           if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8489             {
8490               initializer = cp_parser_braced_list (parser, &non_constant_p);
8491               CONSTRUCTOR_IS_DIRECT_INIT (initializer) = 1;
8492               flags = 0;
8493             }
8494           else
8495             {
8496               /* Consume the `='.  */
8497               cp_parser_require (parser, CPP_EQ, RT_EQ);
8498               initializer = cp_parser_initializer_clause (parser, &non_constant_p);
8499             }
8500           if (BRACE_ENCLOSED_INITIALIZER_P (initializer))
8501             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
8502
8503           /* Process the initializer.  */
8504           cp_finish_decl (decl,
8505                           initializer, !non_constant_p,
8506                           asm_specification,
8507                           flags);
8508
8509           if (pushed_scope)
8510             pop_scope (pushed_scope);
8511
8512           return convert_from_reference (decl);
8513         }
8514     }
8515   /* If we didn't even get past the declarator successfully, we are
8516      definitely not looking at a declaration.  */
8517   else
8518     cp_parser_abort_tentative_parse (parser);
8519
8520   /* Otherwise, we are looking at an expression.  */
8521   return cp_parser_expression (parser, /*cast_p=*/false, NULL);
8522 }
8523
8524 /* Parses a for-statement or range-for-statement until the closing ')',
8525    not included. */
8526
8527 static tree
8528 cp_parser_for (cp_parser *parser)
8529 {
8530   tree init, scope, decl;
8531   bool is_range_for;
8532
8533   /* Begin the for-statement.  */
8534   scope = begin_for_scope (&init);
8535
8536   /* Parse the initialization.  */
8537   is_range_for = cp_parser_for_init_statement (parser, &decl);
8538
8539   if (is_range_for)
8540     return cp_parser_range_for (parser, scope, init, decl);
8541   else
8542     return cp_parser_c_for (parser, scope, init);
8543 }
8544
8545 static tree
8546 cp_parser_c_for (cp_parser *parser, tree scope, tree init)
8547 {
8548   /* Normal for loop */
8549   tree condition = NULL_TREE;
8550   tree expression = NULL_TREE;
8551   tree stmt;
8552
8553   stmt = begin_for_stmt (scope, init);
8554   /* The for-init-statement has already been parsed in
8555      cp_parser_for_init_statement, so no work is needed here.  */
8556   finish_for_init_stmt (stmt);
8557
8558   /* If there's a condition, process it.  */
8559   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8560     condition = cp_parser_condition (parser);
8561   finish_for_cond (condition, stmt);
8562   /* Look for the `;'.  */
8563   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8564
8565   /* If there's an expression, process it.  */
8566   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
8567     expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8568   finish_for_expr (expression, stmt);
8569
8570   return stmt;
8571 }
8572
8573 /* Tries to parse a range-based for-statement:
8574
8575   range-based-for:
8576     decl-specifier-seq declarator : expression
8577
8578   The decl-specifier-seq declarator and the `:' are already parsed by
8579   cp_parser_for_init_statement. If processing_template_decl it returns a
8580   newly created RANGE_FOR_STMT; if not, it is converted to a
8581   regular FOR_STMT.  */
8582
8583 static tree
8584 cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl)
8585 {
8586   tree stmt, range_expr;
8587
8588   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8589     {
8590       bool expr_non_constant_p;
8591       range_expr = cp_parser_braced_list (parser, &expr_non_constant_p);
8592     }
8593   else
8594     range_expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8595
8596   /* If in template, STMT is converted to a normal for-statement
8597      at instantiation. If not, it is done just ahead. */
8598   if (processing_template_decl)
8599     {
8600       stmt = begin_range_for_stmt (scope, init);
8601       finish_range_for_decl (stmt, range_decl, range_expr);
8602     }
8603   else
8604     {
8605       stmt = begin_for_stmt (scope, init);
8606       stmt = cp_convert_range_for (stmt, range_decl, range_expr);
8607     }
8608   return stmt;
8609 }
8610
8611 /* Converts a range-based for-statement into a normal
8612    for-statement, as per the definition.
8613
8614       for (RANGE_DECL : RANGE_EXPR)
8615         BLOCK
8616
8617    should be equivalent to:
8618
8619       {
8620         auto &&__range = RANGE_EXPR;
8621         for (auto __begin = BEGIN_EXPR, end = END_EXPR;
8622               __begin != __end;
8623               ++__begin)
8624           {
8625               RANGE_DECL = *__begin;
8626               BLOCK
8627           }
8628       }
8629
8630    If RANGE_EXPR is an array:
8631         BEGIN_EXPR = __range
8632         END_EXPR = __range + ARRAY_SIZE(__range)
8633    Else if RANGE_EXPR has a member 'begin' or 'end':
8634         BEGIN_EXPR = __range.begin()
8635         END_EXPR = __range.end()
8636    Else:
8637         BEGIN_EXPR = begin(__range)
8638         END_EXPR = end(__range);
8639
8640    If __range has a member 'begin' but not 'end', or vice versa, we must
8641    still use the second alternative (it will surely fail, however).
8642    When calling begin()/end() in the third alternative we must use
8643    argument dependent lookup, but always considering 'std' as an associated
8644    namespace.  */
8645
8646 tree
8647 cp_convert_range_for (tree statement, tree range_decl, tree range_expr)
8648 {
8649   tree range_type, range_temp;
8650   tree begin, end;
8651   tree iter_type, begin_expr, end_expr;
8652   tree condition, expression;
8653
8654   if (range_decl == error_mark_node || range_expr == error_mark_node)
8655     /* If an error happened previously do nothing or else a lot of
8656        unhelpful errors would be issued.  */
8657     begin_expr = end_expr = iter_type = error_mark_node;
8658   else
8659     {
8660       /* Find out the type deduced by the declaration
8661          `auto &&__range = range_expr'.  */
8662       range_type = cp_build_reference_type (make_auto (), true);
8663       range_type = do_auto_deduction (range_type, range_expr,
8664                                       type_uses_auto (range_type));
8665
8666       /* Create the __range variable.  */
8667       range_temp = build_decl (input_location, VAR_DECL,
8668                                get_identifier ("__for_range"), range_type);
8669       TREE_USED (range_temp) = 1;
8670       DECL_ARTIFICIAL (range_temp) = 1;
8671       pushdecl (range_temp);
8672       cp_finish_decl (range_temp, range_expr,
8673                       /*is_constant_init*/false, NULL_TREE,
8674                       LOOKUP_ONLYCONVERTING);
8675
8676       range_temp = convert_from_reference (range_temp);
8677       iter_type = cp_parser_perform_range_for_lookup (range_temp,
8678                                                       &begin_expr, &end_expr);
8679     }
8680
8681   /* The new for initialization statement.  */
8682   begin = build_decl (input_location, VAR_DECL,
8683                       get_identifier ("__for_begin"), iter_type);
8684   TREE_USED (begin) = 1;
8685   DECL_ARTIFICIAL (begin) = 1;
8686   pushdecl (begin);
8687   cp_finish_decl (begin, begin_expr,
8688                   /*is_constant_init*/false, NULL_TREE,
8689                   LOOKUP_ONLYCONVERTING);
8690
8691   end = build_decl (input_location, VAR_DECL,
8692                     get_identifier ("__for_end"), iter_type);
8693   TREE_USED (end) = 1;
8694   DECL_ARTIFICIAL (end) = 1;
8695   pushdecl (end);
8696   cp_finish_decl (end, end_expr,
8697                   /*is_constant_init*/false, NULL_TREE,
8698                   LOOKUP_ONLYCONVERTING);
8699
8700   finish_for_init_stmt (statement);
8701
8702   /* The new for condition.  */
8703   condition = build_x_binary_op (NE_EXPR,
8704                                  begin, ERROR_MARK,
8705                                  end, ERROR_MARK,
8706                                  NULL, tf_warning_or_error);
8707   finish_for_cond (condition, statement);
8708
8709   /* The new increment expression.  */
8710   expression = finish_unary_op_expr (PREINCREMENT_EXPR, begin);
8711   finish_for_expr (expression, statement);
8712
8713   /* The declaration is initialized with *__begin inside the loop body.  */
8714   cp_finish_decl (range_decl,
8715                   build_x_indirect_ref (begin, RO_NULL, tf_warning_or_error),
8716                   /*is_constant_init*/false, NULL_TREE,
8717                   LOOKUP_ONLYCONVERTING);
8718
8719   return statement;
8720 }
8721
8722 /* Solves BEGIN_EXPR and END_EXPR as described in cp_convert_range_for.
8723    We need to solve both at the same time because the method used
8724    depends on the existence of members begin or end.
8725    Returns the type deduced for the iterator expression.  */
8726
8727 static tree
8728 cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end)
8729 {
8730   if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (range))))
8731     {
8732       error ("range-based %<for%> expression of type %qT "
8733              "has incomplete type", TREE_TYPE (range));
8734       *begin = *end = error_mark_node;
8735       return error_mark_node;
8736     }
8737   if (TREE_CODE (TREE_TYPE (range)) == ARRAY_TYPE)
8738     {
8739       /* If RANGE is an array, we will use pointer arithmetic.  */
8740       *begin = range;
8741       *end = build_binary_op (input_location, PLUS_EXPR,
8742                               range,
8743                               array_type_nelts_top (TREE_TYPE (range)),
8744                               0);
8745       return build_pointer_type (TREE_TYPE (TREE_TYPE (range)));
8746     }
8747   else
8748     {
8749       /* If it is not an array, we must do a bit of magic.  */
8750       tree id_begin, id_end;
8751       tree member_begin, member_end;
8752
8753       *begin = *end = error_mark_node;
8754
8755       id_begin = get_identifier ("begin");
8756       id_end = get_identifier ("end");
8757       member_begin = lookup_member (TREE_TYPE (range), id_begin,
8758                                     /*protect=*/2, /*want_type=*/false);
8759       member_end = lookup_member (TREE_TYPE (range), id_end,
8760                                   /*protect=*/2, /*want_type=*/false);
8761
8762       if (member_begin != NULL_TREE || member_end != NULL_TREE)
8763         {
8764           /* Use the member functions.  */
8765           if (member_begin != NULL_TREE)
8766             *begin = cp_parser_range_for_member_function (range, id_begin);
8767           else
8768             error ("range-based %<for%> expression of type %qT has an "
8769                    "%<end%> member but not a %<begin%>", TREE_TYPE (range));
8770
8771           if (member_end != NULL_TREE)
8772             *end = cp_parser_range_for_member_function (range, id_end);
8773           else
8774             error ("range-based %<for%> expression of type %qT has a "
8775                    "%<begin%> member but not an %<end%>", TREE_TYPE (range));
8776         }
8777       else
8778         {
8779           /* Use global functions with ADL.  */
8780           VEC(tree,gc) *vec;
8781           vec = make_tree_vector ();
8782
8783           VEC_safe_push (tree, gc, vec, range);
8784
8785           member_begin = perform_koenig_lookup (id_begin, vec,
8786                                                 /*include_std=*/true,
8787                                                 tf_warning_or_error);
8788           *begin = finish_call_expr (member_begin, &vec, false, true,
8789                                      tf_warning_or_error);
8790           member_end = perform_koenig_lookup (id_end, vec,
8791                                               /*include_std=*/true,
8792                                               tf_warning_or_error);
8793           *end = finish_call_expr (member_end, &vec, false, true,
8794                                    tf_warning_or_error);
8795
8796           release_tree_vector (vec);
8797         }
8798
8799       /* Last common checks.  */
8800       if (*begin == error_mark_node || *end == error_mark_node)
8801         {
8802           /* If one of the expressions is an error do no more checks.  */
8803           *begin = *end = error_mark_node;
8804           return error_mark_node;
8805         }
8806       else
8807         {
8808           tree iter_type = cv_unqualified (TREE_TYPE (*begin));
8809           /* The unqualified type of the __begin and __end temporaries should
8810              be the same, as required by the multiple auto declaration.  */
8811           if (!same_type_p (iter_type, cv_unqualified (TREE_TYPE (*end))))
8812             error ("inconsistent begin/end types in range-based %<for%> "
8813                    "statement: %qT and %qT",
8814                    TREE_TYPE (*begin), TREE_TYPE (*end));
8815           return iter_type;
8816         }
8817     }
8818 }
8819
8820 /* Helper function for cp_parser_perform_range_for_lookup.
8821    Builds a tree for RANGE.IDENTIFIER().  */
8822
8823 static tree
8824 cp_parser_range_for_member_function (tree range, tree identifier)
8825 {
8826   tree member, res;
8827   VEC(tree,gc) *vec;
8828
8829   member = finish_class_member_access_expr (range, identifier,
8830                                             false, tf_warning_or_error);
8831   if (member == error_mark_node)
8832     return error_mark_node;
8833
8834   vec = make_tree_vector ();
8835   res = finish_call_expr (member, &vec,
8836                           /*disallow_virtual=*/false,
8837                           /*koenig_p=*/false,
8838                           tf_warning_or_error);
8839   release_tree_vector (vec);
8840   return res;
8841 }
8842
8843 /* Parse an iteration-statement.
8844
8845    iteration-statement:
8846      while ( condition ) statement
8847      do statement while ( expression ) ;
8848      for ( for-init-statement condition [opt] ; expression [opt] )
8849        statement
8850
8851    Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT.  */
8852
8853 static tree
8854 cp_parser_iteration_statement (cp_parser* parser)
8855 {
8856   cp_token *token;
8857   enum rid keyword;
8858   tree statement;
8859   unsigned char in_statement;
8860
8861   /* Peek at the next token.  */
8862   token = cp_parser_require (parser, CPP_KEYWORD, RT_INTERATION);
8863   if (!token)
8864     return error_mark_node;
8865
8866   /* Remember whether or not we are already within an iteration
8867      statement.  */
8868   in_statement = parser->in_statement;
8869
8870   /* See what kind of keyword it is.  */
8871   keyword = token->keyword;
8872   switch (keyword)
8873     {
8874     case RID_WHILE:
8875       {
8876         tree condition;
8877
8878         /* Begin the while-statement.  */
8879         statement = begin_while_stmt ();
8880         /* Look for the `('.  */
8881         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8882         /* Parse the condition.  */
8883         condition = cp_parser_condition (parser);
8884         finish_while_stmt_cond (condition, statement);
8885         /* Look for the `)'.  */
8886         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8887         /* Parse the dependent statement.  */
8888         parser->in_statement = IN_ITERATION_STMT;
8889         cp_parser_already_scoped_statement (parser);
8890         parser->in_statement = in_statement;
8891         /* We're done with the while-statement.  */
8892         finish_while_stmt (statement);
8893       }
8894       break;
8895
8896     case RID_DO:
8897       {
8898         tree expression;
8899
8900         /* Begin the do-statement.  */
8901         statement = begin_do_stmt ();
8902         /* Parse the body of the do-statement.  */
8903         parser->in_statement = IN_ITERATION_STMT;
8904         cp_parser_implicitly_scoped_statement (parser, NULL);
8905         parser->in_statement = in_statement;
8906         finish_do_body (statement);
8907         /* Look for the `while' keyword.  */
8908         cp_parser_require_keyword (parser, RID_WHILE, RT_WHILE);
8909         /* Look for the `('.  */
8910         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8911         /* Parse the expression.  */
8912         expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8913         /* We're done with the do-statement.  */
8914         finish_do_stmt (expression, statement);
8915         /* Look for the `)'.  */
8916         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8917         /* Look for the `;'.  */
8918         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8919       }
8920       break;
8921
8922     case RID_FOR:
8923       {
8924         /* Look for the `('.  */
8925         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8926
8927         statement = cp_parser_for (parser);
8928
8929         /* Look for the `)'.  */
8930         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8931
8932         /* Parse the body of the for-statement.  */
8933         parser->in_statement = IN_ITERATION_STMT;
8934         cp_parser_already_scoped_statement (parser);
8935         parser->in_statement = in_statement;
8936
8937         /* We're done with the for-statement.  */
8938         finish_for_stmt (statement);
8939       }
8940       break;
8941
8942     default:
8943       cp_parser_error (parser, "expected iteration-statement");
8944       statement = error_mark_node;
8945       break;
8946     }
8947
8948   return statement;
8949 }
8950
8951 /* Parse a for-init-statement or the declarator of a range-based-for.
8952    Returns true if a range-based-for declaration is seen.
8953
8954    for-init-statement:
8955      expression-statement
8956      simple-declaration  */
8957
8958 static bool
8959 cp_parser_for_init_statement (cp_parser* parser, tree *decl)
8960 {
8961   /* If the next token is a `;', then we have an empty
8962      expression-statement.  Grammatically, this is also a
8963      simple-declaration, but an invalid one, because it does not
8964      declare anything.  Therefore, if we did not handle this case
8965      specially, we would issue an error message about an invalid
8966      declaration.  */
8967   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8968     {
8969       bool is_range_for = false;
8970       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
8971
8972       parser->colon_corrects_to_scope_p = false;
8973
8974       /* We're going to speculatively look for a declaration, falling back
8975          to an expression, if necessary.  */
8976       cp_parser_parse_tentatively (parser);
8977       /* Parse the declaration.  */
8978       cp_parser_simple_declaration (parser,
8979                                     /*function_definition_allowed_p=*/false,
8980                                     decl);
8981       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8982       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
8983         {
8984           /* It is a range-for, consume the ':' */
8985           cp_lexer_consume_token (parser->lexer);
8986           is_range_for = true;
8987           if (cxx_dialect < cxx0x)
8988             {
8989               error_at (cp_lexer_peek_token (parser->lexer)->location,
8990                         "range-based %<for%> loops are not allowed "
8991                         "in C++98 mode");
8992               *decl = error_mark_node;
8993             }
8994         }
8995       else
8996           /* The ';' is not consumed yet because we told
8997              cp_parser_simple_declaration not to.  */
8998           cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8999
9000       if (cp_parser_parse_definitely (parser))
9001         return is_range_for;
9002       /* If the tentative parse failed, then we shall need to look for an
9003          expression-statement.  */
9004     }
9005   /* If we are here, it is an expression-statement.  */
9006   cp_parser_expression_statement (parser, NULL_TREE);
9007   return false;
9008 }
9009
9010 /* Parse a jump-statement.
9011
9012    jump-statement:
9013      break ;
9014      continue ;
9015      return expression [opt] ;
9016      return braced-init-list ;
9017      goto identifier ;
9018
9019    GNU extension:
9020
9021    jump-statement:
9022      goto * expression ;
9023
9024    Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR.  */
9025
9026 static tree
9027 cp_parser_jump_statement (cp_parser* parser)
9028 {
9029   tree statement = error_mark_node;
9030   cp_token *token;
9031   enum rid keyword;
9032   unsigned char in_statement;
9033
9034   /* Peek at the next token.  */
9035   token = cp_parser_require (parser, CPP_KEYWORD, RT_JUMP);
9036   if (!token)
9037     return error_mark_node;
9038
9039   /* See what kind of keyword it is.  */
9040   keyword = token->keyword;
9041   switch (keyword)
9042     {
9043     case RID_BREAK:
9044       in_statement = parser->in_statement & ~IN_IF_STMT;      
9045       switch (in_statement)
9046         {
9047         case 0:
9048           error_at (token->location, "break statement not within loop or switch");
9049           break;
9050         default:
9051           gcc_assert ((in_statement & IN_SWITCH_STMT)
9052                       || in_statement == IN_ITERATION_STMT);
9053           statement = finish_break_stmt ();
9054           break;
9055         case IN_OMP_BLOCK:
9056           error_at (token->location, "invalid exit from OpenMP structured block");
9057           break;
9058         case IN_OMP_FOR:
9059           error_at (token->location, "break statement used with OpenMP for loop");
9060           break;
9061         }
9062       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9063       break;
9064
9065     case RID_CONTINUE:
9066       switch (parser->in_statement & ~(IN_SWITCH_STMT | IN_IF_STMT))
9067         {
9068         case 0:
9069           error_at (token->location, "continue statement not within a loop");
9070           break;
9071         case IN_ITERATION_STMT:
9072         case IN_OMP_FOR:
9073           statement = finish_continue_stmt ();
9074           break;
9075         case IN_OMP_BLOCK:
9076           error_at (token->location, "invalid exit from OpenMP structured block");
9077           break;
9078         default:
9079           gcc_unreachable ();
9080         }
9081       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9082       break;
9083
9084     case RID_RETURN:
9085       {
9086         tree expr;
9087         bool expr_non_constant_p;
9088
9089         if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9090           {
9091             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
9092             expr = cp_parser_braced_list (parser, &expr_non_constant_p);
9093           }
9094         else if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9095           expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
9096         else
9097           /* If the next token is a `;', then there is no
9098              expression.  */
9099           expr = NULL_TREE;
9100         /* Build the return-statement.  */
9101         statement = finish_return_stmt (expr);
9102         /* Look for the final `;'.  */
9103         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9104       }
9105       break;
9106
9107     case RID_GOTO:
9108       /* Create the goto-statement.  */
9109       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
9110         {
9111           /* Issue a warning about this use of a GNU extension.  */
9112           pedwarn (token->location, OPT_pedantic, "ISO C++ forbids computed gotos");
9113           /* Consume the '*' token.  */
9114           cp_lexer_consume_token (parser->lexer);
9115           /* Parse the dependent expression.  */
9116           finish_goto_stmt (cp_parser_expression (parser, /*cast_p=*/false, NULL));
9117         }
9118       else
9119         finish_goto_stmt (cp_parser_identifier (parser));
9120       /* Look for the final `;'.  */
9121       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9122       break;
9123
9124     default:
9125       cp_parser_error (parser, "expected jump-statement");
9126       break;
9127     }
9128
9129   return statement;
9130 }
9131
9132 /* Parse a declaration-statement.
9133
9134    declaration-statement:
9135      block-declaration  */
9136
9137 static void
9138 cp_parser_declaration_statement (cp_parser* parser)
9139 {
9140   void *p;
9141
9142   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9143   p = obstack_alloc (&declarator_obstack, 0);
9144
9145  /* Parse the block-declaration.  */
9146   cp_parser_block_declaration (parser, /*statement_p=*/true);
9147
9148   /* Free any declarators allocated.  */
9149   obstack_free (&declarator_obstack, p);
9150
9151   /* Finish off the statement.  */
9152   finish_stmt ();
9153 }
9154
9155 /* Some dependent statements (like `if (cond) statement'), are
9156    implicitly in their own scope.  In other words, if the statement is
9157    a single statement (as opposed to a compound-statement), it is
9158    none-the-less treated as if it were enclosed in braces.  Any
9159    declarations appearing in the dependent statement are out of scope
9160    after control passes that point.  This function parses a statement,
9161    but ensures that is in its own scope, even if it is not a
9162    compound-statement.
9163
9164    If IF_P is not NULL, *IF_P is set to indicate whether the statement
9165    is a (possibly labeled) if statement which is not enclosed in
9166    braces and has an else clause.  This is used to implement
9167    -Wparentheses.
9168
9169    Returns the new statement.  */
9170
9171 static tree
9172 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p)
9173 {
9174   tree statement;
9175
9176   if (if_p != NULL)
9177     *if_p = false;
9178
9179   /* Mark if () ; with a special NOP_EXPR.  */
9180   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9181     {
9182       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9183       cp_lexer_consume_token (parser->lexer);
9184       statement = add_stmt (build_empty_stmt (loc));
9185     }
9186   /* if a compound is opened, we simply parse the statement directly.  */
9187   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9188     statement = cp_parser_compound_statement (parser, NULL, false, false);
9189   /* If the token is not a `{', then we must take special action.  */
9190   else
9191     {
9192       /* Create a compound-statement.  */
9193       statement = begin_compound_stmt (0);
9194       /* Parse the dependent-statement.  */
9195       cp_parser_statement (parser, NULL_TREE, false, if_p);
9196       /* Finish the dummy compound-statement.  */
9197       finish_compound_stmt (statement);
9198     }
9199
9200   /* Return the statement.  */
9201   return statement;
9202 }
9203
9204 /* For some dependent statements (like `while (cond) statement'), we
9205    have already created a scope.  Therefore, even if the dependent
9206    statement is a compound-statement, we do not want to create another
9207    scope.  */
9208
9209 static void
9210 cp_parser_already_scoped_statement (cp_parser* parser)
9211 {
9212   /* If the token is a `{', then we must take special action.  */
9213   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
9214     cp_parser_statement (parser, NULL_TREE, false, NULL);
9215   else
9216     {
9217       /* Avoid calling cp_parser_compound_statement, so that we
9218          don't create a new scope.  Do everything else by hand.  */
9219       cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
9220       /* If the next keyword is `__label__' we have a label declaration.  */
9221       while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
9222         cp_parser_label_declaration (parser);
9223       /* Parse an (optional) statement-seq.  */
9224       cp_parser_statement_seq_opt (parser, NULL_TREE);
9225       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
9226     }
9227 }
9228
9229 /* Declarations [gram.dcl.dcl] */
9230
9231 /* Parse an optional declaration-sequence.
9232
9233    declaration-seq:
9234      declaration
9235      declaration-seq declaration  */
9236
9237 static void
9238 cp_parser_declaration_seq_opt (cp_parser* parser)
9239 {
9240   while (true)
9241     {
9242       cp_token *token;
9243
9244       token = cp_lexer_peek_token (parser->lexer);
9245
9246       if (token->type == CPP_CLOSE_BRACE
9247           || token->type == CPP_EOF
9248           || token->type == CPP_PRAGMA_EOL)
9249         break;
9250
9251       if (token->type == CPP_SEMICOLON)
9252         {
9253           /* A declaration consisting of a single semicolon is
9254              invalid.  Allow it unless we're being pedantic.  */
9255           cp_lexer_consume_token (parser->lexer);
9256           if (!in_system_header)
9257             pedwarn (input_location, OPT_pedantic, "extra %<;%>");
9258           continue;
9259         }
9260
9261       /* If we're entering or exiting a region that's implicitly
9262          extern "C", modify the lang context appropriately.  */
9263       if (!parser->implicit_extern_c && token->implicit_extern_c)
9264         {
9265           push_lang_context (lang_name_c);
9266           parser->implicit_extern_c = true;
9267         }
9268       else if (parser->implicit_extern_c && !token->implicit_extern_c)
9269         {
9270           pop_lang_context ();
9271           parser->implicit_extern_c = false;
9272         }
9273
9274       if (token->type == CPP_PRAGMA)
9275         {
9276           /* A top-level declaration can consist solely of a #pragma.
9277              A nested declaration cannot, so this is done here and not
9278              in cp_parser_declaration.  (A #pragma at block scope is
9279              handled in cp_parser_statement.)  */
9280           cp_parser_pragma (parser, pragma_external);
9281           continue;
9282         }
9283
9284       /* Parse the declaration itself.  */
9285       cp_parser_declaration (parser);
9286     }
9287 }
9288
9289 /* Parse a declaration.
9290
9291    declaration:
9292      block-declaration
9293      function-definition
9294      template-declaration
9295      explicit-instantiation
9296      explicit-specialization
9297      linkage-specification
9298      namespace-definition
9299
9300    GNU extension:
9301
9302    declaration:
9303       __extension__ declaration */
9304
9305 static void
9306 cp_parser_declaration (cp_parser* parser)
9307 {
9308   cp_token token1;
9309   cp_token token2;
9310   int saved_pedantic;
9311   void *p;
9312   tree attributes = NULL_TREE;
9313
9314   /* Check for the `__extension__' keyword.  */
9315   if (cp_parser_extension_opt (parser, &saved_pedantic))
9316     {
9317       /* Parse the qualified declaration.  */
9318       cp_parser_declaration (parser);
9319       /* Restore the PEDANTIC flag.  */
9320       pedantic = saved_pedantic;
9321
9322       return;
9323     }
9324
9325   /* Try to figure out what kind of declaration is present.  */
9326   token1 = *cp_lexer_peek_token (parser->lexer);
9327
9328   if (token1.type != CPP_EOF)
9329     token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
9330   else
9331     {
9332       token2.type = CPP_EOF;
9333       token2.keyword = RID_MAX;
9334     }
9335
9336   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9337   p = obstack_alloc (&declarator_obstack, 0);
9338
9339   /* If the next token is `extern' and the following token is a string
9340      literal, then we have a linkage specification.  */
9341   if (token1.keyword == RID_EXTERN
9342       && cp_parser_is_string_literal (&token2))
9343     cp_parser_linkage_specification (parser);
9344   /* If the next token is `template', then we have either a template
9345      declaration, an explicit instantiation, or an explicit
9346      specialization.  */
9347   else if (token1.keyword == RID_TEMPLATE)
9348     {
9349       /* `template <>' indicates a template specialization.  */
9350       if (token2.type == CPP_LESS
9351           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
9352         cp_parser_explicit_specialization (parser);
9353       /* `template <' indicates a template declaration.  */
9354       else if (token2.type == CPP_LESS)
9355         cp_parser_template_declaration (parser, /*member_p=*/false);
9356       /* Anything else must be an explicit instantiation.  */
9357       else
9358         cp_parser_explicit_instantiation (parser);
9359     }
9360   /* If the next token is `export', then we have a template
9361      declaration.  */
9362   else if (token1.keyword == RID_EXPORT)
9363     cp_parser_template_declaration (parser, /*member_p=*/false);
9364   /* If the next token is `extern', 'static' or 'inline' and the one
9365      after that is `template', we have a GNU extended explicit
9366      instantiation directive.  */
9367   else if (cp_parser_allow_gnu_extensions_p (parser)
9368            && (token1.keyword == RID_EXTERN
9369                || token1.keyword == RID_STATIC
9370                || token1.keyword == RID_INLINE)
9371            && token2.keyword == RID_TEMPLATE)
9372     cp_parser_explicit_instantiation (parser);
9373   /* If the next token is `namespace', check for a named or unnamed
9374      namespace definition.  */
9375   else if (token1.keyword == RID_NAMESPACE
9376            && (/* A named namespace definition.  */
9377                (token2.type == CPP_NAME
9378                 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
9379                     != CPP_EQ))
9380                /* An unnamed namespace definition.  */
9381                || token2.type == CPP_OPEN_BRACE
9382                || token2.keyword == RID_ATTRIBUTE))
9383     cp_parser_namespace_definition (parser);
9384   /* An inline (associated) namespace definition.  */
9385   else if (token1.keyword == RID_INLINE
9386            && token2.keyword == RID_NAMESPACE)
9387     cp_parser_namespace_definition (parser);
9388   /* Objective-C++ declaration/definition.  */
9389   else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
9390     cp_parser_objc_declaration (parser, NULL_TREE);
9391   else if (c_dialect_objc ()
9392            && token1.keyword == RID_ATTRIBUTE
9393            && cp_parser_objc_valid_prefix_attributes (parser, &attributes))
9394     cp_parser_objc_declaration (parser, attributes);
9395   /* We must have either a block declaration or a function
9396      definition.  */
9397   else
9398     /* Try to parse a block-declaration, or a function-definition.  */
9399     cp_parser_block_declaration (parser, /*statement_p=*/false);
9400
9401   /* Free any declarators allocated.  */
9402   obstack_free (&declarator_obstack, p);
9403 }
9404
9405 /* Parse a block-declaration.
9406
9407    block-declaration:
9408      simple-declaration
9409      asm-definition
9410      namespace-alias-definition
9411      using-declaration
9412      using-directive
9413
9414    GNU Extension:
9415
9416    block-declaration:
9417      __extension__ block-declaration
9418
9419    C++0x Extension:
9420
9421    block-declaration:
9422      static_assert-declaration
9423
9424    If STATEMENT_P is TRUE, then this block-declaration is occurring as
9425    part of a declaration-statement.  */
9426
9427 static void
9428 cp_parser_block_declaration (cp_parser *parser,
9429                              bool      statement_p)
9430 {
9431   cp_token *token1;
9432   int saved_pedantic;
9433
9434   /* Check for the `__extension__' keyword.  */
9435   if (cp_parser_extension_opt (parser, &saved_pedantic))
9436     {
9437       /* Parse the qualified declaration.  */
9438       cp_parser_block_declaration (parser, statement_p);
9439       /* Restore the PEDANTIC flag.  */
9440       pedantic = saved_pedantic;
9441
9442       return;
9443     }
9444
9445   /* Peek at the next token to figure out which kind of declaration is
9446      present.  */
9447   token1 = cp_lexer_peek_token (parser->lexer);
9448
9449   /* If the next keyword is `asm', we have an asm-definition.  */
9450   if (token1->keyword == RID_ASM)
9451     {
9452       if (statement_p)
9453         cp_parser_commit_to_tentative_parse (parser);
9454       cp_parser_asm_definition (parser);
9455     }
9456   /* If the next keyword is `namespace', we have a
9457      namespace-alias-definition.  */
9458   else if (token1->keyword == RID_NAMESPACE)
9459     cp_parser_namespace_alias_definition (parser);
9460   /* If the next keyword is `using', we have either a
9461      using-declaration or a using-directive.  */
9462   else if (token1->keyword == RID_USING)
9463     {
9464       cp_token *token2;
9465
9466       if (statement_p)
9467         cp_parser_commit_to_tentative_parse (parser);
9468       /* If the token after `using' is `namespace', then we have a
9469          using-directive.  */
9470       token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
9471       if (token2->keyword == RID_NAMESPACE)
9472         cp_parser_using_directive (parser);
9473       /* Otherwise, it's a using-declaration.  */
9474       else
9475         cp_parser_using_declaration (parser,
9476                                      /*access_declaration_p=*/false);
9477     }
9478   /* If the next keyword is `__label__' we have a misplaced label
9479      declaration.  */
9480   else if (token1->keyword == RID_LABEL)
9481     {
9482       cp_lexer_consume_token (parser->lexer);
9483       error_at (token1->location, "%<__label__%> not at the beginning of a block");
9484       cp_parser_skip_to_end_of_statement (parser);
9485       /* If the next token is now a `;', consume it.  */
9486       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9487         cp_lexer_consume_token (parser->lexer);
9488     }
9489   /* If the next token is `static_assert' we have a static assertion.  */
9490   else if (token1->keyword == RID_STATIC_ASSERT)
9491     cp_parser_static_assert (parser, /*member_p=*/false);
9492   /* Anything else must be a simple-declaration.  */
9493   else
9494     cp_parser_simple_declaration (parser, !statement_p,
9495                                   /*maybe_range_for_decl*/NULL);
9496 }
9497
9498 /* Parse a simple-declaration.
9499
9500    simple-declaration:
9501      decl-specifier-seq [opt] init-declarator-list [opt] ;
9502
9503    init-declarator-list:
9504      init-declarator
9505      init-declarator-list , init-declarator
9506
9507    If FUNCTION_DEFINITION_ALLOWED_P is TRUE, then we also recognize a
9508    function-definition as a simple-declaration.
9509
9510    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
9511    parsed declaration if it is an uninitialized single declarator not followed
9512    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
9513    if present, will not be consumed.  */
9514
9515 static void
9516 cp_parser_simple_declaration (cp_parser* parser,
9517                               bool function_definition_allowed_p,
9518                               tree *maybe_range_for_decl)
9519 {
9520   cp_decl_specifier_seq decl_specifiers;
9521   int declares_class_or_enum;
9522   bool saw_declarator;
9523
9524   if (maybe_range_for_decl)
9525     *maybe_range_for_decl = NULL_TREE;
9526
9527   /* Defer access checks until we know what is being declared; the
9528      checks for names appearing in the decl-specifier-seq should be
9529      done as if we were in the scope of the thing being declared.  */
9530   push_deferring_access_checks (dk_deferred);
9531
9532   /* Parse the decl-specifier-seq.  We have to keep track of whether
9533      or not the decl-specifier-seq declares a named class or
9534      enumeration type, since that is the only case in which the
9535      init-declarator-list is allowed to be empty.
9536
9537      [dcl.dcl]
9538
9539      In a simple-declaration, the optional init-declarator-list can be
9540      omitted only when declaring a class or enumeration, that is when
9541      the decl-specifier-seq contains either a class-specifier, an
9542      elaborated-type-specifier, or an enum-specifier.  */
9543   cp_parser_decl_specifier_seq (parser,
9544                                 CP_PARSER_FLAGS_OPTIONAL,
9545                                 &decl_specifiers,
9546                                 &declares_class_or_enum);
9547   /* We no longer need to defer access checks.  */
9548   stop_deferring_access_checks ();
9549
9550   /* In a block scope, a valid declaration must always have a
9551      decl-specifier-seq.  By not trying to parse declarators, we can
9552      resolve the declaration/expression ambiguity more quickly.  */
9553   if (!function_definition_allowed_p
9554       && !decl_specifiers.any_specifiers_p)
9555     {
9556       cp_parser_error (parser, "expected declaration");
9557       goto done;
9558     }
9559
9560   /* If the next two tokens are both identifiers, the code is
9561      erroneous. The usual cause of this situation is code like:
9562
9563        T t;
9564
9565      where "T" should name a type -- but does not.  */
9566   if (!decl_specifiers.any_type_specifiers_p
9567       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
9568     {
9569       /* If parsing tentatively, we should commit; we really are
9570          looking at a declaration.  */
9571       cp_parser_commit_to_tentative_parse (parser);
9572       /* Give up.  */
9573       goto done;
9574     }
9575
9576   /* If we have seen at least one decl-specifier, and the next token
9577      is not a parenthesis, then we must be looking at a declaration.
9578      (After "int (" we might be looking at a functional cast.)  */
9579   if (decl_specifiers.any_specifiers_p
9580       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
9581       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
9582       && !cp_parser_error_occurred (parser))
9583     cp_parser_commit_to_tentative_parse (parser);
9584
9585   /* Keep going until we hit the `;' at the end of the simple
9586      declaration.  */
9587   saw_declarator = false;
9588   while (cp_lexer_next_token_is_not (parser->lexer,
9589                                      CPP_SEMICOLON))
9590     {
9591       cp_token *token;
9592       bool function_definition_p;
9593       tree decl;
9594
9595       if (saw_declarator)
9596         {
9597           /* If we are processing next declarator, coma is expected */
9598           token = cp_lexer_peek_token (parser->lexer);
9599           gcc_assert (token->type == CPP_COMMA);
9600           cp_lexer_consume_token (parser->lexer);
9601           if (maybe_range_for_decl)
9602             *maybe_range_for_decl = error_mark_node;
9603         }
9604       else
9605         saw_declarator = true;
9606
9607       /* Parse the init-declarator.  */
9608       decl = cp_parser_init_declarator (parser, &decl_specifiers,
9609                                         /*checks=*/NULL,
9610                                         function_definition_allowed_p,
9611                                         /*member_p=*/false,
9612                                         declares_class_or_enum,
9613                                         &function_definition_p,
9614                                         maybe_range_for_decl);
9615       /* If an error occurred while parsing tentatively, exit quickly.
9616          (That usually happens when in the body of a function; each
9617          statement is treated as a declaration-statement until proven
9618          otherwise.)  */
9619       if (cp_parser_error_occurred (parser))
9620         goto done;
9621       /* Handle function definitions specially.  */
9622       if (function_definition_p)
9623         {
9624           /* If the next token is a `,', then we are probably
9625              processing something like:
9626
9627                void f() {}, *p;
9628
9629              which is erroneous.  */
9630           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
9631             {
9632               cp_token *token = cp_lexer_peek_token (parser->lexer);
9633               error_at (token->location,
9634                         "mixing"
9635                         " declarations and function-definitions is forbidden");
9636             }
9637           /* Otherwise, we're done with the list of declarators.  */
9638           else
9639             {
9640               pop_deferring_access_checks ();
9641               return;
9642             }
9643         }
9644       if (maybe_range_for_decl && *maybe_range_for_decl == NULL_TREE)
9645         *maybe_range_for_decl = decl;
9646       /* The next token should be either a `,' or a `;'.  */
9647       token = cp_lexer_peek_token (parser->lexer);
9648       /* If it's a `,', there are more declarators to come.  */
9649       if (token->type == CPP_COMMA)
9650         /* will be consumed next time around */;
9651       /* If it's a `;', we are done.  */
9652       else if (token->type == CPP_SEMICOLON || maybe_range_for_decl)
9653         break;
9654       /* Anything else is an error.  */
9655       else
9656         {
9657           /* If we have already issued an error message we don't need
9658              to issue another one.  */
9659           if (decl != error_mark_node
9660               || cp_parser_uncommitted_to_tentative_parse_p (parser))
9661             cp_parser_error (parser, "expected %<,%> or %<;%>");
9662           /* Skip tokens until we reach the end of the statement.  */
9663           cp_parser_skip_to_end_of_statement (parser);
9664           /* If the next token is now a `;', consume it.  */
9665           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9666             cp_lexer_consume_token (parser->lexer);
9667           goto done;
9668         }
9669       /* After the first time around, a function-definition is not
9670          allowed -- even if it was OK at first.  For example:
9671
9672            int i, f() {}
9673
9674          is not valid.  */
9675       function_definition_allowed_p = false;
9676     }
9677
9678   /* Issue an error message if no declarators are present, and the
9679      decl-specifier-seq does not itself declare a class or
9680      enumeration.  */
9681   if (!saw_declarator)
9682     {
9683       if (cp_parser_declares_only_class_p (parser))
9684         shadow_tag (&decl_specifiers);
9685       /* Perform any deferred access checks.  */
9686       perform_deferred_access_checks ();
9687     }
9688
9689   /* Consume the `;'.  */
9690   if (!maybe_range_for_decl)
9691       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9692
9693  done:
9694   pop_deferring_access_checks ();
9695 }
9696
9697 /* Parse a decl-specifier-seq.
9698
9699    decl-specifier-seq:
9700      decl-specifier-seq [opt] decl-specifier
9701
9702    decl-specifier:
9703      storage-class-specifier
9704      type-specifier
9705      function-specifier
9706      friend
9707      typedef
9708
9709    GNU Extension:
9710
9711    decl-specifier:
9712      attributes
9713
9714    Set *DECL_SPECS to a representation of the decl-specifier-seq.
9715
9716    The parser flags FLAGS is used to control type-specifier parsing.
9717
9718    *DECLARES_CLASS_OR_ENUM is set to the bitwise or of the following
9719    flags:
9720
9721      1: one of the decl-specifiers is an elaborated-type-specifier
9722         (i.e., a type declaration)
9723      2: one of the decl-specifiers is an enum-specifier or a
9724         class-specifier (i.e., a type definition)
9725
9726    */
9727
9728 static void
9729 cp_parser_decl_specifier_seq (cp_parser* parser,
9730                               cp_parser_flags flags,
9731                               cp_decl_specifier_seq *decl_specs,
9732                               int* declares_class_or_enum)
9733 {
9734   bool constructor_possible_p = !parser->in_declarator_p;
9735   cp_token *start_token = NULL;
9736
9737   /* Clear DECL_SPECS.  */
9738   clear_decl_specs (decl_specs);
9739
9740   /* Assume no class or enumeration type is declared.  */
9741   *declares_class_or_enum = 0;
9742
9743   /* Keep reading specifiers until there are no more to read.  */
9744   while (true)
9745     {
9746       bool constructor_p;
9747       bool found_decl_spec;
9748       cp_token *token;
9749
9750       /* Peek at the next token.  */
9751       token = cp_lexer_peek_token (parser->lexer);
9752
9753       /* Save the first token of the decl spec list for error
9754          reporting.  */
9755       if (!start_token)
9756         start_token = token;
9757       /* Handle attributes.  */
9758       if (token->keyword == RID_ATTRIBUTE)
9759         {
9760           /* Parse the attributes.  */
9761           decl_specs->attributes
9762             = chainon (decl_specs->attributes,
9763                        cp_parser_attributes_opt (parser));
9764           continue;
9765         }
9766       /* Assume we will find a decl-specifier keyword.  */
9767       found_decl_spec = true;
9768       /* If the next token is an appropriate keyword, we can simply
9769          add it to the list.  */
9770       switch (token->keyword)
9771         {
9772           /* decl-specifier:
9773                friend
9774                constexpr */
9775         case RID_FRIEND:
9776           if (!at_class_scope_p ())
9777             {
9778               error_at (token->location, "%<friend%> used outside of class");
9779               cp_lexer_purge_token (parser->lexer);
9780             }
9781           else
9782             {
9783               ++decl_specs->specs[(int) ds_friend];
9784               /* Consume the token.  */
9785               cp_lexer_consume_token (parser->lexer);
9786             }
9787           break;
9788
9789         case RID_CONSTEXPR:
9790           ++decl_specs->specs[(int) ds_constexpr];
9791           cp_lexer_consume_token (parser->lexer);
9792           break;
9793
9794           /* function-specifier:
9795                inline
9796                virtual
9797                explicit  */
9798         case RID_INLINE:
9799         case RID_VIRTUAL:
9800         case RID_EXPLICIT:
9801           cp_parser_function_specifier_opt (parser, decl_specs);
9802           break;
9803
9804           /* decl-specifier:
9805                typedef  */
9806         case RID_TYPEDEF:
9807           ++decl_specs->specs[(int) ds_typedef];
9808           /* Consume the token.  */
9809           cp_lexer_consume_token (parser->lexer);
9810           /* A constructor declarator cannot appear in a typedef.  */
9811           constructor_possible_p = false;
9812           /* The "typedef" keyword can only occur in a declaration; we
9813              may as well commit at this point.  */
9814           cp_parser_commit_to_tentative_parse (parser);
9815
9816           if (decl_specs->storage_class != sc_none)
9817             decl_specs->conflicting_specifiers_p = true;
9818           break;
9819
9820           /* storage-class-specifier:
9821                auto
9822                register
9823                static
9824                extern
9825                mutable
9826
9827              GNU Extension:
9828                thread  */
9829         case RID_AUTO:
9830           if (cxx_dialect == cxx98) 
9831             {
9832               /* Consume the token.  */
9833               cp_lexer_consume_token (parser->lexer);
9834
9835               /* Complain about `auto' as a storage specifier, if
9836                  we're complaining about C++0x compatibility.  */
9837               warning_at (token->location, OPT_Wc__0x_compat, "%<auto%>"
9838                           " will change meaning in C++0x; please remove it");
9839
9840               /* Set the storage class anyway.  */
9841               cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
9842                                            token->location);
9843             }
9844           else
9845             /* C++0x auto type-specifier.  */
9846             found_decl_spec = false;
9847           break;
9848
9849         case RID_REGISTER:
9850         case RID_STATIC:
9851         case RID_EXTERN:
9852         case RID_MUTABLE:
9853           /* Consume the token.  */
9854           cp_lexer_consume_token (parser->lexer);
9855           cp_parser_set_storage_class (parser, decl_specs, token->keyword,
9856                                        token->location);
9857           break;
9858         case RID_THREAD:
9859           /* Consume the token.  */
9860           cp_lexer_consume_token (parser->lexer);
9861           ++decl_specs->specs[(int) ds_thread];
9862           break;
9863
9864         default:
9865           /* We did not yet find a decl-specifier yet.  */
9866           found_decl_spec = false;
9867           break;
9868         }
9869
9870       if (found_decl_spec
9871           && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
9872           && token->keyword != RID_CONSTEXPR)
9873         error ("decl-specifier invalid in condition");
9874
9875       /* Constructors are a special case.  The `S' in `S()' is not a
9876          decl-specifier; it is the beginning of the declarator.  */
9877       constructor_p
9878         = (!found_decl_spec
9879            && constructor_possible_p
9880            && (cp_parser_constructor_declarator_p
9881                (parser, decl_specs->specs[(int) ds_friend] != 0)));
9882
9883       /* If we don't have a DECL_SPEC yet, then we must be looking at
9884          a type-specifier.  */
9885       if (!found_decl_spec && !constructor_p)
9886         {
9887           int decl_spec_declares_class_or_enum;
9888           bool is_cv_qualifier;
9889           tree type_spec;
9890
9891           type_spec
9892             = cp_parser_type_specifier (parser, flags,
9893                                         decl_specs,
9894                                         /*is_declaration=*/true,
9895                                         &decl_spec_declares_class_or_enum,
9896                                         &is_cv_qualifier);
9897           *declares_class_or_enum |= decl_spec_declares_class_or_enum;
9898
9899           /* If this type-specifier referenced a user-defined type
9900              (a typedef, class-name, etc.), then we can't allow any
9901              more such type-specifiers henceforth.
9902
9903              [dcl.spec]
9904
9905              The longest sequence of decl-specifiers that could
9906              possibly be a type name is taken as the
9907              decl-specifier-seq of a declaration.  The sequence shall
9908              be self-consistent as described below.
9909
9910              [dcl.type]
9911
9912              As a general rule, at most one type-specifier is allowed
9913              in the complete decl-specifier-seq of a declaration.  The
9914              only exceptions are the following:
9915
9916              -- const or volatile can be combined with any other
9917                 type-specifier.
9918
9919              -- signed or unsigned can be combined with char, long,
9920                 short, or int.
9921
9922              -- ..
9923
9924              Example:
9925
9926                typedef char* Pc;
9927                void g (const int Pc);
9928
9929              Here, Pc is *not* part of the decl-specifier seq; it's
9930              the declarator.  Therefore, once we see a type-specifier
9931              (other than a cv-qualifier), we forbid any additional
9932              user-defined types.  We *do* still allow things like `int
9933              int' to be considered a decl-specifier-seq, and issue the
9934              error message later.  */
9935           if (type_spec && !is_cv_qualifier)
9936             flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
9937           /* A constructor declarator cannot follow a type-specifier.  */
9938           if (type_spec)
9939             {
9940               constructor_possible_p = false;
9941               found_decl_spec = true;
9942               if (!is_cv_qualifier)
9943                 decl_specs->any_type_specifiers_p = true;
9944             }
9945         }
9946
9947       /* If we still do not have a DECL_SPEC, then there are no more
9948          decl-specifiers.  */
9949       if (!found_decl_spec)
9950         break;
9951
9952       decl_specs->any_specifiers_p = true;
9953       /* After we see one decl-specifier, further decl-specifiers are
9954          always optional.  */
9955       flags |= CP_PARSER_FLAGS_OPTIONAL;
9956     }
9957
9958   cp_parser_check_decl_spec (decl_specs, start_token->location);
9959
9960   /* Don't allow a friend specifier with a class definition.  */
9961   if (decl_specs->specs[(int) ds_friend] != 0
9962       && (*declares_class_or_enum & 2))
9963     error_at (start_token->location,
9964               "class definition may not be declared a friend");
9965 }
9966
9967 /* Parse an (optional) storage-class-specifier.
9968
9969    storage-class-specifier:
9970      auto
9971      register
9972      static
9973      extern
9974      mutable
9975
9976    GNU Extension:
9977
9978    storage-class-specifier:
9979      thread
9980
9981    Returns an IDENTIFIER_NODE corresponding to the keyword used.  */
9982
9983 static tree
9984 cp_parser_storage_class_specifier_opt (cp_parser* parser)
9985 {
9986   switch (cp_lexer_peek_token (parser->lexer)->keyword)
9987     {
9988     case RID_AUTO:
9989       if (cxx_dialect != cxx98)
9990         return NULL_TREE;
9991       /* Fall through for C++98.  */
9992
9993     case RID_REGISTER:
9994     case RID_STATIC:
9995     case RID_EXTERN:
9996     case RID_MUTABLE:
9997     case RID_THREAD:
9998       /* Consume the token.  */
9999       return cp_lexer_consume_token (parser->lexer)->u.value;
10000
10001     default:
10002       return NULL_TREE;
10003     }
10004 }
10005
10006 /* Parse an (optional) function-specifier.
10007
10008    function-specifier:
10009      inline
10010      virtual
10011      explicit
10012
10013    Returns an IDENTIFIER_NODE corresponding to the keyword used.
10014    Updates DECL_SPECS, if it is non-NULL.  */
10015
10016 static tree
10017 cp_parser_function_specifier_opt (cp_parser* parser,
10018                                   cp_decl_specifier_seq *decl_specs)
10019 {
10020   cp_token *token = cp_lexer_peek_token (parser->lexer);
10021   switch (token->keyword)
10022     {
10023     case RID_INLINE:
10024       if (decl_specs)
10025         ++decl_specs->specs[(int) ds_inline];
10026       break;
10027
10028     case RID_VIRTUAL:
10029       /* 14.5.2.3 [temp.mem]
10030
10031          A member function template shall not be virtual.  */
10032       if (PROCESSING_REAL_TEMPLATE_DECL_P ())
10033         error_at (token->location, "templates may not be %<virtual%>");
10034       else if (decl_specs)
10035         ++decl_specs->specs[(int) ds_virtual];
10036       break;
10037
10038     case RID_EXPLICIT:
10039       if (decl_specs)
10040         ++decl_specs->specs[(int) ds_explicit];
10041       break;
10042
10043     default:
10044       return NULL_TREE;
10045     }
10046
10047   /* Consume the token.  */
10048   return cp_lexer_consume_token (parser->lexer)->u.value;
10049 }
10050
10051 /* Parse a linkage-specification.
10052
10053    linkage-specification:
10054      extern string-literal { declaration-seq [opt] }
10055      extern string-literal declaration  */
10056
10057 static void
10058 cp_parser_linkage_specification (cp_parser* parser)
10059 {
10060   tree linkage;
10061
10062   /* Look for the `extern' keyword.  */
10063   cp_parser_require_keyword (parser, RID_EXTERN, RT_EXTERN);
10064
10065   /* Look for the string-literal.  */
10066   linkage = cp_parser_string_literal (parser, false, false);
10067
10068   /* Transform the literal into an identifier.  If the literal is a
10069      wide-character string, or contains embedded NULs, then we can't
10070      handle it as the user wants.  */
10071   if (strlen (TREE_STRING_POINTER (linkage))
10072       != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
10073     {
10074       cp_parser_error (parser, "invalid linkage-specification");
10075       /* Assume C++ linkage.  */
10076       linkage = lang_name_cplusplus;
10077     }
10078   else
10079     linkage = get_identifier (TREE_STRING_POINTER (linkage));
10080
10081   /* We're now using the new linkage.  */
10082   push_lang_context (linkage);
10083
10084   /* If the next token is a `{', then we're using the first
10085      production.  */
10086   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10087     {
10088       /* Consume the `{' token.  */
10089       cp_lexer_consume_token (parser->lexer);
10090       /* Parse the declarations.  */
10091       cp_parser_declaration_seq_opt (parser);
10092       /* Look for the closing `}'.  */
10093       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
10094     }
10095   /* Otherwise, there's just one declaration.  */
10096   else
10097     {
10098       bool saved_in_unbraced_linkage_specification_p;
10099
10100       saved_in_unbraced_linkage_specification_p
10101         = parser->in_unbraced_linkage_specification_p;
10102       parser->in_unbraced_linkage_specification_p = true;
10103       cp_parser_declaration (parser);
10104       parser->in_unbraced_linkage_specification_p
10105         = saved_in_unbraced_linkage_specification_p;
10106     }
10107
10108   /* We're done with the linkage-specification.  */
10109   pop_lang_context ();
10110 }
10111
10112 /* Parse a static_assert-declaration.
10113
10114    static_assert-declaration:
10115      static_assert ( constant-expression , string-literal ) ; 
10116
10117    If MEMBER_P, this static_assert is a class member.  */
10118
10119 static void 
10120 cp_parser_static_assert(cp_parser *parser, bool member_p)
10121 {
10122   tree condition;
10123   tree message;
10124   cp_token *token;
10125   location_t saved_loc;
10126   bool dummy;
10127
10128   /* Peek at the `static_assert' token so we can keep track of exactly
10129      where the static assertion started.  */
10130   token = cp_lexer_peek_token (parser->lexer);
10131   saved_loc = token->location;
10132
10133   /* Look for the `static_assert' keyword.  */
10134   if (!cp_parser_require_keyword (parser, RID_STATIC_ASSERT, 
10135                                   RT_STATIC_ASSERT))
10136     return;
10137
10138   /*  We know we are in a static assertion; commit to any tentative
10139       parse.  */
10140   if (cp_parser_parsing_tentatively (parser))
10141     cp_parser_commit_to_tentative_parse (parser);
10142
10143   /* Parse the `(' starting the static assertion condition.  */
10144   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10145
10146   /* Parse the constant-expression.  Allow a non-constant expression
10147      here in order to give better diagnostics in finish_static_assert.  */
10148   condition = 
10149     cp_parser_constant_expression (parser,
10150                                    /*allow_non_constant_p=*/true,
10151                                    /*non_constant_p=*/&dummy);
10152
10153   /* Parse the separating `,'.  */
10154   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
10155
10156   /* Parse the string-literal message.  */
10157   message = cp_parser_string_literal (parser, 
10158                                       /*translate=*/false,
10159                                       /*wide_ok=*/true);
10160
10161   /* A `)' completes the static assertion.  */
10162   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10163     cp_parser_skip_to_closing_parenthesis (parser, 
10164                                            /*recovering=*/true, 
10165                                            /*or_comma=*/false,
10166                                            /*consume_paren=*/true);
10167
10168   /* A semicolon terminates the declaration.  */
10169   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10170
10171   /* Complete the static assertion, which may mean either processing 
10172      the static assert now or saving it for template instantiation.  */
10173   finish_static_assert (condition, message, saved_loc, member_p);
10174 }
10175
10176 /* Parse a `decltype' type. Returns the type. 
10177
10178    simple-type-specifier:
10179      decltype ( expression )  */
10180
10181 static tree
10182 cp_parser_decltype (cp_parser *parser)
10183 {
10184   tree expr;
10185   bool id_expression_or_member_access_p = false;
10186   const char *saved_message;
10187   bool saved_integral_constant_expression_p;
10188   bool saved_non_integral_constant_expression_p;
10189   cp_token *id_expr_start_token;
10190
10191   /* Look for the `decltype' token.  */
10192   if (!cp_parser_require_keyword (parser, RID_DECLTYPE, RT_DECLTYPE))
10193     return error_mark_node;
10194
10195   /* Types cannot be defined in a `decltype' expression.  Save away the
10196      old message.  */
10197   saved_message = parser->type_definition_forbidden_message;
10198
10199   /* And create the new one.  */
10200   parser->type_definition_forbidden_message
10201     = G_("types may not be defined in %<decltype%> expressions");
10202
10203   /* The restrictions on constant-expressions do not apply inside
10204      decltype expressions.  */
10205   saved_integral_constant_expression_p
10206     = parser->integral_constant_expression_p;
10207   saved_non_integral_constant_expression_p
10208     = parser->non_integral_constant_expression_p;
10209   parser->integral_constant_expression_p = false;
10210
10211   /* Do not actually evaluate the expression.  */
10212   ++cp_unevaluated_operand;
10213
10214   /* Do not warn about problems with the expression.  */
10215   ++c_inhibit_evaluation_warnings;
10216
10217   /* Parse the opening `('.  */
10218   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
10219     return error_mark_node;
10220   
10221   /* First, try parsing an id-expression.  */
10222   id_expr_start_token = cp_lexer_peek_token (parser->lexer);
10223   cp_parser_parse_tentatively (parser);
10224   expr = cp_parser_id_expression (parser,
10225                                   /*template_keyword_p=*/false,
10226                                   /*check_dependency_p=*/true,
10227                                   /*template_p=*/NULL,
10228                                   /*declarator_p=*/false,
10229                                   /*optional_p=*/false);
10230
10231   if (!cp_parser_error_occurred (parser) && expr != error_mark_node)
10232     {
10233       bool non_integral_constant_expression_p = false;
10234       tree id_expression = expr;
10235       cp_id_kind idk;
10236       const char *error_msg;
10237
10238       if (TREE_CODE (expr) == IDENTIFIER_NODE)
10239         /* Lookup the name we got back from the id-expression.  */
10240         expr = cp_parser_lookup_name (parser, expr,
10241                                       none_type,
10242                                       /*is_template=*/false,
10243                                       /*is_namespace=*/false,
10244                                       /*check_dependency=*/true,
10245                                       /*ambiguous_decls=*/NULL,
10246                                       id_expr_start_token->location);
10247
10248       if (expr
10249           && expr != error_mark_node
10250           && TREE_CODE (expr) != TEMPLATE_ID_EXPR
10251           && TREE_CODE (expr) != TYPE_DECL
10252           && (TREE_CODE (expr) != BIT_NOT_EXPR
10253               || !TYPE_P (TREE_OPERAND (expr, 0)))
10254           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10255         {
10256           /* Complete lookup of the id-expression.  */
10257           expr = (finish_id_expression
10258                   (id_expression, expr, parser->scope, &idk,
10259                    /*integral_constant_expression_p=*/false,
10260                    /*allow_non_integral_constant_expression_p=*/true,
10261                    &non_integral_constant_expression_p,
10262                    /*template_p=*/false,
10263                    /*done=*/true,
10264                    /*address_p=*/false,
10265                    /*template_arg_p=*/false,
10266                    &error_msg,
10267                    id_expr_start_token->location));
10268
10269           if (expr == error_mark_node)
10270             /* We found an id-expression, but it was something that we
10271                should not have found. This is an error, not something
10272                we can recover from, so note that we found an
10273                id-expression and we'll recover as gracefully as
10274                possible.  */
10275             id_expression_or_member_access_p = true;
10276         }
10277
10278       if (expr 
10279           && expr != error_mark_node
10280           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10281         /* We have an id-expression.  */
10282         id_expression_or_member_access_p = true;
10283     }
10284
10285   if (!id_expression_or_member_access_p)
10286     {
10287       /* Abort the id-expression parse.  */
10288       cp_parser_abort_tentative_parse (parser);
10289
10290       /* Parsing tentatively, again.  */
10291       cp_parser_parse_tentatively (parser);
10292
10293       /* Parse a class member access.  */
10294       expr = cp_parser_postfix_expression (parser, /*address_p=*/false,
10295                                            /*cast_p=*/false,
10296                                            /*member_access_only_p=*/true, NULL);
10297
10298       if (expr 
10299           && expr != error_mark_node
10300           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10301         /* We have an id-expression.  */
10302         id_expression_or_member_access_p = true;
10303     }
10304
10305   if (id_expression_or_member_access_p)
10306     /* We have parsed the complete id-expression or member access.  */
10307     cp_parser_parse_definitely (parser);
10308   else
10309     {
10310       bool saved_greater_than_is_operator_p;
10311
10312       /* Abort our attempt to parse an id-expression or member access
10313          expression.  */
10314       cp_parser_abort_tentative_parse (parser);
10315
10316       /* Within a parenthesized expression, a `>' token is always
10317          the greater-than operator.  */
10318       saved_greater_than_is_operator_p
10319         = parser->greater_than_is_operator_p;
10320       parser->greater_than_is_operator_p = true;
10321
10322       /* Parse a full expression.  */
10323       expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
10324
10325       /* The `>' token might be the end of a template-id or
10326          template-parameter-list now.  */
10327       parser->greater_than_is_operator_p
10328         = saved_greater_than_is_operator_p;
10329     }
10330
10331   /* Go back to evaluating expressions.  */
10332   --cp_unevaluated_operand;
10333   --c_inhibit_evaluation_warnings;
10334
10335   /* Restore the old message and the integral constant expression
10336      flags.  */
10337   parser->type_definition_forbidden_message = saved_message;
10338   parser->integral_constant_expression_p
10339     = saved_integral_constant_expression_p;
10340   parser->non_integral_constant_expression_p
10341     = saved_non_integral_constant_expression_p;
10342
10343   if (expr == error_mark_node)
10344     {
10345       /* Skip everything up to the closing `)'.  */
10346       cp_parser_skip_to_closing_parenthesis (parser, true, false,
10347                                              /*consume_paren=*/true);
10348       return error_mark_node;
10349     }
10350   
10351   /* Parse to the closing `)'.  */
10352   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10353     {
10354       cp_parser_skip_to_closing_parenthesis (parser, true, false,
10355                                              /*consume_paren=*/true);
10356       return error_mark_node;
10357     }
10358
10359   return finish_decltype_type (expr, id_expression_or_member_access_p,
10360                                tf_warning_or_error);
10361 }
10362
10363 /* Special member functions [gram.special] */
10364
10365 /* Parse a conversion-function-id.
10366
10367    conversion-function-id:
10368      operator conversion-type-id
10369
10370    Returns an IDENTIFIER_NODE representing the operator.  */
10371
10372 static tree
10373 cp_parser_conversion_function_id (cp_parser* parser)
10374 {
10375   tree type;
10376   tree saved_scope;
10377   tree saved_qualifying_scope;
10378   tree saved_object_scope;
10379   tree pushed_scope = NULL_TREE;
10380
10381   /* Look for the `operator' token.  */
10382   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10383     return error_mark_node;
10384   /* When we parse the conversion-type-id, the current scope will be
10385      reset.  However, we need that information in able to look up the
10386      conversion function later, so we save it here.  */
10387   saved_scope = parser->scope;
10388   saved_qualifying_scope = parser->qualifying_scope;
10389   saved_object_scope = parser->object_scope;
10390   /* We must enter the scope of the class so that the names of
10391      entities declared within the class are available in the
10392      conversion-type-id.  For example, consider:
10393
10394        struct S {
10395          typedef int I;
10396          operator I();
10397        };
10398
10399        S::operator I() { ... }
10400
10401      In order to see that `I' is a type-name in the definition, we
10402      must be in the scope of `S'.  */
10403   if (saved_scope)
10404     pushed_scope = push_scope (saved_scope);
10405   /* Parse the conversion-type-id.  */
10406   type = cp_parser_conversion_type_id (parser);
10407   /* Leave the scope of the class, if any.  */
10408   if (pushed_scope)
10409     pop_scope (pushed_scope);
10410   /* Restore the saved scope.  */
10411   parser->scope = saved_scope;
10412   parser->qualifying_scope = saved_qualifying_scope;
10413   parser->object_scope = saved_object_scope;
10414   /* If the TYPE is invalid, indicate failure.  */
10415   if (type == error_mark_node)
10416     return error_mark_node;
10417   return mangle_conv_op_name_for_type (type);
10418 }
10419
10420 /* Parse a conversion-type-id:
10421
10422    conversion-type-id:
10423      type-specifier-seq conversion-declarator [opt]
10424
10425    Returns the TYPE specified.  */
10426
10427 static tree
10428 cp_parser_conversion_type_id (cp_parser* parser)
10429 {
10430   tree attributes;
10431   cp_decl_specifier_seq type_specifiers;
10432   cp_declarator *declarator;
10433   tree type_specified;
10434
10435   /* Parse the attributes.  */
10436   attributes = cp_parser_attributes_opt (parser);
10437   /* Parse the type-specifiers.  */
10438   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
10439                                 /*is_trailing_return=*/false,
10440                                 &type_specifiers);
10441   /* If that didn't work, stop.  */
10442   if (type_specifiers.type == error_mark_node)
10443     return error_mark_node;
10444   /* Parse the conversion-declarator.  */
10445   declarator = cp_parser_conversion_declarator_opt (parser);
10446
10447   type_specified =  grokdeclarator (declarator, &type_specifiers, TYPENAME,
10448                                     /*initialized=*/0, &attributes);
10449   if (attributes)
10450     cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
10451
10452   /* Don't give this error when parsing tentatively.  This happens to
10453      work because we always parse this definitively once.  */
10454   if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
10455       && type_uses_auto (type_specified))
10456     {
10457       error ("invalid use of %<auto%> in conversion operator");
10458       return error_mark_node;
10459     }
10460
10461   return type_specified;
10462 }
10463
10464 /* Parse an (optional) conversion-declarator.
10465
10466    conversion-declarator:
10467      ptr-operator conversion-declarator [opt]
10468
10469    */
10470
10471 static cp_declarator *
10472 cp_parser_conversion_declarator_opt (cp_parser* parser)
10473 {
10474   enum tree_code code;
10475   tree class_type;
10476   cp_cv_quals cv_quals;
10477
10478   /* We don't know if there's a ptr-operator next, or not.  */
10479   cp_parser_parse_tentatively (parser);
10480   /* Try the ptr-operator.  */
10481   code = cp_parser_ptr_operator (parser, &class_type, &cv_quals);
10482   /* If it worked, look for more conversion-declarators.  */
10483   if (cp_parser_parse_definitely (parser))
10484     {
10485       cp_declarator *declarator;
10486
10487       /* Parse another optional declarator.  */
10488       declarator = cp_parser_conversion_declarator_opt (parser);
10489
10490       return cp_parser_make_indirect_declarator
10491         (code, class_type, cv_quals, declarator);
10492    }
10493
10494   return NULL;
10495 }
10496
10497 /* Parse an (optional) ctor-initializer.
10498
10499    ctor-initializer:
10500      : mem-initializer-list
10501
10502    Returns TRUE iff the ctor-initializer was actually present.  */
10503
10504 static bool
10505 cp_parser_ctor_initializer_opt (cp_parser* parser)
10506 {
10507   /* If the next token is not a `:', then there is no
10508      ctor-initializer.  */
10509   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
10510     {
10511       /* Do default initialization of any bases and members.  */
10512       if (DECL_CONSTRUCTOR_P (current_function_decl))
10513         finish_mem_initializers (NULL_TREE);
10514
10515       return false;
10516     }
10517
10518   /* Consume the `:' token.  */
10519   cp_lexer_consume_token (parser->lexer);
10520   /* And the mem-initializer-list.  */
10521   cp_parser_mem_initializer_list (parser);
10522
10523   return true;
10524 }
10525
10526 /* Parse a mem-initializer-list.
10527
10528    mem-initializer-list:
10529      mem-initializer ... [opt]
10530      mem-initializer ... [opt] , mem-initializer-list  */
10531
10532 static void
10533 cp_parser_mem_initializer_list (cp_parser* parser)
10534 {
10535   tree mem_initializer_list = NULL_TREE;
10536   cp_token *token = cp_lexer_peek_token (parser->lexer);
10537
10538   /* Let the semantic analysis code know that we are starting the
10539      mem-initializer-list.  */
10540   if (!DECL_CONSTRUCTOR_P (current_function_decl))
10541     error_at (token->location,
10542               "only constructors take member initializers");
10543
10544   /* Loop through the list.  */
10545   while (true)
10546     {
10547       tree mem_initializer;
10548
10549       token = cp_lexer_peek_token (parser->lexer);
10550       /* Parse the mem-initializer.  */
10551       mem_initializer = cp_parser_mem_initializer (parser);
10552       /* If the next token is a `...', we're expanding member initializers. */
10553       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
10554         {
10555           /* Consume the `...'. */
10556           cp_lexer_consume_token (parser->lexer);
10557
10558           /* The TREE_PURPOSE must be a _TYPE, because base-specifiers
10559              can be expanded but members cannot. */
10560           if (mem_initializer != error_mark_node
10561               && !TYPE_P (TREE_PURPOSE (mem_initializer)))
10562             {
10563               error_at (token->location,
10564                         "cannot expand initializer for member %<%D%>",
10565                         TREE_PURPOSE (mem_initializer));
10566               mem_initializer = error_mark_node;
10567             }
10568
10569           /* Construct the pack expansion type. */
10570           if (mem_initializer != error_mark_node)
10571             mem_initializer = make_pack_expansion (mem_initializer);
10572         }
10573       /* Add it to the list, unless it was erroneous.  */
10574       if (mem_initializer != error_mark_node)
10575         {
10576           TREE_CHAIN (mem_initializer) = mem_initializer_list;
10577           mem_initializer_list = mem_initializer;
10578         }
10579       /* If the next token is not a `,', we're done.  */
10580       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
10581         break;
10582       /* Consume the `,' token.  */
10583       cp_lexer_consume_token (parser->lexer);
10584     }
10585
10586   /* Perform semantic analysis.  */
10587   if (DECL_CONSTRUCTOR_P (current_function_decl))
10588     finish_mem_initializers (mem_initializer_list);
10589 }
10590
10591 /* Parse a mem-initializer.
10592
10593    mem-initializer:
10594      mem-initializer-id ( expression-list [opt] )
10595      mem-initializer-id braced-init-list
10596
10597    GNU extension:
10598
10599    mem-initializer:
10600      ( expression-list [opt] )
10601
10602    Returns a TREE_LIST.  The TREE_PURPOSE is the TYPE (for a base
10603    class) or FIELD_DECL (for a non-static data member) to initialize;
10604    the TREE_VALUE is the expression-list.  An empty initialization
10605    list is represented by void_list_node.  */
10606
10607 static tree
10608 cp_parser_mem_initializer (cp_parser* parser)
10609 {
10610   tree mem_initializer_id;
10611   tree expression_list;
10612   tree member;
10613   cp_token *token = cp_lexer_peek_token (parser->lexer);
10614
10615   /* Find out what is being initialized.  */
10616   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
10617     {
10618       permerror (token->location,
10619                  "anachronistic old-style base class initializer");
10620       mem_initializer_id = NULL_TREE;
10621     }
10622   else
10623     {
10624       mem_initializer_id = cp_parser_mem_initializer_id (parser);
10625       if (mem_initializer_id == error_mark_node)
10626         return mem_initializer_id;
10627     }
10628   member = expand_member_init (mem_initializer_id);
10629   if (member && !DECL_P (member))
10630     in_base_initializer = 1;
10631
10632   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10633     {
10634       bool expr_non_constant_p;
10635       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
10636       expression_list = cp_parser_braced_list (parser, &expr_non_constant_p);
10637       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
10638       expression_list = build_tree_list (NULL_TREE, expression_list);
10639     }
10640   else
10641     {
10642       VEC(tree,gc)* vec;
10643       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
10644                                                      /*cast_p=*/false,
10645                                                      /*allow_expansion_p=*/true,
10646                                                      /*non_constant_p=*/NULL);
10647       if (vec == NULL)
10648         return error_mark_node;
10649       expression_list = build_tree_list_vec (vec);
10650       release_tree_vector (vec);
10651     }
10652
10653   if (expression_list == error_mark_node)
10654     return error_mark_node;
10655   if (!expression_list)
10656     expression_list = void_type_node;
10657
10658   in_base_initializer = 0;
10659
10660   return member ? build_tree_list (member, expression_list) : error_mark_node;
10661 }
10662
10663 /* Parse a mem-initializer-id.
10664
10665    mem-initializer-id:
10666      :: [opt] nested-name-specifier [opt] class-name
10667      identifier
10668
10669    Returns a TYPE indicating the class to be initializer for the first
10670    production.  Returns an IDENTIFIER_NODE indicating the data member
10671    to be initialized for the second production.  */
10672
10673 static tree
10674 cp_parser_mem_initializer_id (cp_parser* parser)
10675 {
10676   bool global_scope_p;
10677   bool nested_name_specifier_p;
10678   bool template_p = false;
10679   tree id;
10680
10681   cp_token *token = cp_lexer_peek_token (parser->lexer);
10682
10683   /* `typename' is not allowed in this context ([temp.res]).  */
10684   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
10685     {
10686       error_at (token->location, 
10687                 "keyword %<typename%> not allowed in this context (a qualified "
10688                 "member initializer is implicitly a type)");
10689       cp_lexer_consume_token (parser->lexer);
10690     }
10691   /* Look for the optional `::' operator.  */
10692   global_scope_p
10693     = (cp_parser_global_scope_opt (parser,
10694                                    /*current_scope_valid_p=*/false)
10695        != NULL_TREE);
10696   /* Look for the optional nested-name-specifier.  The simplest way to
10697      implement:
10698
10699        [temp.res]
10700
10701        The keyword `typename' is not permitted in a base-specifier or
10702        mem-initializer; in these contexts a qualified name that
10703        depends on a template-parameter is implicitly assumed to be a
10704        type name.
10705
10706      is to assume that we have seen the `typename' keyword at this
10707      point.  */
10708   nested_name_specifier_p
10709     = (cp_parser_nested_name_specifier_opt (parser,
10710                                             /*typename_keyword_p=*/true,
10711                                             /*check_dependency_p=*/true,
10712                                             /*type_p=*/true,
10713                                             /*is_declaration=*/true)
10714        != NULL_TREE);
10715   if (nested_name_specifier_p)
10716     template_p = cp_parser_optional_template_keyword (parser);
10717   /* If there is a `::' operator or a nested-name-specifier, then we
10718      are definitely looking for a class-name.  */
10719   if (global_scope_p || nested_name_specifier_p)
10720     return cp_parser_class_name (parser,
10721                                  /*typename_keyword_p=*/true,
10722                                  /*template_keyword_p=*/template_p,
10723                                  typename_type,
10724                                  /*check_dependency_p=*/true,
10725                                  /*class_head_p=*/false,
10726                                  /*is_declaration=*/true);
10727   /* Otherwise, we could also be looking for an ordinary identifier.  */
10728   cp_parser_parse_tentatively (parser);
10729   /* Try a class-name.  */
10730   id = cp_parser_class_name (parser,
10731                              /*typename_keyword_p=*/true,
10732                              /*template_keyword_p=*/false,
10733                              none_type,
10734                              /*check_dependency_p=*/true,
10735                              /*class_head_p=*/false,
10736                              /*is_declaration=*/true);
10737   /* If we found one, we're done.  */
10738   if (cp_parser_parse_definitely (parser))
10739     return id;
10740   /* Otherwise, look for an ordinary identifier.  */
10741   return cp_parser_identifier (parser);
10742 }
10743
10744 /* Overloading [gram.over] */
10745
10746 /* Parse an operator-function-id.
10747
10748    operator-function-id:
10749      operator operator
10750
10751    Returns an IDENTIFIER_NODE for the operator which is a
10752    human-readable spelling of the identifier, e.g., `operator +'.  */
10753
10754 static tree
10755 cp_parser_operator_function_id (cp_parser* parser)
10756 {
10757   /* Look for the `operator' keyword.  */
10758   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10759     return error_mark_node;
10760   /* And then the name of the operator itself.  */
10761   return cp_parser_operator (parser);
10762 }
10763
10764 /* Parse an operator.
10765
10766    operator:
10767      new delete new[] delete[] + - * / % ^ & | ~ ! = < >
10768      += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= &&
10769      || ++ -- , ->* -> () []
10770
10771    GNU Extensions:
10772
10773    operator:
10774      <? >? <?= >?=
10775
10776    Returns an IDENTIFIER_NODE for the operator which is a
10777    human-readable spelling of the identifier, e.g., `operator +'.  */
10778
10779 static tree
10780 cp_parser_operator (cp_parser* parser)
10781 {
10782   tree id = NULL_TREE;
10783   cp_token *token;
10784
10785   /* Peek at the next token.  */
10786   token = cp_lexer_peek_token (parser->lexer);
10787   /* Figure out which operator we have.  */
10788   switch (token->type)
10789     {
10790     case CPP_KEYWORD:
10791       {
10792         enum tree_code op;
10793
10794         /* The keyword should be either `new' or `delete'.  */
10795         if (token->keyword == RID_NEW)
10796           op = NEW_EXPR;
10797         else if (token->keyword == RID_DELETE)
10798           op = DELETE_EXPR;
10799         else
10800           break;
10801
10802         /* Consume the `new' or `delete' token.  */
10803         cp_lexer_consume_token (parser->lexer);
10804
10805         /* Peek at the next token.  */
10806         token = cp_lexer_peek_token (parser->lexer);
10807         /* If it's a `[' token then this is the array variant of the
10808            operator.  */
10809         if (token->type == CPP_OPEN_SQUARE)
10810           {
10811             /* Consume the `[' token.  */
10812             cp_lexer_consume_token (parser->lexer);
10813             /* Look for the `]' token.  */
10814             cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10815             id = ansi_opname (op == NEW_EXPR
10816                               ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
10817           }
10818         /* Otherwise, we have the non-array variant.  */
10819         else
10820           id = ansi_opname (op);
10821
10822         return id;
10823       }
10824
10825     case CPP_PLUS:
10826       id = ansi_opname (PLUS_EXPR);
10827       break;
10828
10829     case CPP_MINUS:
10830       id = ansi_opname (MINUS_EXPR);
10831       break;
10832
10833     case CPP_MULT:
10834       id = ansi_opname (MULT_EXPR);
10835       break;
10836
10837     case CPP_DIV:
10838       id = ansi_opname (TRUNC_DIV_EXPR);
10839       break;
10840
10841     case CPP_MOD:
10842       id = ansi_opname (TRUNC_MOD_EXPR);
10843       break;
10844
10845     case CPP_XOR:
10846       id = ansi_opname (BIT_XOR_EXPR);
10847       break;
10848
10849     case CPP_AND:
10850       id = ansi_opname (BIT_AND_EXPR);
10851       break;
10852
10853     case CPP_OR:
10854       id = ansi_opname (BIT_IOR_EXPR);
10855       break;
10856
10857     case CPP_COMPL:
10858       id = ansi_opname (BIT_NOT_EXPR);
10859       break;
10860
10861     case CPP_NOT:
10862       id = ansi_opname (TRUTH_NOT_EXPR);
10863       break;
10864
10865     case CPP_EQ:
10866       id = ansi_assopname (NOP_EXPR);
10867       break;
10868
10869     case CPP_LESS:
10870       id = ansi_opname (LT_EXPR);
10871       break;
10872
10873     case CPP_GREATER:
10874       id = ansi_opname (GT_EXPR);
10875       break;
10876
10877     case CPP_PLUS_EQ:
10878       id = ansi_assopname (PLUS_EXPR);
10879       break;
10880
10881     case CPP_MINUS_EQ:
10882       id = ansi_assopname (MINUS_EXPR);
10883       break;
10884
10885     case CPP_MULT_EQ:
10886       id = ansi_assopname (MULT_EXPR);
10887       break;
10888
10889     case CPP_DIV_EQ:
10890       id = ansi_assopname (TRUNC_DIV_EXPR);
10891       break;
10892
10893     case CPP_MOD_EQ:
10894       id = ansi_assopname (TRUNC_MOD_EXPR);
10895       break;
10896
10897     case CPP_XOR_EQ:
10898       id = ansi_assopname (BIT_XOR_EXPR);
10899       break;
10900
10901     case CPP_AND_EQ:
10902       id = ansi_assopname (BIT_AND_EXPR);
10903       break;
10904
10905     case CPP_OR_EQ:
10906       id = ansi_assopname (BIT_IOR_EXPR);
10907       break;
10908
10909     case CPP_LSHIFT:
10910       id = ansi_opname (LSHIFT_EXPR);
10911       break;
10912
10913     case CPP_RSHIFT:
10914       id = ansi_opname (RSHIFT_EXPR);
10915       break;
10916
10917     case CPP_LSHIFT_EQ:
10918       id = ansi_assopname (LSHIFT_EXPR);
10919       break;
10920
10921     case CPP_RSHIFT_EQ:
10922       id = ansi_assopname (RSHIFT_EXPR);
10923       break;
10924
10925     case CPP_EQ_EQ:
10926       id = ansi_opname (EQ_EXPR);
10927       break;
10928
10929     case CPP_NOT_EQ:
10930       id = ansi_opname (NE_EXPR);
10931       break;
10932
10933     case CPP_LESS_EQ:
10934       id = ansi_opname (LE_EXPR);
10935       break;
10936
10937     case CPP_GREATER_EQ:
10938       id = ansi_opname (GE_EXPR);
10939       break;
10940
10941     case CPP_AND_AND:
10942       id = ansi_opname (TRUTH_ANDIF_EXPR);
10943       break;
10944
10945     case CPP_OR_OR:
10946       id = ansi_opname (TRUTH_ORIF_EXPR);
10947       break;
10948
10949     case CPP_PLUS_PLUS:
10950       id = ansi_opname (POSTINCREMENT_EXPR);
10951       break;
10952
10953     case CPP_MINUS_MINUS:
10954       id = ansi_opname (PREDECREMENT_EXPR);
10955       break;
10956
10957     case CPP_COMMA:
10958       id = ansi_opname (COMPOUND_EXPR);
10959       break;
10960
10961     case CPP_DEREF_STAR:
10962       id = ansi_opname (MEMBER_REF);
10963       break;
10964
10965     case CPP_DEREF:
10966       id = ansi_opname (COMPONENT_REF);
10967       break;
10968
10969     case CPP_OPEN_PAREN:
10970       /* Consume the `('.  */
10971       cp_lexer_consume_token (parser->lexer);
10972       /* Look for the matching `)'.  */
10973       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
10974       return ansi_opname (CALL_EXPR);
10975
10976     case CPP_OPEN_SQUARE:
10977       /* Consume the `['.  */
10978       cp_lexer_consume_token (parser->lexer);
10979       /* Look for the matching `]'.  */
10980       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10981       return ansi_opname (ARRAY_REF);
10982
10983     default:
10984       /* Anything else is an error.  */
10985       break;
10986     }
10987
10988   /* If we have selected an identifier, we need to consume the
10989      operator token.  */
10990   if (id)
10991     cp_lexer_consume_token (parser->lexer);
10992   /* Otherwise, no valid operator name was present.  */
10993   else
10994     {
10995       cp_parser_error (parser, "expected operator");
10996       id = error_mark_node;
10997     }
10998
10999   return id;
11000 }
11001
11002 /* Parse a template-declaration.
11003
11004    template-declaration:
11005      export [opt] template < template-parameter-list > declaration
11006
11007    If MEMBER_P is TRUE, this template-declaration occurs within a
11008    class-specifier.
11009
11010    The grammar rule given by the standard isn't correct.  What
11011    is really meant is:
11012
11013    template-declaration:
11014      export [opt] template-parameter-list-seq
11015        decl-specifier-seq [opt] init-declarator [opt] ;
11016      export [opt] template-parameter-list-seq
11017        function-definition
11018
11019    template-parameter-list-seq:
11020      template-parameter-list-seq [opt]
11021      template < template-parameter-list >  */
11022
11023 static void
11024 cp_parser_template_declaration (cp_parser* parser, bool member_p)
11025 {
11026   /* Check for `export'.  */
11027   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
11028     {
11029       /* Consume the `export' token.  */
11030       cp_lexer_consume_token (parser->lexer);
11031       /* Warn that we do not support `export'.  */
11032       warning (0, "keyword %<export%> not implemented, and will be ignored");
11033     }
11034
11035   cp_parser_template_declaration_after_export (parser, member_p);
11036 }
11037
11038 /* Parse a template-parameter-list.
11039
11040    template-parameter-list:
11041      template-parameter
11042      template-parameter-list , template-parameter
11043
11044    Returns a TREE_LIST.  Each node represents a template parameter.
11045    The nodes are connected via their TREE_CHAINs.  */
11046
11047 static tree
11048 cp_parser_template_parameter_list (cp_parser* parser)
11049 {
11050   tree parameter_list = NULL_TREE;
11051
11052   begin_template_parm_list ();
11053
11054   /* The loop below parses the template parms.  We first need to know
11055      the total number of template parms to be able to compute proper
11056      canonical types of each dependent type. So after the loop, when
11057      we know the total number of template parms,
11058      end_template_parm_list computes the proper canonical types and
11059      fixes up the dependent types accordingly.  */
11060   while (true)
11061     {
11062       tree parameter;
11063       bool is_non_type;
11064       bool is_parameter_pack;
11065       location_t parm_loc;
11066
11067       /* Parse the template-parameter.  */
11068       parm_loc = cp_lexer_peek_token (parser->lexer)->location;
11069       parameter = cp_parser_template_parameter (parser, 
11070                                                 &is_non_type,
11071                                                 &is_parameter_pack);
11072       /* Add it to the list.  */
11073       if (parameter != error_mark_node)
11074         parameter_list = process_template_parm (parameter_list,
11075                                                 parm_loc,
11076                                                 parameter,
11077                                                 is_non_type,
11078                                                 is_parameter_pack,
11079                                                 0);
11080       else
11081        {
11082          tree err_parm = build_tree_list (parameter, parameter);
11083          parameter_list = chainon (parameter_list, err_parm);
11084        }
11085
11086       /* If the next token is not a `,', we're done.  */
11087       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11088         break;
11089       /* Otherwise, consume the `,' token.  */
11090       cp_lexer_consume_token (parser->lexer);
11091     }
11092
11093   return end_template_parm_list (parameter_list);
11094 }
11095
11096 /* Parse a template-parameter.
11097
11098    template-parameter:
11099      type-parameter
11100      parameter-declaration
11101
11102    If all goes well, returns a TREE_LIST.  The TREE_VALUE represents
11103    the parameter.  The TREE_PURPOSE is the default value, if any.
11104    Returns ERROR_MARK_NODE on failure.  *IS_NON_TYPE is set to true
11105    iff this parameter is a non-type parameter.  *IS_PARAMETER_PACK is
11106    set to true iff this parameter is a parameter pack. */
11107
11108 static tree
11109 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
11110                               bool *is_parameter_pack)
11111 {
11112   cp_token *token;
11113   cp_parameter_declarator *parameter_declarator;
11114   cp_declarator *id_declarator;
11115   tree parm;
11116
11117   /* Assume it is a type parameter or a template parameter.  */
11118   *is_non_type = false;
11119   /* Assume it not a parameter pack. */
11120   *is_parameter_pack = false;
11121   /* Peek at the next token.  */
11122   token = cp_lexer_peek_token (parser->lexer);
11123   /* If it is `class' or `template', we have a type-parameter.  */
11124   if (token->keyword == RID_TEMPLATE)
11125     return cp_parser_type_parameter (parser, is_parameter_pack);
11126   /* If it is `class' or `typename' we do not know yet whether it is a
11127      type parameter or a non-type parameter.  Consider:
11128
11129        template <typename T, typename T::X X> ...
11130
11131      or:
11132
11133        template <class C, class D*> ...
11134
11135      Here, the first parameter is a type parameter, and the second is
11136      a non-type parameter.  We can tell by looking at the token after
11137      the identifier -- if it is a `,', `=', or `>' then we have a type
11138      parameter.  */
11139   if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
11140     {
11141       /* Peek at the token after `class' or `typename'.  */
11142       token = cp_lexer_peek_nth_token (parser->lexer, 2);
11143       /* If it's an ellipsis, we have a template type parameter
11144          pack. */
11145       if (token->type == CPP_ELLIPSIS)
11146         return cp_parser_type_parameter (parser, is_parameter_pack);
11147       /* If it's an identifier, skip it.  */
11148       if (token->type == CPP_NAME)
11149         token = cp_lexer_peek_nth_token (parser->lexer, 3);
11150       /* Now, see if the token looks like the end of a template
11151          parameter.  */
11152       if (token->type == CPP_COMMA
11153           || token->type == CPP_EQ
11154           || token->type == CPP_GREATER)
11155         return cp_parser_type_parameter (parser, is_parameter_pack);
11156     }
11157
11158   /* Otherwise, it is a non-type parameter.
11159
11160      [temp.param]
11161
11162      When parsing a default template-argument for a non-type
11163      template-parameter, the first non-nested `>' is taken as the end
11164      of the template parameter-list rather than a greater-than
11165      operator.  */
11166   *is_non_type = true;
11167   parameter_declarator
11168      = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
11169                                         /*parenthesized_p=*/NULL);
11170
11171   /* If the parameter declaration is marked as a parameter pack, set
11172      *IS_PARAMETER_PACK to notify the caller. Also, unmark the
11173      declarator's PACK_EXPANSION_P, otherwise we'll get errors from
11174      grokdeclarator. */
11175   if (parameter_declarator
11176       && parameter_declarator->declarator
11177       && parameter_declarator->declarator->parameter_pack_p)
11178     {
11179       *is_parameter_pack = true;
11180       parameter_declarator->declarator->parameter_pack_p = false;
11181     }
11182
11183   /* If the next token is an ellipsis, and we don't already have it
11184      marked as a parameter pack, then we have a parameter pack (that
11185      has no declarator).  */
11186   if (!*is_parameter_pack
11187       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
11188       && declarator_can_be_parameter_pack (parameter_declarator->declarator))
11189     {
11190       /* Consume the `...'.  */
11191       cp_lexer_consume_token (parser->lexer);
11192       maybe_warn_variadic_templates ();
11193       
11194       *is_parameter_pack = true;
11195     }
11196   /* We might end up with a pack expansion as the type of the non-type
11197      template parameter, in which case this is a non-type template
11198      parameter pack.  */
11199   else if (parameter_declarator
11200            && parameter_declarator->decl_specifiers.type
11201            && PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type))
11202     {
11203       *is_parameter_pack = true;
11204       parameter_declarator->decl_specifiers.type = 
11205         PACK_EXPANSION_PATTERN (parameter_declarator->decl_specifiers.type);
11206     }
11207
11208   if (*is_parameter_pack && cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11209     {
11210       /* Parameter packs cannot have default arguments.  However, a
11211          user may try to do so, so we'll parse them and give an
11212          appropriate diagnostic here.  */
11213
11214       /* Consume the `='.  */
11215       cp_token *start_token = cp_lexer_peek_token (parser->lexer);
11216       cp_lexer_consume_token (parser->lexer);
11217       
11218       /* Find the name of the parameter pack.  */     
11219       id_declarator = parameter_declarator->declarator;
11220       while (id_declarator && id_declarator->kind != cdk_id)
11221         id_declarator = id_declarator->declarator;
11222       
11223       if (id_declarator && id_declarator->kind == cdk_id)
11224         error_at (start_token->location,
11225                   "template parameter pack %qD cannot have a default argument",
11226                   id_declarator->u.id.unqualified_name);
11227       else
11228         error_at (start_token->location,
11229                   "template parameter pack cannot have a default argument");
11230       
11231       /* Parse the default argument, but throw away the result.  */
11232       cp_parser_default_argument (parser, /*template_parm_p=*/true);
11233     }
11234
11235   parm = grokdeclarator (parameter_declarator->declarator,
11236                          &parameter_declarator->decl_specifiers,
11237                          TPARM, /*initialized=*/0,
11238                          /*attrlist=*/NULL);
11239   if (parm == error_mark_node)
11240     return error_mark_node;
11241
11242   return build_tree_list (parameter_declarator->default_argument, parm);
11243 }
11244
11245 /* Parse a type-parameter.
11246
11247    type-parameter:
11248      class identifier [opt]
11249      class identifier [opt] = type-id
11250      typename identifier [opt]
11251      typename identifier [opt] = type-id
11252      template < template-parameter-list > class identifier [opt]
11253      template < template-parameter-list > class identifier [opt]
11254        = id-expression
11255
11256    GNU Extension (variadic templates):
11257
11258    type-parameter:
11259      class ... identifier [opt]
11260      typename ... identifier [opt]
11261
11262    Returns a TREE_LIST.  The TREE_VALUE is itself a TREE_LIST.  The
11263    TREE_PURPOSE is the default-argument, if any.  The TREE_VALUE is
11264    the declaration of the parameter.
11265
11266    Sets *IS_PARAMETER_PACK if this is a template parameter pack. */
11267
11268 static tree
11269 cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
11270 {
11271   cp_token *token;
11272   tree parameter;
11273
11274   /* Look for a keyword to tell us what kind of parameter this is.  */
11275   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_TYPENAME_TEMPLATE);
11276   if (!token)
11277     return error_mark_node;
11278
11279   switch (token->keyword)
11280     {
11281     case RID_CLASS:
11282     case RID_TYPENAME:
11283       {
11284         tree identifier;
11285         tree default_argument;
11286
11287         /* If the next token is an ellipsis, we have a template
11288            argument pack. */
11289         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11290           {
11291             /* Consume the `...' token. */
11292             cp_lexer_consume_token (parser->lexer);
11293             maybe_warn_variadic_templates ();
11294
11295             *is_parameter_pack = true;
11296           }
11297
11298         /* If the next token is an identifier, then it names the
11299            parameter.  */
11300         if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
11301           identifier = cp_parser_identifier (parser);
11302         else
11303           identifier = NULL_TREE;
11304
11305         /* Create the parameter.  */
11306         parameter = finish_template_type_parm (class_type_node, identifier);
11307
11308         /* If the next token is an `=', we have a default argument.  */
11309         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11310           {
11311             /* Consume the `=' token.  */
11312             cp_lexer_consume_token (parser->lexer);
11313             /* Parse the default-argument.  */
11314             push_deferring_access_checks (dk_no_deferred);
11315             default_argument = cp_parser_type_id (parser);
11316
11317             /* Template parameter packs cannot have default
11318                arguments. */
11319             if (*is_parameter_pack)
11320               {
11321                 if (identifier)
11322                   error_at (token->location,
11323                             "template parameter pack %qD cannot have a "
11324                             "default argument", identifier);
11325                 else
11326                   error_at (token->location,
11327                             "template parameter packs cannot have "
11328                             "default arguments");
11329                 default_argument = NULL_TREE;
11330               }
11331             pop_deferring_access_checks ();
11332           }
11333         else
11334           default_argument = NULL_TREE;
11335
11336         /* Create the combined representation of the parameter and the
11337            default argument.  */
11338         parameter = build_tree_list (default_argument, parameter);
11339       }
11340       break;
11341
11342     case RID_TEMPLATE:
11343       {
11344         tree identifier;
11345         tree default_argument;
11346
11347         /* Look for the `<'.  */
11348         cp_parser_require (parser, CPP_LESS, RT_LESS);
11349         /* Parse the template-parameter-list.  */
11350         cp_parser_template_parameter_list (parser);
11351         /* Look for the `>'.  */
11352         cp_parser_require (parser, CPP_GREATER, RT_GREATER);
11353         /* Look for the `class' keyword.  */
11354         cp_parser_require_keyword (parser, RID_CLASS, RT_CLASS);
11355         /* If the next token is an ellipsis, we have a template
11356            argument pack. */
11357         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11358           {
11359             /* Consume the `...' token. */
11360             cp_lexer_consume_token (parser->lexer);
11361             maybe_warn_variadic_templates ();
11362
11363             *is_parameter_pack = true;
11364           }
11365         /* If the next token is an `=', then there is a
11366            default-argument.  If the next token is a `>', we are at
11367            the end of the parameter-list.  If the next token is a `,',
11368            then we are at the end of this parameter.  */
11369         if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
11370             && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
11371             && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11372           {
11373             identifier = cp_parser_identifier (parser);
11374             /* Treat invalid names as if the parameter were nameless.  */
11375             if (identifier == error_mark_node)
11376               identifier = NULL_TREE;
11377           }
11378         else
11379           identifier = NULL_TREE;
11380
11381         /* Create the template parameter.  */
11382         parameter = finish_template_template_parm (class_type_node,
11383                                                    identifier);
11384
11385         /* If the next token is an `=', then there is a
11386            default-argument.  */
11387         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11388           {
11389             bool is_template;
11390
11391             /* Consume the `='.  */
11392             cp_lexer_consume_token (parser->lexer);
11393             /* Parse the id-expression.  */
11394             push_deferring_access_checks (dk_no_deferred);
11395             /* save token before parsing the id-expression, for error
11396                reporting */
11397             token = cp_lexer_peek_token (parser->lexer);
11398             default_argument
11399               = cp_parser_id_expression (parser,
11400                                          /*template_keyword_p=*/false,
11401                                          /*check_dependency_p=*/true,
11402                                          /*template_p=*/&is_template,
11403                                          /*declarator_p=*/false,
11404                                          /*optional_p=*/false);
11405             if (TREE_CODE (default_argument) == TYPE_DECL)
11406               /* If the id-expression was a template-id that refers to
11407                  a template-class, we already have the declaration here,
11408                  so no further lookup is needed.  */
11409                  ;
11410             else
11411               /* Look up the name.  */
11412               default_argument
11413                 = cp_parser_lookup_name (parser, default_argument,
11414                                          none_type,
11415                                          /*is_template=*/is_template,
11416                                          /*is_namespace=*/false,
11417                                          /*check_dependency=*/true,
11418                                          /*ambiguous_decls=*/NULL,
11419                                          token->location);
11420             /* See if the default argument is valid.  */
11421             default_argument
11422               = check_template_template_default_arg (default_argument);
11423
11424             /* Template parameter packs cannot have default
11425                arguments. */
11426             if (*is_parameter_pack)
11427               {
11428                 if (identifier)
11429                   error_at (token->location,
11430                             "template parameter pack %qD cannot "
11431                             "have a default argument",
11432                             identifier);
11433                 else
11434                   error_at (token->location, "template parameter packs cannot "
11435                             "have default arguments");
11436                 default_argument = NULL_TREE;
11437               }
11438             pop_deferring_access_checks ();
11439           }
11440         else
11441           default_argument = NULL_TREE;
11442
11443         /* Create the combined representation of the parameter and the
11444            default argument.  */
11445         parameter = build_tree_list (default_argument, parameter);
11446       }
11447       break;
11448
11449     default:
11450       gcc_unreachable ();
11451       break;
11452     }
11453
11454   return parameter;
11455 }
11456
11457 /* Parse a template-id.
11458
11459    template-id:
11460      template-name < template-argument-list [opt] >
11461
11462    If TEMPLATE_KEYWORD_P is TRUE, then we have just seen the
11463    `template' keyword.  In this case, a TEMPLATE_ID_EXPR will be
11464    returned.  Otherwise, if the template-name names a function, or set
11465    of functions, returns a TEMPLATE_ID_EXPR.  If the template-name
11466    names a class, returns a TYPE_DECL for the specialization.
11467
11468    If CHECK_DEPENDENCY_P is FALSE, names are looked up in
11469    uninstantiated templates.  */
11470
11471 static tree
11472 cp_parser_template_id (cp_parser *parser,
11473                        bool template_keyword_p,
11474                        bool check_dependency_p,
11475                        bool is_declaration)
11476 {
11477   int i;
11478   tree templ;
11479   tree arguments;
11480   tree template_id;
11481   cp_token_position start_of_id = 0;
11482   deferred_access_check *chk;
11483   VEC (deferred_access_check,gc) *access_check;
11484   cp_token *next_token = NULL, *next_token_2 = NULL;
11485   bool is_identifier;
11486
11487   /* If the next token corresponds to a template-id, there is no need
11488      to reparse it.  */
11489   next_token = cp_lexer_peek_token (parser->lexer);
11490   if (next_token->type == CPP_TEMPLATE_ID)
11491     {
11492       struct tree_check *check_value;
11493
11494       /* Get the stored value.  */
11495       check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
11496       /* Perform any access checks that were deferred.  */
11497       access_check = check_value->checks;
11498       if (access_check)
11499         {
11500           FOR_EACH_VEC_ELT (deferred_access_check, access_check, i, chk)
11501             perform_or_defer_access_check (chk->binfo,
11502                                            chk->decl,
11503                                            chk->diag_decl);
11504         }
11505       /* Return the stored value.  */
11506       return check_value->value;
11507     }
11508
11509   /* Avoid performing name lookup if there is no possibility of
11510      finding a template-id.  */
11511   if ((next_token->type != CPP_NAME && next_token->keyword != RID_OPERATOR)
11512       || (next_token->type == CPP_NAME
11513           && !cp_parser_nth_token_starts_template_argument_list_p
11514                (parser, 2)))
11515     {
11516       cp_parser_error (parser, "expected template-id");
11517       return error_mark_node;
11518     }
11519
11520   /* Remember where the template-id starts.  */
11521   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
11522     start_of_id = cp_lexer_token_position (parser->lexer, false);
11523
11524   push_deferring_access_checks (dk_deferred);
11525
11526   /* Parse the template-name.  */
11527   is_identifier = false;
11528   templ = cp_parser_template_name (parser, template_keyword_p,
11529                                    check_dependency_p,
11530                                    is_declaration,
11531                                    &is_identifier);
11532   if (templ == error_mark_node || is_identifier)
11533     {
11534       pop_deferring_access_checks ();
11535       return templ;
11536     }
11537
11538   /* If we find the sequence `[:' after a template-name, it's probably
11539      a digraph-typo for `< ::'. Substitute the tokens and check if we can
11540      parse correctly the argument list.  */
11541   next_token = cp_lexer_peek_token (parser->lexer);
11542   next_token_2 = cp_lexer_peek_nth_token (parser->lexer, 2);
11543   if (next_token->type == CPP_OPEN_SQUARE
11544       && next_token->flags & DIGRAPH
11545       && next_token_2->type == CPP_COLON
11546       && !(next_token_2->flags & PREV_WHITE))
11547     {
11548       cp_parser_parse_tentatively (parser);
11549       /* Change `:' into `::'.  */
11550       next_token_2->type = CPP_SCOPE;
11551       /* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
11552          CPP_LESS.  */
11553       cp_lexer_consume_token (parser->lexer);
11554
11555       /* Parse the arguments.  */
11556       arguments = cp_parser_enclosed_template_argument_list (parser);
11557       if (!cp_parser_parse_definitely (parser))
11558         {
11559           /* If we couldn't parse an argument list, then we revert our changes
11560              and return simply an error. Maybe this is not a template-id
11561              after all.  */
11562           next_token_2->type = CPP_COLON;
11563           cp_parser_error (parser, "expected %<<%>");
11564           pop_deferring_access_checks ();
11565           return error_mark_node;
11566         }
11567       /* Otherwise, emit an error about the invalid digraph, but continue
11568          parsing because we got our argument list.  */
11569       if (permerror (next_token->location,
11570                      "%<<::%> cannot begin a template-argument list"))
11571         {
11572           static bool hint = false;
11573           inform (next_token->location,
11574                   "%<<:%> is an alternate spelling for %<[%>."
11575                   " Insert whitespace between %<<%> and %<::%>");
11576           if (!hint && !flag_permissive)
11577             {
11578               inform (next_token->location, "(if you use %<-fpermissive%>"
11579                       " G++ will accept your code)");
11580               hint = true;
11581             }
11582         }
11583     }
11584   else
11585     {
11586       /* Look for the `<' that starts the template-argument-list.  */
11587       if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
11588         {
11589           pop_deferring_access_checks ();
11590           return error_mark_node;
11591         }
11592       /* Parse the arguments.  */
11593       arguments = cp_parser_enclosed_template_argument_list (parser);
11594     }
11595
11596   /* Build a representation of the specialization.  */
11597   if (TREE_CODE (templ) == IDENTIFIER_NODE)
11598     template_id = build_min_nt (TEMPLATE_ID_EXPR, templ, arguments);
11599   else if (DECL_CLASS_TEMPLATE_P (templ)
11600            || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
11601     {
11602       bool entering_scope;
11603       /* In "template <typename T> ... A<T>::", A<T> is the abstract A
11604          template (rather than some instantiation thereof) only if
11605          is not nested within some other construct.  For example, in
11606          "template <typename T> void f(T) { A<T>::", A<T> is just an
11607          instantiation of A.  */
11608       entering_scope = (template_parm_scope_p ()
11609                         && cp_lexer_next_token_is (parser->lexer,
11610                                                    CPP_SCOPE));
11611       template_id
11612         = finish_template_type (templ, arguments, entering_scope);
11613     }
11614   else
11615     {
11616       /* If it's not a class-template or a template-template, it should be
11617          a function-template.  */
11618       gcc_assert ((DECL_FUNCTION_TEMPLATE_P (templ)
11619                    || TREE_CODE (templ) == OVERLOAD
11620                    || BASELINK_P (templ)));
11621
11622       template_id = lookup_template_function (templ, arguments);
11623     }
11624
11625   /* If parsing tentatively, replace the sequence of tokens that makes
11626      up the template-id with a CPP_TEMPLATE_ID token.  That way,
11627      should we re-parse the token stream, we will not have to repeat
11628      the effort required to do the parse, nor will we issue duplicate
11629      error messages about problems during instantiation of the
11630      template.  */
11631   if (start_of_id)
11632     {
11633       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
11634
11635       /* Reset the contents of the START_OF_ID token.  */
11636       token->type = CPP_TEMPLATE_ID;
11637       /* Retrieve any deferred checks.  Do not pop this access checks yet
11638          so the memory will not be reclaimed during token replacing below.  */
11639       token->u.tree_check_value = ggc_alloc_cleared_tree_check ();
11640       token->u.tree_check_value->value = template_id;
11641       token->u.tree_check_value->checks = get_deferred_access_checks ();
11642       token->keyword = RID_MAX;
11643
11644       /* Purge all subsequent tokens.  */
11645       cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
11646
11647       /* ??? Can we actually assume that, if template_id ==
11648          error_mark_node, we will have issued a diagnostic to the
11649          user, as opposed to simply marking the tentative parse as
11650          failed?  */
11651       if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
11652         error_at (token->location, "parse error in template argument list");
11653     }
11654
11655   pop_deferring_access_checks ();
11656   return template_id;
11657 }
11658
11659 /* Parse a template-name.
11660
11661    template-name:
11662      identifier
11663
11664    The standard should actually say:
11665
11666    template-name:
11667      identifier
11668      operator-function-id
11669
11670    A defect report has been filed about this issue.
11671
11672    A conversion-function-id cannot be a template name because they cannot
11673    be part of a template-id. In fact, looking at this code:
11674
11675    a.operator K<int>()
11676
11677    the conversion-function-id is "operator K<int>", and K<int> is a type-id.
11678    It is impossible to call a templated conversion-function-id with an
11679    explicit argument list, since the only allowed template parameter is
11680    the type to which it is converting.
11681
11682    If TEMPLATE_KEYWORD_P is true, then we have just seen the
11683    `template' keyword, in a construction like:
11684
11685      T::template f<3>()
11686
11687    In that case `f' is taken to be a template-name, even though there
11688    is no way of knowing for sure.
11689
11690    Returns the TEMPLATE_DECL for the template, or an OVERLOAD if the
11691    name refers to a set of overloaded functions, at least one of which
11692    is a template, or an IDENTIFIER_NODE with the name of the template,
11693    if TEMPLATE_KEYWORD_P is true.  If CHECK_DEPENDENCY_P is FALSE,
11694    names are looked up inside uninstantiated templates.  */
11695
11696 static tree
11697 cp_parser_template_name (cp_parser* parser,
11698                          bool template_keyword_p,
11699                          bool check_dependency_p,
11700                          bool is_declaration,
11701                          bool *is_identifier)
11702 {
11703   tree identifier;
11704   tree decl;
11705   tree fns;
11706   cp_token *token = cp_lexer_peek_token (parser->lexer);
11707
11708   /* If the next token is `operator', then we have either an
11709      operator-function-id or a conversion-function-id.  */
11710   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_OPERATOR))
11711     {
11712       /* We don't know whether we're looking at an
11713          operator-function-id or a conversion-function-id.  */
11714       cp_parser_parse_tentatively (parser);
11715       /* Try an operator-function-id.  */
11716       identifier = cp_parser_operator_function_id (parser);
11717       /* If that didn't work, try a conversion-function-id.  */
11718       if (!cp_parser_parse_definitely (parser))
11719         {
11720           cp_parser_error (parser, "expected template-name");
11721           return error_mark_node;
11722         }
11723     }
11724   /* Look for the identifier.  */
11725   else
11726     identifier = cp_parser_identifier (parser);
11727
11728   /* If we didn't find an identifier, we don't have a template-id.  */
11729   if (identifier == error_mark_node)
11730     return error_mark_node;
11731
11732   /* If the name immediately followed the `template' keyword, then it
11733      is a template-name.  However, if the next token is not `<', then
11734      we do not treat it as a template-name, since it is not being used
11735      as part of a template-id.  This enables us to handle constructs
11736      like:
11737
11738        template <typename T> struct S { S(); };
11739        template <typename T> S<T>::S();
11740
11741      correctly.  We would treat `S' as a template -- if it were `S<T>'
11742      -- but we do not if there is no `<'.  */
11743
11744   if (processing_template_decl
11745       && cp_parser_nth_token_starts_template_argument_list_p (parser, 1))
11746     {
11747       /* In a declaration, in a dependent context, we pretend that the
11748          "template" keyword was present in order to improve error
11749          recovery.  For example, given:
11750
11751            template <typename T> void f(T::X<int>);
11752
11753          we want to treat "X<int>" as a template-id.  */
11754       if (is_declaration
11755           && !template_keyword_p
11756           && parser->scope && TYPE_P (parser->scope)
11757           && check_dependency_p
11758           && dependent_scope_p (parser->scope)
11759           /* Do not do this for dtors (or ctors), since they never
11760              need the template keyword before their name.  */
11761           && !constructor_name_p (identifier, parser->scope))
11762         {
11763           cp_token_position start = 0;
11764
11765           /* Explain what went wrong.  */
11766           error_at (token->location, "non-template %qD used as template",
11767                     identifier);
11768           inform (token->location, "use %<%T::template %D%> to indicate that it is a template",
11769                   parser->scope, identifier);
11770           /* If parsing tentatively, find the location of the "<" token.  */
11771           if (cp_parser_simulate_error (parser))
11772             start = cp_lexer_token_position (parser->lexer, true);
11773           /* Parse the template arguments so that we can issue error
11774              messages about them.  */
11775           cp_lexer_consume_token (parser->lexer);
11776           cp_parser_enclosed_template_argument_list (parser);
11777           /* Skip tokens until we find a good place from which to
11778              continue parsing.  */
11779           cp_parser_skip_to_closing_parenthesis (parser,
11780                                                  /*recovering=*/true,
11781                                                  /*or_comma=*/true,
11782                                                  /*consume_paren=*/false);
11783           /* If parsing tentatively, permanently remove the
11784              template argument list.  That will prevent duplicate
11785              error messages from being issued about the missing
11786              "template" keyword.  */
11787           if (start)
11788             cp_lexer_purge_tokens_after (parser->lexer, start);
11789           if (is_identifier)
11790             *is_identifier = true;
11791           return identifier;
11792         }
11793
11794       /* If the "template" keyword is present, then there is generally
11795          no point in doing name-lookup, so we just return IDENTIFIER.
11796          But, if the qualifying scope is non-dependent then we can
11797          (and must) do name-lookup normally.  */
11798       if (template_keyword_p
11799           && (!parser->scope
11800               || (TYPE_P (parser->scope)
11801                   && dependent_type_p (parser->scope))))
11802         return identifier;
11803     }
11804
11805   /* Look up the name.  */
11806   decl = cp_parser_lookup_name (parser, identifier,
11807                                 none_type,
11808                                 /*is_template=*/true,
11809                                 /*is_namespace=*/false,
11810                                 check_dependency_p,
11811                                 /*ambiguous_decls=*/NULL,
11812                                 token->location);
11813
11814   /* If DECL is a template, then the name was a template-name.  */
11815   if (TREE_CODE (decl) == TEMPLATE_DECL)
11816     ;
11817   else
11818     {
11819       tree fn = NULL_TREE;
11820
11821       /* The standard does not explicitly indicate whether a name that
11822          names a set of overloaded declarations, some of which are
11823          templates, is a template-name.  However, such a name should
11824          be a template-name; otherwise, there is no way to form a
11825          template-id for the overloaded templates.  */
11826       fns = BASELINK_P (decl) ? BASELINK_FUNCTIONS (decl) : decl;
11827       if (TREE_CODE (fns) == OVERLOAD)
11828         for (fn = fns; fn; fn = OVL_NEXT (fn))
11829           if (TREE_CODE (OVL_CURRENT (fn)) == TEMPLATE_DECL)
11830             break;
11831
11832       if (!fn)
11833         {
11834           /* The name does not name a template.  */
11835           cp_parser_error (parser, "expected template-name");
11836           return error_mark_node;
11837         }
11838     }
11839
11840   /* If DECL is dependent, and refers to a function, then just return
11841      its name; we will look it up again during template instantiation.  */
11842   if (DECL_FUNCTION_TEMPLATE_P (decl) || !DECL_P (decl))
11843     {
11844       tree scope = CP_DECL_CONTEXT (get_first_fn (decl));
11845       if (TYPE_P (scope) && dependent_type_p (scope))
11846         return identifier;
11847     }
11848
11849   return decl;
11850 }
11851
11852 /* Parse a template-argument-list.
11853
11854    template-argument-list:
11855      template-argument ... [opt]
11856      template-argument-list , template-argument ... [opt]
11857
11858    Returns a TREE_VEC containing the arguments.  */
11859
11860 static tree
11861 cp_parser_template_argument_list (cp_parser* parser)
11862 {
11863   tree fixed_args[10];
11864   unsigned n_args = 0;
11865   unsigned alloced = 10;
11866   tree *arg_ary = fixed_args;
11867   tree vec;
11868   bool saved_in_template_argument_list_p;
11869   bool saved_ice_p;
11870   bool saved_non_ice_p;
11871
11872   saved_in_template_argument_list_p = parser->in_template_argument_list_p;
11873   parser->in_template_argument_list_p = true;
11874   /* Even if the template-id appears in an integral
11875      constant-expression, the contents of the argument list do
11876      not.  */
11877   saved_ice_p = parser->integral_constant_expression_p;
11878   parser->integral_constant_expression_p = false;
11879   saved_non_ice_p = parser->non_integral_constant_expression_p;
11880   parser->non_integral_constant_expression_p = false;
11881   /* Parse the arguments.  */
11882   do
11883     {
11884       tree argument;
11885
11886       if (n_args)
11887         /* Consume the comma.  */
11888         cp_lexer_consume_token (parser->lexer);
11889
11890       /* Parse the template-argument.  */
11891       argument = cp_parser_template_argument (parser);
11892
11893       /* If the next token is an ellipsis, we're expanding a template
11894          argument pack. */
11895       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11896         {
11897           if (argument == error_mark_node)
11898             {
11899               cp_token *token = cp_lexer_peek_token (parser->lexer);
11900               error_at (token->location,
11901                         "expected parameter pack before %<...%>");
11902             }
11903           /* Consume the `...' token. */
11904           cp_lexer_consume_token (parser->lexer);
11905
11906           /* Make the argument into a TYPE_PACK_EXPANSION or
11907              EXPR_PACK_EXPANSION. */
11908           argument = make_pack_expansion (argument);
11909         }
11910
11911       if (n_args == alloced)
11912         {
11913           alloced *= 2;
11914
11915           if (arg_ary == fixed_args)
11916             {
11917               arg_ary = XNEWVEC (tree, alloced);
11918               memcpy (arg_ary, fixed_args, sizeof (tree) * n_args);
11919             }
11920           else
11921             arg_ary = XRESIZEVEC (tree, arg_ary, alloced);
11922         }
11923       arg_ary[n_args++] = argument;
11924     }
11925   while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
11926
11927   vec = make_tree_vec (n_args);
11928
11929   while (n_args--)
11930     TREE_VEC_ELT (vec, n_args) = arg_ary[n_args];
11931
11932   if (arg_ary != fixed_args)
11933     free (arg_ary);
11934   parser->non_integral_constant_expression_p = saved_non_ice_p;
11935   parser->integral_constant_expression_p = saved_ice_p;
11936   parser->in_template_argument_list_p = saved_in_template_argument_list_p;
11937 #ifdef ENABLE_CHECKING
11938   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec));
11939 #endif
11940   return vec;
11941 }
11942
11943 /* Parse a template-argument.
11944
11945    template-argument:
11946      assignment-expression
11947      type-id
11948      id-expression
11949
11950    The representation is that of an assignment-expression, type-id, or
11951    id-expression -- except that the qualified id-expression is
11952    evaluated, so that the value returned is either a DECL or an
11953    OVERLOAD.
11954
11955    Although the standard says "assignment-expression", it forbids
11956    throw-expressions or assignments in the template argument.
11957    Therefore, we use "conditional-expression" instead.  */
11958
11959 static tree
11960 cp_parser_template_argument (cp_parser* parser)
11961 {
11962   tree argument;
11963   bool template_p;
11964   bool address_p;
11965   bool maybe_type_id = false;
11966   cp_token *token = NULL, *argument_start_token = NULL;
11967   cp_id_kind idk;
11968
11969   /* There's really no way to know what we're looking at, so we just
11970      try each alternative in order.
11971
11972        [temp.arg]
11973
11974        In a template-argument, an ambiguity between a type-id and an
11975        expression is resolved to a type-id, regardless of the form of
11976        the corresponding template-parameter.
11977
11978      Therefore, we try a type-id first.  */
11979   cp_parser_parse_tentatively (parser);
11980   argument = cp_parser_template_type_arg (parser);
11981   /* If there was no error parsing the type-id but the next token is a
11982      '>>', our behavior depends on which dialect of C++ we're
11983      parsing. In C++98, we probably found a typo for '> >'. But there
11984      are type-id which are also valid expressions. For instance:
11985
11986      struct X { int operator >> (int); };
11987      template <int V> struct Foo {};
11988      Foo<X () >> 5> r;
11989
11990      Here 'X()' is a valid type-id of a function type, but the user just
11991      wanted to write the expression "X() >> 5". Thus, we remember that we
11992      found a valid type-id, but we still try to parse the argument as an
11993      expression to see what happens. 
11994
11995      In C++0x, the '>>' will be considered two separate '>'
11996      tokens.  */
11997   if (!cp_parser_error_occurred (parser)
11998       && cxx_dialect == cxx98
11999       && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
12000     {
12001       maybe_type_id = true;
12002       cp_parser_abort_tentative_parse (parser);
12003     }
12004   else
12005     {
12006       /* If the next token isn't a `,' or a `>', then this argument wasn't
12007       really finished. This means that the argument is not a valid
12008       type-id.  */
12009       if (!cp_parser_next_token_ends_template_argument_p (parser))
12010         cp_parser_error (parser, "expected template-argument");
12011       /* If that worked, we're done.  */
12012       if (cp_parser_parse_definitely (parser))
12013         return argument;
12014     }
12015   /* We're still not sure what the argument will be.  */
12016   cp_parser_parse_tentatively (parser);
12017   /* Try a template.  */
12018   argument_start_token = cp_lexer_peek_token (parser->lexer);
12019   argument = cp_parser_id_expression (parser,
12020                                       /*template_keyword_p=*/false,
12021                                       /*check_dependency_p=*/true,
12022                                       &template_p,
12023                                       /*declarator_p=*/false,
12024                                       /*optional_p=*/false);
12025   /* If the next token isn't a `,' or a `>', then this argument wasn't
12026      really finished.  */
12027   if (!cp_parser_next_token_ends_template_argument_p (parser))
12028     cp_parser_error (parser, "expected template-argument");
12029   if (!cp_parser_error_occurred (parser))
12030     {
12031       /* Figure out what is being referred to.  If the id-expression
12032          was for a class template specialization, then we will have a
12033          TYPE_DECL at this point.  There is no need to do name lookup
12034          at this point in that case.  */
12035       if (TREE_CODE (argument) != TYPE_DECL)
12036         argument = cp_parser_lookup_name (parser, argument,
12037                                           none_type,
12038                                           /*is_template=*/template_p,
12039                                           /*is_namespace=*/false,
12040                                           /*check_dependency=*/true,
12041                                           /*ambiguous_decls=*/NULL,
12042                                           argument_start_token->location);
12043       if (TREE_CODE (argument) != TEMPLATE_DECL
12044           && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
12045         cp_parser_error (parser, "expected template-name");
12046     }
12047   if (cp_parser_parse_definitely (parser))
12048     return argument;
12049   /* It must be a non-type argument.  There permitted cases are given
12050      in [temp.arg.nontype]:
12051
12052      -- an integral constant-expression of integral or enumeration
12053         type; or
12054
12055      -- the name of a non-type template-parameter; or
12056
12057      -- the name of an object or function with external linkage...
12058
12059      -- the address of an object or function with external linkage...
12060
12061      -- a pointer to member...  */
12062   /* Look for a non-type template parameter.  */
12063   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
12064     {
12065       cp_parser_parse_tentatively (parser);
12066       argument = cp_parser_primary_expression (parser,
12067                                                /*address_p=*/false,
12068                                                /*cast_p=*/false,
12069                                                /*template_arg_p=*/true,
12070                                                &idk);
12071       if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX
12072           || !cp_parser_next_token_ends_template_argument_p (parser))
12073         cp_parser_simulate_error (parser);
12074       if (cp_parser_parse_definitely (parser))
12075         return argument;
12076     }
12077
12078   /* If the next token is "&", the argument must be the address of an
12079      object or function with external linkage.  */
12080   address_p = cp_lexer_next_token_is (parser->lexer, CPP_AND);
12081   if (address_p)
12082     cp_lexer_consume_token (parser->lexer);
12083   /* See if we might have an id-expression.  */
12084   token = cp_lexer_peek_token (parser->lexer);
12085   if (token->type == CPP_NAME
12086       || token->keyword == RID_OPERATOR
12087       || token->type == CPP_SCOPE
12088       || token->type == CPP_TEMPLATE_ID
12089       || token->type == CPP_NESTED_NAME_SPECIFIER)
12090     {
12091       cp_parser_parse_tentatively (parser);
12092       argument = cp_parser_primary_expression (parser,
12093                                                address_p,
12094                                                /*cast_p=*/false,
12095                                                /*template_arg_p=*/true,
12096                                                &idk);
12097       if (cp_parser_error_occurred (parser)
12098           || !cp_parser_next_token_ends_template_argument_p (parser))
12099         cp_parser_abort_tentative_parse (parser);
12100       else
12101         {
12102           tree probe;
12103
12104           if (TREE_CODE (argument) == INDIRECT_REF)
12105             {
12106               gcc_assert (REFERENCE_REF_P (argument));
12107               argument = TREE_OPERAND (argument, 0);
12108             }
12109
12110           /* If we're in a template, we represent a qualified-id referring
12111              to a static data member as a SCOPE_REF even if the scope isn't
12112              dependent so that we can check access control later.  */
12113           probe = argument;
12114           if (TREE_CODE (probe) == SCOPE_REF)
12115             probe = TREE_OPERAND (probe, 1);
12116           if (TREE_CODE (probe) == VAR_DECL)
12117             {
12118               /* A variable without external linkage might still be a
12119                  valid constant-expression, so no error is issued here
12120                  if the external-linkage check fails.  */
12121               if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe))
12122                 cp_parser_simulate_error (parser);
12123             }
12124           else if (is_overloaded_fn (argument))
12125             /* All overloaded functions are allowed; if the external
12126                linkage test does not pass, an error will be issued
12127                later.  */
12128             ;
12129           else if (address_p
12130                    && (TREE_CODE (argument) == OFFSET_REF
12131                        || TREE_CODE (argument) == SCOPE_REF))
12132             /* A pointer-to-member.  */
12133             ;
12134           else if (TREE_CODE (argument) == TEMPLATE_PARM_INDEX)
12135             ;
12136           else
12137             cp_parser_simulate_error (parser);
12138
12139           if (cp_parser_parse_definitely (parser))
12140             {
12141               if (address_p)
12142                 argument = build_x_unary_op (ADDR_EXPR, argument,
12143                                              tf_warning_or_error);
12144               return argument;
12145             }
12146         }
12147     }
12148   /* If the argument started with "&", there are no other valid
12149      alternatives at this point.  */
12150   if (address_p)
12151     {
12152       cp_parser_error (parser, "invalid non-type template argument");
12153       return error_mark_node;
12154     }
12155
12156   /* If the argument wasn't successfully parsed as a type-id followed
12157      by '>>', the argument can only be a constant expression now.
12158      Otherwise, we try parsing the constant-expression tentatively,
12159      because the argument could really be a type-id.  */
12160   if (maybe_type_id)
12161     cp_parser_parse_tentatively (parser);
12162   argument = cp_parser_constant_expression (parser,
12163                                             /*allow_non_constant_p=*/false,
12164                                             /*non_constant_p=*/NULL);
12165   argument = fold_non_dependent_expr (argument);
12166   if (!maybe_type_id)
12167     return argument;
12168   if (!cp_parser_next_token_ends_template_argument_p (parser))
12169     cp_parser_error (parser, "expected template-argument");
12170   if (cp_parser_parse_definitely (parser))
12171     return argument;
12172   /* We did our best to parse the argument as a non type-id, but that
12173      was the only alternative that matched (albeit with a '>' after
12174      it). We can assume it's just a typo from the user, and a
12175      diagnostic will then be issued.  */
12176   return cp_parser_template_type_arg (parser);
12177 }
12178
12179 /* Parse an explicit-instantiation.
12180
12181    explicit-instantiation:
12182      template declaration
12183
12184    Although the standard says `declaration', what it really means is:
12185
12186    explicit-instantiation:
12187      template decl-specifier-seq [opt] declarator [opt] ;
12188
12189    Things like `template int S<int>::i = 5, int S<double>::j;' are not
12190    supposed to be allowed.  A defect report has been filed about this
12191    issue.
12192
12193    GNU Extension:
12194
12195    explicit-instantiation:
12196      storage-class-specifier template
12197        decl-specifier-seq [opt] declarator [opt] ;
12198      function-specifier template
12199        decl-specifier-seq [opt] declarator [opt] ;  */
12200
12201 static void
12202 cp_parser_explicit_instantiation (cp_parser* parser)
12203 {
12204   int declares_class_or_enum;
12205   cp_decl_specifier_seq decl_specifiers;
12206   tree extension_specifier = NULL_TREE;
12207
12208   timevar_push (TV_TEMPLATE_INST);
12209
12210   /* Look for an (optional) storage-class-specifier or
12211      function-specifier.  */
12212   if (cp_parser_allow_gnu_extensions_p (parser))
12213     {
12214       extension_specifier
12215         = cp_parser_storage_class_specifier_opt (parser);
12216       if (!extension_specifier)
12217         extension_specifier
12218           = cp_parser_function_specifier_opt (parser,
12219                                               /*decl_specs=*/NULL);
12220     }
12221
12222   /* Look for the `template' keyword.  */
12223   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12224   /* Let the front end know that we are processing an explicit
12225      instantiation.  */
12226   begin_explicit_instantiation ();
12227   /* [temp.explicit] says that we are supposed to ignore access
12228      control while processing explicit instantiation directives.  */
12229   push_deferring_access_checks (dk_no_check);
12230   /* Parse a decl-specifier-seq.  */
12231   cp_parser_decl_specifier_seq (parser,
12232                                 CP_PARSER_FLAGS_OPTIONAL,
12233                                 &decl_specifiers,
12234                                 &declares_class_or_enum);
12235   /* If there was exactly one decl-specifier, and it declared a class,
12236      and there's no declarator, then we have an explicit type
12237      instantiation.  */
12238   if (declares_class_or_enum && cp_parser_declares_only_class_p (parser))
12239     {
12240       tree type;
12241
12242       type = check_tag_decl (&decl_specifiers);
12243       /* Turn access control back on for names used during
12244          template instantiation.  */
12245       pop_deferring_access_checks ();
12246       if (type)
12247         do_type_instantiation (type, extension_specifier,
12248                                /*complain=*/tf_error);
12249     }
12250   else
12251     {
12252       cp_declarator *declarator;
12253       tree decl;
12254
12255       /* Parse the declarator.  */
12256       declarator
12257         = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
12258                                 /*ctor_dtor_or_conv_p=*/NULL,
12259                                 /*parenthesized_p=*/NULL,
12260                                 /*member_p=*/false);
12261       if (declares_class_or_enum & 2)
12262         cp_parser_check_for_definition_in_return_type (declarator,
12263                                                        decl_specifiers.type,
12264                                                        decl_specifiers.type_location);
12265       if (declarator != cp_error_declarator)
12266         {
12267           if (decl_specifiers.specs[(int)ds_inline])
12268             permerror (input_location, "explicit instantiation shall not use"
12269                        " %<inline%> specifier");
12270           if (decl_specifiers.specs[(int)ds_constexpr])
12271             permerror (input_location, "explicit instantiation shall not use"
12272                        " %<constexpr%> specifier");
12273
12274           decl = grokdeclarator (declarator, &decl_specifiers,
12275                                  NORMAL, 0, &decl_specifiers.attributes);
12276           /* Turn access control back on for names used during
12277              template instantiation.  */
12278           pop_deferring_access_checks ();
12279           /* Do the explicit instantiation.  */
12280           do_decl_instantiation (decl, extension_specifier);
12281         }
12282       else
12283         {
12284           pop_deferring_access_checks ();
12285           /* Skip the body of the explicit instantiation.  */
12286           cp_parser_skip_to_end_of_statement (parser);
12287         }
12288     }
12289   /* We're done with the instantiation.  */
12290   end_explicit_instantiation ();
12291
12292   cp_parser_consume_semicolon_at_end_of_statement (parser);
12293
12294   timevar_pop (TV_TEMPLATE_INST);
12295 }
12296
12297 /* Parse an explicit-specialization.
12298
12299    explicit-specialization:
12300      template < > declaration
12301
12302    Although the standard says `declaration', what it really means is:
12303
12304    explicit-specialization:
12305      template <> decl-specifier [opt] init-declarator [opt] ;
12306      template <> function-definition
12307      template <> explicit-specialization
12308      template <> template-declaration  */
12309
12310 static void
12311 cp_parser_explicit_specialization (cp_parser* parser)
12312 {
12313   bool need_lang_pop;
12314   cp_token *token = cp_lexer_peek_token (parser->lexer);
12315
12316   /* Look for the `template' keyword.  */
12317   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12318   /* Look for the `<'.  */
12319   cp_parser_require (parser, CPP_LESS, RT_LESS);
12320   /* Look for the `>'.  */
12321   cp_parser_require (parser, CPP_GREATER, RT_GREATER);
12322   /* We have processed another parameter list.  */
12323   ++parser->num_template_parameter_lists;
12324   /* [temp]
12325
12326      A template ... explicit specialization ... shall not have C
12327      linkage.  */
12328   if (current_lang_name == lang_name_c)
12329     {
12330       error_at (token->location, "template specialization with C linkage");
12331       /* Give it C++ linkage to avoid confusing other parts of the
12332          front end.  */
12333       push_lang_context (lang_name_cplusplus);
12334       need_lang_pop = true;
12335     }
12336   else
12337     need_lang_pop = false;
12338   /* Let the front end know that we are beginning a specialization.  */
12339   if (!begin_specialization ())
12340     {
12341       end_specialization ();
12342       return;
12343     }
12344
12345   /* If the next keyword is `template', we need to figure out whether
12346      or not we're looking a template-declaration.  */
12347   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
12348     {
12349       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
12350           && cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_GREATER)
12351         cp_parser_template_declaration_after_export (parser,
12352                                                      /*member_p=*/false);
12353       else
12354         cp_parser_explicit_specialization (parser);
12355     }
12356   else
12357     /* Parse the dependent declaration.  */
12358     cp_parser_single_declaration (parser,
12359                                   /*checks=*/NULL,
12360                                   /*member_p=*/false,
12361                                   /*explicit_specialization_p=*/true,
12362                                   /*friend_p=*/NULL);
12363   /* We're done with the specialization.  */
12364   end_specialization ();
12365   /* For the erroneous case of a template with C linkage, we pushed an
12366      implicit C++ linkage scope; exit that scope now.  */
12367   if (need_lang_pop)
12368     pop_lang_context ();
12369   /* We're done with this parameter list.  */
12370   --parser->num_template_parameter_lists;
12371 }
12372
12373 /* Parse a type-specifier.
12374
12375    type-specifier:
12376      simple-type-specifier
12377      class-specifier
12378      enum-specifier
12379      elaborated-type-specifier
12380      cv-qualifier
12381
12382    GNU Extension:
12383
12384    type-specifier:
12385      __complex__
12386
12387    Returns a representation of the type-specifier.  For a
12388    class-specifier, enum-specifier, or elaborated-type-specifier, a
12389    TREE_TYPE is returned; otherwise, a TYPE_DECL is returned.
12390
12391    The parser flags FLAGS is used to control type-specifier parsing.
12392
12393    If IS_DECLARATION is TRUE, then this type-specifier is appearing
12394    in a decl-specifier-seq.
12395
12396    If DECLARES_CLASS_OR_ENUM is non-NULL, and the type-specifier is a
12397    class-specifier, enum-specifier, or elaborated-type-specifier, then
12398    *DECLARES_CLASS_OR_ENUM is set to a nonzero value.  The value is 1
12399    if a type is declared; 2 if it is defined.  Otherwise, it is set to
12400    zero.
12401
12402    If IS_CV_QUALIFIER is non-NULL, and the type-specifier is a
12403    cv-qualifier, then IS_CV_QUALIFIER is set to TRUE.  Otherwise, it
12404    is set to FALSE.  */
12405
12406 static tree
12407 cp_parser_type_specifier (cp_parser* parser,
12408                           cp_parser_flags flags,
12409                           cp_decl_specifier_seq *decl_specs,
12410                           bool is_declaration,
12411                           int* declares_class_or_enum,
12412                           bool* is_cv_qualifier)
12413 {
12414   tree type_spec = NULL_TREE;
12415   cp_token *token;
12416   enum rid keyword;
12417   cp_decl_spec ds = ds_last;
12418
12419   /* Assume this type-specifier does not declare a new type.  */
12420   if (declares_class_or_enum)
12421     *declares_class_or_enum = 0;
12422   /* And that it does not specify a cv-qualifier.  */
12423   if (is_cv_qualifier)
12424     *is_cv_qualifier = false;
12425   /* Peek at the next token.  */
12426   token = cp_lexer_peek_token (parser->lexer);
12427
12428   /* If we're looking at a keyword, we can use that to guide the
12429      production we choose.  */
12430   keyword = token->keyword;
12431   switch (keyword)
12432     {
12433     case RID_ENUM:
12434       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12435         goto elaborated_type_specifier;
12436
12437       /* Look for the enum-specifier.  */
12438       type_spec = cp_parser_enum_specifier (parser);
12439       /* If that worked, we're done.  */
12440       if (type_spec)
12441         {
12442           if (declares_class_or_enum)
12443             *declares_class_or_enum = 2;
12444           if (decl_specs)
12445             cp_parser_set_decl_spec_type (decl_specs,
12446                                           type_spec,
12447                                           token->location,
12448                                           /*user_defined_p=*/true);
12449           return type_spec;
12450         }
12451       else
12452         goto elaborated_type_specifier;
12453
12454       /* Any of these indicate either a class-specifier, or an
12455          elaborated-type-specifier.  */
12456     case RID_CLASS:
12457     case RID_STRUCT:
12458     case RID_UNION:
12459       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12460         goto elaborated_type_specifier;
12461
12462       /* Parse tentatively so that we can back up if we don't find a
12463          class-specifier.  */
12464       cp_parser_parse_tentatively (parser);
12465       /* Look for the class-specifier.  */
12466       type_spec = cp_parser_class_specifier (parser);
12467       invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, type_spec);
12468       /* If that worked, we're done.  */
12469       if (cp_parser_parse_definitely (parser))
12470         {
12471           if (declares_class_or_enum)
12472             *declares_class_or_enum = 2;
12473           if (decl_specs)
12474             cp_parser_set_decl_spec_type (decl_specs,
12475                                           type_spec,
12476                                           token->location,
12477                                           /*user_defined_p=*/true);
12478           return type_spec;
12479         }
12480
12481       /* Fall through.  */
12482     elaborated_type_specifier:
12483       /* We're declaring (not defining) a class or enum.  */
12484       if (declares_class_or_enum)
12485         *declares_class_or_enum = 1;
12486
12487       /* Fall through.  */
12488     case RID_TYPENAME:
12489       /* Look for an elaborated-type-specifier.  */
12490       type_spec
12491         = (cp_parser_elaborated_type_specifier
12492            (parser,
12493             decl_specs && decl_specs->specs[(int) ds_friend],
12494             is_declaration));
12495       if (decl_specs)
12496         cp_parser_set_decl_spec_type (decl_specs,
12497                                       type_spec,
12498                                       token->location,
12499                                       /*user_defined_p=*/true);
12500       return type_spec;
12501
12502     case RID_CONST:
12503       ds = ds_const;
12504       if (is_cv_qualifier)
12505         *is_cv_qualifier = true;
12506       break;
12507
12508     case RID_VOLATILE:
12509       ds = ds_volatile;
12510       if (is_cv_qualifier)
12511         *is_cv_qualifier = true;
12512       break;
12513
12514     case RID_RESTRICT:
12515       ds = ds_restrict;
12516       if (is_cv_qualifier)
12517         *is_cv_qualifier = true;
12518       break;
12519
12520     case RID_COMPLEX:
12521       /* The `__complex__' keyword is a GNU extension.  */
12522       ds = ds_complex;
12523       break;
12524
12525     default:
12526       break;
12527     }
12528
12529   /* Handle simple keywords.  */
12530   if (ds != ds_last)
12531     {
12532       if (decl_specs)
12533         {
12534           ++decl_specs->specs[(int)ds];
12535           decl_specs->any_specifiers_p = true;
12536         }
12537       return cp_lexer_consume_token (parser->lexer)->u.value;
12538     }
12539
12540   /* If we do not already have a type-specifier, assume we are looking
12541      at a simple-type-specifier.  */
12542   type_spec = cp_parser_simple_type_specifier (parser,
12543                                                decl_specs,
12544                                                flags);
12545
12546   /* If we didn't find a type-specifier, and a type-specifier was not
12547      optional in this context, issue an error message.  */
12548   if (!type_spec && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12549     {
12550       cp_parser_error (parser, "expected type specifier");
12551       return error_mark_node;
12552     }
12553
12554   return type_spec;
12555 }
12556
12557 /* Parse a simple-type-specifier.
12558
12559    simple-type-specifier:
12560      :: [opt] nested-name-specifier [opt] type-name
12561      :: [opt] nested-name-specifier template template-id
12562      char
12563      wchar_t
12564      bool
12565      short
12566      int
12567      long
12568      signed
12569      unsigned
12570      float
12571      double
12572      void
12573
12574    C++0x Extension:
12575
12576    simple-type-specifier:
12577      auto
12578      decltype ( expression )   
12579      char16_t
12580      char32_t
12581      __underlying_type ( type-id )
12582
12583    GNU Extension:
12584
12585    simple-type-specifier:
12586      __int128
12587      __typeof__ unary-expression
12588      __typeof__ ( type-id )
12589
12590    Returns the indicated TYPE_DECL.  If DECL_SPECS is not NULL, it is
12591    appropriately updated.  */
12592
12593 static tree
12594 cp_parser_simple_type_specifier (cp_parser* parser,
12595                                  cp_decl_specifier_seq *decl_specs,
12596                                  cp_parser_flags flags)
12597 {
12598   tree type = NULL_TREE;
12599   cp_token *token;
12600
12601   /* Peek at the next token.  */
12602   token = cp_lexer_peek_token (parser->lexer);
12603
12604   /* If we're looking at a keyword, things are easy.  */
12605   switch (token->keyword)
12606     {
12607     case RID_CHAR:
12608       if (decl_specs)
12609         decl_specs->explicit_char_p = true;
12610       type = char_type_node;
12611       break;
12612     case RID_CHAR16:
12613       type = char16_type_node;
12614       break;
12615     case RID_CHAR32:
12616       type = char32_type_node;
12617       break;
12618     case RID_WCHAR:
12619       type = wchar_type_node;
12620       break;
12621     case RID_BOOL:
12622       type = boolean_type_node;
12623       break;
12624     case RID_SHORT:
12625       if (decl_specs)
12626         ++decl_specs->specs[(int) ds_short];
12627       type = short_integer_type_node;
12628       break;
12629     case RID_INT:
12630       if (decl_specs)
12631         decl_specs->explicit_int_p = true;
12632       type = integer_type_node;
12633       break;
12634     case RID_INT128:
12635       if (!int128_integer_type_node)
12636         break;
12637       if (decl_specs)
12638         decl_specs->explicit_int128_p = true;
12639       type = int128_integer_type_node;
12640       break;
12641     case RID_LONG:
12642       if (decl_specs)
12643         ++decl_specs->specs[(int) ds_long];
12644       type = long_integer_type_node;
12645       break;
12646     case RID_SIGNED:
12647       if (decl_specs)
12648         ++decl_specs->specs[(int) ds_signed];
12649       type = integer_type_node;
12650       break;
12651     case RID_UNSIGNED:
12652       if (decl_specs)
12653         ++decl_specs->specs[(int) ds_unsigned];
12654       type = unsigned_type_node;
12655       break;
12656     case RID_FLOAT:
12657       type = float_type_node;
12658       break;
12659     case RID_DOUBLE:
12660       type = double_type_node;
12661       break;
12662     case RID_VOID:
12663       type = void_type_node;
12664       break;
12665       
12666     case RID_AUTO:
12667       maybe_warn_cpp0x (CPP0X_AUTO);
12668       type = make_auto ();
12669       break;
12670
12671     case RID_DECLTYPE:
12672       /* Parse the `decltype' type.  */
12673       type = cp_parser_decltype (parser);
12674
12675       if (decl_specs)
12676         cp_parser_set_decl_spec_type (decl_specs, type,
12677                                       token->location,
12678                                       /*user_defined_p=*/true);
12679
12680       return type;
12681
12682     case RID_TYPEOF:
12683       /* Consume the `typeof' token.  */
12684       cp_lexer_consume_token (parser->lexer);
12685       /* Parse the operand to `typeof'.  */
12686       type = cp_parser_sizeof_operand (parser, RID_TYPEOF);
12687       /* If it is not already a TYPE, take its type.  */
12688       if (!TYPE_P (type))
12689         type = finish_typeof (type);
12690
12691       if (decl_specs)
12692         cp_parser_set_decl_spec_type (decl_specs, type,
12693                                       token->location,
12694                                       /*user_defined_p=*/true);
12695
12696       return type;
12697
12698     case RID_UNDERLYING_TYPE:
12699       type = cp_parser_trait_expr (parser, RID_UNDERLYING_TYPE);
12700
12701       if (decl_specs)
12702         cp_parser_set_decl_spec_type (decl_specs, type,
12703                                       token->location,
12704                                       /*user_defined_p=*/true);
12705
12706       return type;
12707
12708     default:
12709       break;
12710     }
12711
12712   /* If the type-specifier was for a built-in type, we're done.  */
12713   if (type)
12714     {
12715       /* Record the type.  */
12716       if (decl_specs
12717           && (token->keyword != RID_SIGNED
12718               && token->keyword != RID_UNSIGNED
12719               && token->keyword != RID_SHORT
12720               && token->keyword != RID_LONG))
12721         cp_parser_set_decl_spec_type (decl_specs,
12722                                       type,
12723                                       token->location,
12724                                       /*user_defined=*/false);
12725       if (decl_specs)
12726         decl_specs->any_specifiers_p = true;
12727
12728       /* Consume the token.  */
12729       cp_lexer_consume_token (parser->lexer);
12730
12731       /* There is no valid C++ program where a non-template type is
12732          followed by a "<".  That usually indicates that the user thought
12733          that the type was a template.  */
12734       cp_parser_check_for_invalid_template_id (parser, type, token->location);
12735
12736       return TYPE_NAME (type);
12737     }
12738
12739   /* The type-specifier must be a user-defined type.  */
12740   if (!(flags & CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES))
12741     {
12742       bool qualified_p;
12743       bool global_p;
12744
12745       /* Don't gobble tokens or issue error messages if this is an
12746          optional type-specifier.  */
12747       if (flags & CP_PARSER_FLAGS_OPTIONAL)
12748         cp_parser_parse_tentatively (parser);
12749
12750       /* Look for the optional `::' operator.  */
12751       global_p
12752         = (cp_parser_global_scope_opt (parser,
12753                                        /*current_scope_valid_p=*/false)
12754            != NULL_TREE);
12755       /* Look for the nested-name specifier.  */
12756       qualified_p
12757         = (cp_parser_nested_name_specifier_opt (parser,
12758                                                 /*typename_keyword_p=*/false,
12759                                                 /*check_dependency_p=*/true,
12760                                                 /*type_p=*/false,
12761                                                 /*is_declaration=*/false)
12762            != NULL_TREE);
12763       token = cp_lexer_peek_token (parser->lexer);
12764       /* If we have seen a nested-name-specifier, and the next token
12765          is `template', then we are using the template-id production.  */
12766       if (parser->scope
12767           && cp_parser_optional_template_keyword (parser))
12768         {
12769           /* Look for the template-id.  */
12770           type = cp_parser_template_id (parser,
12771                                         /*template_keyword_p=*/true,
12772                                         /*check_dependency_p=*/true,
12773                                         /*is_declaration=*/false);
12774           /* If the template-id did not name a type, we are out of
12775              luck.  */
12776           if (TREE_CODE (type) != TYPE_DECL)
12777             {
12778               cp_parser_error (parser, "expected template-id for type");
12779               type = NULL_TREE;
12780             }
12781         }
12782       /* Otherwise, look for a type-name.  */
12783       else
12784         type = cp_parser_type_name (parser);
12785       /* Keep track of all name-lookups performed in class scopes.  */
12786       if (type
12787           && !global_p
12788           && !qualified_p
12789           && TREE_CODE (type) == TYPE_DECL
12790           && TREE_CODE (DECL_NAME (type)) == IDENTIFIER_NODE)
12791         maybe_note_name_used_in_class (DECL_NAME (type), type);
12792       /* If it didn't work out, we don't have a TYPE.  */
12793       if ((flags & CP_PARSER_FLAGS_OPTIONAL)
12794           && !cp_parser_parse_definitely (parser))
12795         type = NULL_TREE;
12796       if (type && decl_specs)
12797         cp_parser_set_decl_spec_type (decl_specs, type,
12798                                       token->location,
12799                                       /*user_defined=*/true);
12800     }
12801
12802   /* If we didn't get a type-name, issue an error message.  */
12803   if (!type && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12804     {
12805       cp_parser_error (parser, "expected type-name");
12806       return error_mark_node;
12807     }
12808
12809   if (type && type != error_mark_node)
12810     {
12811       /* See if TYPE is an Objective-C type, and if so, parse and
12812          accept any protocol references following it.  Do this before
12813          the cp_parser_check_for_invalid_template_id() call, because
12814          Objective-C types can be followed by '<...>' which would
12815          enclose protocol names rather than template arguments, and so
12816          everything is fine.  */
12817       if (c_dialect_objc () && !parser->scope
12818           && (objc_is_id (type) || objc_is_class_name (type)))
12819         {
12820           tree protos = cp_parser_objc_protocol_refs_opt (parser);
12821           tree qual_type = objc_get_protocol_qualified_type (type, protos);
12822
12823           /* Clobber the "unqualified" type previously entered into
12824              DECL_SPECS with the new, improved protocol-qualified version.  */
12825           if (decl_specs)
12826             decl_specs->type = qual_type;
12827
12828           return qual_type;
12829         }
12830
12831       /* There is no valid C++ program where a non-template type is
12832          followed by a "<".  That usually indicates that the user
12833          thought that the type was a template.  */
12834       cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type),
12835                                                token->location);
12836     }
12837
12838   return type;
12839 }
12840
12841 /* Parse a type-name.
12842
12843    type-name:
12844      class-name
12845      enum-name
12846      typedef-name
12847
12848    enum-name:
12849      identifier
12850
12851    typedef-name:
12852      identifier
12853
12854    Returns a TYPE_DECL for the type.  */
12855
12856 static tree
12857 cp_parser_type_name (cp_parser* parser)
12858 {
12859   tree type_decl;
12860
12861   /* We can't know yet whether it is a class-name or not.  */
12862   cp_parser_parse_tentatively (parser);
12863   /* Try a class-name.  */
12864   type_decl = cp_parser_class_name (parser,
12865                                     /*typename_keyword_p=*/false,
12866                                     /*template_keyword_p=*/false,
12867                                     none_type,
12868                                     /*check_dependency_p=*/true,
12869                                     /*class_head_p=*/false,
12870                                     /*is_declaration=*/false);
12871   /* If it's not a class-name, keep looking.  */
12872   if (!cp_parser_parse_definitely (parser))
12873     {
12874       /* It must be a typedef-name or an enum-name.  */
12875       return cp_parser_nonclass_name (parser);
12876     }
12877
12878   return type_decl;
12879 }
12880
12881 /* Parse a non-class type-name, that is, either an enum-name or a typedef-name.
12882
12883    enum-name:
12884      identifier
12885
12886    typedef-name:
12887      identifier
12888
12889    Returns a TYPE_DECL for the type.  */
12890
12891 static tree
12892 cp_parser_nonclass_name (cp_parser* parser)
12893 {
12894   tree type_decl;
12895   tree identifier;
12896
12897   cp_token *token = cp_lexer_peek_token (parser->lexer);
12898   identifier = cp_parser_identifier (parser);
12899   if (identifier == error_mark_node)
12900     return error_mark_node;
12901
12902   /* Look up the type-name.  */
12903   type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
12904
12905   if (TREE_CODE (type_decl) != TYPE_DECL
12906       && (objc_is_id (identifier) || objc_is_class_name (identifier)))
12907     {
12908       /* See if this is an Objective-C type.  */
12909       tree protos = cp_parser_objc_protocol_refs_opt (parser);
12910       tree type = objc_get_protocol_qualified_type (identifier, protos);
12911       if (type)
12912         type_decl = TYPE_NAME (type);
12913     }
12914
12915   /* Issue an error if we did not find a type-name.  */
12916   if (TREE_CODE (type_decl) != TYPE_DECL
12917       /* In Objective-C, we have the complication that class names are
12918          normally type names and start declarations (eg, the
12919          "NSObject" in "NSObject *object;"), but can be used in an
12920          Objective-C 2.0 dot-syntax (as in "NSObject.version") which
12921          is an expression.  So, a classname followed by a dot is not a
12922          valid type-name.  */
12923       || (objc_is_class_name (TREE_TYPE (type_decl))
12924           && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT))
12925     {
12926       if (!cp_parser_simulate_error (parser))
12927         cp_parser_name_lookup_error (parser, identifier, type_decl,
12928                                      NLE_TYPE, token->location);
12929       return error_mark_node;
12930     }
12931   /* Remember that the name was used in the definition of the
12932      current class so that we can check later to see if the
12933      meaning would have been different after the class was
12934      entirely defined.  */
12935   else if (type_decl != error_mark_node
12936            && !parser->scope)
12937     maybe_note_name_used_in_class (identifier, type_decl);
12938   
12939   return type_decl;
12940 }
12941
12942 /* Parse an elaborated-type-specifier.  Note that the grammar given
12943    here incorporates the resolution to DR68.
12944
12945    elaborated-type-specifier:
12946      class-key :: [opt] nested-name-specifier [opt] identifier
12947      class-key :: [opt] nested-name-specifier [opt] template [opt] template-id
12948      enum-key :: [opt] nested-name-specifier [opt] identifier
12949      typename :: [opt] nested-name-specifier identifier
12950      typename :: [opt] nested-name-specifier template [opt]
12951        template-id
12952
12953    GNU extension:
12954
12955    elaborated-type-specifier:
12956      class-key attributes :: [opt] nested-name-specifier [opt] identifier
12957      class-key attributes :: [opt] nested-name-specifier [opt]
12958                template [opt] template-id
12959      enum attributes :: [opt] nested-name-specifier [opt] identifier
12960
12961    If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
12962    declared `friend'.  If IS_DECLARATION is TRUE, then this
12963    elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
12964    something is being declared.
12965
12966    Returns the TYPE specified.  */
12967
12968 static tree
12969 cp_parser_elaborated_type_specifier (cp_parser* parser,
12970                                      bool is_friend,
12971                                      bool is_declaration)
12972 {
12973   enum tag_types tag_type;
12974   tree identifier;
12975   tree type = NULL_TREE;
12976   tree attributes = NULL_TREE;
12977   tree globalscope;
12978   cp_token *token = NULL;
12979
12980   /* See if we're looking at the `enum' keyword.  */
12981   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
12982     {
12983       /* Consume the `enum' token.  */
12984       cp_lexer_consume_token (parser->lexer);
12985       /* Remember that it's an enumeration type.  */
12986       tag_type = enum_type;
12987       /* Issue a warning if the `struct' or `class' key (for C++0x scoped
12988          enums) is used here.  */
12989       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
12990           || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
12991         {
12992             pedwarn (input_location, 0, "elaborated-type-specifier "
12993                       "for a scoped enum must not use the %<%D%> keyword",
12994                       cp_lexer_peek_token (parser->lexer)->u.value);
12995           /* Consume the `struct' or `class' and parse it anyway.  */
12996           cp_lexer_consume_token (parser->lexer);
12997         }
12998       /* Parse the attributes.  */
12999       attributes = cp_parser_attributes_opt (parser);
13000     }
13001   /* Or, it might be `typename'.  */
13002   else if (cp_lexer_next_token_is_keyword (parser->lexer,
13003                                            RID_TYPENAME))
13004     {
13005       /* Consume the `typename' token.  */
13006       cp_lexer_consume_token (parser->lexer);
13007       /* Remember that it's a `typename' type.  */
13008       tag_type = typename_type;
13009     }
13010   /* Otherwise it must be a class-key.  */
13011   else
13012     {
13013       tag_type = cp_parser_class_key (parser);
13014       if (tag_type == none_type)
13015         return error_mark_node;
13016       /* Parse the attributes.  */
13017       attributes = cp_parser_attributes_opt (parser);
13018     }
13019
13020   /* Look for the `::' operator.  */
13021   globalscope =  cp_parser_global_scope_opt (parser,
13022                                              /*current_scope_valid_p=*/false);
13023   /* Look for the nested-name-specifier.  */
13024   if (tag_type == typename_type && !globalscope)
13025     {
13026       if (!cp_parser_nested_name_specifier (parser,
13027                                            /*typename_keyword_p=*/true,
13028                                            /*check_dependency_p=*/true,
13029                                            /*type_p=*/true,
13030                                             is_declaration))
13031         return error_mark_node;
13032     }
13033   else
13034     /* Even though `typename' is not present, the proposed resolution
13035        to Core Issue 180 says that in `class A<T>::B', `B' should be
13036        considered a type-name, even if `A<T>' is dependent.  */
13037     cp_parser_nested_name_specifier_opt (parser,
13038                                          /*typename_keyword_p=*/true,
13039                                          /*check_dependency_p=*/true,
13040                                          /*type_p=*/true,
13041                                          is_declaration);
13042  /* For everything but enumeration types, consider a template-id.
13043     For an enumeration type, consider only a plain identifier.  */
13044   if (tag_type != enum_type)
13045     {
13046       bool template_p = false;
13047       tree decl;
13048
13049       /* Allow the `template' keyword.  */
13050       template_p = cp_parser_optional_template_keyword (parser);
13051       /* If we didn't see `template', we don't know if there's a
13052          template-id or not.  */
13053       if (!template_p)
13054         cp_parser_parse_tentatively (parser);
13055       /* Parse the template-id.  */
13056       token = cp_lexer_peek_token (parser->lexer);
13057       decl = cp_parser_template_id (parser, template_p,
13058                                     /*check_dependency_p=*/true,
13059                                     is_declaration);
13060       /* If we didn't find a template-id, look for an ordinary
13061          identifier.  */
13062       if (!template_p && !cp_parser_parse_definitely (parser))
13063         ;
13064       /* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
13065          in effect, then we must assume that, upon instantiation, the
13066          template will correspond to a class.  */
13067       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
13068                && tag_type == typename_type)
13069         type = make_typename_type (parser->scope, decl,
13070                                    typename_type,
13071                                    /*complain=*/tf_error);
13072       /* If the `typename' keyword is in effect and DECL is not a type
13073          decl. Then type is non existant.   */
13074       else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL)
13075         type = NULL_TREE; 
13076       else 
13077         type = TREE_TYPE (decl);
13078     }
13079
13080   if (!type)
13081     {
13082       token = cp_lexer_peek_token (parser->lexer);
13083       identifier = cp_parser_identifier (parser);
13084
13085       if (identifier == error_mark_node)
13086         {
13087           parser->scope = NULL_TREE;
13088           return error_mark_node;
13089         }
13090
13091       /* For a `typename', we needn't call xref_tag.  */
13092       if (tag_type == typename_type
13093           && TREE_CODE (parser->scope) != NAMESPACE_DECL)
13094         return cp_parser_make_typename_type (parser, parser->scope,
13095                                              identifier,
13096                                              token->location);
13097       /* Look up a qualified name in the usual way.  */
13098       if (parser->scope)
13099         {
13100           tree decl;
13101           tree ambiguous_decls;
13102
13103           decl = cp_parser_lookup_name (parser, identifier,
13104                                         tag_type,
13105                                         /*is_template=*/false,
13106                                         /*is_namespace=*/false,
13107                                         /*check_dependency=*/true,
13108                                         &ambiguous_decls,
13109                                         token->location);
13110
13111           /* If the lookup was ambiguous, an error will already have been
13112              issued.  */
13113           if (ambiguous_decls)
13114             return error_mark_node;
13115
13116           /* If we are parsing friend declaration, DECL may be a
13117              TEMPLATE_DECL tree node here.  However, we need to check
13118              whether this TEMPLATE_DECL results in valid code.  Consider
13119              the following example:
13120
13121                namespace N {
13122                  template <class T> class C {};
13123                }
13124                class X {
13125                  template <class T> friend class N::C; // #1, valid code
13126                };
13127                template <class T> class Y {
13128                  friend class N::C;                    // #2, invalid code
13129                };
13130
13131              For both case #1 and #2, we arrive at a TEMPLATE_DECL after
13132              name lookup of `N::C'.  We see that friend declaration must
13133              be template for the code to be valid.  Note that
13134              processing_template_decl does not work here since it is
13135              always 1 for the above two cases.  */
13136
13137           decl = (cp_parser_maybe_treat_template_as_class
13138                   (decl, /*tag_name_p=*/is_friend
13139                          && parser->num_template_parameter_lists));
13140
13141           if (TREE_CODE (decl) != TYPE_DECL)
13142             {
13143               cp_parser_diagnose_invalid_type_name (parser,
13144                                                     parser->scope,
13145                                                     identifier,
13146                                                     token->location);
13147               return error_mark_node;
13148             }
13149
13150           if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
13151             {
13152               bool allow_template = (parser->num_template_parameter_lists
13153                                       || DECL_SELF_REFERENCE_P (decl));
13154               type = check_elaborated_type_specifier (tag_type, decl, 
13155                                                       allow_template);
13156
13157               if (type == error_mark_node)
13158                 return error_mark_node;
13159             }
13160
13161           /* Forward declarations of nested types, such as
13162
13163                class C1::C2;
13164                class C1::C2::C3;
13165
13166              are invalid unless all components preceding the final '::'
13167              are complete.  If all enclosing types are complete, these
13168              declarations become merely pointless.
13169
13170              Invalid forward declarations of nested types are errors
13171              caught elsewhere in parsing.  Those that are pointless arrive
13172              here.  */
13173
13174           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
13175               && !is_friend && !processing_explicit_instantiation)
13176             warning (0, "declaration %qD does not declare anything", decl);
13177
13178           type = TREE_TYPE (decl);
13179         }
13180       else
13181         {
13182           /* An elaborated-type-specifier sometimes introduces a new type and
13183              sometimes names an existing type.  Normally, the rule is that it
13184              introduces a new type only if there is not an existing type of
13185              the same name already in scope.  For example, given:
13186
13187                struct S {};
13188                void f() { struct S s; }
13189
13190              the `struct S' in the body of `f' is the same `struct S' as in
13191              the global scope; the existing definition is used.  However, if
13192              there were no global declaration, this would introduce a new
13193              local class named `S'.
13194
13195              An exception to this rule applies to the following code:
13196
13197                namespace N { struct S; }
13198
13199              Here, the elaborated-type-specifier names a new type
13200              unconditionally; even if there is already an `S' in the
13201              containing scope this declaration names a new type.
13202              This exception only applies if the elaborated-type-specifier
13203              forms the complete declaration:
13204
13205                [class.name]
13206
13207                A declaration consisting solely of `class-key identifier ;' is
13208                either a redeclaration of the name in the current scope or a
13209                forward declaration of the identifier as a class name.  It
13210                introduces the name into the current scope.
13211
13212              We are in this situation precisely when the next token is a `;'.
13213
13214              An exception to the exception is that a `friend' declaration does
13215              *not* name a new type; i.e., given:
13216
13217                struct S { friend struct T; };
13218
13219              `T' is not a new type in the scope of `S'.
13220
13221              Also, `new struct S' or `sizeof (struct S)' never results in the
13222              definition of a new type; a new type can only be declared in a
13223              declaration context.  */
13224
13225           tag_scope ts;
13226           bool template_p;
13227
13228           if (is_friend)
13229             /* Friends have special name lookup rules.  */
13230             ts = ts_within_enclosing_non_class;
13231           else if (is_declaration
13232                    && cp_lexer_next_token_is (parser->lexer,
13233                                               CPP_SEMICOLON))
13234             /* This is a `class-key identifier ;' */
13235             ts = ts_current;
13236           else
13237             ts = ts_global;
13238
13239           template_p =
13240             (parser->num_template_parameter_lists
13241              && (cp_parser_next_token_starts_class_definition_p (parser)
13242                  || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
13243           /* An unqualified name was used to reference this type, so
13244              there were no qualifying templates.  */
13245           if (!cp_parser_check_template_parameters (parser,
13246                                                     /*num_templates=*/0,
13247                                                     token->location,
13248                                                     /*declarator=*/NULL))
13249             return error_mark_node;
13250           type = xref_tag (tag_type, identifier, ts, template_p);
13251         }
13252     }
13253
13254   if (type == error_mark_node)
13255     return error_mark_node;
13256
13257   /* Allow attributes on forward declarations of classes.  */
13258   if (attributes)
13259     {
13260       if (TREE_CODE (type) == TYPENAME_TYPE)
13261         warning (OPT_Wattributes,
13262                  "attributes ignored on uninstantiated type");
13263       else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
13264                && ! processing_explicit_instantiation)
13265         warning (OPT_Wattributes,
13266                  "attributes ignored on template instantiation");
13267       else if (is_declaration && cp_parser_declares_only_class_p (parser))
13268         cplus_decl_attributes (&type, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
13269       else
13270         warning (OPT_Wattributes,
13271                  "attributes ignored on elaborated-type-specifier that is not a forward declaration");
13272     }
13273
13274   if (tag_type != enum_type)
13275     cp_parser_check_class_key (tag_type, type);
13276
13277   /* A "<" cannot follow an elaborated type specifier.  If that
13278      happens, the user was probably trying to form a template-id.  */
13279   cp_parser_check_for_invalid_template_id (parser, type, token->location);
13280
13281   return type;
13282 }
13283
13284 /* Parse an enum-specifier.
13285
13286    enum-specifier:
13287      enum-head { enumerator-list [opt] }
13288
13289    enum-head:
13290      enum-key identifier [opt] enum-base [opt]
13291      enum-key nested-name-specifier identifier enum-base [opt]
13292
13293    enum-key:
13294      enum
13295      enum class   [C++0x]
13296      enum struct  [C++0x]
13297
13298    enum-base:   [C++0x]
13299      : type-specifier-seq
13300
13301    opaque-enum-specifier:
13302      enum-key identifier enum-base [opt] ;
13303
13304    GNU Extensions:
13305      enum-key attributes[opt] identifier [opt] enum-base [opt] 
13306        { enumerator-list [opt] }attributes[opt]
13307
13308    Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
13309    if the token stream isn't an enum-specifier after all.  */
13310
13311 static tree
13312 cp_parser_enum_specifier (cp_parser* parser)
13313 {
13314   tree identifier;
13315   tree type = NULL_TREE;
13316   tree prev_scope;
13317   tree nested_name_specifier = NULL_TREE;
13318   tree attributes;
13319   bool scoped_enum_p = false;
13320   bool has_underlying_type = false;
13321   bool nested_being_defined = false;
13322   bool new_value_list = false;
13323   bool is_new_type = false;
13324   bool is_anonymous = false;
13325   tree underlying_type = NULL_TREE;
13326   cp_token *type_start_token = NULL;
13327   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
13328
13329   parser->colon_corrects_to_scope_p = false;
13330
13331   /* Parse tentatively so that we can back up if we don't find a
13332      enum-specifier.  */
13333   cp_parser_parse_tentatively (parser);
13334
13335   /* Caller guarantees that the current token is 'enum', an identifier
13336      possibly follows, and the token after that is an opening brace.
13337      If we don't have an identifier, fabricate an anonymous name for
13338      the enumeration being defined.  */
13339   cp_lexer_consume_token (parser->lexer);
13340
13341   /* Parse the "class" or "struct", which indicates a scoped
13342      enumeration type in C++0x.  */
13343   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
13344       || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
13345     {
13346       if (cxx_dialect < cxx0x)
13347         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13348
13349       /* Consume the `struct' or `class' token.  */
13350       cp_lexer_consume_token (parser->lexer);
13351
13352       scoped_enum_p = true;
13353     }
13354
13355   attributes = cp_parser_attributes_opt (parser);
13356
13357   /* Clear the qualification.  */
13358   parser->scope = NULL_TREE;
13359   parser->qualifying_scope = NULL_TREE;
13360   parser->object_scope = NULL_TREE;
13361
13362   /* Figure out in what scope the declaration is being placed.  */
13363   prev_scope = current_scope ();
13364
13365   type_start_token = cp_lexer_peek_token (parser->lexer);
13366
13367   push_deferring_access_checks (dk_no_check);
13368   nested_name_specifier
13369       = cp_parser_nested_name_specifier_opt (parser,
13370                                              /*typename_keyword_p=*/true,
13371                                              /*check_dependency_p=*/false,
13372                                              /*type_p=*/false,
13373                                              /*is_declaration=*/false);
13374
13375   if (nested_name_specifier)
13376     {
13377       tree name;
13378
13379       identifier = cp_parser_identifier (parser);
13380       name =  cp_parser_lookup_name (parser, identifier,
13381                                      enum_type,
13382                                      /*is_template=*/false,
13383                                      /*is_namespace=*/false,
13384                                      /*check_dependency=*/true,
13385                                      /*ambiguous_decls=*/NULL,
13386                                      input_location);
13387       if (name)
13388         {
13389           type = TREE_TYPE (name);
13390           if (TREE_CODE (type) == TYPENAME_TYPE)
13391             {
13392               /* Are template enums allowed in ISO? */
13393               if (template_parm_scope_p ())
13394                 pedwarn (type_start_token->location, OPT_pedantic,
13395                          "%qD is an enumeration template", name);
13396               /* ignore a typename reference, for it will be solved by name
13397                  in start_enum.  */
13398               type = NULL_TREE;
13399             }
13400         }
13401       else
13402         error_at (type_start_token->location,
13403                   "%qD is not an enumerator-name", identifier);
13404     }
13405   else
13406     {
13407       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13408         identifier = cp_parser_identifier (parser);
13409       else
13410         {
13411           identifier = make_anon_name ();
13412           is_anonymous = true;
13413         }
13414     }
13415   pop_deferring_access_checks ();
13416
13417   /* Check for the `:' that denotes a specified underlying type in C++0x.
13418      Note that a ':' could also indicate a bitfield width, however.  */
13419   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
13420     {
13421       cp_decl_specifier_seq type_specifiers;
13422
13423       /* Consume the `:'.  */
13424       cp_lexer_consume_token (parser->lexer);
13425
13426       /* Parse the type-specifier-seq.  */
13427       cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
13428                                     /*is_trailing_return=*/false,
13429                                     &type_specifiers);
13430
13431       /* At this point this is surely not elaborated type specifier.  */
13432       if (!cp_parser_parse_definitely (parser))
13433         return NULL_TREE;
13434
13435       if (cxx_dialect < cxx0x)
13436         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13437
13438       has_underlying_type = true;
13439
13440       /* If that didn't work, stop.  */
13441       if (type_specifiers.type != error_mark_node)
13442         {
13443           underlying_type = grokdeclarator (NULL, &type_specifiers, TYPENAME,
13444                                             /*initialized=*/0, NULL);
13445           if (underlying_type == error_mark_node)
13446             underlying_type = NULL_TREE;
13447         }
13448     }
13449
13450   /* Look for the `{' but don't consume it yet.  */
13451   if (!cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13452     {
13453       if (cxx_dialect < cxx0x || (!scoped_enum_p && !underlying_type))
13454         {
13455           cp_parser_error (parser, "expected %<{%>");
13456           if (has_underlying_type)
13457             {
13458               type = NULL_TREE;
13459               goto out;
13460             }
13461         }
13462       /* An opaque-enum-specifier must have a ';' here.  */
13463       if ((scoped_enum_p || underlying_type)
13464           && cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
13465         {
13466           cp_parser_error (parser, "expected %<;%> or %<{%>");
13467           if (has_underlying_type)
13468             {
13469               type = NULL_TREE;
13470               goto out;
13471             }
13472         }
13473     }
13474
13475   if (!has_underlying_type && !cp_parser_parse_definitely (parser))
13476     return NULL_TREE;
13477
13478   if (nested_name_specifier)
13479     {
13480       if (CLASS_TYPE_P (nested_name_specifier))
13481         {
13482           nested_being_defined = TYPE_BEING_DEFINED (nested_name_specifier);
13483           TYPE_BEING_DEFINED (nested_name_specifier) = 1;
13484           push_scope (nested_name_specifier);
13485         }
13486       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13487         {
13488           push_nested_namespace (nested_name_specifier);
13489         }
13490     }
13491
13492   /* Issue an error message if type-definitions are forbidden here.  */
13493   if (!cp_parser_check_type_definition (parser))
13494     type = error_mark_node;
13495   else
13496     /* Create the new type.  We do this before consuming the opening
13497        brace so the enum will be recorded as being on the line of its
13498        tag (or the 'enum' keyword, if there is no tag).  */
13499     type = start_enum (identifier, type, underlying_type,
13500                        scoped_enum_p, &is_new_type);
13501
13502   /* If the next token is not '{' it is an opaque-enum-specifier or an
13503      elaborated-type-specifier.  */
13504   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13505     {
13506       timevar_push (TV_PARSE_ENUM);
13507       if (nested_name_specifier)
13508         {
13509           /* The following catches invalid code such as:
13510              enum class S<int>::E { A, B, C }; */
13511           if (!processing_specialization
13512               && CLASS_TYPE_P (nested_name_specifier)
13513               && CLASSTYPE_USE_TEMPLATE (nested_name_specifier))
13514             error_at (type_start_token->location, "cannot add an enumerator "
13515                       "list to a template instantiation");
13516
13517           /* If that scope does not contain the scope in which the
13518              class was originally declared, the program is invalid.  */
13519           if (prev_scope && !is_ancestor (prev_scope, nested_name_specifier))
13520             {
13521               if (at_namespace_scope_p ())
13522                 error_at (type_start_token->location,
13523                           "declaration of %qD in namespace %qD which does not "
13524                           "enclose %qD",
13525                           type, prev_scope, nested_name_specifier);
13526               else
13527                 error_at (type_start_token->location,
13528                           "declaration of %qD in %qD which does not enclose %qD",
13529                           type, prev_scope, nested_name_specifier);
13530               type = error_mark_node;
13531             }
13532         }
13533
13534       if (scoped_enum_p)
13535         begin_scope (sk_scoped_enum, type);
13536
13537       /* Consume the opening brace.  */
13538       cp_lexer_consume_token (parser->lexer);
13539
13540       if (type == error_mark_node)
13541         ; /* Nothing to add */
13542       else if (OPAQUE_ENUM_P (type)
13543                || (cxx_dialect > cxx98 && processing_specialization))
13544         {
13545           new_value_list = true;
13546           SET_OPAQUE_ENUM_P (type, false);
13547           DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
13548         }
13549       else
13550         {
13551           error_at (type_start_token->location, "multiple definition of %q#T", type);
13552           error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
13553                     "previous definition here");
13554           type = error_mark_node;
13555         }
13556
13557       if (type == error_mark_node)
13558         cp_parser_skip_to_end_of_block_or_statement (parser);
13559       /* If the next token is not '}', then there are some enumerators.  */
13560       else if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
13561         cp_parser_enumerator_list (parser, type);
13562
13563       /* Consume the final '}'.  */
13564       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13565
13566       if (scoped_enum_p)
13567         finish_scope ();
13568       timevar_pop (TV_PARSE_ENUM);
13569     }
13570   else
13571     {
13572       /* If a ';' follows, then it is an opaque-enum-specifier
13573         and additional restrictions apply.  */
13574       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
13575         {
13576           if (is_anonymous)
13577             error_at (type_start_token->location,
13578                       "opaque-enum-specifier without name");
13579           else if (nested_name_specifier)
13580             error_at (type_start_token->location,
13581                       "opaque-enum-specifier must use a simple identifier");
13582         }
13583     }
13584
13585   /* Look for trailing attributes to apply to this enumeration, and
13586      apply them if appropriate.  */
13587   if (cp_parser_allow_gnu_extensions_p (parser))
13588     {
13589       tree trailing_attr = cp_parser_attributes_opt (parser);
13590       trailing_attr = chainon (trailing_attr, attributes);
13591       cplus_decl_attributes (&type,
13592                              trailing_attr,
13593                              (int) ATTR_FLAG_TYPE_IN_PLACE);
13594     }
13595
13596   /* Finish up the enumeration.  */
13597   if (type != error_mark_node)
13598     {
13599       if (new_value_list)
13600         finish_enum_value_list (type);
13601       if (is_new_type)
13602         finish_enum (type);
13603     }
13604
13605   if (nested_name_specifier)
13606     {
13607       if (CLASS_TYPE_P (nested_name_specifier))
13608         {
13609           TYPE_BEING_DEFINED (nested_name_specifier) = nested_being_defined;
13610           pop_scope (nested_name_specifier);
13611         }
13612       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13613         {
13614           pop_nested_namespace (nested_name_specifier);
13615         }
13616     }
13617  out:
13618   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
13619   return type;
13620 }
13621
13622 /* Parse an enumerator-list.  The enumerators all have the indicated
13623    TYPE.
13624
13625    enumerator-list:
13626      enumerator-definition
13627      enumerator-list , enumerator-definition  */
13628
13629 static void
13630 cp_parser_enumerator_list (cp_parser* parser, tree type)
13631 {
13632   while (true)
13633     {
13634       /* Parse an enumerator-definition.  */
13635       cp_parser_enumerator_definition (parser, type);
13636
13637       /* If the next token is not a ',', we've reached the end of
13638          the list.  */
13639       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
13640         break;
13641       /* Otherwise, consume the `,' and keep going.  */
13642       cp_lexer_consume_token (parser->lexer);
13643       /* If the next token is a `}', there is a trailing comma.  */
13644       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
13645         {
13646           if (!in_system_header)
13647             pedwarn (input_location, OPT_pedantic, "comma at end of enumerator list");
13648           break;
13649         }
13650     }
13651 }
13652
13653 /* Parse an enumerator-definition.  The enumerator has the indicated
13654    TYPE.
13655
13656    enumerator-definition:
13657      enumerator
13658      enumerator = constant-expression
13659
13660    enumerator:
13661      identifier  */
13662
13663 static void
13664 cp_parser_enumerator_definition (cp_parser* parser, tree type)
13665 {
13666   tree identifier;
13667   tree value;
13668   location_t loc;
13669
13670   /* Save the input location because we are interested in the location
13671      of the identifier and not the location of the explicit value.  */
13672   loc = cp_lexer_peek_token (parser->lexer)->location;
13673
13674   /* Look for the identifier.  */
13675   identifier = cp_parser_identifier (parser);
13676   if (identifier == error_mark_node)
13677     return;
13678
13679   /* If the next token is an '=', then there is an explicit value.  */
13680   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13681     {
13682       /* Consume the `=' token.  */
13683       cp_lexer_consume_token (parser->lexer);
13684       /* Parse the value.  */
13685       value = cp_parser_constant_expression (parser,
13686                                              /*allow_non_constant_p=*/false,
13687                                              NULL);
13688     }
13689   else
13690     value = NULL_TREE;
13691
13692   /* If we are processing a template, make sure the initializer of the
13693      enumerator doesn't contain any bare template parameter pack.  */
13694   if (check_for_bare_parameter_packs (value))
13695     value = error_mark_node;
13696
13697   /* integral_constant_value will pull out this expression, so make sure
13698      it's folded as appropriate.  */
13699   value = fold_non_dependent_expr (value);
13700
13701   /* Create the enumerator.  */
13702   build_enumerator (identifier, value, type, loc);
13703 }
13704
13705 /* Parse a namespace-name.
13706
13707    namespace-name:
13708      original-namespace-name
13709      namespace-alias
13710
13711    Returns the NAMESPACE_DECL for the namespace.  */
13712
13713 static tree
13714 cp_parser_namespace_name (cp_parser* parser)
13715 {
13716   tree identifier;
13717   tree namespace_decl;
13718
13719   cp_token *token = cp_lexer_peek_token (parser->lexer);
13720
13721   /* Get the name of the namespace.  */
13722   identifier = cp_parser_identifier (parser);
13723   if (identifier == error_mark_node)
13724     return error_mark_node;
13725
13726   /* Look up the identifier in the currently active scope.  Look only
13727      for namespaces, due to:
13728
13729        [basic.lookup.udir]
13730
13731        When looking up a namespace-name in a using-directive or alias
13732        definition, only namespace names are considered.
13733
13734      And:
13735
13736        [basic.lookup.qual]
13737
13738        During the lookup of a name preceding the :: scope resolution
13739        operator, object, function, and enumerator names are ignored.
13740
13741      (Note that cp_parser_qualifying_entity only calls this
13742      function if the token after the name is the scope resolution
13743      operator.)  */
13744   namespace_decl = cp_parser_lookup_name (parser, identifier,
13745                                           none_type,
13746                                           /*is_template=*/false,
13747                                           /*is_namespace=*/true,
13748                                           /*check_dependency=*/true,
13749                                           /*ambiguous_decls=*/NULL,
13750                                           token->location);
13751   /* If it's not a namespace, issue an error.  */
13752   if (namespace_decl == error_mark_node
13753       || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
13754     {
13755       if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
13756         error_at (token->location, "%qD is not a namespace-name", identifier);
13757       cp_parser_error (parser, "expected namespace-name");
13758       namespace_decl = error_mark_node;
13759     }
13760
13761   return namespace_decl;
13762 }
13763
13764 /* Parse a namespace-definition.
13765
13766    namespace-definition:
13767      named-namespace-definition
13768      unnamed-namespace-definition
13769
13770    named-namespace-definition:
13771      original-namespace-definition
13772      extension-namespace-definition
13773
13774    original-namespace-definition:
13775      namespace identifier { namespace-body }
13776
13777    extension-namespace-definition:
13778      namespace original-namespace-name { namespace-body }
13779
13780    unnamed-namespace-definition:
13781      namespace { namespace-body } */
13782
13783 static void
13784 cp_parser_namespace_definition (cp_parser* parser)
13785 {
13786   tree identifier, attribs;
13787   bool has_visibility;
13788   bool is_inline;
13789
13790   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_INLINE))
13791     {
13792       maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES);
13793       is_inline = true;
13794       cp_lexer_consume_token (parser->lexer);
13795     }
13796   else
13797     is_inline = false;
13798
13799   /* Look for the `namespace' keyword.  */
13800   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
13801
13802   /* Get the name of the namespace.  We do not attempt to distinguish
13803      between an original-namespace-definition and an
13804      extension-namespace-definition at this point.  The semantic
13805      analysis routines are responsible for that.  */
13806   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13807     identifier = cp_parser_identifier (parser);
13808   else
13809     identifier = NULL_TREE;
13810
13811   /* Parse any specified attributes.  */
13812   attribs = cp_parser_attributes_opt (parser);
13813
13814   /* Look for the `{' to start the namespace.  */
13815   cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
13816   /* Start the namespace.  */
13817   push_namespace (identifier);
13818
13819   /* "inline namespace" is equivalent to a stub namespace definition
13820      followed by a strong using directive.  */
13821   if (is_inline)
13822     {
13823       tree name_space = current_namespace;
13824       /* Set up namespace association.  */
13825       DECL_NAMESPACE_ASSOCIATIONS (name_space)
13826         = tree_cons (CP_DECL_CONTEXT (name_space), NULL_TREE,
13827                      DECL_NAMESPACE_ASSOCIATIONS (name_space));
13828       /* Import the contents of the inline namespace.  */
13829       pop_namespace ();
13830       do_using_directive (name_space);
13831       push_namespace (identifier);
13832     }
13833
13834   has_visibility = handle_namespace_attrs (current_namespace, attribs);
13835
13836   /* Parse the body of the namespace.  */
13837   cp_parser_namespace_body (parser);
13838
13839   if (has_visibility)
13840     pop_visibility (1);
13841
13842   /* Finish the namespace.  */
13843   pop_namespace ();
13844   /* Look for the final `}'.  */
13845   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13846 }
13847
13848 /* Parse a namespace-body.
13849
13850    namespace-body:
13851      declaration-seq [opt]  */
13852
13853 static void
13854 cp_parser_namespace_body (cp_parser* parser)
13855 {
13856   cp_parser_declaration_seq_opt (parser);
13857 }
13858
13859 /* Parse a namespace-alias-definition.
13860
13861    namespace-alias-definition:
13862      namespace identifier = qualified-namespace-specifier ;  */
13863
13864 static void
13865 cp_parser_namespace_alias_definition (cp_parser* parser)
13866 {
13867   tree identifier;
13868   tree namespace_specifier;
13869
13870   cp_token *token = cp_lexer_peek_token (parser->lexer);
13871
13872   /* Look for the `namespace' keyword.  */
13873   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
13874   /* Look for the identifier.  */
13875   identifier = cp_parser_identifier (parser);
13876   if (identifier == error_mark_node)
13877     return;
13878   /* Look for the `=' token.  */
13879   if (!cp_parser_uncommitted_to_tentative_parse_p (parser)
13880       && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) 
13881     {
13882       error_at (token->location, "%<namespace%> definition is not allowed here");
13883       /* Skip the definition.  */
13884       cp_lexer_consume_token (parser->lexer);
13885       if (cp_parser_skip_to_closing_brace (parser))
13886         cp_lexer_consume_token (parser->lexer);
13887       return;
13888     }
13889   cp_parser_require (parser, CPP_EQ, RT_EQ);
13890   /* Look for the qualified-namespace-specifier.  */
13891   namespace_specifier
13892     = cp_parser_qualified_namespace_specifier (parser);
13893   /* Look for the `;' token.  */
13894   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
13895
13896   /* Register the alias in the symbol table.  */
13897   do_namespace_alias (identifier, namespace_specifier);
13898 }
13899
13900 /* Parse a qualified-namespace-specifier.
13901
13902    qualified-namespace-specifier:
13903      :: [opt] nested-name-specifier [opt] namespace-name
13904
13905    Returns a NAMESPACE_DECL corresponding to the specified
13906    namespace.  */
13907
13908 static tree
13909 cp_parser_qualified_namespace_specifier (cp_parser* parser)
13910 {
13911   /* Look for the optional `::'.  */
13912   cp_parser_global_scope_opt (parser,
13913                               /*current_scope_valid_p=*/false);
13914
13915   /* Look for the optional nested-name-specifier.  */
13916   cp_parser_nested_name_specifier_opt (parser,
13917                                        /*typename_keyword_p=*/false,
13918                                        /*check_dependency_p=*/true,
13919                                        /*type_p=*/false,
13920                                        /*is_declaration=*/true);
13921
13922   return cp_parser_namespace_name (parser);
13923 }
13924
13925 /* Parse a using-declaration, or, if ACCESS_DECLARATION_P is true, an
13926    access declaration.
13927
13928    using-declaration:
13929      using typename [opt] :: [opt] nested-name-specifier unqualified-id ;
13930      using :: unqualified-id ;  
13931
13932    access-declaration:
13933      qualified-id ;  
13934
13935    */
13936
13937 static bool
13938 cp_parser_using_declaration (cp_parser* parser, 
13939                              bool access_declaration_p)
13940 {
13941   cp_token *token;
13942   bool typename_p = false;
13943   bool global_scope_p;
13944   tree decl;
13945   tree identifier;
13946   tree qscope;
13947
13948   if (access_declaration_p)
13949     cp_parser_parse_tentatively (parser);
13950   else
13951     {
13952       /* Look for the `using' keyword.  */
13953       cp_parser_require_keyword (parser, RID_USING, RT_USING);
13954       
13955       /* Peek at the next token.  */
13956       token = cp_lexer_peek_token (parser->lexer);
13957       /* See if it's `typename'.  */
13958       if (token->keyword == RID_TYPENAME)
13959         {
13960           /* Remember that we've seen it.  */
13961           typename_p = true;
13962           /* Consume the `typename' token.  */
13963           cp_lexer_consume_token (parser->lexer);
13964         }
13965     }
13966
13967   /* Look for the optional global scope qualification.  */
13968   global_scope_p
13969     = (cp_parser_global_scope_opt (parser,
13970                                    /*current_scope_valid_p=*/false)
13971        != NULL_TREE);
13972
13973   /* If we saw `typename', or didn't see `::', then there must be a
13974      nested-name-specifier present.  */
13975   if (typename_p || !global_scope_p)
13976     qscope = cp_parser_nested_name_specifier (parser, typename_p,
13977                                               /*check_dependency_p=*/true,
13978                                               /*type_p=*/false,
13979                                               /*is_declaration=*/true);
13980   /* Otherwise, we could be in either of the two productions.  In that
13981      case, treat the nested-name-specifier as optional.  */
13982   else
13983     qscope = cp_parser_nested_name_specifier_opt (parser,
13984                                                   /*typename_keyword_p=*/false,
13985                                                   /*check_dependency_p=*/true,
13986                                                   /*type_p=*/false,
13987                                                   /*is_declaration=*/true);
13988   if (!qscope)
13989     qscope = global_namespace;
13990
13991   if (access_declaration_p && cp_parser_error_occurred (parser))
13992     /* Something has already gone wrong; there's no need to parse
13993        further.  Since an error has occurred, the return value of
13994        cp_parser_parse_definitely will be false, as required.  */
13995     return cp_parser_parse_definitely (parser);
13996
13997   token = cp_lexer_peek_token (parser->lexer);
13998   /* Parse the unqualified-id.  */
13999   identifier = cp_parser_unqualified_id (parser,
14000                                          /*template_keyword_p=*/false,
14001                                          /*check_dependency_p=*/true,
14002                                          /*declarator_p=*/true,
14003                                          /*optional_p=*/false);
14004
14005   if (access_declaration_p)
14006     {
14007       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
14008         cp_parser_simulate_error (parser);
14009       if (!cp_parser_parse_definitely (parser))
14010         return false;
14011     }
14012
14013   /* The function we call to handle a using-declaration is different
14014      depending on what scope we are in.  */
14015   if (qscope == error_mark_node || identifier == error_mark_node)
14016     ;
14017   else if (TREE_CODE (identifier) != IDENTIFIER_NODE
14018            && TREE_CODE (identifier) != BIT_NOT_EXPR)
14019     /* [namespace.udecl]
14020
14021        A using declaration shall not name a template-id.  */
14022     error_at (token->location,
14023               "a template-id may not appear in a using-declaration");
14024   else
14025     {
14026       if (at_class_scope_p ())
14027         {
14028           /* Create the USING_DECL.  */
14029           decl = do_class_using_decl (parser->scope, identifier);
14030
14031           if (check_for_bare_parameter_packs (decl))
14032             return false;
14033           else
14034             /* Add it to the list of members in this class.  */
14035             finish_member_declaration (decl);
14036         }
14037       else
14038         {
14039           decl = cp_parser_lookup_name_simple (parser,
14040                                                identifier,
14041                                                token->location);
14042           if (decl == error_mark_node)
14043             cp_parser_name_lookup_error (parser, identifier,
14044                                          decl, NLE_NULL,
14045                                          token->location);
14046           else if (check_for_bare_parameter_packs (decl))
14047             return false;
14048           else if (!at_namespace_scope_p ())
14049             do_local_using_decl (decl, qscope, identifier);
14050           else
14051             do_toplevel_using_decl (decl, qscope, identifier);
14052         }
14053     }
14054
14055   /* Look for the final `;'.  */
14056   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14057   
14058   return true;
14059 }
14060
14061 /* Parse a using-directive.
14062
14063    using-directive:
14064      using namespace :: [opt] nested-name-specifier [opt]
14065        namespace-name ;  */
14066
14067 static void
14068 cp_parser_using_directive (cp_parser* parser)
14069 {
14070   tree namespace_decl;
14071   tree attribs;
14072
14073   /* Look for the `using' keyword.  */
14074   cp_parser_require_keyword (parser, RID_USING, RT_USING);
14075   /* And the `namespace' keyword.  */
14076   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
14077   /* Look for the optional `::' operator.  */
14078   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
14079   /* And the optional nested-name-specifier.  */
14080   cp_parser_nested_name_specifier_opt (parser,
14081                                        /*typename_keyword_p=*/false,
14082                                        /*check_dependency_p=*/true,
14083                                        /*type_p=*/false,
14084                                        /*is_declaration=*/true);
14085   /* Get the namespace being used.  */
14086   namespace_decl = cp_parser_namespace_name (parser);
14087   /* And any specified attributes.  */
14088   attribs = cp_parser_attributes_opt (parser);
14089   /* Update the symbol table.  */
14090   parse_using_directive (namespace_decl, attribs);
14091   /* Look for the final `;'.  */
14092   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14093 }
14094
14095 /* Parse an asm-definition.
14096
14097    asm-definition:
14098      asm ( string-literal ) ;
14099
14100    GNU Extension:
14101
14102    asm-definition:
14103      asm volatile [opt] ( string-literal ) ;
14104      asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
14105      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14106                           : asm-operand-list [opt] ) ;
14107      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14108                           : asm-operand-list [opt]
14109                           : asm-clobber-list [opt] ) ;
14110      asm volatile [opt] goto ( string-literal : : asm-operand-list [opt]
14111                                : asm-clobber-list [opt]
14112                                : asm-goto-list ) ;  */
14113
14114 static void
14115 cp_parser_asm_definition (cp_parser* parser)
14116 {
14117   tree string;
14118   tree outputs = NULL_TREE;
14119   tree inputs = NULL_TREE;
14120   tree clobbers = NULL_TREE;
14121   tree labels = NULL_TREE;
14122   tree asm_stmt;
14123   bool volatile_p = false;
14124   bool extended_p = false;
14125   bool invalid_inputs_p = false;
14126   bool invalid_outputs_p = false;
14127   bool goto_p = false;
14128   required_token missing = RT_NONE;
14129
14130   /* Look for the `asm' keyword.  */
14131   cp_parser_require_keyword (parser, RID_ASM, RT_ASM);
14132   /* See if the next token is `volatile'.  */
14133   if (cp_parser_allow_gnu_extensions_p (parser)
14134       && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE))
14135     {
14136       /* Remember that we saw the `volatile' keyword.  */
14137       volatile_p = true;
14138       /* Consume the token.  */
14139       cp_lexer_consume_token (parser->lexer);
14140     }
14141   if (cp_parser_allow_gnu_extensions_p (parser)
14142       && parser->in_function_body
14143       && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO))
14144     {
14145       /* Remember that we saw the `goto' keyword.  */
14146       goto_p = true;
14147       /* Consume the token.  */
14148       cp_lexer_consume_token (parser->lexer);
14149     }
14150   /* Look for the opening `('.  */
14151   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
14152     return;
14153   /* Look for the string.  */
14154   string = cp_parser_string_literal (parser, false, false);
14155   if (string == error_mark_node)
14156     {
14157       cp_parser_skip_to_closing_parenthesis (parser, true, false,
14158                                              /*consume_paren=*/true);
14159       return;
14160     }
14161
14162   /* If we're allowing GNU extensions, check for the extended assembly
14163      syntax.  Unfortunately, the `:' tokens need not be separated by
14164      a space in C, and so, for compatibility, we tolerate that here
14165      too.  Doing that means that we have to treat the `::' operator as
14166      two `:' tokens.  */
14167   if (cp_parser_allow_gnu_extensions_p (parser)
14168       && parser->in_function_body
14169       && (cp_lexer_next_token_is (parser->lexer, CPP_COLON)
14170           || cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)))
14171     {
14172       bool inputs_p = false;
14173       bool clobbers_p = false;
14174       bool labels_p = false;
14175
14176       /* The extended syntax was used.  */
14177       extended_p = true;
14178
14179       /* Look for outputs.  */
14180       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14181         {
14182           /* Consume the `:'.  */
14183           cp_lexer_consume_token (parser->lexer);
14184           /* Parse the output-operands.  */
14185           if (cp_lexer_next_token_is_not (parser->lexer,
14186                                           CPP_COLON)
14187               && cp_lexer_next_token_is_not (parser->lexer,
14188                                              CPP_SCOPE)
14189               && cp_lexer_next_token_is_not (parser->lexer,
14190                                              CPP_CLOSE_PAREN)
14191               && !goto_p)
14192             outputs = cp_parser_asm_operand_list (parser);
14193
14194             if (outputs == error_mark_node)
14195               invalid_outputs_p = true;
14196         }
14197       /* If the next token is `::', there are no outputs, and the
14198          next token is the beginning of the inputs.  */
14199       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14200         /* The inputs are coming next.  */
14201         inputs_p = true;
14202
14203       /* Look for inputs.  */
14204       if (inputs_p
14205           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14206         {
14207           /* Consume the `:' or `::'.  */
14208           cp_lexer_consume_token (parser->lexer);
14209           /* Parse the output-operands.  */
14210           if (cp_lexer_next_token_is_not (parser->lexer,
14211                                           CPP_COLON)
14212               && cp_lexer_next_token_is_not (parser->lexer,
14213                                              CPP_SCOPE)
14214               && cp_lexer_next_token_is_not (parser->lexer,
14215                                              CPP_CLOSE_PAREN))
14216             inputs = cp_parser_asm_operand_list (parser);
14217
14218             if (inputs == error_mark_node)
14219               invalid_inputs_p = true;
14220         }
14221       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14222         /* The clobbers are coming next.  */
14223         clobbers_p = true;
14224
14225       /* Look for clobbers.  */
14226       if (clobbers_p
14227           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14228         {
14229           clobbers_p = true;
14230           /* Consume the `:' or `::'.  */
14231           cp_lexer_consume_token (parser->lexer);
14232           /* Parse the clobbers.  */
14233           if (cp_lexer_next_token_is_not (parser->lexer,
14234                                           CPP_COLON)
14235               && cp_lexer_next_token_is_not (parser->lexer,
14236                                              CPP_CLOSE_PAREN))
14237             clobbers = cp_parser_asm_clobber_list (parser);
14238         }
14239       else if (goto_p
14240                && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14241         /* The labels are coming next.  */
14242         labels_p = true;
14243
14244       /* Look for labels.  */
14245       if (labels_p
14246           || (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_COLON)))
14247         {
14248           labels_p = true;
14249           /* Consume the `:' or `::'.  */
14250           cp_lexer_consume_token (parser->lexer);
14251           /* Parse the labels.  */
14252           labels = cp_parser_asm_label_list (parser);
14253         }
14254
14255       if (goto_p && !labels_p)
14256         missing = clobbers_p ? RT_COLON : RT_COLON_SCOPE;
14257     }
14258   else if (goto_p)
14259     missing = RT_COLON_SCOPE;
14260
14261   /* Look for the closing `)'.  */
14262   if (!cp_parser_require (parser, missing ? CPP_COLON : CPP_CLOSE_PAREN,
14263                           missing ? missing : RT_CLOSE_PAREN))
14264     cp_parser_skip_to_closing_parenthesis (parser, true, false,
14265                                            /*consume_paren=*/true);
14266   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14267
14268   if (!invalid_inputs_p && !invalid_outputs_p)
14269     {
14270       /* Create the ASM_EXPR.  */
14271       if (parser->in_function_body)
14272         {
14273           asm_stmt = finish_asm_stmt (volatile_p, string, outputs,
14274                                       inputs, clobbers, labels);
14275           /* If the extended syntax was not used, mark the ASM_EXPR.  */
14276           if (!extended_p)
14277             {
14278               tree temp = asm_stmt;
14279               if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
14280                 temp = TREE_OPERAND (temp, 0);
14281
14282               ASM_INPUT_P (temp) = 1;
14283             }
14284         }
14285       else
14286         cgraph_add_asm_node (string);
14287     }
14288 }
14289
14290 /* Declarators [gram.dcl.decl] */
14291
14292 /* Parse an init-declarator.
14293
14294    init-declarator:
14295      declarator initializer [opt]
14296
14297    GNU Extension:
14298
14299    init-declarator:
14300      declarator asm-specification [opt] attributes [opt] initializer [opt]
14301
14302    function-definition:
14303      decl-specifier-seq [opt] declarator ctor-initializer [opt]
14304        function-body
14305      decl-specifier-seq [opt] declarator function-try-block
14306
14307    GNU Extension:
14308
14309    function-definition:
14310      __extension__ function-definition
14311
14312    The DECL_SPECIFIERS apply to this declarator.  Returns a
14313    representation of the entity declared.  If MEMBER_P is TRUE, then
14314    this declarator appears in a class scope.  The new DECL created by
14315    this declarator is returned.
14316
14317    The CHECKS are access checks that should be performed once we know
14318    what entity is being declared (and, therefore, what classes have
14319    befriended it).
14320
14321    If FUNCTION_DEFINITION_ALLOWED_P then we handle the declarator and
14322    for a function-definition here as well.  If the declarator is a
14323    declarator for a function-definition, *FUNCTION_DEFINITION_P will
14324    be TRUE upon return.  By that point, the function-definition will
14325    have been completely parsed.
14326
14327    FUNCTION_DEFINITION_P may be NULL if FUNCTION_DEFINITION_ALLOWED_P
14328    is FALSE.
14329
14330    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
14331    parsed declaration if it is an uninitialized single declarator not followed
14332    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
14333    if present, will not be consumed.  If returned, this declarator will be
14334    created with SD_INITIALIZED but will not call cp_finish_decl.  */
14335
14336 static tree
14337 cp_parser_init_declarator (cp_parser* parser,
14338                            cp_decl_specifier_seq *decl_specifiers,
14339                            VEC (deferred_access_check,gc)* checks,
14340                            bool function_definition_allowed_p,
14341                            bool member_p,
14342                            int declares_class_or_enum,
14343                            bool* function_definition_p,
14344                            tree* maybe_range_for_decl)
14345 {
14346   cp_token *token = NULL, *asm_spec_start_token = NULL,
14347            *attributes_start_token = NULL;
14348   cp_declarator *declarator;
14349   tree prefix_attributes;
14350   tree attributes;
14351   tree asm_specification;
14352   tree initializer;
14353   tree decl = NULL_TREE;
14354   tree scope;
14355   int is_initialized;
14356   /* Only valid if IS_INITIALIZED is true.  In that case, CPP_EQ if
14357      initialized with "= ..", CPP_OPEN_PAREN if initialized with
14358      "(...)".  */
14359   enum cpp_ttype initialization_kind;
14360   bool is_direct_init = false;
14361   bool is_non_constant_init;
14362   int ctor_dtor_or_conv_p;
14363   bool friend_p;
14364   tree pushed_scope = NULL_TREE;
14365   bool range_for_decl_p = false;
14366
14367   /* Gather the attributes that were provided with the
14368      decl-specifiers.  */
14369   prefix_attributes = decl_specifiers->attributes;
14370
14371   /* Assume that this is not the declarator for a function
14372      definition.  */
14373   if (function_definition_p)
14374     *function_definition_p = false;
14375
14376   /* Defer access checks while parsing the declarator; we cannot know
14377      what names are accessible until we know what is being
14378      declared.  */
14379   resume_deferring_access_checks ();
14380
14381   /* Parse the declarator.  */
14382   token = cp_lexer_peek_token (parser->lexer);
14383   declarator
14384     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
14385                             &ctor_dtor_or_conv_p,
14386                             /*parenthesized_p=*/NULL,
14387                             /*member_p=*/false);
14388   /* Gather up the deferred checks.  */
14389   stop_deferring_access_checks ();
14390
14391   /* If the DECLARATOR was erroneous, there's no need to go
14392      further.  */
14393   if (declarator == cp_error_declarator)
14394     return error_mark_node;
14395
14396   /* Check that the number of template-parameter-lists is OK.  */
14397   if (!cp_parser_check_declarator_template_parameters (parser, declarator,
14398                                                        token->location))
14399     return error_mark_node;
14400
14401   if (declares_class_or_enum & 2)
14402     cp_parser_check_for_definition_in_return_type (declarator,
14403                                                    decl_specifiers->type,
14404                                                    decl_specifiers->type_location);
14405
14406   /* Figure out what scope the entity declared by the DECLARATOR is
14407      located in.  `grokdeclarator' sometimes changes the scope, so
14408      we compute it now.  */
14409   scope = get_scope_of_declarator (declarator);
14410
14411   /* Perform any lookups in the declared type which were thought to be
14412      dependent, but are not in the scope of the declarator.  */
14413   decl_specifiers->type
14414     = maybe_update_decl_type (decl_specifiers->type, scope);
14415
14416   /* If we're allowing GNU extensions, look for an asm-specification
14417      and attributes.  */
14418   if (cp_parser_allow_gnu_extensions_p (parser))
14419     {
14420       /* Look for an asm-specification.  */
14421       asm_spec_start_token = cp_lexer_peek_token (parser->lexer);
14422       asm_specification = cp_parser_asm_specification_opt (parser);
14423       /* And attributes.  */
14424       attributes_start_token = cp_lexer_peek_token (parser->lexer);
14425       attributes = cp_parser_attributes_opt (parser);
14426     }
14427   else
14428     {
14429       asm_specification = NULL_TREE;
14430       attributes = NULL_TREE;
14431     }
14432
14433   /* Peek at the next token.  */
14434   token = cp_lexer_peek_token (parser->lexer);
14435   /* Check to see if the token indicates the start of a
14436      function-definition.  */
14437   if (function_declarator_p (declarator)
14438       && cp_parser_token_starts_function_definition_p (token))
14439     {
14440       if (!function_definition_allowed_p)
14441         {
14442           /* If a function-definition should not appear here, issue an
14443              error message.  */
14444           cp_parser_error (parser,
14445                            "a function-definition is not allowed here");
14446           return error_mark_node;
14447         }
14448       else
14449         {
14450           location_t func_brace_location
14451             = cp_lexer_peek_token (parser->lexer)->location;
14452
14453           /* Neither attributes nor an asm-specification are allowed
14454              on a function-definition.  */
14455           if (asm_specification)
14456             error_at (asm_spec_start_token->location,
14457                       "an asm-specification is not allowed "
14458                       "on a function-definition");
14459           if (attributes)
14460             error_at (attributes_start_token->location,
14461                       "attributes are not allowed on a function-definition");
14462           /* This is a function-definition.  */
14463           *function_definition_p = true;
14464
14465           /* Parse the function definition.  */
14466           if (member_p)
14467             decl = cp_parser_save_member_function_body (parser,
14468                                                         decl_specifiers,
14469                                                         declarator,
14470                                                         prefix_attributes);
14471           else
14472             decl
14473               = (cp_parser_function_definition_from_specifiers_and_declarator
14474                  (parser, decl_specifiers, prefix_attributes, declarator));
14475
14476           if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
14477             {
14478               /* This is where the prologue starts...  */
14479               DECL_STRUCT_FUNCTION (decl)->function_start_locus
14480                 = func_brace_location;
14481             }
14482
14483           return decl;
14484         }
14485     }
14486
14487   /* [dcl.dcl]
14488
14489      Only in function declarations for constructors, destructors, and
14490      type conversions can the decl-specifier-seq be omitted.
14491
14492      We explicitly postpone this check past the point where we handle
14493      function-definitions because we tolerate function-definitions
14494      that are missing their return types in some modes.  */
14495   if (!decl_specifiers->any_specifiers_p && ctor_dtor_or_conv_p <= 0)
14496     {
14497       cp_parser_error (parser,
14498                        "expected constructor, destructor, or type conversion");
14499       return error_mark_node;
14500     }
14501
14502   /* An `=' or an `(', or an '{' in C++0x, indicates an initializer.  */
14503   if (token->type == CPP_EQ
14504       || token->type == CPP_OPEN_PAREN
14505       || token->type == CPP_OPEN_BRACE)
14506     {
14507       is_initialized = SD_INITIALIZED;
14508       initialization_kind = token->type;
14509       if (maybe_range_for_decl)
14510         *maybe_range_for_decl = error_mark_node;
14511
14512       if (token->type == CPP_EQ
14513           && function_declarator_p (declarator))
14514         {
14515           cp_token *t2 = cp_lexer_peek_nth_token (parser->lexer, 2);
14516           if (t2->keyword == RID_DEFAULT)
14517             is_initialized = SD_DEFAULTED;
14518           else if (t2->keyword == RID_DELETE)
14519             is_initialized = SD_DELETED;
14520         }
14521     }
14522   else
14523     {
14524       /* If the init-declarator isn't initialized and isn't followed by a
14525          `,' or `;', it's not a valid init-declarator.  */
14526       if (token->type != CPP_COMMA
14527           && token->type != CPP_SEMICOLON)
14528         {
14529           if (maybe_range_for_decl && *maybe_range_for_decl != error_mark_node)
14530             range_for_decl_p = true;
14531           else
14532             {
14533               cp_parser_error (parser, "expected initializer");
14534               return error_mark_node;
14535             }
14536         }
14537       is_initialized = SD_UNINITIALIZED;
14538       initialization_kind = CPP_EOF;
14539     }
14540
14541   /* Because start_decl has side-effects, we should only call it if we
14542      know we're going ahead.  By this point, we know that we cannot
14543      possibly be looking at any other construct.  */
14544   cp_parser_commit_to_tentative_parse (parser);
14545
14546   /* If the decl specifiers were bad, issue an error now that we're
14547      sure this was intended to be a declarator.  Then continue
14548      declaring the variable(s), as int, to try to cut down on further
14549      errors.  */
14550   if (decl_specifiers->any_specifiers_p
14551       && decl_specifiers->type == error_mark_node)
14552     {
14553       cp_parser_error (parser, "invalid type in declaration");
14554       decl_specifiers->type = integer_type_node;
14555     }
14556
14557   /* Check to see whether or not this declaration is a friend.  */
14558   friend_p = cp_parser_friend_p (decl_specifiers);
14559
14560   /* Enter the newly declared entry in the symbol table.  If we're
14561      processing a declaration in a class-specifier, we wait until
14562      after processing the initializer.  */
14563   if (!member_p)
14564     {
14565       if (parser->in_unbraced_linkage_specification_p)
14566         decl_specifiers->storage_class = sc_extern;
14567       decl = start_decl (declarator, decl_specifiers,
14568                          range_for_decl_p? SD_INITIALIZED : is_initialized,
14569                          attributes, prefix_attributes,
14570                          &pushed_scope);
14571       /* Adjust location of decl if declarator->id_loc is more appropriate:
14572          set, and decl wasn't merged with another decl, in which case its
14573          location would be different from input_location, and more accurate.  */
14574       if (DECL_P (decl)
14575           && declarator->id_loc != UNKNOWN_LOCATION
14576           && DECL_SOURCE_LOCATION (decl) == input_location)
14577         DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
14578     }
14579   else if (scope)
14580     /* Enter the SCOPE.  That way unqualified names appearing in the
14581        initializer will be looked up in SCOPE.  */
14582     pushed_scope = push_scope (scope);
14583
14584   /* Perform deferred access control checks, now that we know in which
14585      SCOPE the declared entity resides.  */
14586   if (!member_p && decl)
14587     {
14588       tree saved_current_function_decl = NULL_TREE;
14589
14590       /* If the entity being declared is a function, pretend that we
14591          are in its scope.  If it is a `friend', it may have access to
14592          things that would not otherwise be accessible.  */
14593       if (TREE_CODE (decl) == FUNCTION_DECL)
14594         {
14595           saved_current_function_decl = current_function_decl;
14596           current_function_decl = decl;
14597         }
14598
14599       /* Perform access checks for template parameters.  */
14600       cp_parser_perform_template_parameter_access_checks (checks);
14601
14602       /* Perform the access control checks for the declarator and the
14603          decl-specifiers.  */
14604       perform_deferred_access_checks ();
14605
14606       /* Restore the saved value.  */
14607       if (TREE_CODE (decl) == FUNCTION_DECL)
14608         current_function_decl = saved_current_function_decl;
14609     }
14610
14611   /* Parse the initializer.  */
14612   initializer = NULL_TREE;
14613   is_direct_init = false;
14614   is_non_constant_init = true;
14615   if (is_initialized)
14616     {
14617       if (function_declarator_p (declarator))
14618         {
14619           cp_token *initializer_start_token = cp_lexer_peek_token (parser->lexer);
14620            if (initialization_kind == CPP_EQ)
14621              initializer = cp_parser_pure_specifier (parser);
14622            else
14623              {
14624                /* If the declaration was erroneous, we don't really
14625                   know what the user intended, so just silently
14626                   consume the initializer.  */
14627                if (decl != error_mark_node)
14628                  error_at (initializer_start_token->location,
14629                            "initializer provided for function");
14630                cp_parser_skip_to_closing_parenthesis (parser,
14631                                                       /*recovering=*/true,
14632                                                       /*or_comma=*/false,
14633                                                       /*consume_paren=*/true);
14634              }
14635         }
14636       else
14637         {
14638           /* We want to record the extra mangling scope for in-class
14639              initializers of class members and initializers of static data
14640              member templates.  The former is a C++0x feature which isn't
14641              implemented yet, and I expect it will involve deferring
14642              parsing of the initializer until end of class as with default
14643              arguments.  So right here we only handle the latter.  */
14644           if (!member_p && processing_template_decl)
14645             start_lambda_scope (decl);
14646           initializer = cp_parser_initializer (parser,
14647                                                &is_direct_init,
14648                                                &is_non_constant_init);
14649           if (!member_p && processing_template_decl)
14650             finish_lambda_scope ();
14651         }
14652     }
14653
14654   /* The old parser allows attributes to appear after a parenthesized
14655      initializer.  Mark Mitchell proposed removing this functionality
14656      on the GCC mailing lists on 2002-08-13.  This parser accepts the
14657      attributes -- but ignores them.  */
14658   if (cp_parser_allow_gnu_extensions_p (parser)
14659       && initialization_kind == CPP_OPEN_PAREN)
14660     if (cp_parser_attributes_opt (parser))
14661       warning (OPT_Wattributes,
14662                "attributes after parenthesized initializer ignored");
14663
14664   /* For an in-class declaration, use `grokfield' to create the
14665      declaration.  */
14666   if (member_p)
14667     {
14668       if (pushed_scope)
14669         {
14670           pop_scope (pushed_scope);
14671           pushed_scope = NULL_TREE;
14672         }
14673       decl = grokfield (declarator, decl_specifiers,
14674                         initializer, !is_non_constant_init,
14675                         /*asmspec=*/NULL_TREE,
14676                         prefix_attributes);
14677       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
14678         cp_parser_save_default_args (parser, decl);
14679     }
14680
14681   /* Finish processing the declaration.  But, skip member
14682      declarations.  */
14683   if (!member_p && decl && decl != error_mark_node && !range_for_decl_p)
14684     {
14685       cp_finish_decl (decl,
14686                       initializer, !is_non_constant_init,
14687                       asm_specification,
14688                       /* If the initializer is in parentheses, then this is
14689                          a direct-initialization, which means that an
14690                          `explicit' constructor is OK.  Otherwise, an
14691                          `explicit' constructor cannot be used.  */
14692                       ((is_direct_init || !is_initialized)
14693                        ? LOOKUP_NORMAL : LOOKUP_IMPLICIT));
14694     }
14695   else if ((cxx_dialect != cxx98) && friend_p
14696            && decl && TREE_CODE (decl) == FUNCTION_DECL)
14697     /* Core issue #226 (C++0x only): A default template-argument
14698        shall not be specified in a friend class template
14699        declaration. */
14700     check_default_tmpl_args (decl, current_template_parms, /*is_primary=*/1, 
14701                              /*is_partial=*/0, /*is_friend_decl=*/1);
14702
14703   if (!friend_p && pushed_scope)
14704     pop_scope (pushed_scope);
14705
14706   return decl;
14707 }
14708
14709 /* Parse a declarator.
14710
14711    declarator:
14712      direct-declarator
14713      ptr-operator declarator
14714
14715    abstract-declarator:
14716      ptr-operator abstract-declarator [opt]
14717      direct-abstract-declarator
14718
14719    GNU Extensions:
14720
14721    declarator:
14722      attributes [opt] direct-declarator
14723      attributes [opt] ptr-operator declarator
14724
14725    abstract-declarator:
14726      attributes [opt] ptr-operator abstract-declarator [opt]
14727      attributes [opt] direct-abstract-declarator
14728
14729    If CTOR_DTOR_OR_CONV_P is not NULL, *CTOR_DTOR_OR_CONV_P is used to
14730    detect constructor, destructor or conversion operators. It is set
14731    to -1 if the declarator is a name, and +1 if it is a
14732    function. Otherwise it is set to zero. Usually you just want to
14733    test for >0, but internally the negative value is used.
14734
14735    (The reason for CTOR_DTOR_OR_CONV_P is that a declaration must have
14736    a decl-specifier-seq unless it declares a constructor, destructor,
14737    or conversion.  It might seem that we could check this condition in
14738    semantic analysis, rather than parsing, but that makes it difficult
14739    to handle something like `f()'.  We want to notice that there are
14740    no decl-specifiers, and therefore realize that this is an
14741    expression, not a declaration.)
14742
14743    If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
14744    the declarator is a direct-declarator of the form "(...)".
14745
14746    MEMBER_P is true iff this declarator is a member-declarator.  */
14747
14748 static cp_declarator *
14749 cp_parser_declarator (cp_parser* parser,
14750                       cp_parser_declarator_kind dcl_kind,
14751                       int* ctor_dtor_or_conv_p,
14752                       bool* parenthesized_p,
14753                       bool member_p)
14754 {
14755   cp_declarator *declarator;
14756   enum tree_code code;
14757   cp_cv_quals cv_quals;
14758   tree class_type;
14759   tree attributes = NULL_TREE;
14760
14761   /* Assume this is not a constructor, destructor, or type-conversion
14762      operator.  */
14763   if (ctor_dtor_or_conv_p)
14764     *ctor_dtor_or_conv_p = 0;
14765
14766   if (cp_parser_allow_gnu_extensions_p (parser))
14767     attributes = cp_parser_attributes_opt (parser);
14768
14769   /* Check for the ptr-operator production.  */
14770   cp_parser_parse_tentatively (parser);
14771   /* Parse the ptr-operator.  */
14772   code = cp_parser_ptr_operator (parser,
14773                                  &class_type,
14774                                  &cv_quals);
14775   /* If that worked, then we have a ptr-operator.  */
14776   if (cp_parser_parse_definitely (parser))
14777     {
14778       /* If a ptr-operator was found, then this declarator was not
14779          parenthesized.  */
14780       if (parenthesized_p)
14781         *parenthesized_p = true;
14782       /* The dependent declarator is optional if we are parsing an
14783          abstract-declarator.  */
14784       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED)
14785         cp_parser_parse_tentatively (parser);
14786
14787       /* Parse the dependent declarator.  */
14788       declarator = cp_parser_declarator (parser, dcl_kind,
14789                                          /*ctor_dtor_or_conv_p=*/NULL,
14790                                          /*parenthesized_p=*/NULL,
14791                                          /*member_p=*/false);
14792
14793       /* If we are parsing an abstract-declarator, we must handle the
14794          case where the dependent declarator is absent.  */
14795       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED
14796           && !cp_parser_parse_definitely (parser))
14797         declarator = NULL;
14798
14799       declarator = cp_parser_make_indirect_declarator
14800         (code, class_type, cv_quals, declarator);
14801     }
14802   /* Everything else is a direct-declarator.  */
14803   else
14804     {
14805       if (parenthesized_p)
14806         *parenthesized_p = cp_lexer_next_token_is (parser->lexer,
14807                                                    CPP_OPEN_PAREN);
14808       declarator = cp_parser_direct_declarator (parser, dcl_kind,
14809                                                 ctor_dtor_or_conv_p,
14810                                                 member_p);
14811     }
14812
14813   if (attributes && declarator && declarator != cp_error_declarator)
14814     declarator->attributes = attributes;
14815
14816   return declarator;
14817 }
14818
14819 /* Parse a direct-declarator or direct-abstract-declarator.
14820
14821    direct-declarator:
14822      declarator-id
14823      direct-declarator ( parameter-declaration-clause )
14824        cv-qualifier-seq [opt]
14825        exception-specification [opt]
14826      direct-declarator [ constant-expression [opt] ]
14827      ( declarator )
14828
14829    direct-abstract-declarator:
14830      direct-abstract-declarator [opt]
14831        ( parameter-declaration-clause )
14832        cv-qualifier-seq [opt]
14833        exception-specification [opt]
14834      direct-abstract-declarator [opt] [ constant-expression [opt] ]
14835      ( abstract-declarator )
14836
14837    Returns a representation of the declarator.  DCL_KIND is
14838    CP_PARSER_DECLARATOR_ABSTRACT, if we are parsing a
14839    direct-abstract-declarator.  It is CP_PARSER_DECLARATOR_NAMED, if
14840    we are parsing a direct-declarator.  It is
14841    CP_PARSER_DECLARATOR_EITHER, if we can accept either - in the case
14842    of ambiguity we prefer an abstract declarator, as per
14843    [dcl.ambig.res].  CTOR_DTOR_OR_CONV_P and MEMBER_P are as for
14844    cp_parser_declarator.  */
14845
14846 static cp_declarator *
14847 cp_parser_direct_declarator (cp_parser* parser,
14848                              cp_parser_declarator_kind dcl_kind,
14849                              int* ctor_dtor_or_conv_p,
14850                              bool member_p)
14851 {
14852   cp_token *token;
14853   cp_declarator *declarator = NULL;
14854   tree scope = NULL_TREE;
14855   bool saved_default_arg_ok_p = parser->default_arg_ok_p;
14856   bool saved_in_declarator_p = parser->in_declarator_p;
14857   bool first = true;
14858   tree pushed_scope = NULL_TREE;
14859
14860   while (true)
14861     {
14862       /* Peek at the next token.  */
14863       token = cp_lexer_peek_token (parser->lexer);
14864       if (token->type == CPP_OPEN_PAREN)
14865         {
14866           /* This is either a parameter-declaration-clause, or a
14867              parenthesized declarator. When we know we are parsing a
14868              named declarator, it must be a parenthesized declarator
14869              if FIRST is true. For instance, `(int)' is a
14870              parameter-declaration-clause, with an omitted
14871              direct-abstract-declarator. But `((*))', is a
14872              parenthesized abstract declarator. Finally, when T is a
14873              template parameter `(T)' is a
14874              parameter-declaration-clause, and not a parenthesized
14875              named declarator.
14876
14877              We first try and parse a parameter-declaration-clause,
14878              and then try a nested declarator (if FIRST is true).
14879
14880              It is not an error for it not to be a
14881              parameter-declaration-clause, even when FIRST is
14882              false. Consider,
14883
14884                int i (int);
14885                int i (3);
14886
14887              The first is the declaration of a function while the
14888              second is the definition of a variable, including its
14889              initializer.
14890
14891              Having seen only the parenthesis, we cannot know which of
14892              these two alternatives should be selected.  Even more
14893              complex are examples like:
14894
14895                int i (int (a));
14896                int i (int (3));
14897
14898              The former is a function-declaration; the latter is a
14899              variable initialization.
14900
14901              Thus again, we try a parameter-declaration-clause, and if
14902              that fails, we back out and return.  */
14903
14904           if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
14905             {
14906               tree params;
14907               unsigned saved_num_template_parameter_lists;
14908               bool is_declarator = false;
14909               tree t;
14910
14911               /* In a member-declarator, the only valid interpretation
14912                  of a parenthesis is the start of a
14913                  parameter-declaration-clause.  (It is invalid to
14914                  initialize a static data member with a parenthesized
14915                  initializer; only the "=" form of initialization is
14916                  permitted.)  */
14917               if (!member_p)
14918                 cp_parser_parse_tentatively (parser);
14919
14920               /* Consume the `('.  */
14921               cp_lexer_consume_token (parser->lexer);
14922               if (first)
14923                 {
14924                   /* If this is going to be an abstract declarator, we're
14925                      in a declarator and we can't have default args.  */
14926                   parser->default_arg_ok_p = false;
14927                   parser->in_declarator_p = true;
14928                 }
14929
14930               /* Inside the function parameter list, surrounding
14931                  template-parameter-lists do not apply.  */
14932               saved_num_template_parameter_lists
14933                 = parser->num_template_parameter_lists;
14934               parser->num_template_parameter_lists = 0;
14935
14936               begin_scope (sk_function_parms, NULL_TREE);
14937
14938               /* Parse the parameter-declaration-clause.  */
14939               params = cp_parser_parameter_declaration_clause (parser);
14940
14941               parser->num_template_parameter_lists
14942                 = saved_num_template_parameter_lists;
14943
14944               /* Consume the `)'.  */
14945               cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
14946
14947               /* If all went well, parse the cv-qualifier-seq and the
14948                  exception-specification.  */
14949               if (member_p || cp_parser_parse_definitely (parser))
14950                 {
14951                   cp_cv_quals cv_quals;
14952                   cp_virt_specifiers virt_specifiers;
14953                   tree exception_specification;
14954                   tree late_return;
14955
14956                   is_declarator = true;
14957
14958                   if (ctor_dtor_or_conv_p)
14959                     *ctor_dtor_or_conv_p = *ctor_dtor_or_conv_p < 0;
14960                   first = false;
14961
14962                   /* Parse the cv-qualifier-seq.  */
14963                   cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
14964                   /* And the exception-specification.  */
14965                   exception_specification
14966                     = cp_parser_exception_specification_opt (parser);
14967                   /* Parse the virt-specifier-seq.  */
14968                   virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
14969
14970                   late_return
14971                     = cp_parser_late_return_type_opt (parser, cv_quals);
14972
14973                   /* Create the function-declarator.  */
14974                   declarator = make_call_declarator (declarator,
14975                                                      params,
14976                                                      cv_quals,
14977                                                      virt_specifiers,
14978                                                      exception_specification,
14979                                                      late_return);
14980                   /* Any subsequent parameter lists are to do with
14981                      return type, so are not those of the declared
14982                      function.  */
14983                   parser->default_arg_ok_p = false;
14984                 }
14985
14986               /* Remove the function parms from scope.  */
14987               for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
14988                 pop_binding (DECL_NAME (t), t);
14989               leave_scope();
14990
14991               if (is_declarator)
14992                 /* Repeat the main loop.  */
14993                 continue;
14994             }
14995
14996           /* If this is the first, we can try a parenthesized
14997              declarator.  */
14998           if (first)
14999             {
15000               bool saved_in_type_id_in_expr_p;
15001
15002               parser->default_arg_ok_p = saved_default_arg_ok_p;
15003               parser->in_declarator_p = saved_in_declarator_p;
15004
15005               /* Consume the `('.  */
15006               cp_lexer_consume_token (parser->lexer);
15007               /* Parse the nested declarator.  */
15008               saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
15009               parser->in_type_id_in_expr_p = true;
15010               declarator
15011                 = cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
15012                                         /*parenthesized_p=*/NULL,
15013                                         member_p);
15014               parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
15015               first = false;
15016               /* Expect a `)'.  */
15017               if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
15018                 declarator = cp_error_declarator;
15019               if (declarator == cp_error_declarator)
15020                 break;
15021
15022               goto handle_declarator;
15023             }
15024           /* Otherwise, we must be done.  */
15025           else
15026             break;
15027         }
15028       else if ((!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
15029                && token->type == CPP_OPEN_SQUARE)
15030         {
15031           /* Parse an array-declarator.  */
15032           tree bounds;
15033
15034           if (ctor_dtor_or_conv_p)
15035             *ctor_dtor_or_conv_p = 0;
15036
15037           first = false;
15038           parser->default_arg_ok_p = false;
15039           parser->in_declarator_p = true;
15040           /* Consume the `['.  */
15041           cp_lexer_consume_token (parser->lexer);
15042           /* Peek at the next token.  */
15043           token = cp_lexer_peek_token (parser->lexer);
15044           /* If the next token is `]', then there is no
15045              constant-expression.  */
15046           if (token->type != CPP_CLOSE_SQUARE)
15047             {
15048               bool non_constant_p;
15049
15050               bounds
15051                 = cp_parser_constant_expression (parser,
15052                                                  /*allow_non_constant=*/true,
15053                                                  &non_constant_p);
15054               if (!non_constant_p)
15055                 /* OK */;
15056               /* Normally, the array bound must be an integral constant
15057                  expression.  However, as an extension, we allow VLAs
15058                  in function scopes as long as they aren't part of a
15059                  parameter declaration.  */
15060               else if (!parser->in_function_body
15061                        || current_binding_level->kind == sk_function_parms)
15062                 {
15063                   cp_parser_error (parser,
15064                                    "array bound is not an integer constant");
15065                   bounds = error_mark_node;
15066                 }
15067               else if (processing_template_decl && !error_operand_p (bounds))
15068                 {
15069                   /* Remember this wasn't a constant-expression.  */
15070                   bounds = build_nop (TREE_TYPE (bounds), bounds);
15071                   TREE_SIDE_EFFECTS (bounds) = 1;
15072                 }
15073             }
15074           else
15075             bounds = NULL_TREE;
15076           /* Look for the closing `]'.  */
15077           if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
15078             {
15079               declarator = cp_error_declarator;
15080               break;
15081             }
15082
15083           declarator = make_array_declarator (declarator, bounds);
15084         }
15085       else if (first && dcl_kind != CP_PARSER_DECLARATOR_ABSTRACT)
15086         {
15087           {
15088             tree qualifying_scope;
15089             tree unqualified_name;
15090             special_function_kind sfk;
15091             bool abstract_ok;
15092             bool pack_expansion_p = false;
15093             cp_token *declarator_id_start_token;
15094
15095             /* Parse a declarator-id */
15096             abstract_ok = (dcl_kind == CP_PARSER_DECLARATOR_EITHER);
15097             if (abstract_ok)
15098               {
15099                 cp_parser_parse_tentatively (parser);
15100
15101                 /* If we see an ellipsis, we should be looking at a
15102                    parameter pack. */
15103                 if (token->type == CPP_ELLIPSIS)
15104                   {
15105                     /* Consume the `...' */
15106                     cp_lexer_consume_token (parser->lexer);
15107
15108                     pack_expansion_p = true;
15109                   }
15110               }
15111
15112             declarator_id_start_token = cp_lexer_peek_token (parser->lexer);
15113             unqualified_name
15114               = cp_parser_declarator_id (parser, /*optional_p=*/abstract_ok);
15115             qualifying_scope = parser->scope;
15116             if (abstract_ok)
15117               {
15118                 bool okay = false;
15119
15120                 if (!unqualified_name && pack_expansion_p)
15121                   {
15122                     /* Check whether an error occurred. */
15123                     okay = !cp_parser_error_occurred (parser);
15124
15125                     /* We already consumed the ellipsis to mark a
15126                        parameter pack, but we have no way to report it,
15127                        so abort the tentative parse. We will be exiting
15128                        immediately anyway. */
15129                     cp_parser_abort_tentative_parse (parser);
15130                   }
15131                 else
15132                   okay = cp_parser_parse_definitely (parser);
15133
15134                 if (!okay)
15135                   unqualified_name = error_mark_node;
15136                 else if (unqualified_name
15137                          && (qualifying_scope
15138                              || (TREE_CODE (unqualified_name)
15139                                  != IDENTIFIER_NODE)))
15140                   {
15141                     cp_parser_error (parser, "expected unqualified-id");
15142                     unqualified_name = error_mark_node;
15143                   }
15144               }
15145
15146             if (!unqualified_name)
15147               return NULL;
15148             if (unqualified_name == error_mark_node)
15149               {
15150                 declarator = cp_error_declarator;
15151                 pack_expansion_p = false;
15152                 declarator->parameter_pack_p = false;
15153                 break;
15154               }
15155
15156             if (qualifying_scope && at_namespace_scope_p ()
15157                 && TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
15158               {
15159                 /* In the declaration of a member of a template class
15160                    outside of the class itself, the SCOPE will sometimes
15161                    be a TYPENAME_TYPE.  For example, given:
15162
15163                    template <typename T>
15164                    int S<T>::R::i = 3;
15165
15166                    the SCOPE will be a TYPENAME_TYPE for `S<T>::R'.  In
15167                    this context, we must resolve S<T>::R to an ordinary
15168                    type, rather than a typename type.
15169
15170                    The reason we normally avoid resolving TYPENAME_TYPEs
15171                    is that a specialization of `S' might render
15172                    `S<T>::R' not a type.  However, if `S' is
15173                    specialized, then this `i' will not be used, so there
15174                    is no harm in resolving the types here.  */
15175                 tree type;
15176
15177                 /* Resolve the TYPENAME_TYPE.  */
15178                 type = resolve_typename_type (qualifying_scope,
15179                                               /*only_current_p=*/false);
15180                 /* If that failed, the declarator is invalid.  */
15181                 if (TREE_CODE (type) == TYPENAME_TYPE)
15182                   {
15183                     if (typedef_variant_p (type))
15184                       error_at (declarator_id_start_token->location,
15185                                 "cannot define member of dependent typedef "
15186                                 "%qT", type);
15187                     else
15188                       error_at (declarator_id_start_token->location,
15189                                 "%<%T::%E%> is not a type",
15190                                 TYPE_CONTEXT (qualifying_scope),
15191                                 TYPE_IDENTIFIER (qualifying_scope));
15192                   }
15193                 qualifying_scope = type;
15194               }
15195
15196             sfk = sfk_none;
15197
15198             if (unqualified_name)
15199               {
15200                 tree class_type;
15201
15202                 if (qualifying_scope
15203                     && CLASS_TYPE_P (qualifying_scope))
15204                   class_type = qualifying_scope;
15205                 else
15206                   class_type = current_class_type;
15207
15208                 if (TREE_CODE (unqualified_name) == TYPE_DECL)
15209                   {
15210                     tree name_type = TREE_TYPE (unqualified_name);
15211                     if (class_type && same_type_p (name_type, class_type))
15212                       {
15213                         if (qualifying_scope
15214                             && CLASSTYPE_USE_TEMPLATE (name_type))
15215                           {
15216                             error_at (declarator_id_start_token->location,
15217                                       "invalid use of constructor as a template");
15218                             inform (declarator_id_start_token->location,
15219                                     "use %<%T::%D%> instead of %<%T::%D%> to "
15220                                     "name the constructor in a qualified name",
15221                                     class_type,
15222                                     DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
15223                                     class_type, name_type);
15224                             declarator = cp_error_declarator;
15225                             break;
15226                           }
15227                         else
15228                           unqualified_name = constructor_name (class_type);
15229                       }
15230                     else
15231                       {
15232                         /* We do not attempt to print the declarator
15233                            here because we do not have enough
15234                            information about its original syntactic
15235                            form.  */
15236                         cp_parser_error (parser, "invalid declarator");
15237                         declarator = cp_error_declarator;
15238                         break;
15239                       }
15240                   }
15241
15242                 if (class_type)
15243                   {
15244                     if (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
15245                       sfk = sfk_destructor;
15246                     else if (IDENTIFIER_TYPENAME_P (unqualified_name))
15247                       sfk = sfk_conversion;
15248                     else if (/* There's no way to declare a constructor
15249                                 for an anonymous type, even if the type
15250                                 got a name for linkage purposes.  */
15251                              !TYPE_WAS_ANONYMOUS (class_type)
15252                              && constructor_name_p (unqualified_name,
15253                                                     class_type))
15254                       {
15255                         unqualified_name = constructor_name (class_type);
15256                         sfk = sfk_constructor;
15257                       }
15258                     else if (is_overloaded_fn (unqualified_name)
15259                              && DECL_CONSTRUCTOR_P (get_first_fn
15260                                                     (unqualified_name)))
15261                       sfk = sfk_constructor;
15262
15263                     if (ctor_dtor_or_conv_p && sfk != sfk_none)
15264                       *ctor_dtor_or_conv_p = -1;
15265                   }
15266               }
15267             declarator = make_id_declarator (qualifying_scope,
15268                                              unqualified_name,
15269                                              sfk);
15270             declarator->id_loc = token->location;
15271             declarator->parameter_pack_p = pack_expansion_p;
15272
15273             if (pack_expansion_p)
15274               maybe_warn_variadic_templates ();
15275           }
15276
15277         handle_declarator:;
15278           scope = get_scope_of_declarator (declarator);
15279           if (scope)
15280             /* Any names that appear after the declarator-id for a
15281                member are looked up in the containing scope.  */
15282             pushed_scope = push_scope (scope);
15283           parser->in_declarator_p = true;
15284           if ((ctor_dtor_or_conv_p && *ctor_dtor_or_conv_p)
15285               || (declarator && declarator->kind == cdk_id))
15286             /* Default args are only allowed on function
15287                declarations.  */
15288             parser->default_arg_ok_p = saved_default_arg_ok_p;
15289           else
15290             parser->default_arg_ok_p = false;
15291
15292           first = false;
15293         }
15294       /* We're done.  */
15295       else
15296         break;
15297     }
15298
15299   /* For an abstract declarator, we might wind up with nothing at this
15300      point.  That's an error; the declarator is not optional.  */
15301   if (!declarator)
15302     cp_parser_error (parser, "expected declarator");
15303
15304   /* If we entered a scope, we must exit it now.  */
15305   if (pushed_scope)
15306     pop_scope (pushed_scope);
15307
15308   parser->default_arg_ok_p = saved_default_arg_ok_p;
15309   parser->in_declarator_p = saved_in_declarator_p;
15310
15311   return declarator;
15312 }
15313
15314 /* Parse a ptr-operator.
15315
15316    ptr-operator:
15317      * cv-qualifier-seq [opt]
15318      &
15319      :: [opt] nested-name-specifier * cv-qualifier-seq [opt]
15320
15321    GNU Extension:
15322
15323    ptr-operator:
15324      & cv-qualifier-seq [opt]
15325
15326    Returns INDIRECT_REF if a pointer, or pointer-to-member, was used.
15327    Returns ADDR_EXPR if a reference was used, or NON_LVALUE_EXPR for
15328    an rvalue reference. In the case of a pointer-to-member, *TYPE is
15329    filled in with the TYPE containing the member.  *CV_QUALS is
15330    filled in with the cv-qualifier-seq, or TYPE_UNQUALIFIED, if there
15331    are no cv-qualifiers.  Returns ERROR_MARK if an error occurred.
15332    Note that the tree codes returned by this function have nothing
15333    to do with the types of trees that will be eventually be created
15334    to represent the pointer or reference type being parsed. They are
15335    just constants with suggestive names. */
15336 static enum tree_code
15337 cp_parser_ptr_operator (cp_parser* parser,
15338                         tree* type,
15339                         cp_cv_quals *cv_quals)
15340 {
15341   enum tree_code code = ERROR_MARK;
15342   cp_token *token;
15343
15344   /* Assume that it's not a pointer-to-member.  */
15345   *type = NULL_TREE;
15346   /* And that there are no cv-qualifiers.  */
15347   *cv_quals = TYPE_UNQUALIFIED;
15348
15349   /* Peek at the next token.  */
15350   token = cp_lexer_peek_token (parser->lexer);
15351
15352   /* If it's a `*', `&' or `&&' we have a pointer or reference.  */
15353   if (token->type == CPP_MULT)
15354     code = INDIRECT_REF;
15355   else if (token->type == CPP_AND)
15356     code = ADDR_EXPR;
15357   else if ((cxx_dialect != cxx98) &&
15358            token->type == CPP_AND_AND) /* C++0x only */
15359     code = NON_LVALUE_EXPR;
15360
15361   if (code != ERROR_MARK)
15362     {
15363       /* Consume the `*', `&' or `&&'.  */
15364       cp_lexer_consume_token (parser->lexer);
15365
15366       /* A `*' can be followed by a cv-qualifier-seq, and so can a
15367          `&', if we are allowing GNU extensions.  (The only qualifier
15368          that can legally appear after `&' is `restrict', but that is
15369          enforced during semantic analysis.  */
15370       if (code == INDIRECT_REF
15371           || cp_parser_allow_gnu_extensions_p (parser))
15372         *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15373     }
15374   else
15375     {
15376       /* Try the pointer-to-member case.  */
15377       cp_parser_parse_tentatively (parser);
15378       /* Look for the optional `::' operator.  */
15379       cp_parser_global_scope_opt (parser,
15380                                   /*current_scope_valid_p=*/false);
15381       /* Look for the nested-name specifier.  */
15382       token = cp_lexer_peek_token (parser->lexer);
15383       cp_parser_nested_name_specifier (parser,
15384                                        /*typename_keyword_p=*/false,
15385                                        /*check_dependency_p=*/true,
15386                                        /*type_p=*/false,
15387                                        /*is_declaration=*/false);
15388       /* If we found it, and the next token is a `*', then we are
15389          indeed looking at a pointer-to-member operator.  */
15390       if (!cp_parser_error_occurred (parser)
15391           && cp_parser_require (parser, CPP_MULT, RT_MULT))
15392         {
15393           /* Indicate that the `*' operator was used.  */
15394           code = INDIRECT_REF;
15395
15396           if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
15397             error_at (token->location, "%qD is a namespace", parser->scope);
15398           else
15399             {
15400               /* The type of which the member is a member is given by the
15401                  current SCOPE.  */
15402               *type = parser->scope;
15403               /* The next name will not be qualified.  */
15404               parser->scope = NULL_TREE;
15405               parser->qualifying_scope = NULL_TREE;
15406               parser->object_scope = NULL_TREE;
15407               /* Look for the optional cv-qualifier-seq.  */
15408               *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15409             }
15410         }
15411       /* If that didn't work we don't have a ptr-operator.  */
15412       if (!cp_parser_parse_definitely (parser))
15413         cp_parser_error (parser, "expected ptr-operator");
15414     }
15415
15416   return code;
15417 }
15418
15419 /* Parse an (optional) cv-qualifier-seq.
15420
15421    cv-qualifier-seq:
15422      cv-qualifier cv-qualifier-seq [opt]
15423
15424    cv-qualifier:
15425      const
15426      volatile
15427
15428    GNU Extension:
15429
15430    cv-qualifier:
15431      __restrict__
15432
15433    Returns a bitmask representing the cv-qualifiers.  */
15434
15435 static cp_cv_quals
15436 cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
15437 {
15438   cp_cv_quals cv_quals = TYPE_UNQUALIFIED;
15439
15440   while (true)
15441     {
15442       cp_token *token;
15443       cp_cv_quals cv_qualifier;
15444
15445       /* Peek at the next token.  */
15446       token = cp_lexer_peek_token (parser->lexer);
15447       /* See if it's a cv-qualifier.  */
15448       switch (token->keyword)
15449         {
15450         case RID_CONST:
15451           cv_qualifier = TYPE_QUAL_CONST;
15452           break;
15453
15454         case RID_VOLATILE:
15455           cv_qualifier = TYPE_QUAL_VOLATILE;
15456           break;
15457
15458         case RID_RESTRICT:
15459           cv_qualifier = TYPE_QUAL_RESTRICT;
15460           break;
15461
15462         default:
15463           cv_qualifier = TYPE_UNQUALIFIED;
15464           break;
15465         }
15466
15467       if (!cv_qualifier)
15468         break;
15469
15470       if (cv_quals & cv_qualifier)
15471         {
15472           error_at (token->location, "duplicate cv-qualifier");
15473           cp_lexer_purge_token (parser->lexer);
15474         }
15475       else
15476         {
15477           cp_lexer_consume_token (parser->lexer);
15478           cv_quals |= cv_qualifier;
15479         }
15480     }
15481
15482   return cv_quals;
15483 }
15484
15485 /* Parse an (optional) virt-specifier-seq.
15486
15487    virt-specifier-seq:
15488      virt-specifier virt-specifier-seq [opt]
15489
15490    virt-specifier:
15491      override
15492      final
15493
15494    Returns a bitmask representing the virt-specifiers.  */
15495
15496 static cp_virt_specifiers
15497 cp_parser_virt_specifier_seq_opt (cp_parser* parser)
15498 {
15499   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
15500
15501   while (true)
15502     {
15503       cp_token *token;
15504       cp_virt_specifiers virt_specifier;
15505
15506       /* Peek at the next token.  */
15507       token = cp_lexer_peek_token (parser->lexer);
15508       /* See if it's a virt-specifier-qualifier.  */
15509       if (token->type != CPP_NAME)
15510         break;
15511       if (!strcmp (IDENTIFIER_POINTER(token->u.value), "override"))
15512         virt_specifier = VIRT_SPEC_OVERRIDE;
15513       else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "final"))
15514         virt_specifier = VIRT_SPEC_FINAL;
15515       else
15516         break;
15517
15518       if (virt_specifiers & virt_specifier)
15519         {
15520           error_at (token->location, "duplicate virt-specifier");
15521           cp_lexer_purge_token (parser->lexer);
15522         }
15523       else
15524         {
15525           cp_lexer_consume_token (parser->lexer);
15526           virt_specifiers |= virt_specifier;
15527         }
15528     }
15529   return virt_specifiers;
15530 }
15531
15532 /* Parse a late-specified return type, if any.  This is not a separate
15533    non-terminal, but part of a function declarator, which looks like
15534
15535    -> trailing-type-specifier-seq abstract-declarator(opt)
15536
15537    Returns the type indicated by the type-id.  */
15538
15539 static tree
15540 cp_parser_late_return_type_opt (cp_parser* parser, cp_cv_quals quals)
15541 {
15542   cp_token *token;
15543   tree type;
15544
15545   /* Peek at the next token.  */
15546   token = cp_lexer_peek_token (parser->lexer);
15547   /* A late-specified return type is indicated by an initial '->'. */
15548   if (token->type != CPP_DEREF)
15549     return NULL_TREE;
15550
15551   /* Consume the ->.  */
15552   cp_lexer_consume_token (parser->lexer);
15553
15554   if (current_class_type)
15555     {
15556       /* DR 1207: 'this' is in scope in the trailing return type.  */
15557       tree this_parm = build_this_parm (current_class_type, quals);
15558       gcc_assert (current_class_ptr == NULL_TREE);
15559       current_class_ref
15560         = cp_build_indirect_ref (this_parm, RO_NULL, tf_warning_or_error);
15561       /* Set this second to avoid shortcut in cp_build_indirect_ref.  */
15562       current_class_ptr = this_parm;
15563     }
15564
15565   type = cp_parser_trailing_type_id (parser);
15566
15567   if (current_class_type)
15568     current_class_ptr = current_class_ref = NULL_TREE;
15569
15570   return type;
15571 }
15572
15573 /* Parse a declarator-id.
15574
15575    declarator-id:
15576      id-expression
15577      :: [opt] nested-name-specifier [opt] type-name
15578
15579    In the `id-expression' case, the value returned is as for
15580    cp_parser_id_expression if the id-expression was an unqualified-id.
15581    If the id-expression was a qualified-id, then a SCOPE_REF is
15582    returned.  The first operand is the scope (either a NAMESPACE_DECL
15583    or TREE_TYPE), but the second is still just a representation of an
15584    unqualified-id.  */
15585
15586 static tree
15587 cp_parser_declarator_id (cp_parser* parser, bool optional_p)
15588 {
15589   tree id;
15590   /* The expression must be an id-expression.  Assume that qualified
15591      names are the names of types so that:
15592
15593        template <class T>
15594        int S<T>::R::i = 3;
15595
15596      will work; we must treat `S<T>::R' as the name of a type.
15597      Similarly, assume that qualified names are templates, where
15598      required, so that:
15599
15600        template <class T>
15601        int S<T>::R<T>::i = 3;
15602
15603      will work, too.  */
15604   id = cp_parser_id_expression (parser,
15605                                 /*template_keyword_p=*/false,
15606                                 /*check_dependency_p=*/false,
15607                                 /*template_p=*/NULL,
15608                                 /*declarator_p=*/true,
15609                                 optional_p);
15610   if (id && BASELINK_P (id))
15611     id = BASELINK_FUNCTIONS (id);
15612   return id;
15613 }
15614
15615 /* Parse a type-id.
15616
15617    type-id:
15618      type-specifier-seq abstract-declarator [opt]
15619
15620    Returns the TYPE specified.  */
15621
15622 static tree
15623 cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg,
15624                      bool is_trailing_return)
15625 {
15626   cp_decl_specifier_seq type_specifier_seq;
15627   cp_declarator *abstract_declarator;
15628
15629   /* Parse the type-specifier-seq.  */
15630   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
15631                                 is_trailing_return,
15632                                 &type_specifier_seq);
15633   if (type_specifier_seq.type == error_mark_node)
15634     return error_mark_node;
15635
15636   /* There might or might not be an abstract declarator.  */
15637   cp_parser_parse_tentatively (parser);
15638   /* Look for the declarator.  */
15639   abstract_declarator
15640     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_ABSTRACT, NULL,
15641                             /*parenthesized_p=*/NULL,
15642                             /*member_p=*/false);
15643   /* Check to see if there really was a declarator.  */
15644   if (!cp_parser_parse_definitely (parser))
15645     abstract_declarator = NULL;
15646
15647   if (type_specifier_seq.type
15648       && type_uses_auto (type_specifier_seq.type))
15649     {
15650       /* A type-id with type 'auto' is only ok if the abstract declarator
15651          is a function declarator with a late-specified return type.  */
15652       if (abstract_declarator
15653           && abstract_declarator->kind == cdk_function
15654           && abstract_declarator->u.function.late_return_type)
15655         /* OK */;
15656       else
15657         {
15658           error ("invalid use of %<auto%>");
15659           return error_mark_node;
15660         }
15661     }
15662   
15663   return groktypename (&type_specifier_seq, abstract_declarator,
15664                        is_template_arg);
15665 }
15666
15667 static tree cp_parser_type_id (cp_parser *parser)
15668 {
15669   return cp_parser_type_id_1 (parser, false, false);
15670 }
15671
15672 static tree cp_parser_template_type_arg (cp_parser *parser)
15673 {
15674   tree r;
15675   const char *saved_message = parser->type_definition_forbidden_message;
15676   parser->type_definition_forbidden_message
15677     = G_("types may not be defined in template arguments");
15678   r = cp_parser_type_id_1 (parser, true, false);
15679   parser->type_definition_forbidden_message = saved_message;
15680   return r;
15681 }
15682
15683 static tree cp_parser_trailing_type_id (cp_parser *parser)
15684 {
15685   return cp_parser_type_id_1 (parser, false, true);
15686 }
15687
15688 /* Parse a type-specifier-seq.
15689
15690    type-specifier-seq:
15691      type-specifier type-specifier-seq [opt]
15692
15693    GNU extension:
15694
15695    type-specifier-seq:
15696      attributes type-specifier-seq [opt]
15697
15698    If IS_DECLARATION is true, we are at the start of a "condition" or
15699    exception-declaration, so we might be followed by a declarator-id.
15700
15701    If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
15702    i.e. we've just seen "->".
15703
15704    Sets *TYPE_SPECIFIER_SEQ to represent the sequence.  */
15705
15706 static void
15707 cp_parser_type_specifier_seq (cp_parser* parser,
15708                               bool is_declaration,
15709                               bool is_trailing_return,
15710                               cp_decl_specifier_seq *type_specifier_seq)
15711 {
15712   bool seen_type_specifier = false;
15713   cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
15714   cp_token *start_token = NULL;
15715
15716   /* Clear the TYPE_SPECIFIER_SEQ.  */
15717   clear_decl_specs (type_specifier_seq);
15718
15719   /* In the context of a trailing return type, enum E { } is an
15720      elaborated-type-specifier followed by a function-body, not an
15721      enum-specifier.  */
15722   if (is_trailing_return)
15723     flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
15724
15725   /* Parse the type-specifiers and attributes.  */
15726   while (true)
15727     {
15728       tree type_specifier;
15729       bool is_cv_qualifier;
15730
15731       /* Check for attributes first.  */
15732       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
15733         {
15734           type_specifier_seq->attributes =
15735             chainon (type_specifier_seq->attributes,
15736                      cp_parser_attributes_opt (parser));
15737           continue;
15738         }
15739
15740       /* record the token of the beginning of the type specifier seq,
15741          for error reporting purposes*/
15742      if (!start_token)
15743        start_token = cp_lexer_peek_token (parser->lexer);
15744
15745       /* Look for the type-specifier.  */
15746       type_specifier = cp_parser_type_specifier (parser,
15747                                                  flags,
15748                                                  type_specifier_seq,
15749                                                  /*is_declaration=*/false,
15750                                                  NULL,
15751                                                  &is_cv_qualifier);
15752       if (!type_specifier)
15753         {
15754           /* If the first type-specifier could not be found, this is not a
15755              type-specifier-seq at all.  */
15756           if (!seen_type_specifier)
15757             {
15758               cp_parser_error (parser, "expected type-specifier");
15759               type_specifier_seq->type = error_mark_node;
15760               return;
15761             }
15762           /* If subsequent type-specifiers could not be found, the
15763              type-specifier-seq is complete.  */
15764           break;
15765         }
15766
15767       seen_type_specifier = true;
15768       /* The standard says that a condition can be:
15769
15770             type-specifier-seq declarator = assignment-expression
15771
15772          However, given:
15773
15774            struct S {};
15775            if (int S = ...)
15776
15777          we should treat the "S" as a declarator, not as a
15778          type-specifier.  The standard doesn't say that explicitly for
15779          type-specifier-seq, but it does say that for
15780          decl-specifier-seq in an ordinary declaration.  Perhaps it
15781          would be clearer just to allow a decl-specifier-seq here, and
15782          then add a semantic restriction that if any decl-specifiers
15783          that are not type-specifiers appear, the program is invalid.  */
15784       if (is_declaration && !is_cv_qualifier)
15785         flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
15786     }
15787
15788   cp_parser_check_decl_spec (type_specifier_seq, start_token->location);
15789 }
15790
15791 /* Parse a parameter-declaration-clause.
15792
15793    parameter-declaration-clause:
15794      parameter-declaration-list [opt] ... [opt]
15795      parameter-declaration-list , ...
15796
15797    Returns a representation for the parameter declarations.  A return
15798    value of NULL indicates a parameter-declaration-clause consisting
15799    only of an ellipsis.  */
15800
15801 static tree
15802 cp_parser_parameter_declaration_clause (cp_parser* parser)
15803 {
15804   tree parameters;
15805   cp_token *token;
15806   bool ellipsis_p;
15807   bool is_error;
15808
15809   /* Peek at the next token.  */
15810   token = cp_lexer_peek_token (parser->lexer);
15811   /* Check for trivial parameter-declaration-clauses.  */
15812   if (token->type == CPP_ELLIPSIS)
15813     {
15814       /* Consume the `...' token.  */
15815       cp_lexer_consume_token (parser->lexer);
15816       return NULL_TREE;
15817     }
15818   else if (token->type == CPP_CLOSE_PAREN)
15819     /* There are no parameters.  */
15820     {
15821 #ifndef NO_IMPLICIT_EXTERN_C
15822       if (in_system_header && current_class_type == NULL
15823           && current_lang_name == lang_name_c)
15824         return NULL_TREE;
15825       else
15826 #endif
15827         return void_list_node;
15828     }
15829   /* Check for `(void)', too, which is a special case.  */
15830   else if (token->keyword == RID_VOID
15831            && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
15832                == CPP_CLOSE_PAREN))
15833     {
15834       /* Consume the `void' token.  */
15835       cp_lexer_consume_token (parser->lexer);
15836       /* There are no parameters.  */
15837       return void_list_node;
15838     }
15839
15840   /* Parse the parameter-declaration-list.  */
15841   parameters = cp_parser_parameter_declaration_list (parser, &is_error);
15842   /* If a parse error occurred while parsing the
15843      parameter-declaration-list, then the entire
15844      parameter-declaration-clause is erroneous.  */
15845   if (is_error)
15846     return NULL;
15847
15848   /* Peek at the next token.  */
15849   token = cp_lexer_peek_token (parser->lexer);
15850   /* If it's a `,', the clause should terminate with an ellipsis.  */
15851   if (token->type == CPP_COMMA)
15852     {
15853       /* Consume the `,'.  */
15854       cp_lexer_consume_token (parser->lexer);
15855       /* Expect an ellipsis.  */
15856       ellipsis_p
15857         = (cp_parser_require (parser, CPP_ELLIPSIS, RT_ELLIPSIS) != NULL);
15858     }
15859   /* It might also be `...' if the optional trailing `,' was
15860      omitted.  */
15861   else if (token->type == CPP_ELLIPSIS)
15862     {
15863       /* Consume the `...' token.  */
15864       cp_lexer_consume_token (parser->lexer);
15865       /* And remember that we saw it.  */
15866       ellipsis_p = true;
15867     }
15868   else
15869     ellipsis_p = false;
15870
15871   /* Finish the parameter list.  */
15872   if (!ellipsis_p)
15873     parameters = chainon (parameters, void_list_node);
15874
15875   return parameters;
15876 }
15877
15878 /* Parse a parameter-declaration-list.
15879
15880    parameter-declaration-list:
15881      parameter-declaration
15882      parameter-declaration-list , parameter-declaration
15883
15884    Returns a representation of the parameter-declaration-list, as for
15885    cp_parser_parameter_declaration_clause.  However, the
15886    `void_list_node' is never appended to the list.  Upon return,
15887    *IS_ERROR will be true iff an error occurred.  */
15888
15889 static tree
15890 cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
15891 {
15892   tree parameters = NULL_TREE;
15893   tree *tail = &parameters; 
15894   bool saved_in_unbraced_linkage_specification_p;
15895   int index = 0;
15896
15897   /* Assume all will go well.  */
15898   *is_error = false;
15899   /* The special considerations that apply to a function within an
15900      unbraced linkage specifications do not apply to the parameters
15901      to the function.  */
15902   saved_in_unbraced_linkage_specification_p 
15903     = parser->in_unbraced_linkage_specification_p;
15904   parser->in_unbraced_linkage_specification_p = false;
15905
15906   /* Look for more parameters.  */
15907   while (true)
15908     {
15909       cp_parameter_declarator *parameter;
15910       tree decl = error_mark_node;
15911       bool parenthesized_p;
15912       /* Parse the parameter.  */
15913       parameter
15914         = cp_parser_parameter_declaration (parser,
15915                                            /*template_parm_p=*/false,
15916                                            &parenthesized_p);
15917
15918       /* We don't know yet if the enclosing context is deprecated, so wait
15919          and warn in grokparms if appropriate.  */
15920       deprecated_state = DEPRECATED_SUPPRESS;
15921
15922       if (parameter)
15923         decl = grokdeclarator (parameter->declarator,
15924                                &parameter->decl_specifiers,
15925                                PARM,
15926                                parameter->default_argument != NULL_TREE,
15927                                &parameter->decl_specifiers.attributes);
15928
15929       deprecated_state = DEPRECATED_NORMAL;
15930
15931       /* If a parse error occurred parsing the parameter declaration,
15932          then the entire parameter-declaration-list is erroneous.  */
15933       if (decl == error_mark_node)
15934         {
15935           *is_error = true;
15936           parameters = error_mark_node;
15937           break;
15938         }
15939
15940       if (parameter->decl_specifiers.attributes)
15941         cplus_decl_attributes (&decl,
15942                                parameter->decl_specifiers.attributes,
15943                                0);
15944       if (DECL_NAME (decl))
15945         decl = pushdecl (decl);
15946
15947       if (decl != error_mark_node)
15948         {
15949           retrofit_lang_decl (decl);
15950           DECL_PARM_INDEX (decl) = ++index;
15951           DECL_PARM_LEVEL (decl) = function_parm_depth ();
15952         }
15953
15954       /* Add the new parameter to the list.  */
15955       *tail = build_tree_list (parameter->default_argument, decl);
15956       tail = &TREE_CHAIN (*tail);
15957
15958       /* Peek at the next token.  */
15959       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
15960           || cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
15961           /* These are for Objective-C++ */
15962           || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
15963           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
15964         /* The parameter-declaration-list is complete.  */
15965         break;
15966       else if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
15967         {
15968           cp_token *token;
15969
15970           /* Peek at the next token.  */
15971           token = cp_lexer_peek_nth_token (parser->lexer, 2);
15972           /* If it's an ellipsis, then the list is complete.  */
15973           if (token->type == CPP_ELLIPSIS)
15974             break;
15975           /* Otherwise, there must be more parameters.  Consume the
15976              `,'.  */
15977           cp_lexer_consume_token (parser->lexer);
15978           /* When parsing something like:
15979
15980                 int i(float f, double d)
15981
15982              we can tell after seeing the declaration for "f" that we
15983              are not looking at an initialization of a variable "i",
15984              but rather at the declaration of a function "i".
15985
15986              Due to the fact that the parsing of template arguments
15987              (as specified to a template-id) requires backtracking we
15988              cannot use this technique when inside a template argument
15989              list.  */
15990           if (!parser->in_template_argument_list_p
15991               && !parser->in_type_id_in_expr_p
15992               && cp_parser_uncommitted_to_tentative_parse_p (parser)
15993               /* However, a parameter-declaration of the form
15994                  "foat(f)" (which is a valid declaration of a
15995                  parameter "f") can also be interpreted as an
15996                  expression (the conversion of "f" to "float").  */
15997               && !parenthesized_p)
15998             cp_parser_commit_to_tentative_parse (parser);
15999         }
16000       else
16001         {
16002           cp_parser_error (parser, "expected %<,%> or %<...%>");
16003           if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
16004             cp_parser_skip_to_closing_parenthesis (parser,
16005                                                    /*recovering=*/true,
16006                                                    /*or_comma=*/false,
16007                                                    /*consume_paren=*/false);
16008           break;
16009         }
16010     }
16011
16012   parser->in_unbraced_linkage_specification_p
16013     = saved_in_unbraced_linkage_specification_p;
16014
16015   return parameters;
16016 }
16017
16018 /* Parse a parameter declaration.
16019
16020    parameter-declaration:
16021      decl-specifier-seq ... [opt] declarator
16022      decl-specifier-seq declarator = assignment-expression
16023      decl-specifier-seq ... [opt] abstract-declarator [opt]
16024      decl-specifier-seq abstract-declarator [opt] = assignment-expression
16025
16026    If TEMPLATE_PARM_P is TRUE, then this parameter-declaration
16027    declares a template parameter.  (In that case, a non-nested `>'
16028    token encountered during the parsing of the assignment-expression
16029    is not interpreted as a greater-than operator.)
16030
16031    Returns a representation of the parameter, or NULL if an error
16032    occurs.  If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to
16033    true iff the declarator is of the form "(p)".  */
16034
16035 static cp_parameter_declarator *
16036 cp_parser_parameter_declaration (cp_parser *parser,
16037                                  bool template_parm_p,
16038                                  bool *parenthesized_p)
16039 {
16040   int declares_class_or_enum;
16041   cp_decl_specifier_seq decl_specifiers;
16042   cp_declarator *declarator;
16043   tree default_argument;
16044   cp_token *token = NULL, *declarator_token_start = NULL;
16045   const char *saved_message;
16046
16047   /* In a template parameter, `>' is not an operator.
16048
16049      [temp.param]
16050
16051      When parsing a default template-argument for a non-type
16052      template-parameter, the first non-nested `>' is taken as the end
16053      of the template parameter-list rather than a greater-than
16054      operator.  */
16055
16056   /* Type definitions may not appear in parameter types.  */
16057   saved_message = parser->type_definition_forbidden_message;
16058   parser->type_definition_forbidden_message
16059     = G_("types may not be defined in parameter types");
16060
16061   /* Parse the declaration-specifiers.  */
16062   cp_parser_decl_specifier_seq (parser,
16063                                 CP_PARSER_FLAGS_NONE,
16064                                 &decl_specifiers,
16065                                 &declares_class_or_enum);
16066
16067   /* Complain about missing 'typename' or other invalid type names.  */
16068   if (!decl_specifiers.any_type_specifiers_p)
16069     cp_parser_parse_and_diagnose_invalid_type_name (parser);
16070
16071   /* If an error occurred, there's no reason to attempt to parse the
16072      rest of the declaration.  */
16073   if (cp_parser_error_occurred (parser))
16074     {
16075       parser->type_definition_forbidden_message = saved_message;
16076       return NULL;
16077     }
16078
16079   /* Peek at the next token.  */
16080   token = cp_lexer_peek_token (parser->lexer);
16081
16082   /* If the next token is a `)', `,', `=', `>', or `...', then there
16083      is no declarator. However, when variadic templates are enabled,
16084      there may be a declarator following `...'.  */
16085   if (token->type == CPP_CLOSE_PAREN
16086       || token->type == CPP_COMMA
16087       || token->type == CPP_EQ
16088       || token->type == CPP_GREATER)
16089     {
16090       declarator = NULL;
16091       if (parenthesized_p)
16092         *parenthesized_p = false;
16093     }
16094   /* Otherwise, there should be a declarator.  */
16095   else
16096     {
16097       bool saved_default_arg_ok_p = parser->default_arg_ok_p;
16098       parser->default_arg_ok_p = false;
16099
16100       /* After seeing a decl-specifier-seq, if the next token is not a
16101          "(", there is no possibility that the code is a valid
16102          expression.  Therefore, if parsing tentatively, we commit at
16103          this point.  */
16104       if (!parser->in_template_argument_list_p
16105           /* In an expression context, having seen:
16106
16107                (int((char ...
16108
16109              we cannot be sure whether we are looking at a
16110              function-type (taking a "char" as a parameter) or a cast
16111              of some object of type "char" to "int".  */
16112           && !parser->in_type_id_in_expr_p
16113           && cp_parser_uncommitted_to_tentative_parse_p (parser)
16114           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
16115           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
16116         cp_parser_commit_to_tentative_parse (parser);
16117       /* Parse the declarator.  */
16118       declarator_token_start = token;
16119       declarator = cp_parser_declarator (parser,
16120                                          CP_PARSER_DECLARATOR_EITHER,
16121                                          /*ctor_dtor_or_conv_p=*/NULL,
16122                                          parenthesized_p,
16123                                          /*member_p=*/false);
16124       parser->default_arg_ok_p = saved_default_arg_ok_p;
16125       /* After the declarator, allow more attributes.  */
16126       decl_specifiers.attributes
16127         = chainon (decl_specifiers.attributes,
16128                    cp_parser_attributes_opt (parser));
16129     }
16130
16131   /* If the next token is an ellipsis, and we have not seen a
16132      declarator name, and the type of the declarator contains parameter
16133      packs but it is not a TYPE_PACK_EXPANSION, then we actually have
16134      a parameter pack expansion expression. Otherwise, leave the
16135      ellipsis for a C-style variadic function. */
16136   token = cp_lexer_peek_token (parser->lexer);
16137   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16138     {
16139       tree type = decl_specifiers.type;
16140
16141       if (type && DECL_P (type))
16142         type = TREE_TYPE (type);
16143
16144       if (type
16145           && TREE_CODE (type) != TYPE_PACK_EXPANSION
16146           && declarator_can_be_parameter_pack (declarator)
16147           && (!declarator || !declarator->parameter_pack_p)
16148           && uses_parameter_packs (type))
16149         {
16150           /* Consume the `...'. */
16151           cp_lexer_consume_token (parser->lexer);
16152           maybe_warn_variadic_templates ();
16153           
16154           /* Build a pack expansion type */
16155           if (declarator)
16156             declarator->parameter_pack_p = true;
16157           else
16158             decl_specifiers.type = make_pack_expansion (type);
16159         }
16160     }
16161
16162   /* The restriction on defining new types applies only to the type
16163      of the parameter, not to the default argument.  */
16164   parser->type_definition_forbidden_message = saved_message;
16165
16166   /* If the next token is `=', then process a default argument.  */
16167   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
16168     {
16169       /* Consume the `='.  */
16170       cp_lexer_consume_token (parser->lexer);
16171
16172       /* If we are defining a class, then the tokens that make up the
16173          default argument must be saved and processed later.  */
16174       if (!template_parm_p && at_class_scope_p ()
16175           && TYPE_BEING_DEFINED (current_class_type)
16176           && !LAMBDA_TYPE_P (current_class_type))
16177         {
16178           unsigned depth = 0;
16179           int maybe_template_id = 0;
16180           cp_token *first_token;
16181           cp_token *token;
16182
16183           /* Add tokens until we have processed the entire default
16184              argument.  We add the range [first_token, token).  */
16185           first_token = cp_lexer_peek_token (parser->lexer);
16186           while (true)
16187             {
16188               bool done = false;
16189
16190               /* Peek at the next token.  */
16191               token = cp_lexer_peek_token (parser->lexer);
16192               /* What we do depends on what token we have.  */
16193               switch (token->type)
16194                 {
16195                   /* In valid code, a default argument must be
16196                      immediately followed by a `,' `)', or `...'.  */
16197                 case CPP_COMMA:
16198                   if (depth == 0 && maybe_template_id)
16199                     {
16200                       /* If we've seen a '<', we might be in a
16201                          template-argument-list.  Until Core issue 325 is
16202                          resolved, we don't know how this situation ought
16203                          to be handled, so try to DTRT.  We check whether
16204                          what comes after the comma is a valid parameter
16205                          declaration list.  If it is, then the comma ends
16206                          the default argument; otherwise the default
16207                          argument continues.  */
16208                       bool error = false;
16209                       tree t;
16210
16211                       /* Set ITALP so cp_parser_parameter_declaration_list
16212                          doesn't decide to commit to this parse.  */
16213                       bool saved_italp = parser->in_template_argument_list_p;
16214                       parser->in_template_argument_list_p = true;
16215
16216                       cp_parser_parse_tentatively (parser);
16217                       cp_lexer_consume_token (parser->lexer);
16218                       begin_scope (sk_function_parms, NULL_TREE);
16219                       cp_parser_parameter_declaration_list (parser, &error);
16220                       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
16221                         pop_binding (DECL_NAME (t), t);
16222                       leave_scope ();
16223                       if (!cp_parser_error_occurred (parser) && !error)
16224                         done = true;
16225                       cp_parser_abort_tentative_parse (parser);
16226
16227                       parser->in_template_argument_list_p = saved_italp;
16228                       break;
16229                     }
16230                 case CPP_CLOSE_PAREN:
16231                 case CPP_ELLIPSIS:
16232                   /* If we run into a non-nested `;', `}', or `]',
16233                      then the code is invalid -- but the default
16234                      argument is certainly over.  */
16235                 case CPP_SEMICOLON:
16236                 case CPP_CLOSE_BRACE:
16237                 case CPP_CLOSE_SQUARE:
16238                   if (depth == 0)
16239                     done = true;
16240                   /* Update DEPTH, if necessary.  */
16241                   else if (token->type == CPP_CLOSE_PAREN
16242                            || token->type == CPP_CLOSE_BRACE
16243                            || token->type == CPP_CLOSE_SQUARE)
16244                     --depth;
16245                   break;
16246
16247                 case CPP_OPEN_PAREN:
16248                 case CPP_OPEN_SQUARE:
16249                 case CPP_OPEN_BRACE:
16250                   ++depth;
16251                   break;
16252
16253                 case CPP_LESS:
16254                   if (depth == 0)
16255                     /* This might be the comparison operator, or it might
16256                        start a template argument list.  */
16257                     ++maybe_template_id;
16258                   break;
16259
16260                 case CPP_RSHIFT:
16261                   if (cxx_dialect == cxx98)
16262                     break;
16263                   /* Fall through for C++0x, which treats the `>>'
16264                      operator like two `>' tokens in certain
16265                      cases.  */
16266
16267                 case CPP_GREATER:
16268                   if (depth == 0)
16269                     {
16270                       /* This might be an operator, or it might close a
16271                          template argument list.  But if a previous '<'
16272                          started a template argument list, this will have
16273                          closed it, so we can't be in one anymore.  */
16274                       maybe_template_id -= 1 + (token->type == CPP_RSHIFT);
16275                       if (maybe_template_id < 0)
16276                         maybe_template_id = 0;
16277                     }
16278                   break;
16279
16280                   /* If we run out of tokens, issue an error message.  */
16281                 case CPP_EOF:
16282                 case CPP_PRAGMA_EOL:
16283                   error_at (token->location, "file ends in default argument");
16284                   done = true;
16285                   break;
16286
16287                 case CPP_NAME:
16288                 case CPP_SCOPE:
16289                   /* In these cases, we should look for template-ids.
16290                      For example, if the default argument is
16291                      `X<int, double>()', we need to do name lookup to
16292                      figure out whether or not `X' is a template; if
16293                      so, the `,' does not end the default argument.
16294
16295                      That is not yet done.  */
16296                   break;
16297
16298                 default:
16299                   break;
16300                 }
16301
16302               /* If we've reached the end, stop.  */
16303               if (done)
16304                 break;
16305
16306               /* Add the token to the token block.  */
16307               token = cp_lexer_consume_token (parser->lexer);
16308             }
16309
16310           /* Create a DEFAULT_ARG to represent the unparsed default
16311              argument.  */
16312           default_argument = make_node (DEFAULT_ARG);
16313           DEFARG_TOKENS (default_argument)
16314             = cp_token_cache_new (first_token, token);
16315           DEFARG_INSTANTIATIONS (default_argument) = NULL;
16316         }
16317       /* Outside of a class definition, we can just parse the
16318          assignment-expression.  */
16319       else
16320         {
16321           token = cp_lexer_peek_token (parser->lexer);
16322           default_argument 
16323             = cp_parser_default_argument (parser, template_parm_p);
16324         }
16325
16326       if (!parser->default_arg_ok_p)
16327         {
16328           if (flag_permissive)
16329             warning (0, "deprecated use of default argument for parameter of non-function");
16330           else
16331             {
16332               error_at (token->location,
16333                         "default arguments are only "
16334                         "permitted for function parameters");
16335               default_argument = NULL_TREE;
16336             }
16337         }
16338       else if ((declarator && declarator->parameter_pack_p)
16339                || (decl_specifiers.type
16340                    && PACK_EXPANSION_P (decl_specifiers.type)))
16341         {
16342           /* Find the name of the parameter pack.  */     
16343           cp_declarator *id_declarator = declarator;
16344           while (id_declarator && id_declarator->kind != cdk_id)
16345             id_declarator = id_declarator->declarator;
16346           
16347           if (id_declarator && id_declarator->kind == cdk_id)
16348             error_at (declarator_token_start->location,
16349                       template_parm_p 
16350                       ? "template parameter pack %qD"
16351                       " cannot have a default argument"
16352                       : "parameter pack %qD cannot have a default argument",
16353                       id_declarator->u.id.unqualified_name);
16354           else
16355             error_at (declarator_token_start->location,
16356                       template_parm_p 
16357                       ? "template parameter pack cannot have a default argument"
16358                       : "parameter pack cannot have a default argument");
16359           
16360           default_argument = NULL_TREE;
16361         }
16362     }
16363   else
16364     default_argument = NULL_TREE;
16365
16366   return make_parameter_declarator (&decl_specifiers,
16367                                     declarator,
16368                                     default_argument);
16369 }
16370
16371 /* Parse a default argument and return it.
16372
16373    TEMPLATE_PARM_P is true if this is a default argument for a
16374    non-type template parameter.  */
16375 static tree
16376 cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
16377 {
16378   tree default_argument = NULL_TREE;
16379   bool saved_greater_than_is_operator_p;
16380   bool saved_local_variables_forbidden_p;
16381
16382   /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
16383      set correctly.  */
16384   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
16385   parser->greater_than_is_operator_p = !template_parm_p;
16386   /* Local variable names (and the `this' keyword) may not
16387      appear in a default argument.  */
16388   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
16389   parser->local_variables_forbidden_p = true;
16390   /* Parse the assignment-expression.  */
16391   if (template_parm_p)
16392     push_deferring_access_checks (dk_no_deferred);
16393   default_argument
16394     = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
16395   if (template_parm_p)
16396     pop_deferring_access_checks ();
16397   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
16398   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
16399
16400   return default_argument;
16401 }
16402
16403 /* Parse a function-body.
16404
16405    function-body:
16406      compound_statement  */
16407
16408 static void
16409 cp_parser_function_body (cp_parser *parser)
16410 {
16411   cp_parser_compound_statement (parser, NULL, false, true);
16412 }
16413
16414 /* Parse a ctor-initializer-opt followed by a function-body.  Return
16415    true if a ctor-initializer was present.  */
16416
16417 static bool
16418 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
16419 {
16420   tree body, list;
16421   bool ctor_initializer_p;
16422   const bool check_body_p =
16423      DECL_CONSTRUCTOR_P (current_function_decl)
16424      && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
16425   tree last = NULL;
16426
16427   /* Begin the function body.  */
16428   body = begin_function_body ();
16429   /* Parse the optional ctor-initializer.  */
16430   ctor_initializer_p = cp_parser_ctor_initializer_opt (parser);
16431
16432   /* If we're parsing a constexpr constructor definition, we need
16433      to check that the constructor body is indeed empty.  However,
16434      before we get to cp_parser_function_body lot of junk has been
16435      generated, so we can't just check that we have an empty block.
16436      Rather we take a snapshot of the outermost block, and check whether
16437      cp_parser_function_body changed its state.  */
16438   if (check_body_p)
16439     {
16440       list = body;
16441       if (TREE_CODE (list) == BIND_EXPR)
16442         list = BIND_EXPR_BODY (list);
16443       if (TREE_CODE (list) == STATEMENT_LIST
16444           && STATEMENT_LIST_TAIL (list) != NULL)
16445         last = STATEMENT_LIST_TAIL (list)->stmt;
16446     }
16447   /* Parse the function-body.  */
16448   cp_parser_function_body (parser);
16449   if (check_body_p)
16450     check_constexpr_ctor_body (last, list);
16451   /* Finish the function body.  */
16452   finish_function_body (body);
16453
16454   return ctor_initializer_p;
16455 }
16456
16457 /* Parse an initializer.
16458
16459    initializer:
16460      = initializer-clause
16461      ( expression-list )
16462
16463    Returns an expression representing the initializer.  If no
16464    initializer is present, NULL_TREE is returned.
16465
16466    *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
16467    production is used, and TRUE otherwise.  *IS_DIRECT_INIT is
16468    set to TRUE if there is no initializer present.  If there is an
16469    initializer, and it is not a constant-expression, *NON_CONSTANT_P
16470    is set to true; otherwise it is set to false.  */
16471
16472 static tree
16473 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
16474                        bool* non_constant_p)
16475 {
16476   cp_token *token;
16477   tree init;
16478
16479   /* Peek at the next token.  */
16480   token = cp_lexer_peek_token (parser->lexer);
16481
16482   /* Let our caller know whether or not this initializer was
16483      parenthesized.  */
16484   *is_direct_init = (token->type != CPP_EQ);
16485   /* Assume that the initializer is constant.  */
16486   *non_constant_p = false;
16487
16488   if (token->type == CPP_EQ)
16489     {
16490       /* Consume the `='.  */
16491       cp_lexer_consume_token (parser->lexer);
16492       /* Parse the initializer-clause.  */
16493       init = cp_parser_initializer_clause (parser, non_constant_p);
16494     }
16495   else if (token->type == CPP_OPEN_PAREN)
16496     {
16497       VEC(tree,gc) *vec;
16498       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
16499                                                      /*cast_p=*/false,
16500                                                      /*allow_expansion_p=*/true,
16501                                                      non_constant_p);
16502       if (vec == NULL)
16503         return error_mark_node;
16504       init = build_tree_list_vec (vec);
16505       release_tree_vector (vec);
16506     }
16507   else if (token->type == CPP_OPEN_BRACE)
16508     {
16509       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
16510       init = cp_parser_braced_list (parser, non_constant_p);
16511       CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
16512     }
16513   else
16514     {
16515       /* Anything else is an error.  */
16516       cp_parser_error (parser, "expected initializer");
16517       init = error_mark_node;
16518     }
16519
16520   return init;
16521 }
16522
16523 /* Parse an initializer-clause.
16524
16525    initializer-clause:
16526      assignment-expression
16527      braced-init-list
16528
16529    Returns an expression representing the initializer.
16530
16531    If the `assignment-expression' production is used the value
16532    returned is simply a representation for the expression.
16533
16534    Otherwise, calls cp_parser_braced_list.  */
16535
16536 static tree
16537 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
16538 {
16539   tree initializer;
16540
16541   /* Assume the expression is constant.  */
16542   *non_constant_p = false;
16543
16544   /* If it is not a `{', then we are looking at an
16545      assignment-expression.  */
16546   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
16547     {
16548       initializer
16549         = cp_parser_constant_expression (parser,
16550                                         /*allow_non_constant_p=*/true,
16551                                         non_constant_p);
16552     }
16553   else
16554     initializer = cp_parser_braced_list (parser, non_constant_p);
16555
16556   return initializer;
16557 }
16558
16559 /* Parse a brace-enclosed initializer list.
16560
16561    braced-init-list:
16562      { initializer-list , [opt] }
16563      { }
16564
16565    Returns a CONSTRUCTOR.  The CONSTRUCTOR_ELTS will be
16566    the elements of the initializer-list (or NULL, if the last
16567    production is used).  The TREE_TYPE for the CONSTRUCTOR will be
16568    NULL_TREE.  There is no way to detect whether or not the optional
16569    trailing `,' was provided.  NON_CONSTANT_P is as for
16570    cp_parser_initializer.  */     
16571
16572 static tree
16573 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
16574 {
16575   tree initializer;
16576
16577   /* Consume the `{' token.  */
16578   cp_lexer_consume_token (parser->lexer);
16579   /* Create a CONSTRUCTOR to represent the braced-initializer.  */
16580   initializer = make_node (CONSTRUCTOR);
16581   /* If it's not a `}', then there is a non-trivial initializer.  */
16582   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
16583     {
16584       /* Parse the initializer list.  */
16585       CONSTRUCTOR_ELTS (initializer)
16586         = cp_parser_initializer_list (parser, non_constant_p);
16587       /* A trailing `,' token is allowed.  */
16588       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
16589         cp_lexer_consume_token (parser->lexer);
16590     }
16591   /* Now, there should be a trailing `}'.  */
16592   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16593   TREE_TYPE (initializer) = init_list_type_node;
16594   return initializer;
16595 }
16596
16597 /* Parse an initializer-list.
16598
16599    initializer-list:
16600      initializer-clause ... [opt]
16601      initializer-list , initializer-clause ... [opt]
16602
16603    GNU Extension:
16604
16605    initializer-list:
16606      identifier : initializer-clause
16607      initializer-list, identifier : initializer-clause
16608
16609    Returns a VEC of constructor_elt.  The VALUE of each elt is an expression
16610    for the initializer.  If the INDEX of the elt is non-NULL, it is the
16611    IDENTIFIER_NODE naming the field to initialize.  NON_CONSTANT_P is
16612    as for cp_parser_initializer.  */
16613
16614 static VEC(constructor_elt,gc) *
16615 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
16616 {
16617   VEC(constructor_elt,gc) *v = NULL;
16618
16619   /* Assume all of the expressions are constant.  */
16620   *non_constant_p = false;
16621
16622   /* Parse the rest of the list.  */
16623   while (true)
16624     {
16625       cp_token *token;
16626       tree identifier;
16627       tree initializer;
16628       bool clause_non_constant_p;
16629
16630       /* If the next token is an identifier and the following one is a
16631          colon, we are looking at the GNU designated-initializer
16632          syntax.  */
16633       if (cp_parser_allow_gnu_extensions_p (parser)
16634           && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
16635           && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
16636         {
16637           /* Warn the user that they are using an extension.  */
16638           pedwarn (input_location, OPT_pedantic, 
16639                    "ISO C++ does not allow designated initializers");
16640           /* Consume the identifier.  */
16641           identifier = cp_lexer_consume_token (parser->lexer)->u.value;
16642           /* Consume the `:'.  */
16643           cp_lexer_consume_token (parser->lexer);
16644         }
16645       else
16646         identifier = NULL_TREE;
16647
16648       /* Parse the initializer.  */
16649       initializer = cp_parser_initializer_clause (parser,
16650                                                   &clause_non_constant_p);
16651       /* If any clause is non-constant, so is the entire initializer.  */
16652       if (clause_non_constant_p)
16653         *non_constant_p = true;
16654
16655       /* If we have an ellipsis, this is an initializer pack
16656          expansion.  */
16657       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16658         {
16659           /* Consume the `...'.  */
16660           cp_lexer_consume_token (parser->lexer);
16661
16662           /* Turn the initializer into an initializer expansion.  */
16663           initializer = make_pack_expansion (initializer);
16664         }
16665
16666       /* Add it to the vector.  */
16667       CONSTRUCTOR_APPEND_ELT(v, identifier, initializer);
16668
16669       /* If the next token is not a comma, we have reached the end of
16670          the list.  */
16671       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
16672         break;
16673
16674       /* Peek at the next token.  */
16675       token = cp_lexer_peek_nth_token (parser->lexer, 2);
16676       /* If the next token is a `}', then we're still done.  An
16677          initializer-clause can have a trailing `,' after the
16678          initializer-list and before the closing `}'.  */
16679       if (token->type == CPP_CLOSE_BRACE)
16680         break;
16681
16682       /* Consume the `,' token.  */
16683       cp_lexer_consume_token (parser->lexer);
16684     }
16685
16686   return v;
16687 }
16688
16689 /* Classes [gram.class] */
16690
16691 /* Parse a class-name.
16692
16693    class-name:
16694      identifier
16695      template-id
16696
16697    TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
16698    to indicate that names looked up in dependent types should be
16699    assumed to be types.  TEMPLATE_KEYWORD_P is true iff the `template'
16700    keyword has been used to indicate that the name that appears next
16701    is a template.  TAG_TYPE indicates the explicit tag given before
16702    the type name, if any.  If CHECK_DEPENDENCY_P is FALSE, names are
16703    looked up in dependent scopes.  If CLASS_HEAD_P is TRUE, this class
16704    is the class being defined in a class-head.
16705
16706    Returns the TYPE_DECL representing the class.  */
16707
16708 static tree
16709 cp_parser_class_name (cp_parser *parser,
16710                       bool typename_keyword_p,
16711                       bool template_keyword_p,
16712                       enum tag_types tag_type,
16713                       bool check_dependency_p,
16714                       bool class_head_p,
16715                       bool is_declaration)
16716 {
16717   tree decl;
16718   tree scope;
16719   bool typename_p;
16720   cp_token *token;
16721   tree identifier = NULL_TREE;
16722
16723   /* All class-names start with an identifier.  */
16724   token = cp_lexer_peek_token (parser->lexer);
16725   if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
16726     {
16727       cp_parser_error (parser, "expected class-name");
16728       return error_mark_node;
16729     }
16730
16731   /* PARSER->SCOPE can be cleared when parsing the template-arguments
16732      to a template-id, so we save it here.  */
16733   scope = parser->scope;
16734   if (scope == error_mark_node)
16735     return error_mark_node;
16736
16737   /* Any name names a type if we're following the `typename' keyword
16738      in a qualified name where the enclosing scope is type-dependent.  */
16739   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
16740                 && dependent_type_p (scope));
16741   /* Handle the common case (an identifier, but not a template-id)
16742      efficiently.  */
16743   if (token->type == CPP_NAME
16744       && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
16745     {
16746       cp_token *identifier_token;
16747       bool ambiguous_p;
16748
16749       /* Look for the identifier.  */
16750       identifier_token = cp_lexer_peek_token (parser->lexer);
16751       ambiguous_p = identifier_token->ambiguous_p;
16752       identifier = cp_parser_identifier (parser);
16753       /* If the next token isn't an identifier, we are certainly not
16754          looking at a class-name.  */
16755       if (identifier == error_mark_node)
16756         decl = error_mark_node;
16757       /* If we know this is a type-name, there's no need to look it
16758          up.  */
16759       else if (typename_p)
16760         decl = identifier;
16761       else
16762         {
16763           tree ambiguous_decls;
16764           /* If we already know that this lookup is ambiguous, then
16765              we've already issued an error message; there's no reason
16766              to check again.  */
16767           if (ambiguous_p)
16768             {
16769               cp_parser_simulate_error (parser);
16770               return error_mark_node;
16771             }
16772           /* If the next token is a `::', then the name must be a type
16773              name.
16774
16775              [basic.lookup.qual]
16776
16777              During the lookup for a name preceding the :: scope
16778              resolution operator, object, function, and enumerator
16779              names are ignored.  */
16780           if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16781             tag_type = typename_type;
16782           /* Look up the name.  */
16783           decl = cp_parser_lookup_name (parser, identifier,
16784                                         tag_type,
16785                                         /*is_template=*/false,
16786                                         /*is_namespace=*/false,
16787                                         check_dependency_p,
16788                                         &ambiguous_decls,
16789                                         identifier_token->location);
16790           if (ambiguous_decls)
16791             {
16792               if (cp_parser_parsing_tentatively (parser))
16793                 cp_parser_simulate_error (parser);
16794               return error_mark_node;
16795             }
16796         }
16797     }
16798   else
16799     {
16800       /* Try a template-id.  */
16801       decl = cp_parser_template_id (parser, template_keyword_p,
16802                                     check_dependency_p,
16803                                     is_declaration);
16804       if (decl == error_mark_node)
16805         return error_mark_node;
16806     }
16807
16808   decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
16809
16810   /* If this is a typename, create a TYPENAME_TYPE.  */
16811   if (typename_p && decl != error_mark_node)
16812     {
16813       decl = make_typename_type (scope, decl, typename_type,
16814                                  /*complain=*/tf_error);
16815       if (decl != error_mark_node)
16816         decl = TYPE_NAME (decl);
16817     }
16818
16819   /* Check to see that it is really the name of a class.  */
16820   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
16821       && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
16822       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16823     /* Situations like this:
16824
16825          template <typename T> struct A {
16826            typename T::template X<int>::I i;
16827          };
16828
16829        are problematic.  Is `T::template X<int>' a class-name?  The
16830        standard does not seem to be definitive, but there is no other
16831        valid interpretation of the following `::'.  Therefore, those
16832        names are considered class-names.  */
16833     {
16834       decl = make_typename_type (scope, decl, tag_type, tf_error);
16835       if (decl != error_mark_node)
16836         decl = TYPE_NAME (decl);
16837     }
16838   else if (TREE_CODE (decl) != TYPE_DECL
16839            || TREE_TYPE (decl) == error_mark_node
16840            || !MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
16841            /* In Objective-C 2.0, a classname followed by '.' starts a
16842               dot-syntax expression, and it's not a type-name.  */
16843            || (c_dialect_objc ()
16844                && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT 
16845                && objc_is_class_name (decl)))
16846     decl = error_mark_node;
16847
16848   if (decl == error_mark_node)
16849     cp_parser_error (parser, "expected class-name");
16850   else if (identifier && !parser->scope)
16851     maybe_note_name_used_in_class (identifier, decl);
16852
16853   return decl;
16854 }
16855
16856 /* Parse a class-specifier.
16857
16858    class-specifier:
16859      class-head { member-specification [opt] }
16860
16861    Returns the TREE_TYPE representing the class.  */
16862
16863 static tree
16864 cp_parser_class_specifier_1 (cp_parser* parser)
16865 {
16866   tree type;
16867   tree attributes = NULL_TREE;
16868   bool nested_name_specifier_p;
16869   unsigned saved_num_template_parameter_lists;
16870   bool saved_in_function_body;
16871   bool saved_in_unbraced_linkage_specification_p;
16872   tree old_scope = NULL_TREE;
16873   tree scope = NULL_TREE;
16874   tree bases;
16875   cp_token *closing_brace;
16876
16877   push_deferring_access_checks (dk_no_deferred);
16878
16879   /* Parse the class-head.  */
16880   type = cp_parser_class_head (parser,
16881                                &nested_name_specifier_p,
16882                                &attributes,
16883                                &bases);
16884   /* If the class-head was a semantic disaster, skip the entire body
16885      of the class.  */
16886   if (!type)
16887     {
16888       cp_parser_skip_to_end_of_block_or_statement (parser);
16889       pop_deferring_access_checks ();
16890       return error_mark_node;
16891     }
16892
16893   /* Look for the `{'.  */
16894   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
16895     {
16896       pop_deferring_access_checks ();
16897       return error_mark_node;
16898     }
16899
16900   /* Process the base classes. If they're invalid, skip the 
16901      entire class body.  */
16902   if (!xref_basetypes (type, bases))
16903     {
16904       /* Consuming the closing brace yields better error messages
16905          later on.  */
16906       if (cp_parser_skip_to_closing_brace (parser))
16907         cp_lexer_consume_token (parser->lexer);
16908       pop_deferring_access_checks ();
16909       return error_mark_node;
16910     }
16911
16912   /* Issue an error message if type-definitions are forbidden here.  */
16913   cp_parser_check_type_definition (parser);
16914   /* Remember that we are defining one more class.  */
16915   ++parser->num_classes_being_defined;
16916   /* Inside the class, surrounding template-parameter-lists do not
16917      apply.  */
16918   saved_num_template_parameter_lists
16919     = parser->num_template_parameter_lists;
16920   parser->num_template_parameter_lists = 0;
16921   /* We are not in a function body.  */
16922   saved_in_function_body = parser->in_function_body;
16923   parser->in_function_body = false;
16924   /* We are not immediately inside an extern "lang" block.  */
16925   saved_in_unbraced_linkage_specification_p
16926     = parser->in_unbraced_linkage_specification_p;
16927   parser->in_unbraced_linkage_specification_p = false;
16928
16929   /* Start the class.  */
16930   if (nested_name_specifier_p)
16931     {
16932       scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
16933       old_scope = push_inner_scope (scope);
16934     }
16935   type = begin_class_definition (type, attributes);
16936
16937   if (type == error_mark_node)
16938     /* If the type is erroneous, skip the entire body of the class.  */
16939     cp_parser_skip_to_closing_brace (parser);
16940   else
16941     /* Parse the member-specification.  */
16942     cp_parser_member_specification_opt (parser);
16943
16944   /* Look for the trailing `}'.  */
16945   closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16946   /* Look for trailing attributes to apply to this class.  */
16947   if (cp_parser_allow_gnu_extensions_p (parser))
16948     attributes = cp_parser_attributes_opt (parser);
16949   if (type != error_mark_node)
16950     type = finish_struct (type, attributes);
16951   if (nested_name_specifier_p)
16952     pop_inner_scope (old_scope, scope);
16953
16954   /* We've finished a type definition.  Check for the common syntax
16955      error of forgetting a semicolon after the definition.  We need to
16956      be careful, as we can't just check for not-a-semicolon and be done
16957      with it; the user might have typed:
16958
16959      class X { } c = ...;
16960      class X { } *p = ...;
16961
16962      and so forth.  Instead, enumerate all the possible tokens that
16963      might follow this production; if we don't see one of them, then
16964      complain and silently insert the semicolon.  */
16965   {
16966     cp_token *token = cp_lexer_peek_token (parser->lexer);
16967     bool want_semicolon = true;
16968
16969     switch (token->type)
16970       {
16971       case CPP_NAME:
16972       case CPP_SEMICOLON:
16973       case CPP_MULT:
16974       case CPP_AND:
16975       case CPP_OPEN_PAREN:
16976       case CPP_CLOSE_PAREN:
16977       case CPP_COMMA:
16978         want_semicolon = false;
16979         break;
16980
16981         /* While it's legal for type qualifiers and storage class
16982            specifiers to follow type definitions in the grammar, only
16983            compiler testsuites contain code like that.  Assume that if
16984            we see such code, then what we're really seeing is a case
16985            like:
16986
16987            class X { }
16988            const <type> var = ...;
16989
16990            or
16991
16992            class Y { }
16993            static <type> func (...) ...
16994
16995            i.e. the qualifier or specifier applies to the next
16996            declaration.  To do so, however, we need to look ahead one
16997            more token to see if *that* token is a type specifier.
16998
16999            This code could be improved to handle:
17000
17001            class Z { }
17002            static const <type> var = ...;  */
17003       case CPP_KEYWORD:
17004         if (keyword_is_decl_specifier (token->keyword))
17005           {
17006             cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
17007
17008             /* Handling user-defined types here would be nice, but very
17009                tricky.  */
17010             want_semicolon
17011               = (lookahead->type == CPP_KEYWORD
17012                  && keyword_begins_type_specifier (lookahead->keyword));
17013           }
17014         break;
17015       default:
17016         break;
17017       }
17018
17019     /* If we don't have a type, then something is very wrong and we
17020        shouldn't try to do anything clever.  Likewise for not seeing the
17021        closing brace.  */
17022     if (closing_brace && TYPE_P (type) && want_semicolon)
17023       {
17024         cp_token_position prev
17025           = cp_lexer_previous_token_position (parser->lexer);
17026         cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
17027         location_t loc = prev_token->location;
17028
17029         if (CLASSTYPE_DECLARED_CLASS (type))
17030           error_at (loc, "expected %<;%> after class definition");
17031         else if (TREE_CODE (type) == RECORD_TYPE)
17032           error_at (loc, "expected %<;%> after struct definition");
17033         else if (TREE_CODE (type) == UNION_TYPE)
17034           error_at (loc, "expected %<;%> after union definition");
17035         else
17036           gcc_unreachable ();
17037
17038         /* Unget one token and smash it to look as though we encountered
17039            a semicolon in the input stream.  */
17040         cp_lexer_set_token_position (parser->lexer, prev);
17041         token = cp_lexer_peek_token (parser->lexer);
17042         token->type = CPP_SEMICOLON;
17043         token->keyword = RID_MAX;
17044       }
17045   }
17046
17047   /* If this class is not itself within the scope of another class,
17048      then we need to parse the bodies of all of the queued function
17049      definitions.  Note that the queued functions defined in a class
17050      are not always processed immediately following the
17051      class-specifier for that class.  Consider:
17052
17053        struct A {
17054          struct B { void f() { sizeof (A); } };
17055        };
17056
17057      If `f' were processed before the processing of `A' were
17058      completed, there would be no way to compute the size of `A'.
17059      Note that the nesting we are interested in here is lexical --
17060      not the semantic nesting given by TYPE_CONTEXT.  In particular,
17061      for:
17062
17063        struct A { struct B; };
17064        struct A::B { void f() { } };
17065
17066      there is no need to delay the parsing of `A::B::f'.  */
17067   if (--parser->num_classes_being_defined == 0)
17068     {
17069       tree fn;
17070       tree class_type = NULL_TREE;
17071       tree pushed_scope = NULL_TREE;
17072       unsigned ix;
17073       cp_default_arg_entry *e;
17074
17075       /* In a first pass, parse default arguments to the functions.
17076          Then, in a second pass, parse the bodies of the functions.
17077          This two-phased approach handles cases like:
17078
17079             struct S {
17080               void f() { g(); }
17081               void g(int i = 3);
17082             };
17083
17084          */
17085       FOR_EACH_VEC_ELT (cp_default_arg_entry, unparsed_funs_with_default_args,
17086                         ix, e)
17087         {
17088           fn = e->decl;
17089           /* If there are default arguments that have not yet been processed,
17090              take care of them now.  */
17091           if (class_type != e->class_type)
17092             {
17093               if (pushed_scope)
17094                 pop_scope (pushed_scope);
17095               class_type = e->class_type;
17096               pushed_scope = push_scope (class_type);
17097             }
17098           /* Make sure that any template parameters are in scope.  */
17099           maybe_begin_member_template_processing (fn);
17100           /* Parse the default argument expressions.  */
17101           cp_parser_late_parsing_default_args (parser, fn);
17102           /* Remove any template parameters from the symbol table.  */
17103           maybe_end_member_template_processing ();
17104         }
17105       if (pushed_scope)
17106         pop_scope (pushed_scope);
17107       VEC_truncate (cp_default_arg_entry, unparsed_funs_with_default_args, 0);
17108       /* Now parse the body of the functions.  */
17109       FOR_EACH_VEC_ELT (tree, unparsed_funs_with_definitions, ix, fn)
17110         cp_parser_late_parsing_for_member (parser, fn);
17111       VEC_truncate (tree, unparsed_funs_with_definitions, 0);
17112     }
17113
17114   /* Put back any saved access checks.  */
17115   pop_deferring_access_checks ();
17116
17117   /* Restore saved state.  */
17118   parser->in_function_body = saved_in_function_body;
17119   parser->num_template_parameter_lists
17120     = saved_num_template_parameter_lists;
17121   parser->in_unbraced_linkage_specification_p
17122     = saved_in_unbraced_linkage_specification_p;
17123
17124   return type;
17125 }
17126
17127 static tree
17128 cp_parser_class_specifier (cp_parser* parser)
17129 {
17130   tree ret;
17131   timevar_push (TV_PARSE_STRUCT);
17132   ret = cp_parser_class_specifier_1 (parser);
17133   timevar_pop (TV_PARSE_STRUCT);
17134   return ret;
17135 }
17136
17137 /* Parse a class-head.
17138
17139    class-head:
17140      class-key identifier [opt] base-clause [opt]
17141      class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
17142      class-key nested-name-specifier [opt] template-id
17143        base-clause [opt]
17144
17145    class-virt-specifier:
17146      final
17147
17148    GNU Extensions:
17149      class-key attributes identifier [opt] base-clause [opt]
17150      class-key attributes nested-name-specifier identifier base-clause [opt]
17151      class-key attributes nested-name-specifier [opt] template-id
17152        base-clause [opt]
17153
17154    Upon return BASES is initialized to the list of base classes (or
17155    NULL, if there are none) in the same form returned by
17156    cp_parser_base_clause.
17157
17158    Returns the TYPE of the indicated class.  Sets
17159    *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
17160    involving a nested-name-specifier was used, and FALSE otherwise.
17161
17162    Returns error_mark_node if this is not a class-head.
17163
17164    Returns NULL_TREE if the class-head is syntactically valid, but
17165    semantically invalid in a way that means we should skip the entire
17166    body of the class.  */
17167
17168 static tree
17169 cp_parser_class_head (cp_parser* parser,
17170                       bool* nested_name_specifier_p,
17171                       tree *attributes_p,
17172                       tree *bases)
17173 {
17174   tree nested_name_specifier;
17175   enum tag_types class_key;
17176   tree id = NULL_TREE;
17177   tree type = NULL_TREE;
17178   tree attributes;
17179   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
17180   bool template_id_p = false;
17181   bool qualified_p = false;
17182   bool invalid_nested_name_p = false;
17183   bool invalid_explicit_specialization_p = false;
17184   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17185   tree pushed_scope = NULL_TREE;
17186   unsigned num_templates;
17187   cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
17188   /* Assume no nested-name-specifier will be present.  */
17189   *nested_name_specifier_p = false;
17190   /* Assume no template parameter lists will be used in defining the
17191      type.  */
17192   num_templates = 0;
17193   parser->colon_corrects_to_scope_p = false;
17194
17195   *bases = NULL_TREE;
17196
17197   /* Look for the class-key.  */
17198   class_key = cp_parser_class_key (parser);
17199   if (class_key == none_type)
17200     return error_mark_node;
17201
17202   /* Parse the attributes.  */
17203   attributes = cp_parser_attributes_opt (parser);
17204
17205   /* If the next token is `::', that is invalid -- but sometimes
17206      people do try to write:
17207
17208        struct ::S {};
17209
17210      Handle this gracefully by accepting the extra qualifier, and then
17211      issuing an error about it later if this really is a
17212      class-head.  If it turns out just to be an elaborated type
17213      specifier, remain silent.  */
17214   if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
17215     qualified_p = true;
17216
17217   push_deferring_access_checks (dk_no_check);
17218
17219   /* Determine the name of the class.  Begin by looking for an
17220      optional nested-name-specifier.  */
17221   nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
17222   nested_name_specifier
17223     = cp_parser_nested_name_specifier_opt (parser,
17224                                            /*typename_keyword_p=*/false,
17225                                            /*check_dependency_p=*/false,
17226                                            /*type_p=*/false,
17227                                            /*is_declaration=*/false);
17228   /* If there was a nested-name-specifier, then there *must* be an
17229      identifier.  */
17230   if (nested_name_specifier)
17231     {
17232       type_start_token = cp_lexer_peek_token (parser->lexer);
17233       /* Although the grammar says `identifier', it really means
17234          `class-name' or `template-name'.  You are only allowed to
17235          define a class that has already been declared with this
17236          syntax.
17237
17238          The proposed resolution for Core Issue 180 says that wherever
17239          you see `class T::X' you should treat `X' as a type-name.
17240
17241          It is OK to define an inaccessible class; for example:
17242
17243            class A { class B; };
17244            class A::B {};
17245
17246          We do not know if we will see a class-name, or a
17247          template-name.  We look for a class-name first, in case the
17248          class-name is a template-id; if we looked for the
17249          template-name first we would stop after the template-name.  */
17250       cp_parser_parse_tentatively (parser);
17251       type = cp_parser_class_name (parser,
17252                                    /*typename_keyword_p=*/false,
17253                                    /*template_keyword_p=*/false,
17254                                    class_type,
17255                                    /*check_dependency_p=*/false,
17256                                    /*class_head_p=*/true,
17257                                    /*is_declaration=*/false);
17258       /* If that didn't work, ignore the nested-name-specifier.  */
17259       if (!cp_parser_parse_definitely (parser))
17260         {
17261           invalid_nested_name_p = true;
17262           type_start_token = cp_lexer_peek_token (parser->lexer);
17263           id = cp_parser_identifier (parser);
17264           if (id == error_mark_node)
17265             id = NULL_TREE;
17266         }
17267       /* If we could not find a corresponding TYPE, treat this
17268          declaration like an unqualified declaration.  */
17269       if (type == error_mark_node)
17270         nested_name_specifier = NULL_TREE;
17271       /* Otherwise, count the number of templates used in TYPE and its
17272          containing scopes.  */
17273       else
17274         {
17275           tree scope;
17276
17277           for (scope = TREE_TYPE (type);
17278                scope && TREE_CODE (scope) != NAMESPACE_DECL;
17279                scope = (TYPE_P (scope)
17280                         ? TYPE_CONTEXT (scope)
17281                         : DECL_CONTEXT (scope)))
17282             if (TYPE_P (scope)
17283                 && CLASS_TYPE_P (scope)
17284                 && CLASSTYPE_TEMPLATE_INFO (scope)
17285                 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
17286                 && !CLASSTYPE_TEMPLATE_SPECIALIZATION (scope))
17287               ++num_templates;
17288         }
17289     }
17290   /* Otherwise, the identifier is optional.  */
17291   else
17292     {
17293       /* We don't know whether what comes next is a template-id,
17294          an identifier, or nothing at all.  */
17295       cp_parser_parse_tentatively (parser);
17296       /* Check for a template-id.  */
17297       type_start_token = cp_lexer_peek_token (parser->lexer);
17298       id = cp_parser_template_id (parser,
17299                                   /*template_keyword_p=*/false,
17300                                   /*check_dependency_p=*/true,
17301                                   /*is_declaration=*/true);
17302       /* If that didn't work, it could still be an identifier.  */
17303       if (!cp_parser_parse_definitely (parser))
17304         {
17305           if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
17306             {
17307               type_start_token = cp_lexer_peek_token (parser->lexer);
17308               id = cp_parser_identifier (parser);
17309             }
17310           else
17311             id = NULL_TREE;
17312         }
17313       else
17314         {
17315           template_id_p = true;
17316           ++num_templates;
17317         }
17318     }
17319
17320   pop_deferring_access_checks ();
17321
17322   if (id)
17323     {
17324       cp_parser_check_for_invalid_template_id (parser, id,
17325                                                type_start_token->location);
17326       virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
17327     }
17328
17329   /* If it's not a `:' or a `{' then we can't really be looking at a
17330      class-head, since a class-head only appears as part of a
17331      class-specifier.  We have to detect this situation before calling
17332      xref_tag, since that has irreversible side-effects.  */
17333   if (!cp_parser_next_token_starts_class_definition_p (parser))
17334     {
17335       cp_parser_error (parser, "expected %<{%> or %<:%>");
17336       type = error_mark_node;
17337       goto out;
17338     }
17339
17340   /* At this point, we're going ahead with the class-specifier, even
17341      if some other problem occurs.  */
17342   cp_parser_commit_to_tentative_parse (parser);
17343   if (virt_specifiers & VIRT_SPEC_OVERRIDE)
17344     {
17345       cp_parser_error (parser,
17346                        "cannot specify %<override%> for a class");
17347       type = error_mark_node;
17348       goto out;
17349     }
17350   /* Issue the error about the overly-qualified name now.  */
17351   if (qualified_p)
17352     {
17353       cp_parser_error (parser,
17354                        "global qualification of class name is invalid");
17355       type = error_mark_node;
17356       goto out;
17357     }
17358   else if (invalid_nested_name_p)
17359     {
17360       cp_parser_error (parser,
17361                        "qualified name does not name a class");
17362       type = error_mark_node;
17363       goto out;
17364     }
17365   else if (nested_name_specifier)
17366     {
17367       tree scope;
17368
17369       /* Reject typedef-names in class heads.  */
17370       if (!DECL_IMPLICIT_TYPEDEF_P (type))
17371         {
17372           error_at (type_start_token->location,
17373                     "invalid class name in declaration of %qD",
17374                     type);
17375           type = NULL_TREE;
17376           goto done;
17377         }
17378
17379       /* Figure out in what scope the declaration is being placed.  */
17380       scope = current_scope ();
17381       /* If that scope does not contain the scope in which the
17382          class was originally declared, the program is invalid.  */
17383       if (scope && !is_ancestor (scope, nested_name_specifier))
17384         {
17385           if (at_namespace_scope_p ())
17386             error_at (type_start_token->location,
17387                       "declaration of %qD in namespace %qD which does not "
17388                       "enclose %qD",
17389                       type, scope, nested_name_specifier);
17390           else
17391             error_at (type_start_token->location,
17392                       "declaration of %qD in %qD which does not enclose %qD",
17393                       type, scope, nested_name_specifier);
17394           type = NULL_TREE;
17395           goto done;
17396         }
17397       /* [dcl.meaning]
17398
17399          A declarator-id shall not be qualified except for the
17400          definition of a ... nested class outside of its class
17401          ... [or] the definition or explicit instantiation of a
17402          class member of a namespace outside of its namespace.  */
17403       if (scope == nested_name_specifier)
17404         {
17405           permerror (nested_name_specifier_token_start->location,
17406                      "extra qualification not allowed");
17407           nested_name_specifier = NULL_TREE;
17408           num_templates = 0;
17409         }
17410     }
17411   /* An explicit-specialization must be preceded by "template <>".  If
17412      it is not, try to recover gracefully.  */
17413   if (at_namespace_scope_p ()
17414       && parser->num_template_parameter_lists == 0
17415       && template_id_p)
17416     {
17417       error_at (type_start_token->location,
17418                 "an explicit specialization must be preceded by %<template <>%>");
17419       invalid_explicit_specialization_p = true;
17420       /* Take the same action that would have been taken by
17421          cp_parser_explicit_specialization.  */
17422       ++parser->num_template_parameter_lists;
17423       begin_specialization ();
17424     }
17425   /* There must be no "return" statements between this point and the
17426      end of this function; set "type "to the correct return value and
17427      use "goto done;" to return.  */
17428   /* Make sure that the right number of template parameters were
17429      present.  */
17430   if (!cp_parser_check_template_parameters (parser, num_templates,
17431                                             type_start_token->location,
17432                                             /*declarator=*/NULL))
17433     {
17434       /* If something went wrong, there is no point in even trying to
17435          process the class-definition.  */
17436       type = NULL_TREE;
17437       goto done;
17438     }
17439
17440   /* Look up the type.  */
17441   if (template_id_p)
17442     {
17443       if (TREE_CODE (id) == TEMPLATE_ID_EXPR
17444           && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
17445               || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
17446         {
17447           error_at (type_start_token->location,
17448                     "function template %qD redeclared as a class template", id);
17449           type = error_mark_node;
17450         }
17451       else
17452         {
17453           type = TREE_TYPE (id);
17454           type = maybe_process_partial_specialization (type);
17455         }
17456       if (nested_name_specifier)
17457         pushed_scope = push_scope (nested_name_specifier);
17458     }
17459   else if (nested_name_specifier)
17460     {
17461       tree class_type;
17462
17463       /* Given:
17464
17465             template <typename T> struct S { struct T };
17466             template <typename T> struct S<T>::T { };
17467
17468          we will get a TYPENAME_TYPE when processing the definition of
17469          `S::T'.  We need to resolve it to the actual type before we
17470          try to define it.  */
17471       if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
17472         {
17473           class_type = resolve_typename_type (TREE_TYPE (type),
17474                                               /*only_current_p=*/false);
17475           if (TREE_CODE (class_type) != TYPENAME_TYPE)
17476             type = TYPE_NAME (class_type);
17477           else
17478             {
17479               cp_parser_error (parser, "could not resolve typename type");
17480               type = error_mark_node;
17481             }
17482         }
17483
17484       if (maybe_process_partial_specialization (TREE_TYPE (type))
17485           == error_mark_node)
17486         {
17487           type = NULL_TREE;
17488           goto done;
17489         }
17490
17491       class_type = current_class_type;
17492       /* Enter the scope indicated by the nested-name-specifier.  */
17493       pushed_scope = push_scope (nested_name_specifier);
17494       /* Get the canonical version of this type.  */
17495       type = TYPE_MAIN_DECL (TREE_TYPE (type));
17496       if (PROCESSING_REAL_TEMPLATE_DECL_P ()
17497           && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
17498         {
17499           type = push_template_decl (type);
17500           if (type == error_mark_node)
17501             {
17502               type = NULL_TREE;
17503               goto done;
17504             }
17505         }
17506
17507       type = TREE_TYPE (type);
17508       *nested_name_specifier_p = true;
17509     }
17510   else      /* The name is not a nested name.  */
17511     {
17512       /* If the class was unnamed, create a dummy name.  */
17513       if (!id)
17514         id = make_anon_name ();
17515       type = xref_tag (class_key, id, /*tag_scope=*/ts_current,
17516                        parser->num_template_parameter_lists);
17517     }
17518
17519   /* Indicate whether this class was declared as a `class' or as a
17520      `struct'.  */
17521   if (TREE_CODE (type) == RECORD_TYPE)
17522     CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
17523   cp_parser_check_class_key (class_key, type);
17524
17525   /* If this type was already complete, and we see another definition,
17526      that's an error.  */
17527   if (type != error_mark_node && COMPLETE_TYPE_P (type))
17528     {
17529       error_at (type_start_token->location, "redefinition of %q#T",
17530                 type);
17531       error_at (type_start_token->location, "previous definition of %q+#T",
17532                 type);
17533       type = NULL_TREE;
17534       goto done;
17535     }
17536   else if (type == error_mark_node)
17537     type = NULL_TREE;
17538
17539   /* We will have entered the scope containing the class; the names of
17540      base classes should be looked up in that context.  For example:
17541
17542        struct A { struct B {}; struct C; };
17543        struct A::C : B {};
17544
17545      is valid.  */
17546
17547   /* Get the list of base-classes, if there is one.  */
17548   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
17549     *bases = cp_parser_base_clause (parser);
17550
17551  done:
17552   /* Leave the scope given by the nested-name-specifier.  We will
17553      enter the class scope itself while processing the members.  */
17554   if (pushed_scope)
17555     pop_scope (pushed_scope);
17556
17557   if (invalid_explicit_specialization_p)
17558     {
17559       end_specialization ();
17560       --parser->num_template_parameter_lists;
17561     }
17562
17563   if (type)
17564     DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
17565   *attributes_p = attributes;
17566   if (type && (virt_specifiers & VIRT_SPEC_FINAL))
17567     CLASSTYPE_FINAL (type) = 1;
17568  out:
17569   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
17570   return type;
17571 }
17572
17573 /* Parse a class-key.
17574
17575    class-key:
17576      class
17577      struct
17578      union
17579
17580    Returns the kind of class-key specified, or none_type to indicate
17581    error.  */
17582
17583 static enum tag_types
17584 cp_parser_class_key (cp_parser* parser)
17585 {
17586   cp_token *token;
17587   enum tag_types tag_type;
17588
17589   /* Look for the class-key.  */
17590   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
17591   if (!token)
17592     return none_type;
17593
17594   /* Check to see if the TOKEN is a class-key.  */
17595   tag_type = cp_parser_token_is_class_key (token);
17596   if (!tag_type)
17597     cp_parser_error (parser, "expected class-key");
17598   return tag_type;
17599 }
17600
17601 /* Parse an (optional) member-specification.
17602
17603    member-specification:
17604      member-declaration member-specification [opt]
17605      access-specifier : member-specification [opt]  */
17606
17607 static void
17608 cp_parser_member_specification_opt (cp_parser* parser)
17609 {
17610   while (true)
17611     {
17612       cp_token *token;
17613       enum rid keyword;
17614
17615       /* Peek at the next token.  */
17616       token = cp_lexer_peek_token (parser->lexer);
17617       /* If it's a `}', or EOF then we've seen all the members.  */
17618       if (token->type == CPP_CLOSE_BRACE
17619           || token->type == CPP_EOF
17620           || token->type == CPP_PRAGMA_EOL)
17621         break;
17622
17623       /* See if this token is a keyword.  */
17624       keyword = token->keyword;
17625       switch (keyword)
17626         {
17627         case RID_PUBLIC:
17628         case RID_PROTECTED:
17629         case RID_PRIVATE:
17630           /* Consume the access-specifier.  */
17631           cp_lexer_consume_token (parser->lexer);
17632           /* Remember which access-specifier is active.  */
17633           current_access_specifier = token->u.value;
17634           /* Look for the `:'.  */
17635           cp_parser_require (parser, CPP_COLON, RT_COLON);
17636           break;
17637
17638         default:
17639           /* Accept #pragmas at class scope.  */
17640           if (token->type == CPP_PRAGMA)
17641             {
17642               cp_parser_pragma (parser, pragma_external);
17643               break;
17644             }
17645
17646           /* Otherwise, the next construction must be a
17647              member-declaration.  */
17648           cp_parser_member_declaration (parser);
17649         }
17650     }
17651 }
17652
17653 /* Parse a member-declaration.
17654
17655    member-declaration:
17656      decl-specifier-seq [opt] member-declarator-list [opt] ;
17657      function-definition ; [opt]
17658      :: [opt] nested-name-specifier template [opt] unqualified-id ;
17659      using-declaration
17660      template-declaration
17661
17662    member-declarator-list:
17663      member-declarator
17664      member-declarator-list , member-declarator
17665
17666    member-declarator:
17667      declarator pure-specifier [opt]
17668      declarator constant-initializer [opt]
17669      identifier [opt] : constant-expression
17670
17671    GNU Extensions:
17672
17673    member-declaration:
17674      __extension__ member-declaration
17675
17676    member-declarator:
17677      declarator attributes [opt] pure-specifier [opt]
17678      declarator attributes [opt] constant-initializer [opt]
17679      identifier [opt] attributes [opt] : constant-expression  
17680
17681    C++0x Extensions:
17682
17683    member-declaration:
17684      static_assert-declaration  */
17685
17686 static void
17687 cp_parser_member_declaration (cp_parser* parser)
17688 {
17689   cp_decl_specifier_seq decl_specifiers;
17690   tree prefix_attributes;
17691   tree decl;
17692   int declares_class_or_enum;
17693   bool friend_p;
17694   cp_token *token = NULL;
17695   cp_token *decl_spec_token_start = NULL;
17696   cp_token *initializer_token_start = NULL;
17697   int saved_pedantic;
17698   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17699
17700   /* Check for the `__extension__' keyword.  */
17701   if (cp_parser_extension_opt (parser, &saved_pedantic))
17702     {
17703       /* Recurse.  */
17704       cp_parser_member_declaration (parser);
17705       /* Restore the old value of the PEDANTIC flag.  */
17706       pedantic = saved_pedantic;
17707
17708       return;
17709     }
17710
17711   /* Check for a template-declaration.  */
17712   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
17713     {
17714       /* An explicit specialization here is an error condition, and we
17715          expect the specialization handler to detect and report this.  */
17716       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
17717           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
17718         cp_parser_explicit_specialization (parser);
17719       else
17720         cp_parser_template_declaration (parser, /*member_p=*/true);
17721
17722       return;
17723     }
17724
17725   /* Check for a using-declaration.  */
17726   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
17727     {
17728       /* Parse the using-declaration.  */
17729       cp_parser_using_declaration (parser,
17730                                    /*access_declaration_p=*/false);
17731       return;
17732     }
17733
17734   /* Check for @defs.  */
17735   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
17736     {
17737       tree ivar, member;
17738       tree ivar_chains = cp_parser_objc_defs_expression (parser);
17739       ivar = ivar_chains;
17740       while (ivar)
17741         {
17742           member = ivar;
17743           ivar = TREE_CHAIN (member);
17744           TREE_CHAIN (member) = NULL_TREE;
17745           finish_member_declaration (member);
17746         }
17747       return;
17748     }
17749
17750   /* If the next token is `static_assert' we have a static assertion.  */
17751   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
17752     {
17753       cp_parser_static_assert (parser, /*member_p=*/true);
17754       return;
17755     }
17756
17757   parser->colon_corrects_to_scope_p = false;
17758
17759   if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
17760     goto out;
17761
17762   /* Parse the decl-specifier-seq.  */
17763   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
17764   cp_parser_decl_specifier_seq (parser,
17765                                 CP_PARSER_FLAGS_OPTIONAL,
17766                                 &decl_specifiers,
17767                                 &declares_class_or_enum);
17768   prefix_attributes = decl_specifiers.attributes;
17769   decl_specifiers.attributes = NULL_TREE;
17770   /* Check for an invalid type-name.  */
17771   if (!decl_specifiers.any_type_specifiers_p
17772       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
17773     goto out;
17774   /* If there is no declarator, then the decl-specifier-seq should
17775      specify a type.  */
17776   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
17777     {
17778       /* If there was no decl-specifier-seq, and the next token is a
17779          `;', then we have something like:
17780
17781            struct S { ; };
17782
17783          [class.mem]
17784
17785          Each member-declaration shall declare at least one member
17786          name of the class.  */
17787       if (!decl_specifiers.any_specifiers_p)
17788         {
17789           cp_token *token = cp_lexer_peek_token (parser->lexer);
17790           if (!in_system_header_at (token->location))
17791             pedwarn (token->location, OPT_pedantic, "extra %<;%>");
17792         }
17793       else
17794         {
17795           tree type;
17796
17797           /* See if this declaration is a friend.  */
17798           friend_p = cp_parser_friend_p (&decl_specifiers);
17799           /* If there were decl-specifiers, check to see if there was
17800              a class-declaration.  */
17801           type = check_tag_decl (&decl_specifiers);
17802           /* Nested classes have already been added to the class, but
17803              a `friend' needs to be explicitly registered.  */
17804           if (friend_p)
17805             {
17806               /* If the `friend' keyword was present, the friend must
17807                  be introduced with a class-key.  */
17808                if (!declares_class_or_enum && cxx_dialect < cxx0x)
17809                  pedwarn (decl_spec_token_start->location, OPT_pedantic,
17810                           "in C++03 a class-key must be used "
17811                           "when declaring a friend");
17812                /* In this case:
17813
17814                     template <typename T> struct A {
17815                       friend struct A<T>::B;
17816                     };
17817
17818                   A<T>::B will be represented by a TYPENAME_TYPE, and
17819                   therefore not recognized by check_tag_decl.  */
17820                if (!type)
17821                  {
17822                    type = decl_specifiers.type;
17823                    if (type && TREE_CODE (type) == TYPE_DECL)
17824                      type = TREE_TYPE (type);
17825                  }
17826                if (!type || !TYPE_P (type))
17827                  error_at (decl_spec_token_start->location,
17828                            "friend declaration does not name a class or "
17829                            "function");
17830                else
17831                  make_friend_class (current_class_type, type,
17832                                     /*complain=*/true);
17833             }
17834           /* If there is no TYPE, an error message will already have
17835              been issued.  */
17836           else if (!type || type == error_mark_node)
17837             ;
17838           /* An anonymous aggregate has to be handled specially; such
17839              a declaration really declares a data member (with a
17840              particular type), as opposed to a nested class.  */
17841           else if (ANON_AGGR_TYPE_P (type))
17842             {
17843               /* Remove constructors and such from TYPE, now that we
17844                  know it is an anonymous aggregate.  */
17845               fixup_anonymous_aggr (type);
17846               /* And make the corresponding data member.  */
17847               decl = build_decl (decl_spec_token_start->location,
17848                                  FIELD_DECL, NULL_TREE, type);
17849               /* Add it to the class.  */
17850               finish_member_declaration (decl);
17851             }
17852           else
17853             cp_parser_check_access_in_redeclaration
17854                                               (TYPE_NAME (type),
17855                                                decl_spec_token_start->location);
17856         }
17857     }
17858   else
17859     {
17860       bool assume_semicolon = false;
17861
17862       /* See if these declarations will be friends.  */
17863       friend_p = cp_parser_friend_p (&decl_specifiers);
17864
17865       /* Keep going until we hit the `;' at the end of the
17866          declaration.  */
17867       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
17868         {
17869           tree attributes = NULL_TREE;
17870           tree first_attribute;
17871
17872           /* Peek at the next token.  */
17873           token = cp_lexer_peek_token (parser->lexer);
17874
17875           /* Check for a bitfield declaration.  */
17876           if (token->type == CPP_COLON
17877               || (token->type == CPP_NAME
17878                   && cp_lexer_peek_nth_token (parser->lexer, 2)->type
17879                   == CPP_COLON))
17880             {
17881               tree identifier;
17882               tree width;
17883
17884               /* Get the name of the bitfield.  Note that we cannot just
17885                  check TOKEN here because it may have been invalidated by
17886                  the call to cp_lexer_peek_nth_token above.  */
17887               if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
17888                 identifier = cp_parser_identifier (parser);
17889               else
17890                 identifier = NULL_TREE;
17891
17892               /* Consume the `:' token.  */
17893               cp_lexer_consume_token (parser->lexer);
17894               /* Get the width of the bitfield.  */
17895               width
17896                 = cp_parser_constant_expression (parser,
17897                                                  /*allow_non_constant=*/false,
17898                                                  NULL);
17899
17900               /* Look for attributes that apply to the bitfield.  */
17901               attributes = cp_parser_attributes_opt (parser);
17902               /* Remember which attributes are prefix attributes and
17903                  which are not.  */
17904               first_attribute = attributes;
17905               /* Combine the attributes.  */
17906               attributes = chainon (prefix_attributes, attributes);
17907
17908               /* Create the bitfield declaration.  */
17909               decl = grokbitfield (identifier
17910                                    ? make_id_declarator (NULL_TREE,
17911                                                          identifier,
17912                                                          sfk_none)
17913                                    : NULL,
17914                                    &decl_specifiers,
17915                                    width,
17916                                    attributes);
17917             }
17918           else
17919             {
17920               cp_declarator *declarator;
17921               tree initializer;
17922               tree asm_specification;
17923               int ctor_dtor_or_conv_p;
17924
17925               /* Parse the declarator.  */
17926               declarator
17927                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
17928                                         &ctor_dtor_or_conv_p,
17929                                         /*parenthesized_p=*/NULL,
17930                                         /*member_p=*/true);
17931
17932               /* If something went wrong parsing the declarator, make sure
17933                  that we at least consume some tokens.  */
17934               if (declarator == cp_error_declarator)
17935                 {
17936                   /* Skip to the end of the statement.  */
17937                   cp_parser_skip_to_end_of_statement (parser);
17938                   /* If the next token is not a semicolon, that is
17939                      probably because we just skipped over the body of
17940                      a function.  So, we consume a semicolon if
17941                      present, but do not issue an error message if it
17942                      is not present.  */
17943                   if (cp_lexer_next_token_is (parser->lexer,
17944                                               CPP_SEMICOLON))
17945                     cp_lexer_consume_token (parser->lexer);
17946                   goto out;
17947                 }
17948
17949               if (declares_class_or_enum & 2)
17950                 cp_parser_check_for_definition_in_return_type
17951                                             (declarator, decl_specifiers.type,
17952                                              decl_specifiers.type_location);
17953
17954               /* Look for an asm-specification.  */
17955               asm_specification = cp_parser_asm_specification_opt (parser);
17956               /* Look for attributes that apply to the declaration.  */
17957               attributes = cp_parser_attributes_opt (parser);
17958               /* Remember which attributes are prefix attributes and
17959                  which are not.  */
17960               first_attribute = attributes;
17961               /* Combine the attributes.  */
17962               attributes = chainon (prefix_attributes, attributes);
17963
17964               /* If it's an `=', then we have a constant-initializer or a
17965                  pure-specifier.  It is not correct to parse the
17966                  initializer before registering the member declaration
17967                  since the member declaration should be in scope while
17968                  its initializer is processed.  However, the rest of the
17969                  front end does not yet provide an interface that allows
17970                  us to handle this correctly.  */
17971               if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
17972                 {
17973                   /* In [class.mem]:
17974
17975                      A pure-specifier shall be used only in the declaration of
17976                      a virtual function.
17977
17978                      A member-declarator can contain a constant-initializer
17979                      only if it declares a static member of integral or
17980                      enumeration type.
17981
17982                      Therefore, if the DECLARATOR is for a function, we look
17983                      for a pure-specifier; otherwise, we look for a
17984                      constant-initializer.  When we call `grokfield', it will
17985                      perform more stringent semantics checks.  */
17986                   initializer_token_start = cp_lexer_peek_token (parser->lexer);
17987                   if (function_declarator_p (declarator))
17988                     initializer = cp_parser_pure_specifier (parser);
17989                   else
17990                     /* Parse the initializer.  */
17991                     initializer = cp_parser_constant_initializer (parser);
17992                 }
17993               /* Otherwise, there is no initializer.  */
17994               else
17995                 initializer = NULL_TREE;
17996
17997               /* See if we are probably looking at a function
17998                  definition.  We are certainly not looking at a
17999                  member-declarator.  Calling `grokfield' has
18000                  side-effects, so we must not do it unless we are sure
18001                  that we are looking at a member-declarator.  */
18002               if (cp_parser_token_starts_function_definition_p
18003                   (cp_lexer_peek_token (parser->lexer)))
18004                 {
18005                   /* The grammar does not allow a pure-specifier to be
18006                      used when a member function is defined.  (It is
18007                      possible that this fact is an oversight in the
18008                      standard, since a pure function may be defined
18009                      outside of the class-specifier.  */
18010                   if (initializer)
18011                     error_at (initializer_token_start->location,
18012                               "pure-specifier on function-definition");
18013                   decl = cp_parser_save_member_function_body (parser,
18014                                                               &decl_specifiers,
18015                                                               declarator,
18016                                                               attributes);
18017                   /* If the member was not a friend, declare it here.  */
18018                   if (!friend_p)
18019                     finish_member_declaration (decl);
18020                   /* Peek at the next token.  */
18021                   token = cp_lexer_peek_token (parser->lexer);
18022                   /* If the next token is a semicolon, consume it.  */
18023                   if (token->type == CPP_SEMICOLON)
18024                     cp_lexer_consume_token (parser->lexer);
18025                   goto out;
18026                 }
18027               else
18028                 if (declarator->kind == cdk_function)
18029                   declarator->id_loc = token->location;
18030                 /* Create the declaration.  */
18031                 decl = grokfield (declarator, &decl_specifiers,
18032                                   initializer, /*init_const_expr_p=*/true,
18033                                   asm_specification,
18034                                   attributes);
18035             }
18036
18037           /* Reset PREFIX_ATTRIBUTES.  */
18038           while (attributes && TREE_CHAIN (attributes) != first_attribute)
18039             attributes = TREE_CHAIN (attributes);
18040           if (attributes)
18041             TREE_CHAIN (attributes) = NULL_TREE;
18042
18043           /* If there is any qualification still in effect, clear it
18044              now; we will be starting fresh with the next declarator.  */
18045           parser->scope = NULL_TREE;
18046           parser->qualifying_scope = NULL_TREE;
18047           parser->object_scope = NULL_TREE;
18048           /* If it's a `,', then there are more declarators.  */
18049           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18050             cp_lexer_consume_token (parser->lexer);
18051           /* If the next token isn't a `;', then we have a parse error.  */
18052           else if (cp_lexer_next_token_is_not (parser->lexer,
18053                                                CPP_SEMICOLON))
18054             {
18055               /* The next token might be a ways away from where the
18056                  actual semicolon is missing.  Find the previous token
18057                  and use that for our error position.  */
18058               cp_token *token = cp_lexer_previous_token (parser->lexer);
18059               error_at (token->location,
18060                         "expected %<;%> at end of member declaration");
18061
18062               /* Assume that the user meant to provide a semicolon.  If
18063                  we were to cp_parser_skip_to_end_of_statement, we might
18064                  skip to a semicolon inside a member function definition
18065                  and issue nonsensical error messages.  */
18066               assume_semicolon = true;
18067             }
18068
18069           if (decl)
18070             {
18071               /* Add DECL to the list of members.  */
18072               if (!friend_p)
18073                 finish_member_declaration (decl);
18074
18075               if (TREE_CODE (decl) == FUNCTION_DECL)
18076                 cp_parser_save_default_args (parser, decl);
18077             }
18078
18079           if (assume_semicolon)
18080             goto out;
18081         }
18082     }
18083
18084   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18085  out:
18086   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
18087 }
18088
18089 /* Parse a pure-specifier.
18090
18091    pure-specifier:
18092      = 0
18093
18094    Returns INTEGER_ZERO_NODE if a pure specifier is found.
18095    Otherwise, ERROR_MARK_NODE is returned.  */
18096
18097 static tree
18098 cp_parser_pure_specifier (cp_parser* parser)
18099 {
18100   cp_token *token;
18101
18102   /* Look for the `=' token.  */
18103   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18104     return error_mark_node;
18105   /* Look for the `0' token.  */
18106   token = cp_lexer_peek_token (parser->lexer);
18107
18108   if (token->type == CPP_EOF
18109       || token->type == CPP_PRAGMA_EOL)
18110     return error_mark_node;
18111
18112   cp_lexer_consume_token (parser->lexer);
18113
18114   /* Accept = default or = delete in c++0x mode.  */
18115   if (token->keyword == RID_DEFAULT
18116       || token->keyword == RID_DELETE)
18117     {
18118       maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
18119       return token->u.value;
18120     }
18121
18122   /* c_lex_with_flags marks a single digit '0' with PURE_ZERO.  */
18123   if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
18124     {
18125       cp_parser_error (parser,
18126                        "invalid pure specifier (only %<= 0%> is allowed)");
18127       cp_parser_skip_to_end_of_statement (parser);
18128       return error_mark_node;
18129     }
18130   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
18131     {
18132       error_at (token->location, "templates may not be %<virtual%>");
18133       return error_mark_node;
18134     }
18135
18136   return integer_zero_node;
18137 }
18138
18139 /* Parse a constant-initializer.
18140
18141    constant-initializer:
18142      = constant-expression
18143
18144    Returns a representation of the constant-expression.  */
18145
18146 static tree
18147 cp_parser_constant_initializer (cp_parser* parser)
18148 {
18149   /* Look for the `=' token.  */
18150   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18151     return error_mark_node;
18152
18153   /* It is invalid to write:
18154
18155        struct S { static const int i = { 7 }; };
18156
18157      */
18158   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18159     {
18160       cp_parser_error (parser,
18161                        "a brace-enclosed initializer is not allowed here");
18162       /* Consume the opening brace.  */
18163       cp_lexer_consume_token (parser->lexer);
18164       /* Skip the initializer.  */
18165       cp_parser_skip_to_closing_brace (parser);
18166       /* Look for the trailing `}'.  */
18167       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
18168
18169       return error_mark_node;
18170     }
18171
18172   return cp_parser_constant_expression (parser,
18173                                         /*allow_non_constant=*/false,
18174                                         NULL);
18175 }
18176
18177 /* Derived classes [gram.class.derived] */
18178
18179 /* Parse a base-clause.
18180
18181    base-clause:
18182      : base-specifier-list
18183
18184    base-specifier-list:
18185      base-specifier ... [opt]
18186      base-specifier-list , base-specifier ... [opt]
18187
18188    Returns a TREE_LIST representing the base-classes, in the order in
18189    which they were declared.  The representation of each node is as
18190    described by cp_parser_base_specifier.
18191
18192    In the case that no bases are specified, this function will return
18193    NULL_TREE, not ERROR_MARK_NODE.  */
18194
18195 static tree
18196 cp_parser_base_clause (cp_parser* parser)
18197 {
18198   tree bases = NULL_TREE;
18199
18200   /* Look for the `:' that begins the list.  */
18201   cp_parser_require (parser, CPP_COLON, RT_COLON);
18202
18203   /* Scan the base-specifier-list.  */
18204   while (true)
18205     {
18206       cp_token *token;
18207       tree base;
18208       bool pack_expansion_p = false;
18209
18210       /* Look for the base-specifier.  */
18211       base = cp_parser_base_specifier (parser);
18212       /* Look for the (optional) ellipsis. */
18213       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18214         {
18215           /* Consume the `...'. */
18216           cp_lexer_consume_token (parser->lexer);
18217
18218           pack_expansion_p = true;
18219         }
18220
18221       /* Add BASE to the front of the list.  */
18222       if (base != error_mark_node)
18223         {
18224           if (pack_expansion_p)
18225             /* Make this a pack expansion type. */
18226             TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
18227           
18228
18229           if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
18230             {
18231               TREE_CHAIN (base) = bases;
18232               bases = base;
18233             }
18234         }
18235       /* Peek at the next token.  */
18236       token = cp_lexer_peek_token (parser->lexer);
18237       /* If it's not a comma, then the list is complete.  */
18238       if (token->type != CPP_COMMA)
18239         break;
18240       /* Consume the `,'.  */
18241       cp_lexer_consume_token (parser->lexer);
18242     }
18243
18244   /* PARSER->SCOPE may still be non-NULL at this point, if the last
18245      base class had a qualified name.  However, the next name that
18246      appears is certainly not qualified.  */
18247   parser->scope = NULL_TREE;
18248   parser->qualifying_scope = NULL_TREE;
18249   parser->object_scope = NULL_TREE;
18250
18251   return nreverse (bases);
18252 }
18253
18254 /* Parse a base-specifier.
18255
18256    base-specifier:
18257      :: [opt] nested-name-specifier [opt] class-name
18258      virtual access-specifier [opt] :: [opt] nested-name-specifier
18259        [opt] class-name
18260      access-specifier virtual [opt] :: [opt] nested-name-specifier
18261        [opt] class-name
18262
18263    Returns a TREE_LIST.  The TREE_PURPOSE will be one of
18264    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
18265    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
18266    (or the ERROR_MARK_NODE) indicating the type that was specified.  */
18267
18268 static tree
18269 cp_parser_base_specifier (cp_parser* parser)
18270 {
18271   cp_token *token;
18272   bool done = false;
18273   bool virtual_p = false;
18274   bool duplicate_virtual_error_issued_p = false;
18275   bool duplicate_access_error_issued_p = false;
18276   bool class_scope_p, template_p;
18277   tree access = access_default_node;
18278   tree type;
18279
18280   /* Process the optional `virtual' and `access-specifier'.  */
18281   while (!done)
18282     {
18283       /* Peek at the next token.  */
18284       token = cp_lexer_peek_token (parser->lexer);
18285       /* Process `virtual'.  */
18286       switch (token->keyword)
18287         {
18288         case RID_VIRTUAL:
18289           /* If `virtual' appears more than once, issue an error.  */
18290           if (virtual_p && !duplicate_virtual_error_issued_p)
18291             {
18292               cp_parser_error (parser,
18293                                "%<virtual%> specified more than once in base-specified");
18294               duplicate_virtual_error_issued_p = true;
18295             }
18296
18297           virtual_p = true;
18298
18299           /* Consume the `virtual' token.  */
18300           cp_lexer_consume_token (parser->lexer);
18301
18302           break;
18303
18304         case RID_PUBLIC:
18305         case RID_PROTECTED:
18306         case RID_PRIVATE:
18307           /* If more than one access specifier appears, issue an
18308              error.  */
18309           if (access != access_default_node
18310               && !duplicate_access_error_issued_p)
18311             {
18312               cp_parser_error (parser,
18313                                "more than one access specifier in base-specified");
18314               duplicate_access_error_issued_p = true;
18315             }
18316
18317           access = ridpointers[(int) token->keyword];
18318
18319           /* Consume the access-specifier.  */
18320           cp_lexer_consume_token (parser->lexer);
18321
18322           break;
18323
18324         default:
18325           done = true;
18326           break;
18327         }
18328     }
18329   /* It is not uncommon to see programs mechanically, erroneously, use
18330      the 'typename' keyword to denote (dependent) qualified types
18331      as base classes.  */
18332   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
18333     {
18334       token = cp_lexer_peek_token (parser->lexer);
18335       if (!processing_template_decl)
18336         error_at (token->location,
18337                   "keyword %<typename%> not allowed outside of templates");
18338       else
18339         error_at (token->location,
18340                   "keyword %<typename%> not allowed in this context "
18341                   "(the base class is implicitly a type)");
18342       cp_lexer_consume_token (parser->lexer);
18343     }
18344
18345   /* Look for the optional `::' operator.  */
18346   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
18347   /* Look for the nested-name-specifier.  The simplest way to
18348      implement:
18349
18350        [temp.res]
18351
18352        The keyword `typename' is not permitted in a base-specifier or
18353        mem-initializer; in these contexts a qualified name that
18354        depends on a template-parameter is implicitly assumed to be a
18355        type name.
18356
18357      is to pretend that we have seen the `typename' keyword at this
18358      point.  */
18359   cp_parser_nested_name_specifier_opt (parser,
18360                                        /*typename_keyword_p=*/true,
18361                                        /*check_dependency_p=*/true,
18362                                        typename_type,
18363                                        /*is_declaration=*/true);
18364   /* If the base class is given by a qualified name, assume that names
18365      we see are type names or templates, as appropriate.  */
18366   class_scope_p = (parser->scope && TYPE_P (parser->scope));
18367   template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
18368
18369   /* Finally, look for the class-name.  */
18370   type = cp_parser_class_name (parser,
18371                                class_scope_p,
18372                                template_p,
18373                                typename_type,
18374                                /*check_dependency_p=*/true,
18375                                /*class_head_p=*/false,
18376                                /*is_declaration=*/true);
18377
18378   if (type == error_mark_node)
18379     return error_mark_node;
18380
18381   return finish_base_specifier (TREE_TYPE (type), access, virtual_p);
18382 }
18383
18384 /* Exception handling [gram.exception] */
18385
18386 /* Parse an (optional) exception-specification.
18387
18388    exception-specification:
18389      throw ( type-id-list [opt] )
18390
18391    Returns a TREE_LIST representing the exception-specification.  The
18392    TREE_VALUE of each node is a type.  */
18393
18394 static tree
18395 cp_parser_exception_specification_opt (cp_parser* parser)
18396 {
18397   cp_token *token;
18398   tree type_id_list;
18399   const char *saved_message;
18400
18401   /* Peek at the next token.  */
18402   token = cp_lexer_peek_token (parser->lexer);
18403
18404   /* Is it a noexcept-specification?  */
18405   if (cp_parser_is_keyword (token, RID_NOEXCEPT))
18406     {
18407       tree expr;
18408       cp_lexer_consume_token (parser->lexer);
18409
18410       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
18411         {
18412           cp_lexer_consume_token (parser->lexer);
18413
18414           /* Types may not be defined in an exception-specification.  */
18415           saved_message = parser->type_definition_forbidden_message;
18416           parser->type_definition_forbidden_message
18417             = G_("types may not be defined in an exception-specification");
18418
18419           expr = cp_parser_constant_expression (parser, false, NULL);
18420
18421           /* Restore the saved message.  */
18422           parser->type_definition_forbidden_message = saved_message;
18423
18424           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18425         }
18426       else
18427         expr = boolean_true_node;
18428
18429       return build_noexcept_spec (expr, tf_warning_or_error);
18430     }
18431
18432   /* If it's not `throw', then there's no exception-specification.  */
18433   if (!cp_parser_is_keyword (token, RID_THROW))
18434     return NULL_TREE;
18435
18436 #if 0
18437   /* Enable this once a lot of code has transitioned to noexcept?  */
18438   if (cxx_dialect == cxx0x && !in_system_header)
18439     warning (OPT_Wdeprecated, "dynamic exception specifications are "
18440              "deprecated in C++0x; use %<noexcept%> instead");
18441 #endif
18442
18443   /* Consume the `throw'.  */
18444   cp_lexer_consume_token (parser->lexer);
18445
18446   /* Look for the `('.  */
18447   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18448
18449   /* Peek at the next token.  */
18450   token = cp_lexer_peek_token (parser->lexer);
18451   /* If it's not a `)', then there is a type-id-list.  */
18452   if (token->type != CPP_CLOSE_PAREN)
18453     {
18454       /* Types may not be defined in an exception-specification.  */
18455       saved_message = parser->type_definition_forbidden_message;
18456       parser->type_definition_forbidden_message
18457         = G_("types may not be defined in an exception-specification");
18458       /* Parse the type-id-list.  */
18459       type_id_list = cp_parser_type_id_list (parser);
18460       /* Restore the saved message.  */
18461       parser->type_definition_forbidden_message = saved_message;
18462     }
18463   else
18464     type_id_list = empty_except_spec;
18465
18466   /* Look for the `)'.  */
18467   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18468
18469   return type_id_list;
18470 }
18471
18472 /* Parse an (optional) type-id-list.
18473
18474    type-id-list:
18475      type-id ... [opt]
18476      type-id-list , type-id ... [opt]
18477
18478    Returns a TREE_LIST.  The TREE_VALUE of each node is a TYPE,
18479    in the order that the types were presented.  */
18480
18481 static tree
18482 cp_parser_type_id_list (cp_parser* parser)
18483 {
18484   tree types = NULL_TREE;
18485
18486   while (true)
18487     {
18488       cp_token *token;
18489       tree type;
18490
18491       /* Get the next type-id.  */
18492       type = cp_parser_type_id (parser);
18493       /* Parse the optional ellipsis. */
18494       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18495         {
18496           /* Consume the `...'. */
18497           cp_lexer_consume_token (parser->lexer);
18498
18499           /* Turn the type into a pack expansion expression. */
18500           type = make_pack_expansion (type);
18501         }
18502       /* Add it to the list.  */
18503       types = add_exception_specifier (types, type, /*complain=*/1);
18504       /* Peek at the next token.  */
18505       token = cp_lexer_peek_token (parser->lexer);
18506       /* If it is not a `,', we are done.  */
18507       if (token->type != CPP_COMMA)
18508         break;
18509       /* Consume the `,'.  */
18510       cp_lexer_consume_token (parser->lexer);
18511     }
18512
18513   return nreverse (types);
18514 }
18515
18516 /* Parse a try-block.
18517
18518    try-block:
18519      try compound-statement handler-seq  */
18520
18521 static tree
18522 cp_parser_try_block (cp_parser* parser)
18523 {
18524   tree try_block;
18525
18526   cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
18527   try_block = begin_try_block ();
18528   cp_parser_compound_statement (parser, NULL, true, false);
18529   finish_try_block (try_block);
18530   cp_parser_handler_seq (parser);
18531   finish_handler_sequence (try_block);
18532
18533   return try_block;
18534 }
18535
18536 /* Parse a function-try-block.
18537
18538    function-try-block:
18539      try ctor-initializer [opt] function-body handler-seq  */
18540
18541 static bool
18542 cp_parser_function_try_block (cp_parser* parser)
18543 {
18544   tree compound_stmt;
18545   tree try_block;
18546   bool ctor_initializer_p;
18547
18548   /* Look for the `try' keyword.  */
18549   if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
18550     return false;
18551   /* Let the rest of the front end know where we are.  */
18552   try_block = begin_function_try_block (&compound_stmt);
18553   /* Parse the function-body.  */
18554   ctor_initializer_p
18555     = cp_parser_ctor_initializer_opt_and_function_body (parser);
18556   /* We're done with the `try' part.  */
18557   finish_function_try_block (try_block);
18558   /* Parse the handlers.  */
18559   cp_parser_handler_seq (parser);
18560   /* We're done with the handlers.  */
18561   finish_function_handler_sequence (try_block, compound_stmt);
18562
18563   return ctor_initializer_p;
18564 }
18565
18566 /* Parse a handler-seq.
18567
18568    handler-seq:
18569      handler handler-seq [opt]  */
18570
18571 static void
18572 cp_parser_handler_seq (cp_parser* parser)
18573 {
18574   while (true)
18575     {
18576       cp_token *token;
18577
18578       /* Parse the handler.  */
18579       cp_parser_handler (parser);
18580       /* Peek at the next token.  */
18581       token = cp_lexer_peek_token (parser->lexer);
18582       /* If it's not `catch' then there are no more handlers.  */
18583       if (!cp_parser_is_keyword (token, RID_CATCH))
18584         break;
18585     }
18586 }
18587
18588 /* Parse a handler.
18589
18590    handler:
18591      catch ( exception-declaration ) compound-statement  */
18592
18593 static void
18594 cp_parser_handler (cp_parser* parser)
18595 {
18596   tree handler;
18597   tree declaration;
18598
18599   cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
18600   handler = begin_handler ();
18601   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18602   declaration = cp_parser_exception_declaration (parser);
18603   finish_handler_parms (declaration, handler);
18604   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18605   cp_parser_compound_statement (parser, NULL, false, false);
18606   finish_handler (handler);
18607 }
18608
18609 /* Parse an exception-declaration.
18610
18611    exception-declaration:
18612      type-specifier-seq declarator
18613      type-specifier-seq abstract-declarator
18614      type-specifier-seq
18615      ...
18616
18617    Returns a VAR_DECL for the declaration, or NULL_TREE if the
18618    ellipsis variant is used.  */
18619
18620 static tree
18621 cp_parser_exception_declaration (cp_parser* parser)
18622 {
18623   cp_decl_specifier_seq type_specifiers;
18624   cp_declarator *declarator;
18625   const char *saved_message;
18626
18627   /* If it's an ellipsis, it's easy to handle.  */
18628   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18629     {
18630       /* Consume the `...' token.  */
18631       cp_lexer_consume_token (parser->lexer);
18632       return NULL_TREE;
18633     }
18634
18635   /* Types may not be defined in exception-declarations.  */
18636   saved_message = parser->type_definition_forbidden_message;
18637   parser->type_definition_forbidden_message
18638     = G_("types may not be defined in exception-declarations");
18639
18640   /* Parse the type-specifier-seq.  */
18641   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
18642                                 /*is_trailing_return=*/false,
18643                                 &type_specifiers);
18644   /* If it's a `)', then there is no declarator.  */
18645   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
18646     declarator = NULL;
18647   else
18648     declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
18649                                        /*ctor_dtor_or_conv_p=*/NULL,
18650                                        /*parenthesized_p=*/NULL,
18651                                        /*member_p=*/false);
18652
18653   /* Restore the saved message.  */
18654   parser->type_definition_forbidden_message = saved_message;
18655
18656   if (!type_specifiers.any_specifiers_p)
18657     return error_mark_node;
18658
18659   return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
18660 }
18661
18662 /* Parse a throw-expression.
18663
18664    throw-expression:
18665      throw assignment-expression [opt]
18666
18667    Returns a THROW_EXPR representing the throw-expression.  */
18668
18669 static tree
18670 cp_parser_throw_expression (cp_parser* parser)
18671 {
18672   tree expression;
18673   cp_token* token;
18674
18675   cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
18676   token = cp_lexer_peek_token (parser->lexer);
18677   /* Figure out whether or not there is an assignment-expression
18678      following the "throw" keyword.  */
18679   if (token->type == CPP_COMMA
18680       || token->type == CPP_SEMICOLON
18681       || token->type == CPP_CLOSE_PAREN
18682       || token->type == CPP_CLOSE_SQUARE
18683       || token->type == CPP_CLOSE_BRACE
18684       || token->type == CPP_COLON)
18685     expression = NULL_TREE;
18686   else
18687     expression = cp_parser_assignment_expression (parser,
18688                                                   /*cast_p=*/false, NULL);
18689
18690   return build_throw (expression);
18691 }
18692
18693 /* GNU Extensions */
18694
18695 /* Parse an (optional) asm-specification.
18696
18697    asm-specification:
18698      asm ( string-literal )
18699
18700    If the asm-specification is present, returns a STRING_CST
18701    corresponding to the string-literal.  Otherwise, returns
18702    NULL_TREE.  */
18703
18704 static tree
18705 cp_parser_asm_specification_opt (cp_parser* parser)
18706 {
18707   cp_token *token;
18708   tree asm_specification;
18709
18710   /* Peek at the next token.  */
18711   token = cp_lexer_peek_token (parser->lexer);
18712   /* If the next token isn't the `asm' keyword, then there's no
18713      asm-specification.  */
18714   if (!cp_parser_is_keyword (token, RID_ASM))
18715     return NULL_TREE;
18716
18717   /* Consume the `asm' token.  */
18718   cp_lexer_consume_token (parser->lexer);
18719   /* Look for the `('.  */
18720   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18721
18722   /* Look for the string-literal.  */
18723   asm_specification = cp_parser_string_literal (parser, false, false);
18724
18725   /* Look for the `)'.  */
18726   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18727
18728   return asm_specification;
18729 }
18730
18731 /* Parse an asm-operand-list.
18732
18733    asm-operand-list:
18734      asm-operand
18735      asm-operand-list , asm-operand
18736
18737    asm-operand:
18738      string-literal ( expression )
18739      [ string-literal ] string-literal ( expression )
18740
18741    Returns a TREE_LIST representing the operands.  The TREE_VALUE of
18742    each node is the expression.  The TREE_PURPOSE is itself a
18743    TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
18744    string-literal (or NULL_TREE if not present) and whose TREE_VALUE
18745    is a STRING_CST for the string literal before the parenthesis. Returns
18746    ERROR_MARK_NODE if any of the operands are invalid.  */
18747
18748 static tree
18749 cp_parser_asm_operand_list (cp_parser* parser)
18750 {
18751   tree asm_operands = NULL_TREE;
18752   bool invalid_operands = false;
18753
18754   while (true)
18755     {
18756       tree string_literal;
18757       tree expression;
18758       tree name;
18759
18760       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
18761         {
18762           /* Consume the `[' token.  */
18763           cp_lexer_consume_token (parser->lexer);
18764           /* Read the operand name.  */
18765           name = cp_parser_identifier (parser);
18766           if (name != error_mark_node)
18767             name = build_string (IDENTIFIER_LENGTH (name),
18768                                  IDENTIFIER_POINTER (name));
18769           /* Look for the closing `]'.  */
18770           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
18771         }
18772       else
18773         name = NULL_TREE;
18774       /* Look for the string-literal.  */
18775       string_literal = cp_parser_string_literal (parser, false, false);
18776
18777       /* Look for the `('.  */
18778       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18779       /* Parse the expression.  */
18780       expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
18781       /* Look for the `)'.  */
18782       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18783
18784       if (name == error_mark_node 
18785           || string_literal == error_mark_node 
18786           || expression == error_mark_node)
18787         invalid_operands = true;
18788
18789       /* Add this operand to the list.  */
18790       asm_operands = tree_cons (build_tree_list (name, string_literal),
18791                                 expression,
18792                                 asm_operands);
18793       /* If the next token is not a `,', there are no more
18794          operands.  */
18795       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18796         break;
18797       /* Consume the `,'.  */
18798       cp_lexer_consume_token (parser->lexer);
18799     }
18800
18801   return invalid_operands ? error_mark_node : nreverse (asm_operands);
18802 }
18803
18804 /* Parse an asm-clobber-list.
18805
18806    asm-clobber-list:
18807      string-literal
18808      asm-clobber-list , string-literal
18809
18810    Returns a TREE_LIST, indicating the clobbers in the order that they
18811    appeared.  The TREE_VALUE of each node is a STRING_CST.  */
18812
18813 static tree
18814 cp_parser_asm_clobber_list (cp_parser* parser)
18815 {
18816   tree clobbers = NULL_TREE;
18817
18818   while (true)
18819     {
18820       tree string_literal;
18821
18822       /* Look for the string literal.  */
18823       string_literal = cp_parser_string_literal (parser, false, false);
18824       /* Add it to the list.  */
18825       clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
18826       /* If the next token is not a `,', then the list is
18827          complete.  */
18828       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18829         break;
18830       /* Consume the `,' token.  */
18831       cp_lexer_consume_token (parser->lexer);
18832     }
18833
18834   return clobbers;
18835 }
18836
18837 /* Parse an asm-label-list.
18838
18839    asm-label-list:
18840      identifier
18841      asm-label-list , identifier
18842
18843    Returns a TREE_LIST, indicating the labels in the order that they
18844    appeared.  The TREE_VALUE of each node is a label.  */
18845
18846 static tree
18847 cp_parser_asm_label_list (cp_parser* parser)
18848 {
18849   tree labels = NULL_TREE;
18850
18851   while (true)
18852     {
18853       tree identifier, label, name;
18854
18855       /* Look for the identifier.  */
18856       identifier = cp_parser_identifier (parser);
18857       if (!error_operand_p (identifier))
18858         {
18859           label = lookup_label (identifier);
18860           if (TREE_CODE (label) == LABEL_DECL)
18861             {
18862               TREE_USED (label) = 1;
18863               check_goto (label);
18864               name = build_string (IDENTIFIER_LENGTH (identifier),
18865                                    IDENTIFIER_POINTER (identifier));
18866               labels = tree_cons (name, label, labels);
18867             }
18868         }
18869       /* If the next token is not a `,', then the list is
18870          complete.  */
18871       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18872         break;
18873       /* Consume the `,' token.  */
18874       cp_lexer_consume_token (parser->lexer);
18875     }
18876
18877   return nreverse (labels);
18878 }
18879
18880 /* Parse an (optional) series of attributes.
18881
18882    attributes:
18883      attributes attribute
18884
18885    attribute:
18886      __attribute__ (( attribute-list [opt] ))
18887
18888    The return value is as for cp_parser_attribute_list.  */
18889
18890 static tree
18891 cp_parser_attributes_opt (cp_parser* parser)
18892 {
18893   tree attributes = NULL_TREE;
18894
18895   while (true)
18896     {
18897       cp_token *token;
18898       tree attribute_list;
18899
18900       /* Peek at the next token.  */
18901       token = cp_lexer_peek_token (parser->lexer);
18902       /* If it's not `__attribute__', then we're done.  */
18903       if (token->keyword != RID_ATTRIBUTE)
18904         break;
18905
18906       /* Consume the `__attribute__' keyword.  */
18907       cp_lexer_consume_token (parser->lexer);
18908       /* Look for the two `(' tokens.  */
18909       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18910       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18911
18912       /* Peek at the next token.  */
18913       token = cp_lexer_peek_token (parser->lexer);
18914       if (token->type != CPP_CLOSE_PAREN)
18915         /* Parse the attribute-list.  */
18916         attribute_list = cp_parser_attribute_list (parser);
18917       else
18918         /* If the next token is a `)', then there is no attribute
18919            list.  */
18920         attribute_list = NULL;
18921
18922       /* Look for the two `)' tokens.  */
18923       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18924       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18925
18926       /* Add these new attributes to the list.  */
18927       attributes = chainon (attributes, attribute_list);
18928     }
18929
18930   return attributes;
18931 }
18932
18933 /* Parse an attribute-list.
18934
18935    attribute-list:
18936      attribute
18937      attribute-list , attribute
18938
18939    attribute:
18940      identifier
18941      identifier ( identifier )
18942      identifier ( identifier , expression-list )
18943      identifier ( expression-list )
18944
18945    Returns a TREE_LIST, or NULL_TREE on error.  Each node corresponds
18946    to an attribute.  The TREE_PURPOSE of each node is the identifier
18947    indicating which attribute is in use.  The TREE_VALUE represents
18948    the arguments, if any.  */
18949
18950 static tree
18951 cp_parser_attribute_list (cp_parser* parser)
18952 {
18953   tree attribute_list = NULL_TREE;
18954   bool save_translate_strings_p = parser->translate_strings_p;
18955
18956   parser->translate_strings_p = false;
18957   while (true)
18958     {
18959       cp_token *token;
18960       tree identifier;
18961       tree attribute;
18962
18963       /* Look for the identifier.  We also allow keywords here; for
18964          example `__attribute__ ((const))' is legal.  */
18965       token = cp_lexer_peek_token (parser->lexer);
18966       if (token->type == CPP_NAME
18967           || token->type == CPP_KEYWORD)
18968         {
18969           tree arguments = NULL_TREE;
18970
18971           /* Consume the token.  */
18972           token = cp_lexer_consume_token (parser->lexer);
18973
18974           /* Save away the identifier that indicates which attribute
18975              this is.  */
18976           identifier = (token->type == CPP_KEYWORD) 
18977             /* For keywords, use the canonical spelling, not the
18978                parsed identifier.  */
18979             ? ridpointers[(int) token->keyword]
18980             : token->u.value;
18981           
18982           attribute = build_tree_list (identifier, NULL_TREE);
18983
18984           /* Peek at the next token.  */
18985           token = cp_lexer_peek_token (parser->lexer);
18986           /* If it's an `(', then parse the attribute arguments.  */
18987           if (token->type == CPP_OPEN_PAREN)
18988             {
18989               VEC(tree,gc) *vec;
18990               int attr_flag = (attribute_takes_identifier_p (identifier)
18991                                ? id_attr : normal_attr);
18992               vec = cp_parser_parenthesized_expression_list
18993                     (parser, attr_flag, /*cast_p=*/false,
18994                      /*allow_expansion_p=*/false,
18995                      /*non_constant_p=*/NULL);
18996               if (vec == NULL)
18997                 arguments = error_mark_node;
18998               else
18999                 {
19000                   arguments = build_tree_list_vec (vec);
19001                   release_tree_vector (vec);
19002                 }
19003               /* Save the arguments away.  */
19004               TREE_VALUE (attribute) = arguments;
19005             }
19006
19007           if (arguments != error_mark_node)
19008             {
19009               /* Add this attribute to the list.  */
19010               TREE_CHAIN (attribute) = attribute_list;
19011               attribute_list = attribute;
19012             }
19013
19014           token = cp_lexer_peek_token (parser->lexer);
19015         }
19016       /* Now, look for more attributes.  If the next token isn't a
19017          `,', we're done.  */
19018       if (token->type != CPP_COMMA)
19019         break;
19020
19021       /* Consume the comma and keep going.  */
19022       cp_lexer_consume_token (parser->lexer);
19023     }
19024   parser->translate_strings_p = save_translate_strings_p;
19025
19026   /* We built up the list in reverse order.  */
19027   return nreverse (attribute_list);
19028 }
19029
19030 /* Parse an optional `__extension__' keyword.  Returns TRUE if it is
19031    present, and FALSE otherwise.  *SAVED_PEDANTIC is set to the
19032    current value of the PEDANTIC flag, regardless of whether or not
19033    the `__extension__' keyword is present.  The caller is responsible
19034    for restoring the value of the PEDANTIC flag.  */
19035
19036 static bool
19037 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
19038 {
19039   /* Save the old value of the PEDANTIC flag.  */
19040   *saved_pedantic = pedantic;
19041
19042   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
19043     {
19044       /* Consume the `__extension__' token.  */
19045       cp_lexer_consume_token (parser->lexer);
19046       /* We're not being pedantic while the `__extension__' keyword is
19047          in effect.  */
19048       pedantic = 0;
19049
19050       return true;
19051     }
19052
19053   return false;
19054 }
19055
19056 /* Parse a label declaration.
19057
19058    label-declaration:
19059      __label__ label-declarator-seq ;
19060
19061    label-declarator-seq:
19062      identifier , label-declarator-seq
19063      identifier  */
19064
19065 static void
19066 cp_parser_label_declaration (cp_parser* parser)
19067 {
19068   /* Look for the `__label__' keyword.  */
19069   cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
19070
19071   while (true)
19072     {
19073       tree identifier;
19074
19075       /* Look for an identifier.  */
19076       identifier = cp_parser_identifier (parser);
19077       /* If we failed, stop.  */
19078       if (identifier == error_mark_node)
19079         break;
19080       /* Declare it as a label.  */
19081       finish_label_decl (identifier);
19082       /* If the next token is a `;', stop.  */
19083       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
19084         break;
19085       /* Look for the `,' separating the label declarations.  */
19086       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
19087     }
19088
19089   /* Look for the final `;'.  */
19090   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19091 }
19092
19093 /* Support Functions */
19094
19095 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
19096    NAME should have one of the representations used for an
19097    id-expression.  If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
19098    is returned.  If PARSER->SCOPE is a dependent type, then a
19099    SCOPE_REF is returned.
19100
19101    If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
19102    returned; the name was already resolved when the TEMPLATE_ID_EXPR
19103    was formed.  Abstractly, such entities should not be passed to this
19104    function, because they do not need to be looked up, but it is
19105    simpler to check for this special case here, rather than at the
19106    call-sites.
19107
19108    In cases not explicitly covered above, this function returns a
19109    DECL, OVERLOAD, or baselink representing the result of the lookup.
19110    If there was no entity with the indicated NAME, the ERROR_MARK_NODE
19111    is returned.
19112
19113    If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
19114    (e.g., "struct") that was used.  In that case bindings that do not
19115    refer to types are ignored.
19116
19117    If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
19118    ignored.
19119
19120    If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
19121    are ignored.
19122
19123    If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
19124    types.
19125
19126    If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
19127    TREE_LIST of candidates if name-lookup results in an ambiguity, and
19128    NULL_TREE otherwise.  */
19129
19130 static tree
19131 cp_parser_lookup_name (cp_parser *parser, tree name,
19132                        enum tag_types tag_type,
19133                        bool is_template,
19134                        bool is_namespace,
19135                        bool check_dependency,
19136                        tree *ambiguous_decls,
19137                        location_t name_location)
19138 {
19139   int flags = 0;
19140   tree decl;
19141   tree object_type = parser->context->object_type;
19142
19143   if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
19144     flags |= LOOKUP_COMPLAIN;
19145
19146   /* Assume that the lookup will be unambiguous.  */
19147   if (ambiguous_decls)
19148     *ambiguous_decls = NULL_TREE;
19149
19150   /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
19151      no longer valid.  Note that if we are parsing tentatively, and
19152      the parse fails, OBJECT_TYPE will be automatically restored.  */
19153   parser->context->object_type = NULL_TREE;
19154
19155   if (name == error_mark_node)
19156     return error_mark_node;
19157
19158   /* A template-id has already been resolved; there is no lookup to
19159      do.  */
19160   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
19161     return name;
19162   if (BASELINK_P (name))
19163     {
19164       gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
19165                   == TEMPLATE_ID_EXPR);
19166       return name;
19167     }
19168
19169   /* A BIT_NOT_EXPR is used to represent a destructor.  By this point,
19170      it should already have been checked to make sure that the name
19171      used matches the type being destroyed.  */
19172   if (TREE_CODE (name) == BIT_NOT_EXPR)
19173     {
19174       tree type;
19175
19176       /* Figure out to which type this destructor applies.  */
19177       if (parser->scope)
19178         type = parser->scope;
19179       else if (object_type)
19180         type = object_type;
19181       else
19182         type = current_class_type;
19183       /* If that's not a class type, there is no destructor.  */
19184       if (!type || !CLASS_TYPE_P (type))
19185         return error_mark_node;
19186       if (CLASSTYPE_LAZY_DESTRUCTOR (type))
19187         lazily_declare_fn (sfk_destructor, type);
19188       if (!CLASSTYPE_DESTRUCTORS (type))
19189           return error_mark_node;
19190       /* If it was a class type, return the destructor.  */
19191       return CLASSTYPE_DESTRUCTORS (type);
19192     }
19193
19194   /* By this point, the NAME should be an ordinary identifier.  If
19195      the id-expression was a qualified name, the qualifying scope is
19196      stored in PARSER->SCOPE at this point.  */
19197   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
19198
19199   /* Perform the lookup.  */
19200   if (parser->scope)
19201     {
19202       bool dependent_p;
19203
19204       if (parser->scope == error_mark_node)
19205         return error_mark_node;
19206
19207       /* If the SCOPE is dependent, the lookup must be deferred until
19208          the template is instantiated -- unless we are explicitly
19209          looking up names in uninstantiated templates.  Even then, we
19210          cannot look up the name if the scope is not a class type; it
19211          might, for example, be a template type parameter.  */
19212       dependent_p = (TYPE_P (parser->scope)
19213                      && dependent_scope_p (parser->scope));
19214       if ((check_dependency || !CLASS_TYPE_P (parser->scope))
19215           && dependent_p)
19216         /* Defer lookup.  */
19217         decl = error_mark_node;
19218       else
19219         {
19220           tree pushed_scope = NULL_TREE;
19221
19222           /* If PARSER->SCOPE is a dependent type, then it must be a
19223              class type, and we must not be checking dependencies;
19224              otherwise, we would have processed this lookup above.  So
19225              that PARSER->SCOPE is not considered a dependent base by
19226              lookup_member, we must enter the scope here.  */
19227           if (dependent_p)
19228             pushed_scope = push_scope (parser->scope);
19229
19230           /* If the PARSER->SCOPE is a template specialization, it
19231              may be instantiated during name lookup.  In that case,
19232              errors may be issued.  Even if we rollback the current
19233              tentative parse, those errors are valid.  */
19234           decl = lookup_qualified_name (parser->scope, name,
19235                                         tag_type != none_type,
19236                                         /*complain=*/true);
19237
19238           /* 3.4.3.1: In a lookup in which the constructor is an acceptable
19239              lookup result and the nested-name-specifier nominates a class C:
19240                * if the name specified after the nested-name-specifier, when
19241                looked up in C, is the injected-class-name of C (Clause 9), or
19242                * if the name specified after the nested-name-specifier is the
19243                same as the identifier or the simple-template-id's template-
19244                name in the last component of the nested-name-specifier,
19245              the name is instead considered to name the constructor of
19246              class C. [ Note: for example, the constructor is not an
19247              acceptable lookup result in an elaborated-type-specifier so
19248              the constructor would not be used in place of the
19249              injected-class-name. --end note ] Such a constructor name
19250              shall be used only in the declarator-id of a declaration that
19251              names a constructor or in a using-declaration.  */
19252           if (tag_type == none_type
19253               && DECL_SELF_REFERENCE_P (decl)
19254               && same_type_p (DECL_CONTEXT (decl), parser->scope))
19255             decl = lookup_qualified_name (parser->scope, ctor_identifier,
19256                                           tag_type != none_type,
19257                                           /*complain=*/true);
19258
19259           /* If we have a single function from a using decl, pull it out.  */
19260           if (TREE_CODE (decl) == OVERLOAD
19261               && !really_overloaded_fn (decl))
19262             decl = OVL_FUNCTION (decl);
19263
19264           if (pushed_scope)
19265             pop_scope (pushed_scope);
19266         }
19267
19268       /* If the scope is a dependent type and either we deferred lookup or
19269          we did lookup but didn't find the name, rememeber the name.  */
19270       if (decl == error_mark_node && TYPE_P (parser->scope)
19271           && dependent_type_p (parser->scope))
19272         {
19273           if (tag_type)
19274             {
19275               tree type;
19276
19277               /* The resolution to Core Issue 180 says that `struct
19278                  A::B' should be considered a type-name, even if `A'
19279                  is dependent.  */
19280               type = make_typename_type (parser->scope, name, tag_type,
19281                                          /*complain=*/tf_error);
19282               decl = TYPE_NAME (type);
19283             }
19284           else if (is_template
19285                    && (cp_parser_next_token_ends_template_argument_p (parser)
19286                        || cp_lexer_next_token_is (parser->lexer,
19287                                                   CPP_CLOSE_PAREN)))
19288             decl = make_unbound_class_template (parser->scope,
19289                                                 name, NULL_TREE,
19290                                                 /*complain=*/tf_error);
19291           else
19292             decl = build_qualified_name (/*type=*/NULL_TREE,
19293                                          parser->scope, name,
19294                                          is_template);
19295         }
19296       parser->qualifying_scope = parser->scope;
19297       parser->object_scope = NULL_TREE;
19298     }
19299   else if (object_type)
19300     {
19301       tree object_decl = NULL_TREE;
19302       /* Look up the name in the scope of the OBJECT_TYPE, unless the
19303          OBJECT_TYPE is not a class.  */
19304       if (CLASS_TYPE_P (object_type))
19305         /* If the OBJECT_TYPE is a template specialization, it may
19306            be instantiated during name lookup.  In that case, errors
19307            may be issued.  Even if we rollback the current tentative
19308            parse, those errors are valid.  */
19309         object_decl = lookup_member (object_type,
19310                                      name,
19311                                      /*protect=*/0,
19312                                      tag_type != none_type);
19313       /* Look it up in the enclosing context, too.  */
19314       decl = lookup_name_real (name, tag_type != none_type,
19315                                /*nonclass=*/0,
19316                                /*block_p=*/true, is_namespace, flags);
19317       parser->object_scope = object_type;
19318       parser->qualifying_scope = NULL_TREE;
19319       if (object_decl)
19320         decl = object_decl;
19321     }
19322   else
19323     {
19324       decl = lookup_name_real (name, tag_type != none_type,
19325                                /*nonclass=*/0,
19326                                /*block_p=*/true, is_namespace, flags);
19327       parser->qualifying_scope = NULL_TREE;
19328       parser->object_scope = NULL_TREE;
19329     }
19330
19331   /* If the lookup failed, let our caller know.  */
19332   if (!decl || decl == error_mark_node)
19333     return error_mark_node;
19334
19335   /* Pull out the template from an injected-class-name (or multiple).  */
19336   if (is_template)
19337     decl = maybe_get_template_decl_from_type_decl (decl);
19338
19339   /* If it's a TREE_LIST, the result of the lookup was ambiguous.  */
19340   if (TREE_CODE (decl) == TREE_LIST)
19341     {
19342       if (ambiguous_decls)
19343         *ambiguous_decls = decl;
19344       /* The error message we have to print is too complicated for
19345          cp_parser_error, so we incorporate its actions directly.  */
19346       if (!cp_parser_simulate_error (parser))
19347         {
19348           error_at (name_location, "reference to %qD is ambiguous",
19349                     name);
19350           print_candidates (decl);
19351         }
19352       return error_mark_node;
19353     }
19354
19355   gcc_assert (DECL_P (decl)
19356               || TREE_CODE (decl) == OVERLOAD
19357               || TREE_CODE (decl) == SCOPE_REF
19358               || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
19359               || BASELINK_P (decl));
19360
19361   /* If we have resolved the name of a member declaration, check to
19362      see if the declaration is accessible.  When the name resolves to
19363      set of overloaded functions, accessibility is checked when
19364      overload resolution is done.
19365
19366      During an explicit instantiation, access is not checked at all,
19367      as per [temp.explicit].  */
19368   if (DECL_P (decl))
19369     check_accessibility_of_qualified_id (decl, object_type, parser->scope);
19370
19371   return decl;
19372 }
19373
19374 /* Like cp_parser_lookup_name, but for use in the typical case where
19375    CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
19376    IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE.  */
19377
19378 static tree
19379 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
19380 {
19381   return cp_parser_lookup_name (parser, name,
19382                                 none_type,
19383                                 /*is_template=*/false,
19384                                 /*is_namespace=*/false,
19385                                 /*check_dependency=*/true,
19386                                 /*ambiguous_decls=*/NULL,
19387                                 location);
19388 }
19389
19390 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
19391    the current context, return the TYPE_DECL.  If TAG_NAME_P is
19392    true, the DECL indicates the class being defined in a class-head,
19393    or declared in an elaborated-type-specifier.
19394
19395    Otherwise, return DECL.  */
19396
19397 static tree
19398 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
19399 {
19400   /* If the TEMPLATE_DECL is being declared as part of a class-head,
19401      the translation from TEMPLATE_DECL to TYPE_DECL occurs:
19402
19403        struct A {
19404          template <typename T> struct B;
19405        };
19406
19407        template <typename T> struct A::B {};
19408
19409      Similarly, in an elaborated-type-specifier:
19410
19411        namespace N { struct X{}; }
19412
19413        struct A {
19414          template <typename T> friend struct N::X;
19415        };
19416
19417      However, if the DECL refers to a class type, and we are in
19418      the scope of the class, then the name lookup automatically
19419      finds the TYPE_DECL created by build_self_reference rather
19420      than a TEMPLATE_DECL.  For example, in:
19421
19422        template <class T> struct S {
19423          S s;
19424        };
19425
19426      there is no need to handle such case.  */
19427
19428   if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
19429     return DECL_TEMPLATE_RESULT (decl);
19430
19431   return decl;
19432 }
19433
19434 /* If too many, or too few, template-parameter lists apply to the
19435    declarator, issue an error message.  Returns TRUE if all went well,
19436    and FALSE otherwise.  */
19437
19438 static bool
19439 cp_parser_check_declarator_template_parameters (cp_parser* parser,
19440                                                 cp_declarator *declarator,
19441                                                 location_t declarator_location)
19442 {
19443   unsigned num_templates;
19444
19445   /* We haven't seen any classes that involve template parameters yet.  */
19446   num_templates = 0;
19447
19448   switch (declarator->kind)
19449     {
19450     case cdk_id:
19451       if (declarator->u.id.qualifying_scope)
19452         {
19453           tree scope;
19454
19455           scope = declarator->u.id.qualifying_scope;
19456
19457           while (scope && CLASS_TYPE_P (scope))
19458             {
19459               /* You're supposed to have one `template <...>'
19460                  for every template class, but you don't need one
19461                  for a full specialization.  For example:
19462
19463                  template <class T> struct S{};
19464                  template <> struct S<int> { void f(); };
19465                  void S<int>::f () {}
19466
19467                  is correct; there shouldn't be a `template <>' for
19468                  the definition of `S<int>::f'.  */
19469               if (!CLASSTYPE_TEMPLATE_INFO (scope))
19470                 /* If SCOPE does not have template information of any
19471                    kind, then it is not a template, nor is it nested
19472                    within a template.  */
19473                 break;
19474               if (explicit_class_specialization_p (scope))
19475                 break;
19476               if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope)))
19477                 ++num_templates;
19478
19479               scope = TYPE_CONTEXT (scope);
19480             }
19481         }
19482       else if (TREE_CODE (declarator->u.id.unqualified_name)
19483                == TEMPLATE_ID_EXPR)
19484         /* If the DECLARATOR has the form `X<y>' then it uses one
19485            additional level of template parameters.  */
19486         ++num_templates;
19487
19488       return cp_parser_check_template_parameters 
19489         (parser, num_templates, declarator_location, declarator);
19490
19491
19492     case cdk_function:
19493     case cdk_array:
19494     case cdk_pointer:
19495     case cdk_reference:
19496     case cdk_ptrmem:
19497       return (cp_parser_check_declarator_template_parameters
19498               (parser, declarator->declarator, declarator_location));
19499
19500     case cdk_error:
19501       return true;
19502
19503     default:
19504       gcc_unreachable ();
19505     }
19506   return false;
19507 }
19508
19509 /* NUM_TEMPLATES were used in the current declaration.  If that is
19510    invalid, return FALSE and issue an error messages.  Otherwise,
19511    return TRUE.  If DECLARATOR is non-NULL, then we are checking a
19512    declarator and we can print more accurate diagnostics.  */
19513
19514 static bool
19515 cp_parser_check_template_parameters (cp_parser* parser,
19516                                      unsigned num_templates,
19517                                      location_t location,
19518                                      cp_declarator *declarator)
19519 {
19520   /* If there are the same number of template classes and parameter
19521      lists, that's OK.  */
19522   if (parser->num_template_parameter_lists == num_templates)
19523     return true;
19524   /* If there are more, but only one more, then we are referring to a
19525      member template.  That's OK too.  */
19526   if (parser->num_template_parameter_lists == num_templates + 1)
19527     return true;
19528   /* If there are more template classes than parameter lists, we have
19529      something like:
19530
19531        template <class T> void S<T>::R<T>::f ();  */
19532   if (parser->num_template_parameter_lists < num_templates)
19533     {
19534       if (declarator && !current_function_decl)
19535         error_at (location, "specializing member %<%T::%E%> "
19536                   "requires %<template<>%> syntax", 
19537                   declarator->u.id.qualifying_scope,
19538                   declarator->u.id.unqualified_name);
19539       else if (declarator)
19540         error_at (location, "invalid declaration of %<%T::%E%>",
19541                   declarator->u.id.qualifying_scope,
19542                   declarator->u.id.unqualified_name);
19543       else 
19544         error_at (location, "too few template-parameter-lists");
19545       return false;
19546     }
19547   /* Otherwise, there are too many template parameter lists.  We have
19548      something like:
19549
19550      template <class T> template <class U> void S::f();  */
19551   error_at (location, "too many template-parameter-lists");
19552   return false;
19553 }
19554
19555 /* Parse an optional `::' token indicating that the following name is
19556    from the global namespace.  If so, PARSER->SCOPE is set to the
19557    GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
19558    unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
19559    Returns the new value of PARSER->SCOPE, if the `::' token is
19560    present, and NULL_TREE otherwise.  */
19561
19562 static tree
19563 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
19564 {
19565   cp_token *token;
19566
19567   /* Peek at the next token.  */
19568   token = cp_lexer_peek_token (parser->lexer);
19569   /* If we're looking at a `::' token then we're starting from the
19570      global namespace, not our current location.  */
19571   if (token->type == CPP_SCOPE)
19572     {
19573       /* Consume the `::' token.  */
19574       cp_lexer_consume_token (parser->lexer);
19575       /* Set the SCOPE so that we know where to start the lookup.  */
19576       parser->scope = global_namespace;
19577       parser->qualifying_scope = global_namespace;
19578       parser->object_scope = NULL_TREE;
19579
19580       return parser->scope;
19581     }
19582   else if (!current_scope_valid_p)
19583     {
19584       parser->scope = NULL_TREE;
19585       parser->qualifying_scope = NULL_TREE;
19586       parser->object_scope = NULL_TREE;
19587     }
19588
19589   return NULL_TREE;
19590 }
19591
19592 /* Returns TRUE if the upcoming token sequence is the start of a
19593    constructor declarator.  If FRIEND_P is true, the declarator is
19594    preceded by the `friend' specifier.  */
19595
19596 static bool
19597 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
19598 {
19599   bool constructor_p;
19600   tree nested_name_specifier;
19601   cp_token *next_token;
19602
19603   /* The common case is that this is not a constructor declarator, so
19604      try to avoid doing lots of work if at all possible.  It's not
19605      valid declare a constructor at function scope.  */
19606   if (parser->in_function_body)
19607     return false;
19608   /* And only certain tokens can begin a constructor declarator.  */
19609   next_token = cp_lexer_peek_token (parser->lexer);
19610   if (next_token->type != CPP_NAME
19611       && next_token->type != CPP_SCOPE
19612       && next_token->type != CPP_NESTED_NAME_SPECIFIER
19613       && next_token->type != CPP_TEMPLATE_ID)
19614     return false;
19615
19616   /* Parse tentatively; we are going to roll back all of the tokens
19617      consumed here.  */
19618   cp_parser_parse_tentatively (parser);
19619   /* Assume that we are looking at a constructor declarator.  */
19620   constructor_p = true;
19621
19622   /* Look for the optional `::' operator.  */
19623   cp_parser_global_scope_opt (parser,
19624                               /*current_scope_valid_p=*/false);
19625   /* Look for the nested-name-specifier.  */
19626   nested_name_specifier
19627     = (cp_parser_nested_name_specifier_opt (parser,
19628                                             /*typename_keyword_p=*/false,
19629                                             /*check_dependency_p=*/false,
19630                                             /*type_p=*/false,
19631                                             /*is_declaration=*/false));
19632   /* Outside of a class-specifier, there must be a
19633      nested-name-specifier.  */
19634   if (!nested_name_specifier &&
19635       (!at_class_scope_p () || !TYPE_BEING_DEFINED (current_class_type)
19636        || friend_p))
19637     constructor_p = false;
19638   else if (nested_name_specifier == error_mark_node)
19639     constructor_p = false;
19640
19641   /* If we have a class scope, this is easy; DR 147 says that S::S always
19642      names the constructor, and no other qualified name could.  */
19643   if (constructor_p && nested_name_specifier
19644       && CLASS_TYPE_P (nested_name_specifier))
19645     {
19646       tree id = cp_parser_unqualified_id (parser,
19647                                           /*template_keyword_p=*/false,
19648                                           /*check_dependency_p=*/false,
19649                                           /*declarator_p=*/true,
19650                                           /*optional_p=*/false);
19651       if (is_overloaded_fn (id))
19652         id = DECL_NAME (get_first_fn (id));
19653       if (!constructor_name_p (id, nested_name_specifier))
19654         constructor_p = false;
19655     }
19656   /* If we still think that this might be a constructor-declarator,
19657      look for a class-name.  */
19658   else if (constructor_p)
19659     {
19660       /* If we have:
19661
19662            template <typename T> struct S {
19663              S();
19664            };
19665
19666          we must recognize that the nested `S' names a class.  */
19667       tree type_decl;
19668       type_decl = cp_parser_class_name (parser,
19669                                         /*typename_keyword_p=*/false,
19670                                         /*template_keyword_p=*/false,
19671                                         none_type,
19672                                         /*check_dependency_p=*/false,
19673                                         /*class_head_p=*/false,
19674                                         /*is_declaration=*/false);
19675       /* If there was no class-name, then this is not a constructor.  */
19676       constructor_p = !cp_parser_error_occurred (parser);
19677
19678       /* If we're still considering a constructor, we have to see a `(',
19679          to begin the parameter-declaration-clause, followed by either a
19680          `)', an `...', or a decl-specifier.  We need to check for a
19681          type-specifier to avoid being fooled into thinking that:
19682
19683            S (f) (int);
19684
19685          is a constructor.  (It is actually a function named `f' that
19686          takes one parameter (of type `int') and returns a value of type
19687          `S'.  */
19688       if (constructor_p
19689           && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
19690         constructor_p = false;
19691
19692       if (constructor_p
19693           && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
19694           && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
19695           /* A parameter declaration begins with a decl-specifier,
19696              which is either the "attribute" keyword, a storage class
19697              specifier, or (usually) a type-specifier.  */
19698           && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
19699         {
19700           tree type;
19701           tree pushed_scope = NULL_TREE;
19702           unsigned saved_num_template_parameter_lists;
19703
19704           /* Names appearing in the type-specifier should be looked up
19705              in the scope of the class.  */
19706           if (current_class_type)
19707             type = NULL_TREE;
19708           else
19709             {
19710               type = TREE_TYPE (type_decl);
19711               if (TREE_CODE (type) == TYPENAME_TYPE)
19712                 {
19713                   type = resolve_typename_type (type,
19714                                                 /*only_current_p=*/false);
19715                   if (TREE_CODE (type) == TYPENAME_TYPE)
19716                     {
19717                       cp_parser_abort_tentative_parse (parser);
19718                       return false;
19719                     }
19720                 }
19721               pushed_scope = push_scope (type);
19722             }
19723
19724           /* Inside the constructor parameter list, surrounding
19725              template-parameter-lists do not apply.  */
19726           saved_num_template_parameter_lists
19727             = parser->num_template_parameter_lists;
19728           parser->num_template_parameter_lists = 0;
19729
19730           /* Look for the type-specifier.  */
19731           cp_parser_type_specifier (parser,
19732                                     CP_PARSER_FLAGS_NONE,
19733                                     /*decl_specs=*/NULL,
19734                                     /*is_declarator=*/true,
19735                                     /*declares_class_or_enum=*/NULL,
19736                                     /*is_cv_qualifier=*/NULL);
19737
19738           parser->num_template_parameter_lists
19739             = saved_num_template_parameter_lists;
19740
19741           /* Leave the scope of the class.  */
19742           if (pushed_scope)
19743             pop_scope (pushed_scope);
19744
19745           constructor_p = !cp_parser_error_occurred (parser);
19746         }
19747     }
19748
19749   /* We did not really want to consume any tokens.  */
19750   cp_parser_abort_tentative_parse (parser);
19751
19752   return constructor_p;
19753 }
19754
19755 /* Parse the definition of the function given by the DECL_SPECIFIERS,
19756    ATTRIBUTES, and DECLARATOR.  The access checks have been deferred;
19757    they must be performed once we are in the scope of the function.
19758
19759    Returns the function defined.  */
19760
19761 static tree
19762 cp_parser_function_definition_from_specifiers_and_declarator
19763   (cp_parser* parser,
19764    cp_decl_specifier_seq *decl_specifiers,
19765    tree attributes,
19766    const cp_declarator *declarator)
19767 {
19768   tree fn;
19769   bool success_p;
19770
19771   /* Begin the function-definition.  */
19772   success_p = start_function (decl_specifiers, declarator, attributes);
19773
19774   /* The things we're about to see are not directly qualified by any
19775      template headers we've seen thus far.  */
19776   reset_specialization ();
19777
19778   /* If there were names looked up in the decl-specifier-seq that we
19779      did not check, check them now.  We must wait until we are in the
19780      scope of the function to perform the checks, since the function
19781      might be a friend.  */
19782   perform_deferred_access_checks ();
19783
19784   if (!success_p)
19785     {
19786       /* Skip the entire function.  */
19787       cp_parser_skip_to_end_of_block_or_statement (parser);
19788       fn = error_mark_node;
19789     }
19790   else if (DECL_INITIAL (current_function_decl) != error_mark_node)
19791     {
19792       /* Seen already, skip it.  An error message has already been output.  */
19793       cp_parser_skip_to_end_of_block_or_statement (parser);
19794       fn = current_function_decl;
19795       current_function_decl = NULL_TREE;
19796       /* If this is a function from a class, pop the nested class.  */
19797       if (current_class_name)
19798         pop_nested_class ();
19799     }
19800   else
19801     {
19802       timevar_id_t tv;
19803       if (DECL_DECLARED_INLINE_P (current_function_decl))
19804         tv = TV_PARSE_INLINE;
19805       else
19806         tv = TV_PARSE_FUNC;
19807       timevar_push (tv);
19808       fn = cp_parser_function_definition_after_declarator (parser,
19809                                                          /*inline_p=*/false);
19810       timevar_pop (tv);
19811     }
19812
19813   return fn;
19814 }
19815
19816 /* Parse the part of a function-definition that follows the
19817    declarator.  INLINE_P is TRUE iff this function is an inline
19818    function defined within a class-specifier.
19819
19820    Returns the function defined.  */
19821
19822 static tree
19823 cp_parser_function_definition_after_declarator (cp_parser* parser,
19824                                                 bool inline_p)
19825 {
19826   tree fn;
19827   bool ctor_initializer_p = false;
19828   bool saved_in_unbraced_linkage_specification_p;
19829   bool saved_in_function_body;
19830   unsigned saved_num_template_parameter_lists;
19831   cp_token *token;
19832
19833   saved_in_function_body = parser->in_function_body;
19834   parser->in_function_body = true;
19835   /* If the next token is `return', then the code may be trying to
19836      make use of the "named return value" extension that G++ used to
19837      support.  */
19838   token = cp_lexer_peek_token (parser->lexer);
19839   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
19840     {
19841       /* Consume the `return' keyword.  */
19842       cp_lexer_consume_token (parser->lexer);
19843       /* Look for the identifier that indicates what value is to be
19844          returned.  */
19845       cp_parser_identifier (parser);
19846       /* Issue an error message.  */
19847       error_at (token->location,
19848                 "named return values are no longer supported");
19849       /* Skip tokens until we reach the start of the function body.  */
19850       while (true)
19851         {
19852           cp_token *token = cp_lexer_peek_token (parser->lexer);
19853           if (token->type == CPP_OPEN_BRACE
19854               || token->type == CPP_EOF
19855               || token->type == CPP_PRAGMA_EOL)
19856             break;
19857           cp_lexer_consume_token (parser->lexer);
19858         }
19859     }
19860   /* The `extern' in `extern "C" void f () { ... }' does not apply to
19861      anything declared inside `f'.  */
19862   saved_in_unbraced_linkage_specification_p
19863     = parser->in_unbraced_linkage_specification_p;
19864   parser->in_unbraced_linkage_specification_p = false;
19865   /* Inside the function, surrounding template-parameter-lists do not
19866      apply.  */
19867   saved_num_template_parameter_lists
19868     = parser->num_template_parameter_lists;
19869   parser->num_template_parameter_lists = 0;
19870
19871   start_lambda_scope (current_function_decl);
19872
19873   /* If the next token is `try', then we are looking at a
19874      function-try-block.  */
19875   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
19876     ctor_initializer_p = cp_parser_function_try_block (parser);
19877   /* A function-try-block includes the function-body, so we only do
19878      this next part if we're not processing a function-try-block.  */
19879   else
19880     ctor_initializer_p
19881       = cp_parser_ctor_initializer_opt_and_function_body (parser);
19882
19883   finish_lambda_scope ();
19884
19885   /* Finish the function.  */
19886   fn = finish_function ((ctor_initializer_p ? 1 : 0) |
19887                         (inline_p ? 2 : 0));
19888   /* Generate code for it, if necessary.  */
19889   expand_or_defer_fn (fn);
19890   /* Restore the saved values.  */
19891   parser->in_unbraced_linkage_specification_p
19892     = saved_in_unbraced_linkage_specification_p;
19893   parser->num_template_parameter_lists
19894     = saved_num_template_parameter_lists;
19895   parser->in_function_body = saved_in_function_body;
19896
19897   return fn;
19898 }
19899
19900 /* Parse a template-declaration, assuming that the `export' (and
19901    `extern') keywords, if present, has already been scanned.  MEMBER_P
19902    is as for cp_parser_template_declaration.  */
19903
19904 static void
19905 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
19906 {
19907   tree decl = NULL_TREE;
19908   VEC (deferred_access_check,gc) *checks;
19909   tree parameter_list;
19910   bool friend_p = false;
19911   bool need_lang_pop;
19912   cp_token *token;
19913
19914   /* Look for the `template' keyword.  */
19915   token = cp_lexer_peek_token (parser->lexer);
19916   if (!cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE))
19917     return;
19918
19919   /* And the `<'.  */
19920   if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
19921     return;
19922   if (at_class_scope_p () && current_function_decl)
19923     {
19924       /* 14.5.2.2 [temp.mem]
19925
19926          A local class shall not have member templates.  */
19927       error_at (token->location,
19928                 "invalid declaration of member template in local class");
19929       cp_parser_skip_to_end_of_block_or_statement (parser);
19930       return;
19931     }
19932   /* [temp]
19933
19934      A template ... shall not have C linkage.  */
19935   if (current_lang_name == lang_name_c)
19936     {
19937       error_at (token->location, "template with C linkage");
19938       /* Give it C++ linkage to avoid confusing other parts of the
19939          front end.  */
19940       push_lang_context (lang_name_cplusplus);
19941       need_lang_pop = true;
19942     }
19943   else
19944     need_lang_pop = false;
19945
19946   /* We cannot perform access checks on the template parameter
19947      declarations until we know what is being declared, just as we
19948      cannot check the decl-specifier list.  */
19949   push_deferring_access_checks (dk_deferred);
19950
19951   /* If the next token is `>', then we have an invalid
19952      specialization.  Rather than complain about an invalid template
19953      parameter, issue an error message here.  */
19954   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
19955     {
19956       cp_parser_error (parser, "invalid explicit specialization");
19957       begin_specialization ();
19958       parameter_list = NULL_TREE;
19959     }
19960   else
19961     {
19962       /* Parse the template parameters.  */
19963       parameter_list = cp_parser_template_parameter_list (parser);
19964       fixup_template_parms ();
19965     }
19966
19967   /* Get the deferred access checks from the parameter list.  These
19968      will be checked once we know what is being declared, as for a
19969      member template the checks must be performed in the scope of the
19970      class containing the member.  */
19971   checks = get_deferred_access_checks ();
19972
19973   /* Look for the `>'.  */
19974   cp_parser_skip_to_end_of_template_parameter_list (parser);
19975   /* We just processed one more parameter list.  */
19976   ++parser->num_template_parameter_lists;
19977   /* If the next token is `template', there are more template
19978      parameters.  */
19979   if (cp_lexer_next_token_is_keyword (parser->lexer,
19980                                       RID_TEMPLATE))
19981     cp_parser_template_declaration_after_export (parser, member_p);
19982   else
19983     {
19984       /* There are no access checks when parsing a template, as we do not
19985          know if a specialization will be a friend.  */
19986       push_deferring_access_checks (dk_no_check);
19987       token = cp_lexer_peek_token (parser->lexer);
19988       decl = cp_parser_single_declaration (parser,
19989                                            checks,
19990                                            member_p,
19991                                            /*explicit_specialization_p=*/false,
19992                                            &friend_p);
19993       pop_deferring_access_checks ();
19994
19995       /* If this is a member template declaration, let the front
19996          end know.  */
19997       if (member_p && !friend_p && decl)
19998         {
19999           if (TREE_CODE (decl) == TYPE_DECL)
20000             cp_parser_check_access_in_redeclaration (decl, token->location);
20001
20002           decl = finish_member_template_decl (decl);
20003         }
20004       else if (friend_p && decl && TREE_CODE (decl) == TYPE_DECL)
20005         make_friend_class (current_class_type, TREE_TYPE (decl),
20006                            /*complain=*/true);
20007     }
20008   /* We are done with the current parameter list.  */
20009   --parser->num_template_parameter_lists;
20010
20011   pop_deferring_access_checks ();
20012
20013   /* Finish up.  */
20014   finish_template_decl (parameter_list);
20015
20016   /* Register member declarations.  */
20017   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
20018     finish_member_declaration (decl);
20019   /* For the erroneous case of a template with C linkage, we pushed an
20020      implicit C++ linkage scope; exit that scope now.  */
20021   if (need_lang_pop)
20022     pop_lang_context ();
20023   /* If DECL is a function template, we must return to parse it later.
20024      (Even though there is no definition, there might be default
20025      arguments that need handling.)  */
20026   if (member_p && decl
20027       && (TREE_CODE (decl) == FUNCTION_DECL
20028           || DECL_FUNCTION_TEMPLATE_P (decl)))
20029     VEC_safe_push (tree, gc, unparsed_funs_with_definitions, decl);
20030 }
20031
20032 /* Perform the deferred access checks from a template-parameter-list.
20033    CHECKS is a TREE_LIST of access checks, as returned by
20034    get_deferred_access_checks.  */
20035
20036 static void
20037 cp_parser_perform_template_parameter_access_checks (VEC (deferred_access_check,gc)* checks)
20038 {
20039   ++processing_template_parmlist;
20040   perform_access_checks (checks);
20041   --processing_template_parmlist;
20042 }
20043
20044 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
20045    `function-definition' sequence.  MEMBER_P is true, this declaration
20046    appears in a class scope.
20047
20048    Returns the DECL for the declared entity.  If FRIEND_P is non-NULL,
20049    *FRIEND_P is set to TRUE iff the declaration is a friend.  */
20050
20051 static tree
20052 cp_parser_single_declaration (cp_parser* parser,
20053                               VEC (deferred_access_check,gc)* checks,
20054                               bool member_p,
20055                               bool explicit_specialization_p,
20056                               bool* friend_p)
20057 {
20058   int declares_class_or_enum;
20059   tree decl = NULL_TREE;
20060   cp_decl_specifier_seq decl_specifiers;
20061   bool function_definition_p = false;
20062   cp_token *decl_spec_token_start;
20063
20064   /* This function is only used when processing a template
20065      declaration.  */
20066   gcc_assert (innermost_scope_kind () == sk_template_parms
20067               || innermost_scope_kind () == sk_template_spec);
20068
20069   /* Defer access checks until we know what is being declared.  */
20070   push_deferring_access_checks (dk_deferred);
20071
20072   /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
20073      alternative.  */
20074   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
20075   cp_parser_decl_specifier_seq (parser,
20076                                 CP_PARSER_FLAGS_OPTIONAL,
20077                                 &decl_specifiers,
20078                                 &declares_class_or_enum);
20079   if (friend_p)
20080     *friend_p = cp_parser_friend_p (&decl_specifiers);
20081
20082   /* There are no template typedefs.  */
20083   if (decl_specifiers.specs[(int) ds_typedef])
20084     {
20085       error_at (decl_spec_token_start->location,
20086                 "template declaration of %<typedef%>");
20087       decl = error_mark_node;
20088     }
20089
20090   /* Gather up the access checks that occurred the
20091      decl-specifier-seq.  */
20092   stop_deferring_access_checks ();
20093
20094   /* Check for the declaration of a template class.  */
20095   if (declares_class_or_enum)
20096     {
20097       if (cp_parser_declares_only_class_p (parser))
20098         {
20099           decl = shadow_tag (&decl_specifiers);
20100
20101           /* In this case:
20102
20103                struct C {
20104                  friend template <typename T> struct A<T>::B;
20105                };
20106
20107              A<T>::B will be represented by a TYPENAME_TYPE, and
20108              therefore not recognized by shadow_tag.  */
20109           if (friend_p && *friend_p
20110               && !decl
20111               && decl_specifiers.type
20112               && TYPE_P (decl_specifiers.type))
20113             decl = decl_specifiers.type;
20114
20115           if (decl && decl != error_mark_node)
20116             decl = TYPE_NAME (decl);
20117           else
20118             decl = error_mark_node;
20119
20120           /* Perform access checks for template parameters.  */
20121           cp_parser_perform_template_parameter_access_checks (checks);
20122         }
20123     }
20124
20125   /* Complain about missing 'typename' or other invalid type names.  */
20126   if (!decl_specifiers.any_type_specifiers_p
20127       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
20128     {
20129       /* cp_parser_parse_and_diagnose_invalid_type_name calls
20130          cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
20131          the rest of this declaration.  */
20132       decl = error_mark_node;
20133       goto out;
20134     }
20135
20136   /* If it's not a template class, try for a template function.  If
20137      the next token is a `;', then this declaration does not declare
20138      anything.  But, if there were errors in the decl-specifiers, then
20139      the error might well have come from an attempted class-specifier.
20140      In that case, there's no need to warn about a missing declarator.  */
20141   if (!decl
20142       && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
20143           || decl_specifiers.type != error_mark_node))
20144     {
20145       decl = cp_parser_init_declarator (parser,
20146                                         &decl_specifiers,
20147                                         checks,
20148                                         /*function_definition_allowed_p=*/true,
20149                                         member_p,
20150                                         declares_class_or_enum,
20151                                         &function_definition_p,
20152                                         NULL);
20153
20154     /* 7.1.1-1 [dcl.stc]
20155
20156        A storage-class-specifier shall not be specified in an explicit
20157        specialization...  */
20158     if (decl
20159         && explicit_specialization_p
20160         && decl_specifiers.storage_class != sc_none)
20161       {
20162         error_at (decl_spec_token_start->location,
20163                   "explicit template specialization cannot have a storage class");
20164         decl = error_mark_node;
20165       }
20166     }
20167
20168   /* Look for a trailing `;' after the declaration.  */
20169   if (!function_definition_p
20170       && (decl == error_mark_node
20171           || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
20172     cp_parser_skip_to_end_of_block_or_statement (parser);
20173
20174  out:
20175   pop_deferring_access_checks ();
20176
20177   /* Clear any current qualification; whatever comes next is the start
20178      of something new.  */
20179   parser->scope = NULL_TREE;
20180   parser->qualifying_scope = NULL_TREE;
20181   parser->object_scope = NULL_TREE;
20182
20183   return decl;
20184 }
20185
20186 /* Parse a cast-expression that is not the operand of a unary "&".  */
20187
20188 static tree
20189 cp_parser_simple_cast_expression (cp_parser *parser)
20190 {
20191   return cp_parser_cast_expression (parser, /*address_p=*/false,
20192                                     /*cast_p=*/false, NULL);
20193 }
20194
20195 /* Parse a functional cast to TYPE.  Returns an expression
20196    representing the cast.  */
20197
20198 static tree
20199 cp_parser_functional_cast (cp_parser* parser, tree type)
20200 {
20201   VEC(tree,gc) *vec;
20202   tree expression_list;
20203   tree cast;
20204   bool nonconst_p;
20205
20206   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
20207     {
20208       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
20209       expression_list = cp_parser_braced_list (parser, &nonconst_p);
20210       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
20211       if (TREE_CODE (type) == TYPE_DECL)
20212         type = TREE_TYPE (type);
20213       return finish_compound_literal (type, expression_list,
20214                                       tf_warning_or_error);
20215     }
20216
20217
20218   vec = cp_parser_parenthesized_expression_list (parser, non_attr,
20219                                                  /*cast_p=*/true,
20220                                                  /*allow_expansion_p=*/true,
20221                                                  /*non_constant_p=*/NULL);
20222   if (vec == NULL)
20223     expression_list = error_mark_node;
20224   else
20225     {
20226       expression_list = build_tree_list_vec (vec);
20227       release_tree_vector (vec);
20228     }
20229
20230   cast = build_functional_cast (type, expression_list,
20231                                 tf_warning_or_error);
20232   /* [expr.const]/1: In an integral constant expression "only type
20233      conversions to integral or enumeration type can be used".  */
20234   if (TREE_CODE (type) == TYPE_DECL)
20235     type = TREE_TYPE (type);
20236   if (cast != error_mark_node
20237       && !cast_valid_in_integral_constant_expression_p (type)
20238       && cp_parser_non_integral_constant_expression (parser,
20239                                                      NIC_CONSTRUCTOR))
20240     return error_mark_node;
20241   return cast;
20242 }
20243
20244 /* Save the tokens that make up the body of a member function defined
20245    in a class-specifier.  The DECL_SPECIFIERS and DECLARATOR have
20246    already been parsed.  The ATTRIBUTES are any GNU "__attribute__"
20247    specifiers applied to the declaration.  Returns the FUNCTION_DECL
20248    for the member function.  */
20249
20250 static tree
20251 cp_parser_save_member_function_body (cp_parser* parser,
20252                                      cp_decl_specifier_seq *decl_specifiers,
20253                                      cp_declarator *declarator,
20254                                      tree attributes)
20255 {
20256   cp_token *first;
20257   cp_token *last;
20258   tree fn;
20259
20260   /* Create the FUNCTION_DECL.  */
20261   fn = grokmethod (decl_specifiers, declarator, attributes);
20262   /* If something went badly wrong, bail out now.  */
20263   if (fn == error_mark_node)
20264     {
20265       /* If there's a function-body, skip it.  */
20266       if (cp_parser_token_starts_function_definition_p
20267           (cp_lexer_peek_token (parser->lexer)))
20268         cp_parser_skip_to_end_of_block_or_statement (parser);
20269       return error_mark_node;
20270     }
20271
20272   /* Remember it, if there default args to post process.  */
20273   cp_parser_save_default_args (parser, fn);
20274
20275   /* Save away the tokens that make up the body of the
20276      function.  */
20277   first = parser->lexer->next_token;
20278   /* We can have braced-init-list mem-initializers before the fn body.  */
20279   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
20280     {
20281       cp_lexer_consume_token (parser->lexer);
20282       while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
20283              && cp_lexer_next_token_is_not_keyword (parser->lexer, RID_TRY))
20284         {
20285           /* cache_group will stop after an un-nested { } pair, too.  */
20286           if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
20287             break;
20288
20289           /* variadic mem-inits have ... after the ')'.  */
20290           if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20291             cp_lexer_consume_token (parser->lexer);
20292         }
20293     }
20294   cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20295   /* Handle function try blocks.  */
20296   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
20297     cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20298   last = parser->lexer->next_token;
20299
20300   /* Save away the inline definition; we will process it when the
20301      class is complete.  */
20302   DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
20303   DECL_PENDING_INLINE_P (fn) = 1;
20304
20305   /* We need to know that this was defined in the class, so that
20306      friend templates are handled correctly.  */
20307   DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
20308
20309   /* Add FN to the queue of functions to be parsed later.  */
20310   VEC_safe_push (tree, gc, unparsed_funs_with_definitions, fn);
20311
20312   return fn;
20313 }
20314
20315 /* Parse a template-argument-list, as well as the trailing ">" (but
20316    not the opening ">").  See cp_parser_template_argument_list for the
20317    return value.  */
20318
20319 static tree
20320 cp_parser_enclosed_template_argument_list (cp_parser* parser)
20321 {
20322   tree arguments;
20323   tree saved_scope;
20324   tree saved_qualifying_scope;
20325   tree saved_object_scope;
20326   bool saved_greater_than_is_operator_p;
20327   int saved_unevaluated_operand;
20328   int saved_inhibit_evaluation_warnings;
20329
20330   /* [temp.names]
20331
20332      When parsing a template-id, the first non-nested `>' is taken as
20333      the end of the template-argument-list rather than a greater-than
20334      operator.  */
20335   saved_greater_than_is_operator_p
20336     = parser->greater_than_is_operator_p;
20337   parser->greater_than_is_operator_p = false;
20338   /* Parsing the argument list may modify SCOPE, so we save it
20339      here.  */
20340   saved_scope = parser->scope;
20341   saved_qualifying_scope = parser->qualifying_scope;
20342   saved_object_scope = parser->object_scope;
20343   /* We need to evaluate the template arguments, even though this
20344      template-id may be nested within a "sizeof".  */
20345   saved_unevaluated_operand = cp_unevaluated_operand;
20346   cp_unevaluated_operand = 0;
20347   saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
20348   c_inhibit_evaluation_warnings = 0;
20349   /* Parse the template-argument-list itself.  */
20350   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
20351       || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20352     arguments = NULL_TREE;
20353   else
20354     arguments = cp_parser_template_argument_list (parser);
20355   /* Look for the `>' that ends the template-argument-list. If we find
20356      a '>>' instead, it's probably just a typo.  */
20357   if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20358     {
20359       if (cxx_dialect != cxx98)
20360         {
20361           /* In C++0x, a `>>' in a template argument list or cast
20362              expression is considered to be two separate `>'
20363              tokens. So, change the current token to a `>', but don't
20364              consume it: it will be consumed later when the outer
20365              template argument list (or cast expression) is parsed.
20366              Note that this replacement of `>' for `>>' is necessary
20367              even if we are parsing tentatively: in the tentative
20368              case, after calling
20369              cp_parser_enclosed_template_argument_list we will always
20370              throw away all of the template arguments and the first
20371              closing `>', either because the template argument list
20372              was erroneous or because we are replacing those tokens
20373              with a CPP_TEMPLATE_ID token.  The second `>' (which will
20374              not have been thrown away) is needed either to close an
20375              outer template argument list or to complete a new-style
20376              cast.  */
20377           cp_token *token = cp_lexer_peek_token (parser->lexer);
20378           token->type = CPP_GREATER;
20379         }
20380       else if (!saved_greater_than_is_operator_p)
20381         {
20382           /* If we're in a nested template argument list, the '>>' has
20383             to be a typo for '> >'. We emit the error message, but we
20384             continue parsing and we push a '>' as next token, so that
20385             the argument list will be parsed correctly.  Note that the
20386             global source location is still on the token before the
20387             '>>', so we need to say explicitly where we want it.  */
20388           cp_token *token = cp_lexer_peek_token (parser->lexer);
20389           error_at (token->location, "%<>>%> should be %<> >%> "
20390                     "within a nested template argument list");
20391
20392           token->type = CPP_GREATER;
20393         }
20394       else
20395         {
20396           /* If this is not a nested template argument list, the '>>'
20397             is a typo for '>'. Emit an error message and continue.
20398             Same deal about the token location, but here we can get it
20399             right by consuming the '>>' before issuing the diagnostic.  */
20400           cp_token *token = cp_lexer_consume_token (parser->lexer);
20401           error_at (token->location,
20402                     "spurious %<>>%>, use %<>%> to terminate "
20403                     "a template argument list");
20404         }
20405     }
20406   else
20407     cp_parser_skip_to_end_of_template_parameter_list (parser);
20408   /* The `>' token might be a greater-than operator again now.  */
20409   parser->greater_than_is_operator_p
20410     = saved_greater_than_is_operator_p;
20411   /* Restore the SAVED_SCOPE.  */
20412   parser->scope = saved_scope;
20413   parser->qualifying_scope = saved_qualifying_scope;
20414   parser->object_scope = saved_object_scope;
20415   cp_unevaluated_operand = saved_unevaluated_operand;
20416   c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
20417
20418   return arguments;
20419 }
20420
20421 /* MEMBER_FUNCTION is a member function, or a friend.  If default
20422    arguments, or the body of the function have not yet been parsed,
20423    parse them now.  */
20424
20425 static void
20426 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
20427 {
20428   timevar_push (TV_PARSE_INMETH);
20429   /* If this member is a template, get the underlying
20430      FUNCTION_DECL.  */
20431   if (DECL_FUNCTION_TEMPLATE_P (member_function))
20432     member_function = DECL_TEMPLATE_RESULT (member_function);
20433
20434   /* There should not be any class definitions in progress at this
20435      point; the bodies of members are only parsed outside of all class
20436      definitions.  */
20437   gcc_assert (parser->num_classes_being_defined == 0);
20438   /* While we're parsing the member functions we might encounter more
20439      classes.  We want to handle them right away, but we don't want
20440      them getting mixed up with functions that are currently in the
20441      queue.  */
20442   push_unparsed_function_queues (parser);
20443
20444   /* Make sure that any template parameters are in scope.  */
20445   maybe_begin_member_template_processing (member_function);
20446
20447   /* If the body of the function has not yet been parsed, parse it
20448      now.  */
20449   if (DECL_PENDING_INLINE_P (member_function))
20450     {
20451       tree function_scope;
20452       cp_token_cache *tokens;
20453
20454       /* The function is no longer pending; we are processing it.  */
20455       tokens = DECL_PENDING_INLINE_INFO (member_function);
20456       DECL_PENDING_INLINE_INFO (member_function) = NULL;
20457       DECL_PENDING_INLINE_P (member_function) = 0;
20458
20459       /* If this is a local class, enter the scope of the containing
20460          function.  */
20461       function_scope = current_function_decl;
20462       if (function_scope)
20463         push_function_context ();
20464
20465       /* Push the body of the function onto the lexer stack.  */
20466       cp_parser_push_lexer_for_tokens (parser, tokens);
20467
20468       /* Let the front end know that we going to be defining this
20469          function.  */
20470       start_preparsed_function (member_function, NULL_TREE,
20471                                 SF_PRE_PARSED | SF_INCLASS_INLINE);
20472
20473       /* Don't do access checking if it is a templated function.  */
20474       if (processing_template_decl)
20475         push_deferring_access_checks (dk_no_check);
20476
20477       /* Now, parse the body of the function.  */
20478       cp_parser_function_definition_after_declarator (parser,
20479                                                       /*inline_p=*/true);
20480
20481       if (processing_template_decl)
20482         pop_deferring_access_checks ();
20483
20484       /* Leave the scope of the containing function.  */
20485       if (function_scope)
20486         pop_function_context ();
20487       cp_parser_pop_lexer (parser);
20488     }
20489
20490   /* Remove any template parameters from the symbol table.  */
20491   maybe_end_member_template_processing ();
20492
20493   /* Restore the queue.  */
20494   pop_unparsed_function_queues (parser);
20495   timevar_pop (TV_PARSE_INMETH);
20496 }
20497
20498 /* If DECL contains any default args, remember it on the unparsed
20499    functions queue.  */
20500
20501 static void
20502 cp_parser_save_default_args (cp_parser* parser, tree decl)
20503 {
20504   tree probe;
20505
20506   for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
20507        probe;
20508        probe = TREE_CHAIN (probe))
20509     if (TREE_PURPOSE (probe))
20510       {
20511         cp_default_arg_entry *entry
20512           = VEC_safe_push (cp_default_arg_entry, gc,
20513                            unparsed_funs_with_default_args, NULL);
20514         entry->class_type = current_class_type;
20515         entry->decl = decl;
20516         break;
20517       }
20518 }
20519
20520 /* FN is a FUNCTION_DECL which may contains a parameter with an
20521    unparsed DEFAULT_ARG.  Parse the default args now.  This function
20522    assumes that the current scope is the scope in which the default
20523    argument should be processed.  */
20524
20525 static void
20526 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
20527 {
20528   bool saved_local_variables_forbidden_p;
20529   tree parm, parmdecl;
20530
20531   /* While we're parsing the default args, we might (due to the
20532      statement expression extension) encounter more classes.  We want
20533      to handle them right away, but we don't want them getting mixed
20534      up with default args that are currently in the queue.  */
20535   push_unparsed_function_queues (parser);
20536
20537   /* Local variable names (and the `this' keyword) may not appear
20538      in a default argument.  */
20539   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
20540   parser->local_variables_forbidden_p = true;
20541
20542   push_defarg_context (fn);
20543
20544   for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
20545          parmdecl = DECL_ARGUMENTS (fn);
20546        parm && parm != void_list_node;
20547        parm = TREE_CHAIN (parm),
20548          parmdecl = DECL_CHAIN (parmdecl))
20549     {
20550       cp_token_cache *tokens;
20551       tree default_arg = TREE_PURPOSE (parm);
20552       tree parsed_arg;
20553       VEC(tree,gc) *insts;
20554       tree copy;
20555       unsigned ix;
20556
20557       if (!default_arg)
20558         continue;
20559
20560       if (TREE_CODE (default_arg) != DEFAULT_ARG)
20561         /* This can happen for a friend declaration for a function
20562            already declared with default arguments.  */
20563         continue;
20564
20565        /* Push the saved tokens for the default argument onto the parser's
20566           lexer stack.  */
20567       tokens = DEFARG_TOKENS (default_arg);
20568       cp_parser_push_lexer_for_tokens (parser, tokens);
20569
20570       start_lambda_scope (parmdecl);
20571
20572       /* Parse the assignment-expression.  */
20573       parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
20574       if (parsed_arg == error_mark_node)
20575         {
20576           cp_parser_pop_lexer (parser);
20577           continue;
20578         }
20579
20580       if (!processing_template_decl)
20581         parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg);
20582
20583       TREE_PURPOSE (parm) = parsed_arg;
20584
20585       /* Update any instantiations we've already created.  */
20586       for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
20587            VEC_iterate (tree, insts, ix, copy); ix++)
20588         TREE_PURPOSE (copy) = parsed_arg;
20589
20590       finish_lambda_scope ();
20591
20592       /* If the token stream has not been completely used up, then
20593          there was extra junk after the end of the default
20594          argument.  */
20595       if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
20596         cp_parser_error (parser, "expected %<,%>");
20597
20598       /* Revert to the main lexer.  */
20599       cp_parser_pop_lexer (parser);
20600     }
20601
20602   pop_defarg_context ();
20603
20604   /* Make sure no default arg is missing.  */
20605   check_default_args (fn);
20606
20607   /* Restore the state of local_variables_forbidden_p.  */
20608   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
20609
20610   /* Restore the queue.  */
20611   pop_unparsed_function_queues (parser);
20612 }
20613
20614 /* Parse the operand of `sizeof' (or a similar operator).  Returns
20615    either a TYPE or an expression, depending on the form of the
20616    input.  The KEYWORD indicates which kind of expression we have
20617    encountered.  */
20618
20619 static tree
20620 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
20621 {
20622   tree expr = NULL_TREE;
20623   const char *saved_message;
20624   char *tmp;
20625   bool saved_integral_constant_expression_p;
20626   bool saved_non_integral_constant_expression_p;
20627   bool pack_expansion_p = false;
20628
20629   /* Types cannot be defined in a `sizeof' expression.  Save away the
20630      old message.  */
20631   saved_message = parser->type_definition_forbidden_message;
20632   /* And create the new one.  */
20633   tmp = concat ("types may not be defined in %<",
20634                 IDENTIFIER_POINTER (ridpointers[keyword]),
20635                 "%> expressions", NULL);
20636   parser->type_definition_forbidden_message = tmp;
20637
20638   /* The restrictions on constant-expressions do not apply inside
20639      sizeof expressions.  */
20640   saved_integral_constant_expression_p
20641     = parser->integral_constant_expression_p;
20642   saved_non_integral_constant_expression_p
20643     = parser->non_integral_constant_expression_p;
20644   parser->integral_constant_expression_p = false;
20645
20646   /* If it's a `...', then we are computing the length of a parameter
20647      pack.  */
20648   if (keyword == RID_SIZEOF
20649       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20650     {
20651       /* Consume the `...'.  */
20652       cp_lexer_consume_token (parser->lexer);
20653       maybe_warn_variadic_templates ();
20654
20655       /* Note that this is an expansion.  */
20656       pack_expansion_p = true;
20657     }
20658
20659   /* Do not actually evaluate the expression.  */
20660   ++cp_unevaluated_operand;
20661   ++c_inhibit_evaluation_warnings;
20662   /* If it's a `(', then we might be looking at the type-id
20663      construction.  */
20664   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
20665     {
20666       tree type;
20667       bool saved_in_type_id_in_expr_p;
20668
20669       /* We can't be sure yet whether we're looking at a type-id or an
20670          expression.  */
20671       cp_parser_parse_tentatively (parser);
20672       /* Consume the `('.  */
20673       cp_lexer_consume_token (parser->lexer);
20674       /* Parse the type-id.  */
20675       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
20676       parser->in_type_id_in_expr_p = true;
20677       type = cp_parser_type_id (parser);
20678       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
20679       /* Now, look for the trailing `)'.  */
20680       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
20681       /* If all went well, then we're done.  */
20682       if (cp_parser_parse_definitely (parser))
20683         {
20684           cp_decl_specifier_seq decl_specs;
20685
20686           /* Build a trivial decl-specifier-seq.  */
20687           clear_decl_specs (&decl_specs);
20688           decl_specs.type = type;
20689
20690           /* Call grokdeclarator to figure out what type this is.  */
20691           expr = grokdeclarator (NULL,
20692                                  &decl_specs,
20693                                  TYPENAME,
20694                                  /*initialized=*/0,
20695                                  /*attrlist=*/NULL);
20696         }
20697     }
20698
20699   /* If the type-id production did not work out, then we must be
20700      looking at the unary-expression production.  */
20701   if (!expr)
20702     expr = cp_parser_unary_expression (parser, /*address_p=*/false,
20703                                        /*cast_p=*/false, NULL);
20704
20705   if (pack_expansion_p)
20706     /* Build a pack expansion. */
20707     expr = make_pack_expansion (expr);
20708
20709   /* Go back to evaluating expressions.  */
20710   --cp_unevaluated_operand;
20711   --c_inhibit_evaluation_warnings;
20712
20713   /* Free the message we created.  */
20714   free (tmp);
20715   /* And restore the old one.  */
20716   parser->type_definition_forbidden_message = saved_message;
20717   parser->integral_constant_expression_p
20718     = saved_integral_constant_expression_p;
20719   parser->non_integral_constant_expression_p
20720     = saved_non_integral_constant_expression_p;
20721
20722   return expr;
20723 }
20724
20725 /* If the current declaration has no declarator, return true.  */
20726
20727 static bool
20728 cp_parser_declares_only_class_p (cp_parser *parser)
20729 {
20730   /* If the next token is a `;' or a `,' then there is no
20731      declarator.  */
20732   return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
20733           || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
20734 }
20735
20736 /* Update the DECL_SPECS to reflect the storage class indicated by
20737    KEYWORD.  */
20738
20739 static void
20740 cp_parser_set_storage_class (cp_parser *parser,
20741                              cp_decl_specifier_seq *decl_specs,
20742                              enum rid keyword,
20743                              location_t location)
20744 {
20745   cp_storage_class storage_class;
20746
20747   if (parser->in_unbraced_linkage_specification_p)
20748     {
20749       error_at (location, "invalid use of %qD in linkage specification",
20750                 ridpointers[keyword]);
20751       return;
20752     }
20753   else if (decl_specs->storage_class != sc_none)
20754     {
20755       decl_specs->conflicting_specifiers_p = true;
20756       return;
20757     }
20758
20759   if ((keyword == RID_EXTERN || keyword == RID_STATIC)
20760       && decl_specs->specs[(int) ds_thread])
20761     {
20762       error_at (location, "%<__thread%> before %qD", ridpointers[keyword]);
20763       decl_specs->specs[(int) ds_thread] = 0;
20764     }
20765
20766   switch (keyword)
20767     {
20768     case RID_AUTO:
20769       storage_class = sc_auto;
20770       break;
20771     case RID_REGISTER:
20772       storage_class = sc_register;
20773       break;
20774     case RID_STATIC:
20775       storage_class = sc_static;
20776       break;
20777     case RID_EXTERN:
20778       storage_class = sc_extern;
20779       break;
20780     case RID_MUTABLE:
20781       storage_class = sc_mutable;
20782       break;
20783     default:
20784       gcc_unreachable ();
20785     }
20786   decl_specs->storage_class = storage_class;
20787
20788   /* A storage class specifier cannot be applied alongside a typedef 
20789      specifier. If there is a typedef specifier present then set 
20790      conflicting_specifiers_p which will trigger an error later
20791      on in grokdeclarator. */
20792   if (decl_specs->specs[(int)ds_typedef])
20793     decl_specs->conflicting_specifiers_p = true;
20794 }
20795
20796 /* Update the DECL_SPECS to reflect the TYPE_SPEC.  If USER_DEFINED_P
20797    is true, the type is a user-defined type; otherwise it is a
20798    built-in type specified by a keyword.  */
20799
20800 static void
20801 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
20802                               tree type_spec,
20803                               location_t location,
20804                               bool user_defined_p)
20805 {
20806   decl_specs->any_specifiers_p = true;
20807
20808   /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
20809      (with, for example, in "typedef int wchar_t;") we remember that
20810      this is what happened.  In system headers, we ignore these
20811      declarations so that G++ can work with system headers that are not
20812      C++-safe.  */
20813   if (decl_specs->specs[(int) ds_typedef]
20814       && !user_defined_p
20815       && (type_spec == boolean_type_node
20816           || type_spec == char16_type_node
20817           || type_spec == char32_type_node
20818           || type_spec == wchar_type_node)
20819       && (decl_specs->type
20820           || decl_specs->specs[(int) ds_long]
20821           || decl_specs->specs[(int) ds_short]
20822           || decl_specs->specs[(int) ds_unsigned]
20823           || decl_specs->specs[(int) ds_signed]))
20824     {
20825       decl_specs->redefined_builtin_type = type_spec;
20826       if (!decl_specs->type)
20827         {
20828           decl_specs->type = type_spec;
20829           decl_specs->user_defined_type_p = false;
20830           decl_specs->type_location = location;
20831         }
20832     }
20833   else if (decl_specs->type)
20834     decl_specs->multiple_types_p = true;
20835   else
20836     {
20837       decl_specs->type = type_spec;
20838       decl_specs->user_defined_type_p = user_defined_p;
20839       decl_specs->redefined_builtin_type = NULL_TREE;
20840       decl_specs->type_location = location;
20841     }
20842 }
20843
20844 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
20845    Returns TRUE iff `friend' appears among the DECL_SPECIFIERS.  */
20846
20847 static bool
20848 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
20849 {
20850   return decl_specifiers->specs[(int) ds_friend] != 0;
20851 }
20852
20853 /* Issue an error message indicating that TOKEN_DESC was expected.
20854    If KEYWORD is true, it indicated this function is called by
20855    cp_parser_require_keword and the required token can only be
20856    a indicated keyword. */
20857
20858 static void
20859 cp_parser_required_error (cp_parser *parser,
20860                           required_token token_desc,
20861                           bool keyword)
20862 {
20863   switch (token_desc)
20864     {
20865       case RT_NEW:
20866         cp_parser_error (parser, "expected %<new%>");
20867         return;
20868       case RT_DELETE:
20869         cp_parser_error (parser, "expected %<delete%>");
20870         return;
20871       case RT_RETURN:
20872         cp_parser_error (parser, "expected %<return%>");
20873         return;
20874       case RT_WHILE:
20875         cp_parser_error (parser, "expected %<while%>");
20876         return;
20877       case RT_EXTERN:
20878         cp_parser_error (parser, "expected %<extern%>");
20879         return;
20880       case RT_STATIC_ASSERT:
20881         cp_parser_error (parser, "expected %<static_assert%>");
20882         return;
20883       case RT_DECLTYPE:
20884         cp_parser_error (parser, "expected %<decltype%>");
20885         return;
20886       case RT_OPERATOR:
20887         cp_parser_error (parser, "expected %<operator%>");
20888         return;
20889       case RT_CLASS:
20890         cp_parser_error (parser, "expected %<class%>");
20891         return;
20892       case RT_TEMPLATE:
20893         cp_parser_error (parser, "expected %<template%>");
20894         return;
20895       case RT_NAMESPACE:
20896         cp_parser_error (parser, "expected %<namespace%>");
20897         return;
20898       case RT_USING:
20899         cp_parser_error (parser, "expected %<using%>");
20900         return;
20901       case RT_ASM:
20902         cp_parser_error (parser, "expected %<asm%>");
20903         return;
20904       case RT_TRY:
20905         cp_parser_error (parser, "expected %<try%>");
20906         return;
20907       case RT_CATCH:
20908         cp_parser_error (parser, "expected %<catch%>");
20909         return;
20910       case RT_THROW:
20911         cp_parser_error (parser, "expected %<throw%>");
20912         return;
20913       case RT_LABEL:
20914         cp_parser_error (parser, "expected %<__label__%>");
20915         return;
20916       case RT_AT_TRY:
20917         cp_parser_error (parser, "expected %<@try%>");
20918         return;
20919       case RT_AT_SYNCHRONIZED:
20920         cp_parser_error (parser, "expected %<@synchronized%>");
20921         return;
20922       case RT_AT_THROW:
20923         cp_parser_error (parser, "expected %<@throw%>");
20924         return;
20925       default:
20926         break;
20927     }
20928   if (!keyword)
20929     {
20930       switch (token_desc)
20931         {
20932           case RT_SEMICOLON:
20933             cp_parser_error (parser, "expected %<;%>");
20934             return;
20935           case RT_OPEN_PAREN:
20936             cp_parser_error (parser, "expected %<(%>");
20937             return;
20938           case RT_CLOSE_BRACE:
20939             cp_parser_error (parser, "expected %<}%>");
20940             return;
20941           case RT_OPEN_BRACE:
20942             cp_parser_error (parser, "expected %<{%>");
20943             return;
20944           case RT_CLOSE_SQUARE:
20945             cp_parser_error (parser, "expected %<]%>");
20946             return;
20947           case RT_OPEN_SQUARE:
20948             cp_parser_error (parser, "expected %<[%>");
20949             return;
20950           case RT_COMMA:
20951             cp_parser_error (parser, "expected %<,%>");
20952             return;
20953           case RT_SCOPE:
20954             cp_parser_error (parser, "expected %<::%>");
20955             return;
20956           case RT_LESS:
20957             cp_parser_error (parser, "expected %<<%>");
20958             return;
20959           case RT_GREATER:
20960             cp_parser_error (parser, "expected %<>%>");
20961             return;
20962           case RT_EQ:
20963             cp_parser_error (parser, "expected %<=%>");
20964             return;
20965           case RT_ELLIPSIS:
20966             cp_parser_error (parser, "expected %<...%>");
20967             return;
20968           case RT_MULT:
20969             cp_parser_error (parser, "expected %<*%>");
20970             return;
20971           case RT_COMPL:
20972             cp_parser_error (parser, "expected %<~%>");
20973             return;
20974           case RT_COLON:
20975             cp_parser_error (parser, "expected %<:%>");
20976             return;
20977           case RT_COLON_SCOPE:
20978             cp_parser_error (parser, "expected %<:%> or %<::%>");
20979             return;
20980           case RT_CLOSE_PAREN:
20981             cp_parser_error (parser, "expected %<)%>");
20982             return;
20983           case RT_COMMA_CLOSE_PAREN:
20984             cp_parser_error (parser, "expected %<,%> or %<)%>");
20985             return;
20986           case RT_PRAGMA_EOL:
20987             cp_parser_error (parser, "expected end of line");
20988             return;
20989           case RT_NAME:
20990             cp_parser_error (parser, "expected identifier");
20991             return;
20992           case RT_SELECT:
20993             cp_parser_error (parser, "expected selection-statement");
20994             return;
20995           case RT_INTERATION:
20996             cp_parser_error (parser, "expected iteration-statement");
20997             return;
20998           case RT_JUMP:
20999             cp_parser_error (parser, "expected jump-statement");
21000             return;
21001           case RT_CLASS_KEY:
21002             cp_parser_error (parser, "expected class-key");
21003             return;
21004           case RT_CLASS_TYPENAME_TEMPLATE:
21005             cp_parser_error (parser,
21006                  "expected %<class%>, %<typename%>, or %<template%>");
21007             return;
21008           default:
21009             gcc_unreachable ();
21010         }
21011     }
21012   else
21013     gcc_unreachable ();
21014 }
21015
21016
21017
21018 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
21019    issue an error message indicating that TOKEN_DESC was expected.
21020
21021    Returns the token consumed, if the token had the appropriate type.
21022    Otherwise, returns NULL.  */
21023
21024 static cp_token *
21025 cp_parser_require (cp_parser* parser,
21026                    enum cpp_ttype type,
21027                    required_token token_desc)
21028 {
21029   if (cp_lexer_next_token_is (parser->lexer, type))
21030     return cp_lexer_consume_token (parser->lexer);
21031   else
21032     {
21033       /* Output the MESSAGE -- unless we're parsing tentatively.  */
21034       if (!cp_parser_simulate_error (parser))
21035         cp_parser_required_error (parser, token_desc, /*keyword=*/false);
21036       return NULL;
21037     }
21038 }
21039
21040 /* An error message is produced if the next token is not '>'.
21041    All further tokens are skipped until the desired token is
21042    found or '{', '}', ';' or an unbalanced ')' or ']'.  */
21043
21044 static void
21045 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
21046 {
21047   /* Current level of '< ... >'.  */
21048   unsigned level = 0;
21049   /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'.  */
21050   unsigned nesting_depth = 0;
21051
21052   /* Are we ready, yet?  If not, issue error message.  */
21053   if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
21054     return;
21055
21056   /* Skip tokens until the desired token is found.  */
21057   while (true)
21058     {
21059       /* Peek at the next token.  */
21060       switch (cp_lexer_peek_token (parser->lexer)->type)
21061         {
21062         case CPP_LESS:
21063           if (!nesting_depth)
21064             ++level;
21065           break;
21066
21067         case CPP_RSHIFT:
21068           if (cxx_dialect == cxx98)
21069             /* C++0x views the `>>' operator as two `>' tokens, but
21070                C++98 does not. */
21071             break;
21072           else if (!nesting_depth && level-- == 0)
21073             {
21074               /* We've hit a `>>' where the first `>' closes the
21075                  template argument list, and the second `>' is
21076                  spurious.  Just consume the `>>' and stop; we've
21077                  already produced at least one error.  */
21078               cp_lexer_consume_token (parser->lexer);
21079               return;
21080             }
21081           /* Fall through for C++0x, so we handle the second `>' in
21082              the `>>'.  */
21083
21084         case CPP_GREATER:
21085           if (!nesting_depth && level-- == 0)
21086             {
21087               /* We've reached the token we want, consume it and stop.  */
21088               cp_lexer_consume_token (parser->lexer);
21089               return;
21090             }
21091           break;
21092
21093         case CPP_OPEN_PAREN:
21094         case CPP_OPEN_SQUARE:
21095           ++nesting_depth;
21096           break;
21097
21098         case CPP_CLOSE_PAREN:
21099         case CPP_CLOSE_SQUARE:
21100           if (nesting_depth-- == 0)
21101             return;
21102           break;
21103
21104         case CPP_EOF:
21105         case CPP_PRAGMA_EOL:
21106         case CPP_SEMICOLON:
21107         case CPP_OPEN_BRACE:
21108         case CPP_CLOSE_BRACE:
21109           /* The '>' was probably forgotten, don't look further.  */
21110           return;
21111
21112         default:
21113           break;
21114         }
21115
21116       /* Consume this token.  */
21117       cp_lexer_consume_token (parser->lexer);
21118     }
21119 }
21120
21121 /* If the next token is the indicated keyword, consume it.  Otherwise,
21122    issue an error message indicating that TOKEN_DESC was expected.
21123
21124    Returns the token consumed, if the token had the appropriate type.
21125    Otherwise, returns NULL.  */
21126
21127 static cp_token *
21128 cp_parser_require_keyword (cp_parser* parser,
21129                            enum rid keyword,
21130                            required_token token_desc)
21131 {
21132   cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
21133
21134   if (token && token->keyword != keyword)
21135     {
21136       cp_parser_required_error (parser, token_desc, /*keyword=*/true); 
21137       return NULL;
21138     }
21139
21140   return token;
21141 }
21142
21143 /* Returns TRUE iff TOKEN is a token that can begin the body of a
21144    function-definition.  */
21145
21146 static bool
21147 cp_parser_token_starts_function_definition_p (cp_token* token)
21148 {
21149   return (/* An ordinary function-body begins with an `{'.  */
21150           token->type == CPP_OPEN_BRACE
21151           /* A ctor-initializer begins with a `:'.  */
21152           || token->type == CPP_COLON
21153           /* A function-try-block begins with `try'.  */
21154           || token->keyword == RID_TRY
21155           /* The named return value extension begins with `return'.  */
21156           || token->keyword == RID_RETURN);
21157 }
21158
21159 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
21160    definition.  */
21161
21162 static bool
21163 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
21164 {
21165   cp_token *token;
21166
21167   token = cp_lexer_peek_token (parser->lexer);
21168   return (token->type == CPP_OPEN_BRACE || token->type == CPP_COLON);
21169 }
21170
21171 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
21172    C++0x) ending a template-argument.  */
21173
21174 static bool
21175 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
21176 {
21177   cp_token *token;
21178
21179   token = cp_lexer_peek_token (parser->lexer);
21180   return (token->type == CPP_COMMA 
21181           || token->type == CPP_GREATER
21182           || token->type == CPP_ELLIPSIS
21183           || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
21184 }
21185
21186 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
21187    (n+1)-th is a ":" (which is a possible digraph typo for "< ::").  */
21188
21189 static bool
21190 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
21191                                                      size_t n)
21192 {
21193   cp_token *token;
21194
21195   token = cp_lexer_peek_nth_token (parser->lexer, n);
21196   if (token->type == CPP_LESS)
21197     return true;
21198   /* Check for the sequence `<::' in the original code. It would be lexed as
21199      `[:', where `[' is a digraph, and there is no whitespace before
21200      `:'.  */
21201   if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
21202     {
21203       cp_token *token2;
21204       token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
21205       if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
21206         return true;
21207     }
21208   return false;
21209 }
21210
21211 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
21212    or none_type otherwise.  */
21213
21214 static enum tag_types
21215 cp_parser_token_is_class_key (cp_token* token)
21216 {
21217   switch (token->keyword)
21218     {
21219     case RID_CLASS:
21220       return class_type;
21221     case RID_STRUCT:
21222       return record_type;
21223     case RID_UNION:
21224       return union_type;
21225
21226     default:
21227       return none_type;
21228     }
21229 }
21230
21231 /* Issue an error message if the CLASS_KEY does not match the TYPE.  */
21232
21233 static void
21234 cp_parser_check_class_key (enum tag_types class_key, tree type)
21235 {
21236   if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
21237     permerror (input_location, "%qs tag used in naming %q#T",
21238             class_key == union_type ? "union"
21239              : class_key == record_type ? "struct" : "class",
21240              type);
21241 }
21242
21243 /* Issue an error message if DECL is redeclared with different
21244    access than its original declaration [class.access.spec/3].
21245    This applies to nested classes and nested class templates.
21246    [class.mem/1].  */
21247
21248 static void
21249 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
21250 {
21251   if (!decl || !CLASS_TYPE_P (TREE_TYPE (decl)))
21252     return;
21253
21254   if ((TREE_PRIVATE (decl)
21255        != (current_access_specifier == access_private_node))
21256       || (TREE_PROTECTED (decl)
21257           != (current_access_specifier == access_protected_node)))
21258     error_at (location, "%qD redeclared with different access", decl);
21259 }
21260
21261 /* Look for the `template' keyword, as a syntactic disambiguator.
21262    Return TRUE iff it is present, in which case it will be
21263    consumed.  */
21264
21265 static bool
21266 cp_parser_optional_template_keyword (cp_parser *parser)
21267 {
21268   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
21269     {
21270       /* The `template' keyword can only be used within templates;
21271          outside templates the parser can always figure out what is a
21272          template and what is not.  */
21273       if (!processing_template_decl)
21274         {
21275           cp_token *token = cp_lexer_peek_token (parser->lexer);
21276           error_at (token->location,
21277                     "%<template%> (as a disambiguator) is only allowed "
21278                     "within templates");
21279           /* If this part of the token stream is rescanned, the same
21280              error message would be generated.  So, we purge the token
21281              from the stream.  */
21282           cp_lexer_purge_token (parser->lexer);
21283           return false;
21284         }
21285       else
21286         {
21287           /* Consume the `template' keyword.  */
21288           cp_lexer_consume_token (parser->lexer);
21289           return true;
21290         }
21291     }
21292
21293   return false;
21294 }
21295
21296 /* The next token is a CPP_NESTED_NAME_SPECIFIER.  Consume the token,
21297    set PARSER->SCOPE, and perform other related actions.  */
21298
21299 static void
21300 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
21301 {
21302   int i;
21303   struct tree_check *check_value;
21304   deferred_access_check *chk;
21305   VEC (deferred_access_check,gc) *checks;
21306
21307   /* Get the stored value.  */
21308   check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
21309   /* Perform any access checks that were deferred.  */
21310   checks = check_value->checks;
21311   if (checks)
21312     {
21313       FOR_EACH_VEC_ELT (deferred_access_check, checks, i, chk)
21314         perform_or_defer_access_check (chk->binfo,
21315                                        chk->decl,
21316                                        chk->diag_decl);
21317     }
21318   /* Set the scope from the stored value.  */
21319   parser->scope = check_value->value;
21320   parser->qualifying_scope = check_value->qualifying_scope;
21321   parser->object_scope = NULL_TREE;
21322 }
21323
21324 /* Consume tokens up through a non-nested END token.  Returns TRUE if we
21325    encounter the end of a block before what we were looking for.  */
21326
21327 static bool
21328 cp_parser_cache_group (cp_parser *parser,
21329                        enum cpp_ttype end,
21330                        unsigned depth)
21331 {
21332   while (true)
21333     {
21334       cp_token *token = cp_lexer_peek_token (parser->lexer);
21335
21336       /* Abort a parenthesized expression if we encounter a semicolon.  */
21337       if ((end == CPP_CLOSE_PAREN || depth == 0)
21338           && token->type == CPP_SEMICOLON)
21339         return true;
21340       /* If we've reached the end of the file, stop.  */
21341       if (token->type == CPP_EOF
21342           || (end != CPP_PRAGMA_EOL
21343               && token->type == CPP_PRAGMA_EOL))
21344         return true;
21345       if (token->type == CPP_CLOSE_BRACE && depth == 0)
21346         /* We've hit the end of an enclosing block, so there's been some
21347            kind of syntax error.  */
21348         return true;
21349
21350       /* Consume the token.  */
21351       cp_lexer_consume_token (parser->lexer);
21352       /* See if it starts a new group.  */
21353       if (token->type == CPP_OPEN_BRACE)
21354         {
21355           cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
21356           /* In theory this should probably check end == '}', but
21357              cp_parser_save_member_function_body needs it to exit
21358              after either '}' or ')' when called with ')'.  */
21359           if (depth == 0)
21360             return false;
21361         }
21362       else if (token->type == CPP_OPEN_PAREN)
21363         {
21364           cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
21365           if (depth == 0 && end == CPP_CLOSE_PAREN)
21366             return false;
21367         }
21368       else if (token->type == CPP_PRAGMA)
21369         cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
21370       else if (token->type == end)
21371         return false;
21372     }
21373 }
21374
21375 /* Begin parsing tentatively.  We always save tokens while parsing
21376    tentatively so that if the tentative parsing fails we can restore the
21377    tokens.  */
21378
21379 static void
21380 cp_parser_parse_tentatively (cp_parser* parser)
21381 {
21382   /* Enter a new parsing context.  */
21383   parser->context = cp_parser_context_new (parser->context);
21384   /* Begin saving tokens.  */
21385   cp_lexer_save_tokens (parser->lexer);
21386   /* In order to avoid repetitive access control error messages,
21387      access checks are queued up until we are no longer parsing
21388      tentatively.  */
21389   push_deferring_access_checks (dk_deferred);
21390 }
21391
21392 /* Commit to the currently active tentative parse.  */
21393
21394 static void
21395 cp_parser_commit_to_tentative_parse (cp_parser* parser)
21396 {
21397   cp_parser_context *context;
21398   cp_lexer *lexer;
21399
21400   /* Mark all of the levels as committed.  */
21401   lexer = parser->lexer;
21402   for (context = parser->context; context->next; context = context->next)
21403     {
21404       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
21405         break;
21406       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
21407       while (!cp_lexer_saving_tokens (lexer))
21408         lexer = lexer->next;
21409       cp_lexer_commit_tokens (lexer);
21410     }
21411 }
21412
21413 /* Abort the currently active tentative parse.  All consumed tokens
21414    will be rolled back, and no diagnostics will be issued.  */
21415
21416 static void
21417 cp_parser_abort_tentative_parse (cp_parser* parser)
21418 {
21419   gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
21420               || errorcount > 0);
21421   cp_parser_simulate_error (parser);
21422   /* Now, pretend that we want to see if the construct was
21423      successfully parsed.  */
21424   cp_parser_parse_definitely (parser);
21425 }
21426
21427 /* Stop parsing tentatively.  If a parse error has occurred, restore the
21428    token stream.  Otherwise, commit to the tokens we have consumed.
21429    Returns true if no error occurred; false otherwise.  */
21430
21431 static bool
21432 cp_parser_parse_definitely (cp_parser* parser)
21433 {
21434   bool error_occurred;
21435   cp_parser_context *context;
21436
21437   /* Remember whether or not an error occurred, since we are about to
21438      destroy that information.  */
21439   error_occurred = cp_parser_error_occurred (parser);
21440   /* Remove the topmost context from the stack.  */
21441   context = parser->context;
21442   parser->context = context->next;
21443   /* If no parse errors occurred, commit to the tentative parse.  */
21444   if (!error_occurred)
21445     {
21446       /* Commit to the tokens read tentatively, unless that was
21447          already done.  */
21448       if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
21449         cp_lexer_commit_tokens (parser->lexer);
21450
21451       pop_to_parent_deferring_access_checks ();
21452     }
21453   /* Otherwise, if errors occurred, roll back our state so that things
21454      are just as they were before we began the tentative parse.  */
21455   else
21456     {
21457       cp_lexer_rollback_tokens (parser->lexer);
21458       pop_deferring_access_checks ();
21459     }
21460   /* Add the context to the front of the free list.  */
21461   context->next = cp_parser_context_free_list;
21462   cp_parser_context_free_list = context;
21463
21464   return !error_occurred;
21465 }
21466
21467 /* Returns true if we are parsing tentatively and are not committed to
21468    this tentative parse.  */
21469
21470 static bool
21471 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
21472 {
21473   return (cp_parser_parsing_tentatively (parser)
21474           && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
21475 }
21476
21477 /* Returns nonzero iff an error has occurred during the most recent
21478    tentative parse.  */
21479
21480 static bool
21481 cp_parser_error_occurred (cp_parser* parser)
21482 {
21483   return (cp_parser_parsing_tentatively (parser)
21484           && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
21485 }
21486
21487 /* Returns nonzero if GNU extensions are allowed.  */
21488
21489 static bool
21490 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
21491 {
21492   return parser->allow_gnu_extensions_p;
21493 }
21494 \f
21495 /* Objective-C++ Productions */
21496
21497
21498 /* Parse an Objective-C expression, which feeds into a primary-expression
21499    above.
21500
21501    objc-expression:
21502      objc-message-expression
21503      objc-string-literal
21504      objc-encode-expression
21505      objc-protocol-expression
21506      objc-selector-expression
21507
21508   Returns a tree representation of the expression.  */
21509
21510 static tree
21511 cp_parser_objc_expression (cp_parser* parser)
21512 {
21513   /* Try to figure out what kind of declaration is present.  */
21514   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
21515
21516   switch (kwd->type)
21517     {
21518     case CPP_OPEN_SQUARE:
21519       return cp_parser_objc_message_expression (parser);
21520
21521     case CPP_OBJC_STRING:
21522       kwd = cp_lexer_consume_token (parser->lexer);
21523       return objc_build_string_object (kwd->u.value);
21524
21525     case CPP_KEYWORD:
21526       switch (kwd->keyword)
21527         {
21528         case RID_AT_ENCODE:
21529           return cp_parser_objc_encode_expression (parser);
21530
21531         case RID_AT_PROTOCOL:
21532           return cp_parser_objc_protocol_expression (parser);
21533
21534         case RID_AT_SELECTOR:
21535           return cp_parser_objc_selector_expression (parser);
21536
21537         default:
21538           break;
21539         }
21540     default:
21541       error_at (kwd->location,
21542                 "misplaced %<@%D%> Objective-C++ construct",
21543                 kwd->u.value);
21544       cp_parser_skip_to_end_of_block_or_statement (parser);
21545     }
21546
21547   return error_mark_node;
21548 }
21549
21550 /* Parse an Objective-C message expression.
21551
21552    objc-message-expression:
21553      [ objc-message-receiver objc-message-args ]
21554
21555    Returns a representation of an Objective-C message.  */
21556
21557 static tree
21558 cp_parser_objc_message_expression (cp_parser* parser)
21559 {
21560   tree receiver, messageargs;
21561
21562   cp_lexer_consume_token (parser->lexer);  /* Eat '['.  */
21563   receiver = cp_parser_objc_message_receiver (parser);
21564   messageargs = cp_parser_objc_message_args (parser);
21565   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
21566
21567   return objc_build_message_expr (receiver, messageargs);
21568 }
21569
21570 /* Parse an objc-message-receiver.
21571
21572    objc-message-receiver:
21573      expression
21574      simple-type-specifier
21575
21576   Returns a representation of the type or expression.  */
21577
21578 static tree
21579 cp_parser_objc_message_receiver (cp_parser* parser)
21580 {
21581   tree rcv;
21582
21583   /* An Objective-C message receiver may be either (1) a type
21584      or (2) an expression.  */
21585   cp_parser_parse_tentatively (parser);
21586   rcv = cp_parser_expression (parser, false, NULL);
21587
21588   if (cp_parser_parse_definitely (parser))
21589     return rcv;
21590
21591   rcv = cp_parser_simple_type_specifier (parser,
21592                                          /*decl_specs=*/NULL,
21593                                          CP_PARSER_FLAGS_NONE);
21594
21595   return objc_get_class_reference (rcv);
21596 }
21597
21598 /* Parse the arguments and selectors comprising an Objective-C message.
21599
21600    objc-message-args:
21601      objc-selector
21602      objc-selector-args
21603      objc-selector-args , objc-comma-args
21604
21605    objc-selector-args:
21606      objc-selector [opt] : assignment-expression
21607      objc-selector-args objc-selector [opt] : assignment-expression
21608
21609    objc-comma-args:
21610      assignment-expression
21611      objc-comma-args , assignment-expression
21612
21613    Returns a TREE_LIST, with TREE_PURPOSE containing a list of
21614    selector arguments and TREE_VALUE containing a list of comma
21615    arguments.  */
21616
21617 static tree
21618 cp_parser_objc_message_args (cp_parser* parser)
21619 {
21620   tree sel_args = NULL_TREE, addl_args = NULL_TREE;
21621   bool maybe_unary_selector_p = true;
21622   cp_token *token = cp_lexer_peek_token (parser->lexer);
21623
21624   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
21625     {
21626       tree selector = NULL_TREE, arg;
21627
21628       if (token->type != CPP_COLON)
21629         selector = cp_parser_objc_selector (parser);
21630
21631       /* Detect if we have a unary selector.  */
21632       if (maybe_unary_selector_p
21633           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
21634         return build_tree_list (selector, NULL_TREE);
21635
21636       maybe_unary_selector_p = false;
21637       cp_parser_require (parser, CPP_COLON, RT_COLON);
21638       arg = cp_parser_assignment_expression (parser, false, NULL);
21639
21640       sel_args
21641         = chainon (sel_args,
21642                    build_tree_list (selector, arg));
21643
21644       token = cp_lexer_peek_token (parser->lexer);
21645     }
21646
21647   /* Handle non-selector arguments, if any. */
21648   while (token->type == CPP_COMMA)
21649     {
21650       tree arg;
21651
21652       cp_lexer_consume_token (parser->lexer);
21653       arg = cp_parser_assignment_expression (parser, false, NULL);
21654
21655       addl_args
21656         = chainon (addl_args,
21657                    build_tree_list (NULL_TREE, arg));
21658
21659       token = cp_lexer_peek_token (parser->lexer);
21660     }
21661
21662   if (sel_args == NULL_TREE && addl_args == NULL_TREE)
21663     {
21664       cp_parser_error (parser, "objective-c++ message argument(s) are expected");
21665       return build_tree_list (error_mark_node, error_mark_node);
21666     }
21667
21668   return build_tree_list (sel_args, addl_args);
21669 }
21670
21671 /* Parse an Objective-C encode expression.
21672
21673    objc-encode-expression:
21674      @encode objc-typename
21675
21676    Returns an encoded representation of the type argument.  */
21677
21678 static tree
21679 cp_parser_objc_encode_expression (cp_parser* parser)
21680 {
21681   tree type;
21682   cp_token *token;
21683
21684   cp_lexer_consume_token (parser->lexer);  /* Eat '@encode'.  */
21685   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21686   token = cp_lexer_peek_token (parser->lexer);
21687   type = complete_type (cp_parser_type_id (parser));
21688   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21689
21690   if (!type)
21691     {
21692       error_at (token->location, 
21693                 "%<@encode%> must specify a type as an argument");
21694       return error_mark_node;
21695     }
21696
21697   /* This happens if we find @encode(T) (where T is a template
21698      typename or something dependent on a template typename) when
21699      parsing a template.  In that case, we can't compile it
21700      immediately, but we rather create an AT_ENCODE_EXPR which will
21701      need to be instantiated when the template is used.
21702   */
21703   if (dependent_type_p (type))
21704     {
21705       tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
21706       TREE_READONLY (value) = 1;
21707       return value;
21708     }
21709
21710   return objc_build_encode_expr (type);
21711 }
21712
21713 /* Parse an Objective-C @defs expression.  */
21714
21715 static tree
21716 cp_parser_objc_defs_expression (cp_parser *parser)
21717 {
21718   tree name;
21719
21720   cp_lexer_consume_token (parser->lexer);  /* Eat '@defs'.  */
21721   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21722   name = cp_parser_identifier (parser);
21723   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21724
21725   return objc_get_class_ivars (name);
21726 }
21727
21728 /* Parse an Objective-C protocol expression.
21729
21730   objc-protocol-expression:
21731     @protocol ( identifier )
21732
21733   Returns a representation of the protocol expression.  */
21734
21735 static tree
21736 cp_parser_objc_protocol_expression (cp_parser* parser)
21737 {
21738   tree proto;
21739
21740   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
21741   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21742   proto = cp_parser_identifier (parser);
21743   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21744
21745   return objc_build_protocol_expr (proto);
21746 }
21747
21748 /* Parse an Objective-C selector expression.
21749
21750    objc-selector-expression:
21751      @selector ( objc-method-signature )
21752
21753    objc-method-signature:
21754      objc-selector
21755      objc-selector-seq
21756
21757    objc-selector-seq:
21758      objc-selector :
21759      objc-selector-seq objc-selector :
21760
21761   Returns a representation of the method selector.  */
21762
21763 static tree
21764 cp_parser_objc_selector_expression (cp_parser* parser)
21765 {
21766   tree sel_seq = NULL_TREE;
21767   bool maybe_unary_selector_p = true;
21768   cp_token *token;
21769   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
21770
21771   cp_lexer_consume_token (parser->lexer);  /* Eat '@selector'.  */
21772   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21773   token = cp_lexer_peek_token (parser->lexer);
21774
21775   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
21776          || token->type == CPP_SCOPE)
21777     {
21778       tree selector = NULL_TREE;
21779
21780       if (token->type != CPP_COLON
21781           || token->type == CPP_SCOPE)
21782         selector = cp_parser_objc_selector (parser);
21783
21784       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
21785           && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
21786         {
21787           /* Detect if we have a unary selector.  */
21788           if (maybe_unary_selector_p)
21789             {
21790               sel_seq = selector;
21791               goto finish_selector;
21792             }
21793           else
21794             {
21795               cp_parser_error (parser, "expected %<:%>");
21796             }
21797         }
21798       maybe_unary_selector_p = false;
21799       token = cp_lexer_consume_token (parser->lexer);
21800
21801       if (token->type == CPP_SCOPE)
21802         {
21803           sel_seq
21804             = chainon (sel_seq,
21805                        build_tree_list (selector, NULL_TREE));
21806           sel_seq
21807             = chainon (sel_seq,
21808                        build_tree_list (NULL_TREE, NULL_TREE));
21809         }
21810       else
21811         sel_seq
21812           = chainon (sel_seq,
21813                      build_tree_list (selector, NULL_TREE));
21814
21815       token = cp_lexer_peek_token (parser->lexer);
21816     }
21817
21818  finish_selector:
21819   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21820
21821   return objc_build_selector_expr (loc, sel_seq);
21822 }
21823
21824 /* Parse a list of identifiers.
21825
21826    objc-identifier-list:
21827      identifier
21828      objc-identifier-list , identifier
21829
21830    Returns a TREE_LIST of identifier nodes.  */
21831
21832 static tree
21833 cp_parser_objc_identifier_list (cp_parser* parser)
21834 {
21835   tree identifier;
21836   tree list;
21837   cp_token *sep;
21838
21839   identifier = cp_parser_identifier (parser);
21840   if (identifier == error_mark_node)
21841     return error_mark_node;      
21842
21843   list = build_tree_list (NULL_TREE, identifier);
21844   sep = cp_lexer_peek_token (parser->lexer);
21845
21846   while (sep->type == CPP_COMMA)
21847     {
21848       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
21849       identifier = cp_parser_identifier (parser);
21850       if (identifier == error_mark_node)
21851         return list;
21852
21853       list = chainon (list, build_tree_list (NULL_TREE,
21854                                              identifier));
21855       sep = cp_lexer_peek_token (parser->lexer);
21856     }
21857   
21858   return list;
21859 }
21860
21861 /* Parse an Objective-C alias declaration.
21862
21863    objc-alias-declaration:
21864      @compatibility_alias identifier identifier ;
21865
21866    This function registers the alias mapping with the Objective-C front end.
21867    It returns nothing.  */
21868
21869 static void
21870 cp_parser_objc_alias_declaration (cp_parser* parser)
21871 {
21872   tree alias, orig;
21873
21874   cp_lexer_consume_token (parser->lexer);  /* Eat '@compatibility_alias'.  */
21875   alias = cp_parser_identifier (parser);
21876   orig = cp_parser_identifier (parser);
21877   objc_declare_alias (alias, orig);
21878   cp_parser_consume_semicolon_at_end_of_statement (parser);
21879 }
21880
21881 /* Parse an Objective-C class forward-declaration.
21882
21883    objc-class-declaration:
21884      @class objc-identifier-list ;
21885
21886    The function registers the forward declarations with the Objective-C
21887    front end.  It returns nothing.  */
21888
21889 static void
21890 cp_parser_objc_class_declaration (cp_parser* parser)
21891 {
21892   cp_lexer_consume_token (parser->lexer);  /* Eat '@class'.  */
21893   while (true)
21894     {
21895       tree id;
21896       
21897       id = cp_parser_identifier (parser);
21898       if (id == error_mark_node)
21899         break;
21900       
21901       objc_declare_class (id);
21902
21903       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
21904         cp_lexer_consume_token (parser->lexer);
21905       else
21906         break;
21907     }
21908   cp_parser_consume_semicolon_at_end_of_statement (parser);
21909 }
21910
21911 /* Parse a list of Objective-C protocol references.
21912
21913    objc-protocol-refs-opt:
21914      objc-protocol-refs [opt]
21915
21916    objc-protocol-refs:
21917      < objc-identifier-list >
21918
21919    Returns a TREE_LIST of identifiers, if any.  */
21920
21921 static tree
21922 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
21923 {
21924   tree protorefs = NULL_TREE;
21925
21926   if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
21927     {
21928       cp_lexer_consume_token (parser->lexer);  /* Eat '<'.  */
21929       protorefs = cp_parser_objc_identifier_list (parser);
21930       cp_parser_require (parser, CPP_GREATER, RT_GREATER);
21931     }
21932
21933   return protorefs;
21934 }
21935
21936 /* Parse a Objective-C visibility specification.  */
21937
21938 static void
21939 cp_parser_objc_visibility_spec (cp_parser* parser)
21940 {
21941   cp_token *vis = cp_lexer_peek_token (parser->lexer);
21942
21943   switch (vis->keyword)
21944     {
21945     case RID_AT_PRIVATE:
21946       objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
21947       break;
21948     case RID_AT_PROTECTED:
21949       objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
21950       break;
21951     case RID_AT_PUBLIC:
21952       objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
21953       break;
21954     case RID_AT_PACKAGE:
21955       objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
21956       break;
21957     default:
21958       return;
21959     }
21960
21961   /* Eat '@private'/'@protected'/'@public'.  */
21962   cp_lexer_consume_token (parser->lexer);
21963 }
21964
21965 /* Parse an Objective-C method type.  Return 'true' if it is a class
21966    (+) method, and 'false' if it is an instance (-) method.  */
21967
21968 static inline bool
21969 cp_parser_objc_method_type (cp_parser* parser)
21970 {
21971   if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
21972     return true;
21973   else
21974     return false;
21975 }
21976
21977 /* Parse an Objective-C protocol qualifier.  */
21978
21979 static tree
21980 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
21981 {
21982   tree quals = NULL_TREE, node;
21983   cp_token *token = cp_lexer_peek_token (parser->lexer);
21984
21985   node = token->u.value;
21986
21987   while (node && TREE_CODE (node) == IDENTIFIER_NODE
21988          && (node == ridpointers [(int) RID_IN]
21989              || node == ridpointers [(int) RID_OUT]
21990              || node == ridpointers [(int) RID_INOUT]
21991              || node == ridpointers [(int) RID_BYCOPY]
21992              || node == ridpointers [(int) RID_BYREF]
21993              || node == ridpointers [(int) RID_ONEWAY]))
21994     {
21995       quals = tree_cons (NULL_TREE, node, quals);
21996       cp_lexer_consume_token (parser->lexer);
21997       token = cp_lexer_peek_token (parser->lexer);
21998       node = token->u.value;
21999     }
22000
22001   return quals;
22002 }
22003
22004 /* Parse an Objective-C typename.  */
22005
22006 static tree
22007 cp_parser_objc_typename (cp_parser* parser)
22008 {
22009   tree type_name = NULL_TREE;
22010
22011   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
22012     {
22013       tree proto_quals, cp_type = NULL_TREE;
22014
22015       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22016       proto_quals = cp_parser_objc_protocol_qualifiers (parser);
22017
22018       /* An ObjC type name may consist of just protocol qualifiers, in which
22019          case the type shall default to 'id'.  */
22020       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
22021         {
22022           cp_type = cp_parser_type_id (parser);
22023           
22024           /* If the type could not be parsed, an error has already
22025              been produced.  For error recovery, behave as if it had
22026              not been specified, which will use the default type
22027              'id'.  */
22028           if (cp_type == error_mark_node)
22029             {
22030               cp_type = NULL_TREE;
22031               /* We need to skip to the closing parenthesis as
22032                  cp_parser_type_id() does not seem to do it for
22033                  us.  */
22034               cp_parser_skip_to_closing_parenthesis (parser,
22035                                                      /*recovering=*/true,
22036                                                      /*or_comma=*/false,
22037                                                      /*consume_paren=*/false);
22038             }
22039         }
22040
22041       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22042       type_name = build_tree_list (proto_quals, cp_type);
22043     }
22044
22045   return type_name;
22046 }
22047
22048 /* Check to see if TYPE refers to an Objective-C selector name.  */
22049
22050 static bool
22051 cp_parser_objc_selector_p (enum cpp_ttype type)
22052 {
22053   return (type == CPP_NAME || type == CPP_KEYWORD
22054           || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
22055           || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
22056           || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
22057           || type == CPP_XOR || type == CPP_XOR_EQ);
22058 }
22059
22060 /* Parse an Objective-C selector.  */
22061
22062 static tree
22063 cp_parser_objc_selector (cp_parser* parser)
22064 {
22065   cp_token *token = cp_lexer_consume_token (parser->lexer);
22066
22067   if (!cp_parser_objc_selector_p (token->type))
22068     {
22069       error_at (token->location, "invalid Objective-C++ selector name");
22070       return error_mark_node;
22071     }
22072
22073   /* C++ operator names are allowed to appear in ObjC selectors.  */
22074   switch (token->type)
22075     {
22076     case CPP_AND_AND: return get_identifier ("and");
22077     case CPP_AND_EQ: return get_identifier ("and_eq");
22078     case CPP_AND: return get_identifier ("bitand");
22079     case CPP_OR: return get_identifier ("bitor");
22080     case CPP_COMPL: return get_identifier ("compl");
22081     case CPP_NOT: return get_identifier ("not");
22082     case CPP_NOT_EQ: return get_identifier ("not_eq");
22083     case CPP_OR_OR: return get_identifier ("or");
22084     case CPP_OR_EQ: return get_identifier ("or_eq");
22085     case CPP_XOR: return get_identifier ("xor");
22086     case CPP_XOR_EQ: return get_identifier ("xor_eq");
22087     default: return token->u.value;
22088     }
22089 }
22090
22091 /* Parse an Objective-C params list.  */
22092
22093 static tree
22094 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
22095 {
22096   tree params = NULL_TREE;
22097   bool maybe_unary_selector_p = true;
22098   cp_token *token = cp_lexer_peek_token (parser->lexer);
22099
22100   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
22101     {
22102       tree selector = NULL_TREE, type_name, identifier;
22103       tree parm_attr = NULL_TREE;
22104
22105       if (token->keyword == RID_ATTRIBUTE)
22106         break;
22107
22108       if (token->type != CPP_COLON)
22109         selector = cp_parser_objc_selector (parser);
22110
22111       /* Detect if we have a unary selector.  */
22112       if (maybe_unary_selector_p
22113           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
22114         {
22115           params = selector; /* Might be followed by attributes.  */
22116           break;
22117         }
22118
22119       maybe_unary_selector_p = false;
22120       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
22121         {
22122           /* Something went quite wrong.  There should be a colon
22123              here, but there is not.  Stop parsing parameters.  */
22124           break;
22125         }
22126       type_name = cp_parser_objc_typename (parser);
22127       /* New ObjC allows attributes on parameters too.  */
22128       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
22129         parm_attr = cp_parser_attributes_opt (parser);
22130       identifier = cp_parser_identifier (parser);
22131
22132       params
22133         = chainon (params,
22134                    objc_build_keyword_decl (selector,
22135                                             type_name,
22136                                             identifier,
22137                                             parm_attr));
22138
22139       token = cp_lexer_peek_token (parser->lexer);
22140     }
22141
22142   if (params == NULL_TREE)
22143     {
22144       cp_parser_error (parser, "objective-c++ method declaration is expected");
22145       return error_mark_node;
22146     }
22147
22148   /* We allow tail attributes for the method.  */
22149   if (token->keyword == RID_ATTRIBUTE)
22150     {
22151       *attributes = cp_parser_attributes_opt (parser);
22152       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22153           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22154         return params;
22155       cp_parser_error (parser, 
22156                        "method attributes must be specified at the end");
22157       return error_mark_node;
22158     }
22159
22160   if (params == NULL_TREE)
22161     {
22162       cp_parser_error (parser, "objective-c++ method declaration is expected");
22163       return error_mark_node;
22164     }
22165   return params;
22166 }
22167
22168 /* Parse the non-keyword Objective-C params.  */
22169
22170 static tree
22171 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp, 
22172                                        tree* attributes)
22173 {
22174   tree params = make_node (TREE_LIST);
22175   cp_token *token = cp_lexer_peek_token (parser->lexer);
22176   *ellipsisp = false;  /* Initially, assume no ellipsis.  */
22177
22178   while (token->type == CPP_COMMA)
22179     {
22180       cp_parameter_declarator *parmdecl;
22181       tree parm;
22182
22183       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22184       token = cp_lexer_peek_token (parser->lexer);
22185
22186       if (token->type == CPP_ELLIPSIS)
22187         {
22188           cp_lexer_consume_token (parser->lexer);  /* Eat '...'.  */
22189           *ellipsisp = true;
22190           token = cp_lexer_peek_token (parser->lexer);
22191           break;
22192         }
22193
22194       /* TODO: parse attributes for tail parameters.  */
22195       parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
22196       parm = grokdeclarator (parmdecl->declarator,
22197                              &parmdecl->decl_specifiers,
22198                              PARM, /*initialized=*/0,
22199                              /*attrlist=*/NULL);
22200
22201       chainon (params, build_tree_list (NULL_TREE, parm));
22202       token = cp_lexer_peek_token (parser->lexer);
22203     }
22204
22205   /* We allow tail attributes for the method.  */
22206   if (token->keyword == RID_ATTRIBUTE)
22207     {
22208       if (*attributes == NULL_TREE)
22209         {
22210           *attributes = cp_parser_attributes_opt (parser);
22211           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22212               || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22213             return params;
22214         }
22215       else        
22216         /* We have an error, but parse the attributes, so that we can 
22217            carry on.  */
22218         *attributes = cp_parser_attributes_opt (parser);
22219
22220       cp_parser_error (parser, 
22221                        "method attributes must be specified at the end");
22222       return error_mark_node;
22223     }
22224
22225   return params;
22226 }
22227
22228 /* Parse a linkage specification, a pragma, an extra semicolon or a block.  */
22229
22230 static void
22231 cp_parser_objc_interstitial_code (cp_parser* parser)
22232 {
22233   cp_token *token = cp_lexer_peek_token (parser->lexer);
22234
22235   /* If the next token is `extern' and the following token is a string
22236      literal, then we have a linkage specification.  */
22237   if (token->keyword == RID_EXTERN
22238       && cp_parser_is_string_literal (cp_lexer_peek_nth_token (parser->lexer, 2)))
22239     cp_parser_linkage_specification (parser);
22240   /* Handle #pragma, if any.  */
22241   else if (token->type == CPP_PRAGMA)
22242     cp_parser_pragma (parser, pragma_external);
22243   /* Allow stray semicolons.  */
22244   else if (token->type == CPP_SEMICOLON)
22245     cp_lexer_consume_token (parser->lexer);
22246   /* Mark methods as optional or required, when building protocols.  */
22247   else if (token->keyword == RID_AT_OPTIONAL)
22248     {
22249       cp_lexer_consume_token (parser->lexer);
22250       objc_set_method_opt (true);
22251     }
22252   else if (token->keyword == RID_AT_REQUIRED)
22253     {
22254       cp_lexer_consume_token (parser->lexer);
22255       objc_set_method_opt (false);
22256     }
22257   else if (token->keyword == RID_NAMESPACE)
22258     cp_parser_namespace_definition (parser);
22259   /* Other stray characters must generate errors.  */
22260   else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
22261     {
22262       cp_lexer_consume_token (parser->lexer);
22263       error ("stray %qs between Objective-C++ methods",
22264              token->type == CPP_OPEN_BRACE ? "{" : "}");
22265     }
22266   /* Finally, try to parse a block-declaration, or a function-definition.  */
22267   else
22268     cp_parser_block_declaration (parser, /*statement_p=*/false);
22269 }
22270
22271 /* Parse a method signature.  */
22272
22273 static tree
22274 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
22275 {
22276   tree rettype, kwdparms, optparms;
22277   bool ellipsis = false;
22278   bool is_class_method;
22279
22280   is_class_method = cp_parser_objc_method_type (parser);
22281   rettype = cp_parser_objc_typename (parser);
22282   *attributes = NULL_TREE;
22283   kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
22284   if (kwdparms == error_mark_node)
22285     return error_mark_node;
22286   optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
22287   if (optparms == error_mark_node)
22288     return error_mark_node;
22289
22290   return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
22291 }
22292
22293 static bool
22294 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
22295 {
22296   tree tattr;  
22297   cp_lexer_save_tokens (parser->lexer);
22298   tattr = cp_parser_attributes_opt (parser);
22299   gcc_assert (tattr) ;
22300   
22301   /* If the attributes are followed by a method introducer, this is not allowed.
22302      Dump the attributes and flag the situation.  */
22303   if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
22304       || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
22305     return true;
22306
22307   /* Otherwise, the attributes introduce some interstitial code, possibly so
22308      rewind to allow that check.  */
22309   cp_lexer_rollback_tokens (parser->lexer);
22310   return false;  
22311 }
22312
22313 /* Parse an Objective-C method prototype list.  */
22314
22315 static void
22316 cp_parser_objc_method_prototype_list (cp_parser* parser)
22317 {
22318   cp_token *token = cp_lexer_peek_token (parser->lexer);
22319
22320   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22321     {
22322       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22323         {
22324           tree attributes, sig;
22325           bool is_class_method;
22326           if (token->type == CPP_PLUS)
22327             is_class_method = true;
22328           else
22329             is_class_method = false;
22330           sig = cp_parser_objc_method_signature (parser, &attributes);
22331           if (sig == error_mark_node)
22332             {
22333               cp_parser_skip_to_end_of_block_or_statement (parser);
22334               token = cp_lexer_peek_token (parser->lexer);
22335               continue;
22336             }
22337           objc_add_method_declaration (is_class_method, sig, attributes);
22338           cp_parser_consume_semicolon_at_end_of_statement (parser);
22339         }
22340       else if (token->keyword == RID_AT_PROPERTY)
22341         cp_parser_objc_at_property_declaration (parser);
22342       else if (token->keyword == RID_ATTRIBUTE 
22343                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22344         warning_at (cp_lexer_peek_token (parser->lexer)->location, 
22345                     OPT_Wattributes, 
22346                     "prefix attributes are ignored for methods");
22347       else
22348         /* Allow for interspersed non-ObjC++ code.  */
22349         cp_parser_objc_interstitial_code (parser);
22350
22351       token = cp_lexer_peek_token (parser->lexer);
22352     }
22353
22354   if (token->type != CPP_EOF)
22355     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22356   else
22357     cp_parser_error (parser, "expected %<@end%>");
22358
22359   objc_finish_interface ();
22360 }
22361
22362 /* Parse an Objective-C method definition list.  */
22363
22364 static void
22365 cp_parser_objc_method_definition_list (cp_parser* parser)
22366 {
22367   cp_token *token = cp_lexer_peek_token (parser->lexer);
22368
22369   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22370     {
22371       tree meth;
22372
22373       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22374         {
22375           cp_token *ptk;
22376           tree sig, attribute;
22377           bool is_class_method;
22378           if (token->type == CPP_PLUS)
22379             is_class_method = true;
22380           else
22381             is_class_method = false;
22382           push_deferring_access_checks (dk_deferred);
22383           sig = cp_parser_objc_method_signature (parser, &attribute);
22384           if (sig == error_mark_node)
22385             {
22386               cp_parser_skip_to_end_of_block_or_statement (parser);
22387               token = cp_lexer_peek_token (parser->lexer);
22388               continue;
22389             }
22390           objc_start_method_definition (is_class_method, sig, attribute,
22391                                         NULL_TREE);
22392
22393           /* For historical reasons, we accept an optional semicolon.  */
22394           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22395             cp_lexer_consume_token (parser->lexer);
22396
22397           ptk = cp_lexer_peek_token (parser->lexer);
22398           if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS 
22399                 || ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
22400             {
22401               perform_deferred_access_checks ();
22402               stop_deferring_access_checks ();
22403               meth = cp_parser_function_definition_after_declarator (parser,
22404                                                                      false);
22405               pop_deferring_access_checks ();
22406               objc_finish_method_definition (meth);
22407             }
22408         }
22409       /* The following case will be removed once @synthesize is
22410          completely implemented.  */
22411       else if (token->keyword == RID_AT_PROPERTY)
22412         cp_parser_objc_at_property_declaration (parser);
22413       else if (token->keyword == RID_AT_SYNTHESIZE)
22414         cp_parser_objc_at_synthesize_declaration (parser);
22415       else if (token->keyword == RID_AT_DYNAMIC)
22416         cp_parser_objc_at_dynamic_declaration (parser);
22417       else if (token->keyword == RID_ATTRIBUTE 
22418                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22419         warning_at (token->location, OPT_Wattributes,
22420                     "prefix attributes are ignored for methods");
22421       else
22422         /* Allow for interspersed non-ObjC++ code.  */
22423         cp_parser_objc_interstitial_code (parser);
22424
22425       token = cp_lexer_peek_token (parser->lexer);
22426     }
22427
22428   if (token->type != CPP_EOF)
22429     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22430   else
22431     cp_parser_error (parser, "expected %<@end%>");
22432
22433   objc_finish_implementation ();
22434 }
22435
22436 /* Parse Objective-C ivars.  */
22437
22438 static void
22439 cp_parser_objc_class_ivars (cp_parser* parser)
22440 {
22441   cp_token *token = cp_lexer_peek_token (parser->lexer);
22442
22443   if (token->type != CPP_OPEN_BRACE)
22444     return;     /* No ivars specified.  */
22445
22446   cp_lexer_consume_token (parser->lexer);  /* Eat '{'.  */
22447   token = cp_lexer_peek_token (parser->lexer);
22448
22449   while (token->type != CPP_CLOSE_BRACE 
22450         && token->keyword != RID_AT_END && token->type != CPP_EOF)
22451     {
22452       cp_decl_specifier_seq declspecs;
22453       int decl_class_or_enum_p;
22454       tree prefix_attributes;
22455
22456       cp_parser_objc_visibility_spec (parser);
22457
22458       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
22459         break;
22460
22461       cp_parser_decl_specifier_seq (parser,
22462                                     CP_PARSER_FLAGS_OPTIONAL,
22463                                     &declspecs,
22464                                     &decl_class_or_enum_p);
22465
22466       /* auto, register, static, extern, mutable.  */
22467       if (declspecs.storage_class != sc_none)
22468         {
22469           cp_parser_error (parser, "invalid type for instance variable");         
22470           declspecs.storage_class = sc_none;
22471         }
22472
22473       /* __thread.  */
22474       if (declspecs.specs[(int) ds_thread])
22475         {
22476           cp_parser_error (parser, "invalid type for instance variable");
22477           declspecs.specs[(int) ds_thread] = 0;
22478         }
22479       
22480       /* typedef.  */
22481       if (declspecs.specs[(int) ds_typedef])
22482         {
22483           cp_parser_error (parser, "invalid type for instance variable");
22484           declspecs.specs[(int) ds_typedef] = 0;
22485         }
22486
22487       prefix_attributes = declspecs.attributes;
22488       declspecs.attributes = NULL_TREE;
22489
22490       /* Keep going until we hit the `;' at the end of the
22491          declaration.  */
22492       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22493         {
22494           tree width = NULL_TREE, attributes, first_attribute, decl;
22495           cp_declarator *declarator = NULL;
22496           int ctor_dtor_or_conv_p;
22497
22498           /* Check for a (possibly unnamed) bitfield declaration.  */
22499           token = cp_lexer_peek_token (parser->lexer);
22500           if (token->type == CPP_COLON)
22501             goto eat_colon;
22502
22503           if (token->type == CPP_NAME
22504               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
22505                   == CPP_COLON))
22506             {
22507               /* Get the name of the bitfield.  */
22508               declarator = make_id_declarator (NULL_TREE,
22509                                                cp_parser_identifier (parser),
22510                                                sfk_none);
22511
22512              eat_colon:
22513               cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22514               /* Get the width of the bitfield.  */
22515               width
22516                 = cp_parser_constant_expression (parser,
22517                                                  /*allow_non_constant=*/false,
22518                                                  NULL);
22519             }
22520           else
22521             {
22522               /* Parse the declarator.  */
22523               declarator
22524                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
22525                                         &ctor_dtor_or_conv_p,
22526                                         /*parenthesized_p=*/NULL,
22527                                         /*member_p=*/false);
22528             }
22529
22530           /* Look for attributes that apply to the ivar.  */
22531           attributes = cp_parser_attributes_opt (parser);
22532           /* Remember which attributes are prefix attributes and
22533              which are not.  */
22534           first_attribute = attributes;
22535           /* Combine the attributes.  */
22536           attributes = chainon (prefix_attributes, attributes);
22537
22538           if (width)
22539               /* Create the bitfield declaration.  */
22540               decl = grokbitfield (declarator, &declspecs,
22541                                    width,
22542                                    attributes);
22543           else
22544             decl = grokfield (declarator, &declspecs,
22545                               NULL_TREE, /*init_const_expr_p=*/false,
22546                               NULL_TREE, attributes);
22547
22548           /* Add the instance variable.  */
22549           if (decl != error_mark_node && decl != NULL_TREE)
22550             objc_add_instance_variable (decl);
22551
22552           /* Reset PREFIX_ATTRIBUTES.  */
22553           while (attributes && TREE_CHAIN (attributes) != first_attribute)
22554             attributes = TREE_CHAIN (attributes);
22555           if (attributes)
22556             TREE_CHAIN (attributes) = NULL_TREE;
22557
22558           token = cp_lexer_peek_token (parser->lexer);
22559
22560           if (token->type == CPP_COMMA)
22561             {
22562               cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22563               continue;
22564             }
22565           break;
22566         }
22567
22568       cp_parser_consume_semicolon_at_end_of_statement (parser);
22569       token = cp_lexer_peek_token (parser->lexer);
22570     }
22571
22572   if (token->keyword == RID_AT_END)
22573     cp_parser_error (parser, "expected %<}%>");
22574
22575   /* Do not consume the RID_AT_END, so it will be read again as terminating
22576      the @interface of @implementation.  */ 
22577   if (token->keyword != RID_AT_END && token->type != CPP_EOF)
22578     cp_lexer_consume_token (parser->lexer);  /* Eat '}'.  */
22579     
22580   /* For historical reasons, we accept an optional semicolon.  */
22581   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22582     cp_lexer_consume_token (parser->lexer);
22583 }
22584
22585 /* Parse an Objective-C protocol declaration.  */
22586
22587 static void
22588 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
22589 {
22590   tree proto, protorefs;
22591   cp_token *tok;
22592
22593   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
22594   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
22595     {
22596       tok = cp_lexer_peek_token (parser->lexer);
22597       error_at (tok->location, "identifier expected after %<@protocol%>");
22598       cp_parser_consume_semicolon_at_end_of_statement (parser);
22599       return;
22600     }
22601
22602   /* See if we have a forward declaration or a definition.  */
22603   tok = cp_lexer_peek_nth_token (parser->lexer, 2);
22604
22605   /* Try a forward declaration first.  */
22606   if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
22607     {
22608       while (true)
22609         {
22610           tree id;
22611           
22612           id = cp_parser_identifier (parser);
22613           if (id == error_mark_node)
22614             break;
22615           
22616           objc_declare_protocol (id, attributes);
22617           
22618           if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22619             cp_lexer_consume_token (parser->lexer);
22620           else
22621             break;
22622         }
22623       cp_parser_consume_semicolon_at_end_of_statement (parser);
22624     }
22625
22626   /* Ok, we got a full-fledged definition (or at least should).  */
22627   else
22628     {
22629       proto = cp_parser_identifier (parser);
22630       protorefs = cp_parser_objc_protocol_refs_opt (parser);
22631       objc_start_protocol (proto, protorefs, attributes);
22632       cp_parser_objc_method_prototype_list (parser);
22633     }
22634 }
22635
22636 /* Parse an Objective-C superclass or category.  */
22637
22638 static void
22639 cp_parser_objc_superclass_or_category (cp_parser *parser, 
22640                                        bool iface_p,
22641                                        tree *super,
22642                                        tree *categ, bool *is_class_extension)
22643 {
22644   cp_token *next = cp_lexer_peek_token (parser->lexer);
22645
22646   *super = *categ = NULL_TREE;
22647   *is_class_extension = false;
22648   if (next->type == CPP_COLON)
22649     {
22650       cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22651       *super = cp_parser_identifier (parser);
22652     }
22653   else if (next->type == CPP_OPEN_PAREN)
22654     {
22655       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22656
22657       /* If there is no category name, and this is an @interface, we
22658          have a class extension.  */
22659       if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22660         {
22661           *categ = NULL_TREE;
22662           *is_class_extension = true;
22663         }
22664       else
22665         *categ = cp_parser_identifier (parser);
22666
22667       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22668     }
22669 }
22670
22671 /* Parse an Objective-C class interface.  */
22672
22673 static void
22674 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
22675 {
22676   tree name, super, categ, protos;
22677   bool is_class_extension;
22678
22679   cp_lexer_consume_token (parser->lexer);  /* Eat '@interface'.  */
22680   name = cp_parser_identifier (parser);
22681   if (name == error_mark_node)
22682     {
22683       /* It's hard to recover because even if valid @interface stuff
22684          is to follow, we can't compile it (or validate it) if we
22685          don't even know which class it refers to.  Let's assume this
22686          was a stray '@interface' token in the stream and skip it.
22687       */
22688       return;
22689     }
22690   cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
22691                                          &is_class_extension);
22692   protos = cp_parser_objc_protocol_refs_opt (parser);
22693
22694   /* We have either a class or a category on our hands.  */
22695   if (categ || is_class_extension)
22696     objc_start_category_interface (name, categ, protos, attributes);
22697   else
22698     {
22699       objc_start_class_interface (name, super, protos, attributes);
22700       /* Handle instance variable declarations, if any.  */
22701       cp_parser_objc_class_ivars (parser);
22702       objc_continue_interface ();
22703     }
22704
22705   cp_parser_objc_method_prototype_list (parser);
22706 }
22707
22708 /* Parse an Objective-C class implementation.  */
22709
22710 static void
22711 cp_parser_objc_class_implementation (cp_parser* parser)
22712 {
22713   tree name, super, categ;
22714   bool is_class_extension;
22715
22716   cp_lexer_consume_token (parser->lexer);  /* Eat '@implementation'.  */
22717   name = cp_parser_identifier (parser);
22718   if (name == error_mark_node)
22719     {
22720       /* It's hard to recover because even if valid @implementation
22721          stuff is to follow, we can't compile it (or validate it) if
22722          we don't even know which class it refers to.  Let's assume
22723          this was a stray '@implementation' token in the stream and
22724          skip it.
22725       */
22726       return;
22727     }
22728   cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
22729                                          &is_class_extension);
22730
22731   /* We have either a class or a category on our hands.  */
22732   if (categ)
22733     objc_start_category_implementation (name, categ);
22734   else
22735     {
22736       objc_start_class_implementation (name, super);
22737       /* Handle instance variable declarations, if any.  */
22738       cp_parser_objc_class_ivars (parser);
22739       objc_continue_implementation ();
22740     }
22741
22742   cp_parser_objc_method_definition_list (parser);
22743 }
22744
22745 /* Consume the @end token and finish off the implementation.  */
22746
22747 static void
22748 cp_parser_objc_end_implementation (cp_parser* parser)
22749 {
22750   cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22751   objc_finish_implementation ();
22752 }
22753
22754 /* Parse an Objective-C declaration.  */
22755
22756 static void
22757 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
22758 {
22759   /* Try to figure out what kind of declaration is present.  */
22760   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22761
22762   if (attributes)
22763     switch (kwd->keyword)
22764       {
22765         case RID_AT_ALIAS:
22766         case RID_AT_CLASS:
22767         case RID_AT_END:
22768           error_at (kwd->location, "attributes may not be specified before"
22769                     " the %<@%D%> Objective-C++ keyword",
22770                     kwd->u.value);
22771           attributes = NULL;
22772           break;
22773         case RID_AT_IMPLEMENTATION:
22774           warning_at (kwd->location, OPT_Wattributes,
22775                       "prefix attributes are ignored before %<@%D%>",
22776                       kwd->u.value);
22777           attributes = NULL;
22778         default:
22779           break;
22780       }
22781
22782   switch (kwd->keyword)
22783     {
22784     case RID_AT_ALIAS:
22785       cp_parser_objc_alias_declaration (parser);
22786       break;
22787     case RID_AT_CLASS:
22788       cp_parser_objc_class_declaration (parser);
22789       break;
22790     case RID_AT_PROTOCOL:
22791       cp_parser_objc_protocol_declaration (parser, attributes);
22792       break;
22793     case RID_AT_INTERFACE:
22794       cp_parser_objc_class_interface (parser, attributes);
22795       break;
22796     case RID_AT_IMPLEMENTATION:
22797       cp_parser_objc_class_implementation (parser);
22798       break;
22799     case RID_AT_END:
22800       cp_parser_objc_end_implementation (parser);
22801       break;
22802     default:
22803       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
22804                 kwd->u.value);
22805       cp_parser_skip_to_end_of_block_or_statement (parser);
22806     }
22807 }
22808
22809 /* Parse an Objective-C try-catch-finally statement.
22810
22811    objc-try-catch-finally-stmt:
22812      @try compound-statement objc-catch-clause-seq [opt]
22813        objc-finally-clause [opt]
22814
22815    objc-catch-clause-seq:
22816      objc-catch-clause objc-catch-clause-seq [opt]
22817
22818    objc-catch-clause:
22819      @catch ( objc-exception-declaration ) compound-statement
22820
22821    objc-finally-clause:
22822      @finally compound-statement
22823
22824    objc-exception-declaration:
22825      parameter-declaration
22826      '...'
22827
22828    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
22829
22830    Returns NULL_TREE.
22831
22832    PS: This function is identical to c_parser_objc_try_catch_finally_statement
22833    for C.  Keep them in sync.  */   
22834
22835 static tree
22836 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
22837 {
22838   location_t location;
22839   tree stmt;
22840
22841   cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
22842   location = cp_lexer_peek_token (parser->lexer)->location;
22843   objc_maybe_warn_exceptions (location);
22844   /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
22845      node, lest it get absorbed into the surrounding block.  */
22846   stmt = push_stmt_list ();
22847   cp_parser_compound_statement (parser, NULL, false, false);
22848   objc_begin_try_stmt (location, pop_stmt_list (stmt));
22849
22850   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
22851     {
22852       cp_parameter_declarator *parm;
22853       tree parameter_declaration = error_mark_node;
22854       bool seen_open_paren = false;
22855
22856       cp_lexer_consume_token (parser->lexer);
22857       if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
22858         seen_open_paren = true;
22859       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
22860         {
22861           /* We have "@catch (...)" (where the '...' are literally
22862              what is in the code).  Skip the '...'.
22863              parameter_declaration is set to NULL_TREE, and
22864              objc_being_catch_clauses() knows that that means
22865              '...'.  */
22866           cp_lexer_consume_token (parser->lexer);
22867           parameter_declaration = NULL_TREE;
22868         }
22869       else
22870         {
22871           /* We have "@catch (NSException *exception)" or something
22872              like that.  Parse the parameter declaration.  */
22873           parm = cp_parser_parameter_declaration (parser, false, NULL);
22874           if (parm == NULL)
22875             parameter_declaration = error_mark_node;
22876           else
22877             parameter_declaration = grokdeclarator (parm->declarator,
22878                                                     &parm->decl_specifiers,
22879                                                     PARM, /*initialized=*/0,
22880                                                     /*attrlist=*/NULL);
22881         }
22882       if (seen_open_paren)
22883         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22884       else
22885         {
22886           /* If there was no open parenthesis, we are recovering from
22887              an error, and we are trying to figure out what mistake
22888              the user has made.  */
22889
22890           /* If there is an immediate closing parenthesis, the user
22891              probably forgot the opening one (ie, they typed "@catch
22892              NSException *e)".  Parse the closing parenthesis and keep
22893              going.  */
22894           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22895             cp_lexer_consume_token (parser->lexer);
22896           
22897           /* If these is no immediate closing parenthesis, the user
22898              probably doesn't know that parenthesis are required at
22899              all (ie, they typed "@catch NSException *e").  So, just
22900              forget about the closing parenthesis and keep going.  */
22901         }
22902       objc_begin_catch_clause (parameter_declaration);
22903       cp_parser_compound_statement (parser, NULL, false, false);
22904       objc_finish_catch_clause ();
22905     }
22906   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
22907     {
22908       cp_lexer_consume_token (parser->lexer);
22909       location = cp_lexer_peek_token (parser->lexer)->location;
22910       /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
22911          node, lest it get absorbed into the surrounding block.  */
22912       stmt = push_stmt_list ();
22913       cp_parser_compound_statement (parser, NULL, false, false);
22914       objc_build_finally_clause (location, pop_stmt_list (stmt));
22915     }
22916
22917   return objc_finish_try_stmt ();
22918 }
22919
22920 /* Parse an Objective-C synchronized statement.
22921
22922    objc-synchronized-stmt:
22923      @synchronized ( expression ) compound-statement
22924
22925    Returns NULL_TREE.  */
22926
22927 static tree
22928 cp_parser_objc_synchronized_statement (cp_parser *parser)
22929 {
22930   location_t location;
22931   tree lock, stmt;
22932
22933   cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
22934
22935   location = cp_lexer_peek_token (parser->lexer)->location;
22936   objc_maybe_warn_exceptions (location);
22937   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
22938   lock = cp_parser_expression (parser, false, NULL);
22939   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22940
22941   /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
22942      node, lest it get absorbed into the surrounding block.  */
22943   stmt = push_stmt_list ();
22944   cp_parser_compound_statement (parser, NULL, false, false);
22945
22946   return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
22947 }
22948
22949 /* Parse an Objective-C throw statement.
22950
22951    objc-throw-stmt:
22952      @throw assignment-expression [opt] ;
22953
22954    Returns a constructed '@throw' statement.  */
22955
22956 static tree
22957 cp_parser_objc_throw_statement (cp_parser *parser)
22958 {
22959   tree expr = NULL_TREE;
22960   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
22961
22962   cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
22963
22964   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22965     expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
22966
22967   cp_parser_consume_semicolon_at_end_of_statement (parser);
22968
22969   return objc_build_throw_stmt (loc, expr);
22970 }
22971
22972 /* Parse an Objective-C statement.  */
22973
22974 static tree
22975 cp_parser_objc_statement (cp_parser * parser)
22976 {
22977   /* Try to figure out what kind of declaration is present.  */
22978   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22979
22980   switch (kwd->keyword)
22981     {
22982     case RID_AT_TRY:
22983       return cp_parser_objc_try_catch_finally_statement (parser);
22984     case RID_AT_SYNCHRONIZED:
22985       return cp_parser_objc_synchronized_statement (parser);
22986     case RID_AT_THROW:
22987       return cp_parser_objc_throw_statement (parser);
22988     default:
22989       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
22990                kwd->u.value);
22991       cp_parser_skip_to_end_of_block_or_statement (parser);
22992     }
22993
22994   return error_mark_node;
22995 }
22996
22997 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to 
22998    look ahead to see if an objc keyword follows the attributes.  This
22999    is to detect the use of prefix attributes on ObjC @interface and 
23000    @protocol.  */
23001
23002 static bool
23003 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
23004 {
23005   cp_lexer_save_tokens (parser->lexer);
23006   *attrib = cp_parser_attributes_opt (parser);
23007   gcc_assert (*attrib);
23008   if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
23009     {
23010       cp_lexer_commit_tokens (parser->lexer);
23011       return true;
23012     }
23013   cp_lexer_rollback_tokens (parser->lexer);
23014   return false;  
23015 }
23016
23017 /* This routine is a minimal replacement for
23018    c_parser_struct_declaration () used when parsing the list of
23019    types/names or ObjC++ properties.  For example, when parsing the
23020    code
23021
23022    @property (readonly) int a, b, c;
23023
23024    this function is responsible for parsing "int a, int b, int c" and
23025    returning the declarations as CHAIN of DECLs.
23026
23027    TODO: Share this code with cp_parser_objc_class_ivars.  It's very
23028    similar parsing.  */
23029 static tree
23030 cp_parser_objc_struct_declaration (cp_parser *parser)
23031 {
23032   tree decls = NULL_TREE;
23033   cp_decl_specifier_seq declspecs;
23034   int decl_class_or_enum_p;
23035   tree prefix_attributes;
23036
23037   cp_parser_decl_specifier_seq (parser,
23038                                 CP_PARSER_FLAGS_NONE,
23039                                 &declspecs,
23040                                 &decl_class_or_enum_p);
23041
23042   if (declspecs.type == error_mark_node)
23043     return error_mark_node;
23044
23045   /* auto, register, static, extern, mutable.  */
23046   if (declspecs.storage_class != sc_none)
23047     {
23048       cp_parser_error (parser, "invalid type for property");
23049       declspecs.storage_class = sc_none;
23050     }
23051   
23052   /* __thread.  */
23053   if (declspecs.specs[(int) ds_thread])
23054     {
23055       cp_parser_error (parser, "invalid type for property");
23056       declspecs.specs[(int) ds_thread] = 0;
23057     }
23058   
23059   /* typedef.  */
23060   if (declspecs.specs[(int) ds_typedef])
23061     {
23062       cp_parser_error (parser, "invalid type for property");
23063       declspecs.specs[(int) ds_typedef] = 0;
23064     }
23065
23066   prefix_attributes = declspecs.attributes;
23067   declspecs.attributes = NULL_TREE;
23068
23069   /* Keep going until we hit the `;' at the end of the declaration. */
23070   while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23071     {
23072       tree attributes, first_attribute, decl;
23073       cp_declarator *declarator;
23074       cp_token *token;
23075
23076       /* Parse the declarator.  */
23077       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
23078                                          NULL, NULL, false);
23079
23080       /* Look for attributes that apply to the ivar.  */
23081       attributes = cp_parser_attributes_opt (parser);
23082       /* Remember which attributes are prefix attributes and
23083          which are not.  */
23084       first_attribute = attributes;
23085       /* Combine the attributes.  */
23086       attributes = chainon (prefix_attributes, attributes);
23087       
23088       decl = grokfield (declarator, &declspecs,
23089                         NULL_TREE, /*init_const_expr_p=*/false,
23090                         NULL_TREE, attributes);
23091
23092       if (decl == error_mark_node || decl == NULL_TREE)
23093         return error_mark_node;
23094       
23095       /* Reset PREFIX_ATTRIBUTES.  */
23096       while (attributes && TREE_CHAIN (attributes) != first_attribute)
23097         attributes = TREE_CHAIN (attributes);
23098       if (attributes)
23099         TREE_CHAIN (attributes) = NULL_TREE;
23100
23101       DECL_CHAIN (decl) = decls;
23102       decls = decl;
23103
23104       token = cp_lexer_peek_token (parser->lexer);
23105       if (token->type == CPP_COMMA)
23106         {
23107           cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
23108           continue;
23109         }
23110       else
23111         break;
23112     }
23113   return decls;
23114 }
23115
23116 /* Parse an Objective-C @property declaration.  The syntax is:
23117
23118    objc-property-declaration:
23119      '@property' objc-property-attributes[opt] struct-declaration ;
23120
23121    objc-property-attributes:
23122     '(' objc-property-attribute-list ')'
23123
23124    objc-property-attribute-list:
23125      objc-property-attribute
23126      objc-property-attribute-list, objc-property-attribute
23127
23128    objc-property-attribute
23129      'getter' = identifier
23130      'setter' = identifier
23131      'readonly'
23132      'readwrite'
23133      'assign'
23134      'retain'
23135      'copy'
23136      'nonatomic'
23137
23138   For example:
23139     @property NSString *name;
23140     @property (readonly) id object;
23141     @property (retain, nonatomic, getter=getTheName) id name;
23142     @property int a, b, c;
23143
23144    PS: This function is identical to
23145    c_parser_objc_at_property_declaration for C.  Keep them in sync.  */
23146 static void 
23147 cp_parser_objc_at_property_declaration (cp_parser *parser)
23148 {
23149   /* The following variables hold the attributes of the properties as
23150      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
23151      seen.  When we see an attribute, we set them to 'true' (if they
23152      are boolean properties) or to the identifier (if they have an
23153      argument, ie, for getter and setter).  Note that here we only
23154      parse the list of attributes, check the syntax and accumulate the
23155      attributes that we find.  objc_add_property_declaration() will
23156      then process the information.  */
23157   bool property_assign = false;
23158   bool property_copy = false;
23159   tree property_getter_ident = NULL_TREE;
23160   bool property_nonatomic = false;
23161   bool property_readonly = false;
23162   bool property_readwrite = false;
23163   bool property_retain = false;
23164   tree property_setter_ident = NULL_TREE;
23165
23166   /* 'properties' is the list of properties that we read.  Usually a
23167      single one, but maybe more (eg, in "@property int a, b, c;" there
23168      are three).  */
23169   tree properties;
23170   location_t loc;
23171
23172   loc = cp_lexer_peek_token (parser->lexer)->location;
23173
23174   cp_lexer_consume_token (parser->lexer);  /* Eat '@property'.  */
23175
23176   /* Parse the optional attribute list...  */
23177   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
23178     {
23179       /* Eat the '('.  */
23180       cp_lexer_consume_token (parser->lexer);
23181
23182       while (true)
23183         {
23184           bool syntax_error = false;
23185           cp_token *token = cp_lexer_peek_token (parser->lexer);
23186           enum rid keyword;
23187
23188           if (token->type != CPP_NAME)
23189             {
23190               cp_parser_error (parser, "expected identifier");
23191               break;
23192             }
23193           keyword = C_RID_CODE (token->u.value);
23194           cp_lexer_consume_token (parser->lexer);
23195           switch (keyword)
23196             {
23197             case RID_ASSIGN:    property_assign = true;    break;
23198             case RID_COPY:      property_copy = true;      break;
23199             case RID_NONATOMIC: property_nonatomic = true; break;
23200             case RID_READONLY:  property_readonly = true;  break;
23201             case RID_READWRITE: property_readwrite = true; break;
23202             case RID_RETAIN:    property_retain = true;    break;
23203
23204             case RID_GETTER:
23205             case RID_SETTER:
23206               if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
23207                 {
23208                   if (keyword == RID_GETTER)
23209                     cp_parser_error (parser,
23210                                      "missing %<=%> (after %<getter%> attribute)");
23211                   else
23212                     cp_parser_error (parser,
23213                                      "missing %<=%> (after %<setter%> attribute)");
23214                   syntax_error = true;
23215                   break;
23216                 }
23217               cp_lexer_consume_token (parser->lexer); /* eat the = */
23218               if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
23219                 {
23220                   cp_parser_error (parser, "expected identifier");
23221                   syntax_error = true;
23222                   break;
23223                 }
23224               if (keyword == RID_SETTER)
23225                 {
23226                   if (property_setter_ident != NULL_TREE)
23227                     {
23228                       cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
23229                       cp_lexer_consume_token (parser->lexer);
23230                     }
23231                   else
23232                     property_setter_ident = cp_parser_objc_selector (parser);
23233                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
23234                     cp_parser_error (parser, "setter name must terminate with %<:%>");
23235                   else
23236                     cp_lexer_consume_token (parser->lexer);
23237                 }
23238               else
23239                 {
23240                   if (property_getter_ident != NULL_TREE)
23241                     {
23242                       cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
23243                       cp_lexer_consume_token (parser->lexer);
23244                     }
23245                   else
23246                     property_getter_ident = cp_parser_objc_selector (parser);
23247                 }
23248               break;
23249             default:
23250               cp_parser_error (parser, "unknown property attribute");
23251               syntax_error = true;
23252               break;
23253             }
23254
23255           if (syntax_error)
23256             break;
23257
23258           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23259             cp_lexer_consume_token (parser->lexer);
23260           else
23261             break;
23262         }
23263
23264       /* FIXME: "@property (setter, assign);" will generate a spurious
23265          "error: expected â€˜)’ before â€˜,’ token".  This is because
23266          cp_parser_require, unlike the C counterpart, will produce an
23267          error even if we are in error recovery.  */
23268       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23269         {
23270           cp_parser_skip_to_closing_parenthesis (parser,
23271                                                  /*recovering=*/true,
23272                                                  /*or_comma=*/false,
23273                                                  /*consume_paren=*/true);
23274         }
23275     }
23276
23277   /* ... and the property declaration(s).  */
23278   properties = cp_parser_objc_struct_declaration (parser);
23279
23280   if (properties == error_mark_node)
23281     {
23282       cp_parser_skip_to_end_of_statement (parser);
23283       /* If the next token is now a `;', consume it.  */
23284       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23285         cp_lexer_consume_token (parser->lexer);
23286       return;
23287     }
23288
23289   if (properties == NULL_TREE)
23290     cp_parser_error (parser, "expected identifier");
23291   else
23292     {
23293       /* Comma-separated properties are chained together in
23294          reverse order; add them one by one.  */
23295       properties = nreverse (properties);
23296       
23297       for (; properties; properties = TREE_CHAIN (properties))
23298         objc_add_property_declaration (loc, copy_node (properties),
23299                                        property_readonly, property_readwrite,
23300                                        property_assign, property_retain,
23301                                        property_copy, property_nonatomic,
23302                                        property_getter_ident, property_setter_ident);
23303     }
23304   
23305   cp_parser_consume_semicolon_at_end_of_statement (parser);
23306 }
23307
23308 /* Parse an Objective-C++ @synthesize declaration.  The syntax is:
23309
23310    objc-synthesize-declaration:
23311      @synthesize objc-synthesize-identifier-list ;
23312
23313    objc-synthesize-identifier-list:
23314      objc-synthesize-identifier
23315      objc-synthesize-identifier-list, objc-synthesize-identifier
23316
23317    objc-synthesize-identifier
23318      identifier
23319      identifier = identifier
23320
23321   For example:
23322     @synthesize MyProperty;
23323     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
23324
23325   PS: This function is identical to c_parser_objc_at_synthesize_declaration
23326   for C.  Keep them in sync.
23327 */
23328 static void 
23329 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
23330 {
23331   tree list = NULL_TREE;
23332   location_t loc;
23333   loc = cp_lexer_peek_token (parser->lexer)->location;
23334
23335   cp_lexer_consume_token (parser->lexer);  /* Eat '@synthesize'.  */
23336   while (true)
23337     {
23338       tree property, ivar;
23339       property = cp_parser_identifier (parser);
23340       if (property == error_mark_node)
23341         {
23342           cp_parser_consume_semicolon_at_end_of_statement (parser);
23343           return;
23344         }
23345       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
23346         {
23347           cp_lexer_consume_token (parser->lexer);
23348           ivar = cp_parser_identifier (parser);
23349           if (ivar == error_mark_node)
23350             {
23351               cp_parser_consume_semicolon_at_end_of_statement (parser);
23352               return;
23353             }
23354         }
23355       else
23356         ivar = NULL_TREE;
23357       list = chainon (list, build_tree_list (ivar, property));
23358       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23359         cp_lexer_consume_token (parser->lexer);
23360       else
23361         break;
23362     }
23363   cp_parser_consume_semicolon_at_end_of_statement (parser);
23364   objc_add_synthesize_declaration (loc, list);
23365 }
23366
23367 /* Parse an Objective-C++ @dynamic declaration.  The syntax is:
23368
23369    objc-dynamic-declaration:
23370      @dynamic identifier-list ;
23371
23372    For example:
23373      @dynamic MyProperty;
23374      @dynamic MyProperty, AnotherProperty;
23375
23376   PS: This function is identical to c_parser_objc_at_dynamic_declaration
23377   for C.  Keep them in sync.
23378 */
23379 static void 
23380 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
23381 {
23382   tree list = NULL_TREE;
23383   location_t loc;
23384   loc = cp_lexer_peek_token (parser->lexer)->location;
23385
23386   cp_lexer_consume_token (parser->lexer);  /* Eat '@dynamic'.  */
23387   while (true)
23388     {
23389       tree property;
23390       property = cp_parser_identifier (parser);
23391       if (property == error_mark_node)
23392         {
23393           cp_parser_consume_semicolon_at_end_of_statement (parser);
23394           return;
23395         }
23396       list = chainon (list, build_tree_list (NULL, property));
23397       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23398         cp_lexer_consume_token (parser->lexer);
23399       else
23400         break;
23401     }
23402   cp_parser_consume_semicolon_at_end_of_statement (parser);
23403   objc_add_dynamic_declaration (loc, list);
23404 }
23405
23406 \f
23407 /* OpenMP 2.5 parsing routines.  */
23408
23409 /* Returns name of the next clause.
23410    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
23411    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
23412    returned and the token is consumed.  */
23413
23414 static pragma_omp_clause
23415 cp_parser_omp_clause_name (cp_parser *parser)
23416 {
23417   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
23418
23419   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
23420     result = PRAGMA_OMP_CLAUSE_IF;
23421   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
23422     result = PRAGMA_OMP_CLAUSE_DEFAULT;
23423   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
23424     result = PRAGMA_OMP_CLAUSE_PRIVATE;
23425   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23426     {
23427       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23428       const char *p = IDENTIFIER_POINTER (id);
23429
23430       switch (p[0])
23431         {
23432         case 'c':
23433           if (!strcmp ("collapse", p))
23434             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
23435           else if (!strcmp ("copyin", p))
23436             result = PRAGMA_OMP_CLAUSE_COPYIN;
23437           else if (!strcmp ("copyprivate", p))
23438             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
23439           break;
23440         case 'f':
23441           if (!strcmp ("firstprivate", p))
23442             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
23443           break;
23444         case 'l':
23445           if (!strcmp ("lastprivate", p))
23446             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
23447           break;
23448         case 'n':
23449           if (!strcmp ("nowait", p))
23450             result = PRAGMA_OMP_CLAUSE_NOWAIT;
23451           else if (!strcmp ("num_threads", p))
23452             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
23453           break;
23454         case 'o':
23455           if (!strcmp ("ordered", p))
23456             result = PRAGMA_OMP_CLAUSE_ORDERED;
23457           break;
23458         case 'r':
23459           if (!strcmp ("reduction", p))
23460             result = PRAGMA_OMP_CLAUSE_REDUCTION;
23461           break;
23462         case 's':
23463           if (!strcmp ("schedule", p))
23464             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
23465           else if (!strcmp ("shared", p))
23466             result = PRAGMA_OMP_CLAUSE_SHARED;
23467           break;
23468         case 'u':
23469           if (!strcmp ("untied", p))
23470             result = PRAGMA_OMP_CLAUSE_UNTIED;
23471           break;
23472         }
23473     }
23474
23475   if (result != PRAGMA_OMP_CLAUSE_NONE)
23476     cp_lexer_consume_token (parser->lexer);
23477
23478   return result;
23479 }
23480
23481 /* Validate that a clause of the given type does not already exist.  */
23482
23483 static void
23484 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
23485                            const char *name, location_t location)
23486 {
23487   tree c;
23488
23489   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
23490     if (OMP_CLAUSE_CODE (c) == code)
23491       {
23492         error_at (location, "too many %qs clauses", name);
23493         break;
23494       }
23495 }
23496
23497 /* OpenMP 2.5:
23498    variable-list:
23499      identifier
23500      variable-list , identifier
23501
23502    In addition, we match a closing parenthesis.  An opening parenthesis
23503    will have been consumed by the caller.
23504
23505    If KIND is nonzero, create the appropriate node and install the decl
23506    in OMP_CLAUSE_DECL and add the node to the head of the list.
23507
23508    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
23509    return the list created.  */
23510
23511 static tree
23512 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
23513                                 tree list)
23514 {
23515   cp_token *token;
23516   while (1)
23517     {
23518       tree name, decl;
23519
23520       token = cp_lexer_peek_token (parser->lexer);
23521       name = cp_parser_id_expression (parser, /*template_p=*/false,
23522                                       /*check_dependency_p=*/true,
23523                                       /*template_p=*/NULL,
23524                                       /*declarator_p=*/false,
23525                                       /*optional_p=*/false);
23526       if (name == error_mark_node)
23527         goto skip_comma;
23528
23529       decl = cp_parser_lookup_name_simple (parser, name, token->location);
23530       if (decl == error_mark_node)
23531         cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
23532                                      token->location);
23533       else if (kind != 0)
23534         {
23535           tree u = build_omp_clause (token->location, kind);
23536           OMP_CLAUSE_DECL (u) = decl;
23537           OMP_CLAUSE_CHAIN (u) = list;
23538           list = u;
23539         }
23540       else
23541         list = tree_cons (decl, NULL_TREE, list);
23542
23543     get_comma:
23544       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
23545         break;
23546       cp_lexer_consume_token (parser->lexer);
23547     }
23548
23549   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23550     {
23551       int ending;
23552
23553       /* Try to resync to an unnested comma.  Copied from
23554          cp_parser_parenthesized_expression_list.  */
23555     skip_comma:
23556       ending = cp_parser_skip_to_closing_parenthesis (parser,
23557                                                       /*recovering=*/true,
23558                                                       /*or_comma=*/true,
23559                                                       /*consume_paren=*/true);
23560       if (ending < 0)
23561         goto get_comma;
23562     }
23563
23564   return list;
23565 }
23566
23567 /* Similarly, but expect leading and trailing parenthesis.  This is a very
23568    common case for omp clauses.  */
23569
23570 static tree
23571 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
23572 {
23573   if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23574     return cp_parser_omp_var_list_no_open (parser, kind, list);
23575   return list;
23576 }
23577
23578 /* OpenMP 3.0:
23579    collapse ( constant-expression ) */
23580
23581 static tree
23582 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
23583 {
23584   tree c, num;
23585   location_t loc;
23586   HOST_WIDE_INT n;
23587
23588   loc = cp_lexer_peek_token (parser->lexer)->location;
23589   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23590     return list;
23591
23592   num = cp_parser_constant_expression (parser, false, NULL);
23593
23594   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23595     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23596                                            /*or_comma=*/false,
23597                                            /*consume_paren=*/true);
23598
23599   if (num == error_mark_node)
23600     return list;
23601   num = fold_non_dependent_expr (num);
23602   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
23603       || !host_integerp (num, 0)
23604       || (n = tree_low_cst (num, 0)) <= 0
23605       || (int) n != n)
23606     {
23607       error_at (loc, "collapse argument needs positive constant integer expression");
23608       return list;
23609     }
23610
23611   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
23612   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
23613   OMP_CLAUSE_CHAIN (c) = list;
23614   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
23615
23616   return c;
23617 }
23618
23619 /* OpenMP 2.5:
23620    default ( shared | none ) */
23621
23622 static tree
23623 cp_parser_omp_clause_default (cp_parser *parser, tree list, location_t location)
23624 {
23625   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
23626   tree c;
23627
23628   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23629     return list;
23630   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 'n':
23638           if (strcmp ("none", p) != 0)
23639             goto invalid_kind;
23640           kind = OMP_CLAUSE_DEFAULT_NONE;
23641           break;
23642
23643         case 's':
23644           if (strcmp ("shared", p) != 0)
23645             goto invalid_kind;
23646           kind = OMP_CLAUSE_DEFAULT_SHARED;
23647           break;
23648
23649         default:
23650           goto invalid_kind;
23651         }
23652
23653       cp_lexer_consume_token (parser->lexer);
23654     }
23655   else
23656     {
23657     invalid_kind:
23658       cp_parser_error (parser, "expected %<none%> or %<shared%>");
23659     }
23660
23661   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23662     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23663                                            /*or_comma=*/false,
23664                                            /*consume_paren=*/true);
23665
23666   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
23667     return list;
23668
23669   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
23670   c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
23671   OMP_CLAUSE_CHAIN (c) = list;
23672   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
23673
23674   return c;
23675 }
23676
23677 /* OpenMP 2.5:
23678    if ( expression ) */
23679
23680 static tree
23681 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
23682 {
23683   tree t, c;
23684
23685   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23686     return list;
23687
23688   t = cp_parser_condition (parser);
23689
23690   if (t == error_mark_node
23691       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23692     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23693                                            /*or_comma=*/false,
23694                                            /*consume_paren=*/true);
23695
23696   check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if", location);
23697
23698   c = build_omp_clause (location, OMP_CLAUSE_IF);
23699   OMP_CLAUSE_IF_EXPR (c) = t;
23700   OMP_CLAUSE_CHAIN (c) = list;
23701
23702   return c;
23703 }
23704
23705 /* OpenMP 2.5:
23706    nowait */
23707
23708 static tree
23709 cp_parser_omp_clause_nowait (cp_parser *parser ATTRIBUTE_UNUSED,
23710                              tree list, location_t location)
23711 {
23712   tree c;
23713
23714   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
23715
23716   c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
23717   OMP_CLAUSE_CHAIN (c) = list;
23718   return c;
23719 }
23720
23721 /* OpenMP 2.5:
23722    num_threads ( expression ) */
23723
23724 static tree
23725 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
23726                                   location_t location)
23727 {
23728   tree t, c;
23729
23730   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23731     return list;
23732
23733   t = cp_parser_expression (parser, false, NULL);
23734
23735   if (t == error_mark_node
23736       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23737     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23738                                            /*or_comma=*/false,
23739                                            /*consume_paren=*/true);
23740
23741   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
23742                              "num_threads", location);
23743
23744   c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
23745   OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
23746   OMP_CLAUSE_CHAIN (c) = list;
23747
23748   return c;
23749 }
23750
23751 /* OpenMP 2.5:
23752    ordered */
23753
23754 static tree
23755 cp_parser_omp_clause_ordered (cp_parser *parser ATTRIBUTE_UNUSED,
23756                               tree list, location_t location)
23757 {
23758   tree c;
23759
23760   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
23761                              "ordered", location);
23762
23763   c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
23764   OMP_CLAUSE_CHAIN (c) = list;
23765   return c;
23766 }
23767
23768 /* OpenMP 2.5:
23769    reduction ( reduction-operator : variable-list )
23770
23771    reduction-operator:
23772      One of: + * - & ^ | && || */
23773
23774 static tree
23775 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
23776 {
23777   enum tree_code code;
23778   tree nlist, c;
23779
23780   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23781     return list;
23782
23783   switch (cp_lexer_peek_token (parser->lexer)->type)
23784     {
23785     case CPP_PLUS:
23786       code = PLUS_EXPR;
23787       break;
23788     case CPP_MULT:
23789       code = MULT_EXPR;
23790       break;
23791     case CPP_MINUS:
23792       code = MINUS_EXPR;
23793       break;
23794     case CPP_AND:
23795       code = BIT_AND_EXPR;
23796       break;
23797     case CPP_XOR:
23798       code = BIT_XOR_EXPR;
23799       break;
23800     case CPP_OR:
23801       code = BIT_IOR_EXPR;
23802       break;
23803     case CPP_AND_AND:
23804       code = TRUTH_ANDIF_EXPR;
23805       break;
23806     case CPP_OR_OR:
23807       code = TRUTH_ORIF_EXPR;
23808       break;
23809     default:
23810       cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
23811                                "%<|%>, %<&&%>, or %<||%>");
23812     resync_fail:
23813       cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23814                                              /*or_comma=*/false,
23815                                              /*consume_paren=*/true);
23816       return list;
23817     }
23818   cp_lexer_consume_token (parser->lexer);
23819
23820   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
23821     goto resync_fail;
23822
23823   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list);
23824   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
23825     OMP_CLAUSE_REDUCTION_CODE (c) = code;
23826
23827   return nlist;
23828 }
23829
23830 /* OpenMP 2.5:
23831    schedule ( schedule-kind )
23832    schedule ( schedule-kind , expression )
23833
23834    schedule-kind:
23835      static | dynamic | guided | runtime | auto  */
23836
23837 static tree
23838 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
23839 {
23840   tree c, t;
23841
23842   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23843     return list;
23844
23845   c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
23846
23847   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23848     {
23849       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23850       const char *p = IDENTIFIER_POINTER (id);
23851
23852       switch (p[0])
23853         {
23854         case 'd':
23855           if (strcmp ("dynamic", p) != 0)
23856             goto invalid_kind;
23857           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
23858           break;
23859
23860         case 'g':
23861           if (strcmp ("guided", p) != 0)
23862             goto invalid_kind;
23863           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
23864           break;
23865
23866         case 'r':
23867           if (strcmp ("runtime", p) != 0)
23868             goto invalid_kind;
23869           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
23870           break;
23871
23872         default:
23873           goto invalid_kind;
23874         }
23875     }
23876   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
23877     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
23878   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
23879     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
23880   else
23881     goto invalid_kind;
23882   cp_lexer_consume_token (parser->lexer);
23883
23884   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23885     {
23886       cp_token *token;
23887       cp_lexer_consume_token (parser->lexer);
23888
23889       token = cp_lexer_peek_token (parser->lexer);
23890       t = cp_parser_assignment_expression (parser, false, NULL);
23891
23892       if (t == error_mark_node)
23893         goto resync_fail;
23894       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
23895         error_at (token->location, "schedule %<runtime%> does not take "
23896                   "a %<chunk_size%> parameter");
23897       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
23898         error_at (token->location, "schedule %<auto%> does not take "
23899                   "a %<chunk_size%> parameter");
23900       else
23901         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
23902
23903       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23904         goto resync_fail;
23905     }
23906   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
23907     goto resync_fail;
23908
23909   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
23910   OMP_CLAUSE_CHAIN (c) = list;
23911   return c;
23912
23913  invalid_kind:
23914   cp_parser_error (parser, "invalid schedule kind");
23915  resync_fail:
23916   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23917                                          /*or_comma=*/false,
23918                                          /*consume_paren=*/true);
23919   return list;
23920 }
23921
23922 /* OpenMP 3.0:
23923    untied */
23924
23925 static tree
23926 cp_parser_omp_clause_untied (cp_parser *parser ATTRIBUTE_UNUSED,
23927                              tree list, location_t location)
23928 {
23929   tree c;
23930
23931   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
23932
23933   c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
23934   OMP_CLAUSE_CHAIN (c) = list;
23935   return c;
23936 }
23937
23938 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
23939    is a bitmask in MASK.  Return the list of clauses found; the result
23940    of clause default goes in *pdefault.  */
23941
23942 static tree
23943 cp_parser_omp_all_clauses (cp_parser *parser, unsigned int mask,
23944                            const char *where, cp_token *pragma_tok)
23945 {
23946   tree clauses = NULL;
23947   bool first = true;
23948   cp_token *token = NULL;
23949
23950   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
23951     {
23952       pragma_omp_clause c_kind;
23953       const char *c_name;
23954       tree prev = clauses;
23955
23956       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23957         cp_lexer_consume_token (parser->lexer);
23958
23959       token = cp_lexer_peek_token (parser->lexer);
23960       c_kind = cp_parser_omp_clause_name (parser);
23961       first = false;
23962
23963       switch (c_kind)
23964         {
23965         case PRAGMA_OMP_CLAUSE_COLLAPSE:
23966           clauses = cp_parser_omp_clause_collapse (parser, clauses,
23967                                                    token->location);
23968           c_name = "collapse";
23969           break;
23970         case PRAGMA_OMP_CLAUSE_COPYIN:
23971           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
23972           c_name = "copyin";
23973           break;
23974         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
23975           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
23976                                             clauses);
23977           c_name = "copyprivate";
23978           break;
23979         case PRAGMA_OMP_CLAUSE_DEFAULT:
23980           clauses = cp_parser_omp_clause_default (parser, clauses,
23981                                                   token->location);
23982           c_name = "default";
23983           break;
23984         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
23985           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
23986                                             clauses);
23987           c_name = "firstprivate";
23988           break;
23989         case PRAGMA_OMP_CLAUSE_IF:
23990           clauses = cp_parser_omp_clause_if (parser, clauses, token->location);
23991           c_name = "if";
23992           break;
23993         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
23994           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
23995                                             clauses);
23996           c_name = "lastprivate";
23997           break;
23998         case PRAGMA_OMP_CLAUSE_NOWAIT:
23999           clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
24000           c_name = "nowait";
24001           break;
24002         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
24003           clauses = cp_parser_omp_clause_num_threads (parser, clauses,
24004                                                       token->location);
24005           c_name = "num_threads";
24006           break;
24007         case PRAGMA_OMP_CLAUSE_ORDERED:
24008           clauses = cp_parser_omp_clause_ordered (parser, clauses,
24009                                                   token->location);
24010           c_name = "ordered";
24011           break;
24012         case PRAGMA_OMP_CLAUSE_PRIVATE:
24013           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
24014                                             clauses);
24015           c_name = "private";
24016           break;
24017         case PRAGMA_OMP_CLAUSE_REDUCTION:
24018           clauses = cp_parser_omp_clause_reduction (parser, clauses);
24019           c_name = "reduction";
24020           break;
24021         case PRAGMA_OMP_CLAUSE_SCHEDULE:
24022           clauses = cp_parser_omp_clause_schedule (parser, clauses,
24023                                                    token->location);
24024           c_name = "schedule";
24025           break;
24026         case PRAGMA_OMP_CLAUSE_SHARED:
24027           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
24028                                             clauses);
24029           c_name = "shared";
24030           break;
24031         case PRAGMA_OMP_CLAUSE_UNTIED:
24032           clauses = cp_parser_omp_clause_untied (parser, clauses,
24033                                                  token->location);
24034           c_name = "nowait";
24035           break;
24036         default:
24037           cp_parser_error (parser, "expected %<#pragma omp%> clause");
24038           goto saw_error;
24039         }
24040
24041       if (((mask >> c_kind) & 1) == 0)
24042         {
24043           /* Remove the invalid clause(s) from the list to avoid
24044              confusing the rest of the compiler.  */
24045           clauses = prev;
24046           error_at (token->location, "%qs is not valid for %qs", c_name, where);
24047         }
24048     }
24049  saw_error:
24050   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
24051   return finish_omp_clauses (clauses);
24052 }
24053
24054 /* OpenMP 2.5:
24055    structured-block:
24056      statement
24057
24058    In practice, we're also interested in adding the statement to an
24059    outer node.  So it is convenient if we work around the fact that
24060    cp_parser_statement calls add_stmt.  */
24061
24062 static unsigned
24063 cp_parser_begin_omp_structured_block (cp_parser *parser)
24064 {
24065   unsigned save = parser->in_statement;
24066
24067   /* Only move the values to IN_OMP_BLOCK if they weren't false.
24068      This preserves the "not within loop or switch" style error messages
24069      for nonsense cases like
24070         void foo() {
24071         #pragma omp single
24072           break;
24073         }
24074   */
24075   if (parser->in_statement)
24076     parser->in_statement = IN_OMP_BLOCK;
24077
24078   return save;
24079 }
24080
24081 static void
24082 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
24083 {
24084   parser->in_statement = save;
24085 }
24086
24087 static tree
24088 cp_parser_omp_structured_block (cp_parser *parser)
24089 {
24090   tree stmt = begin_omp_structured_block ();
24091   unsigned int save = cp_parser_begin_omp_structured_block (parser);
24092
24093   cp_parser_statement (parser, NULL_TREE, false, NULL);
24094
24095   cp_parser_end_omp_structured_block (parser, save);
24096   return finish_omp_structured_block (stmt);
24097 }
24098
24099 /* OpenMP 2.5:
24100    # pragma omp atomic new-line
24101      expression-stmt
24102
24103    expression-stmt:
24104      x binop= expr | x++ | ++x | x-- | --x
24105    binop:
24106      +, *, -, /, &, ^, |, <<, >>
24107
24108   where x is an lvalue expression with scalar type.  */
24109
24110 static void
24111 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
24112 {
24113   tree lhs, rhs;
24114   enum tree_code code;
24115
24116   cp_parser_require_pragma_eol (parser, pragma_tok);
24117
24118   lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24119                                     /*cast_p=*/false, NULL);
24120   switch (TREE_CODE (lhs))
24121     {
24122     case ERROR_MARK:
24123       goto saw_error;
24124
24125     case PREINCREMENT_EXPR:
24126     case POSTINCREMENT_EXPR:
24127       lhs = TREE_OPERAND (lhs, 0);
24128       code = PLUS_EXPR;
24129       rhs = integer_one_node;
24130       break;
24131
24132     case PREDECREMENT_EXPR:
24133     case POSTDECREMENT_EXPR:
24134       lhs = TREE_OPERAND (lhs, 0);
24135       code = MINUS_EXPR;
24136       rhs = integer_one_node;
24137       break;
24138
24139     case COMPOUND_EXPR:
24140       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
24141          && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
24142          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
24143          && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
24144          && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
24145                                              (TREE_OPERAND (lhs, 1), 0), 0)))
24146             == BOOLEAN_TYPE)
24147        /* Undo effects of boolean_increment for post {in,de}crement.  */
24148        lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
24149       /* FALLTHRU */
24150     case MODIFY_EXPR:
24151       if (TREE_CODE (lhs) == MODIFY_EXPR
24152          && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
24153        {
24154          /* Undo effects of boolean_increment.  */
24155          if (integer_onep (TREE_OPERAND (lhs, 1)))
24156            {
24157              /* This is pre or post increment.  */
24158              rhs = TREE_OPERAND (lhs, 1);
24159              lhs = TREE_OPERAND (lhs, 0);
24160              code = NOP_EXPR;
24161              break;
24162            }
24163        }
24164       /* FALLTHRU */
24165     default:
24166       switch (cp_lexer_peek_token (parser->lexer)->type)
24167         {
24168         case CPP_MULT_EQ:
24169           code = MULT_EXPR;
24170           break;
24171         case CPP_DIV_EQ:
24172           code = TRUNC_DIV_EXPR;
24173           break;
24174         case CPP_PLUS_EQ:
24175           code = PLUS_EXPR;
24176           break;
24177         case CPP_MINUS_EQ:
24178           code = MINUS_EXPR;
24179           break;
24180         case CPP_LSHIFT_EQ:
24181           code = LSHIFT_EXPR;
24182           break;
24183         case CPP_RSHIFT_EQ:
24184           code = RSHIFT_EXPR;
24185           break;
24186         case CPP_AND_EQ:
24187           code = BIT_AND_EXPR;
24188           break;
24189         case CPP_OR_EQ:
24190           code = BIT_IOR_EXPR;
24191           break;
24192         case CPP_XOR_EQ:
24193           code = BIT_XOR_EXPR;
24194           break;
24195         default:
24196           cp_parser_error (parser,
24197                            "invalid operator for %<#pragma omp atomic%>");
24198           goto saw_error;
24199         }
24200       cp_lexer_consume_token (parser->lexer);
24201
24202       rhs = cp_parser_expression (parser, false, NULL);
24203       if (rhs == error_mark_node)
24204         goto saw_error;
24205       break;
24206     }
24207   finish_omp_atomic (code, lhs, rhs);
24208   cp_parser_consume_semicolon_at_end_of_statement (parser);
24209   return;
24210
24211  saw_error:
24212   cp_parser_skip_to_end_of_block_or_statement (parser);
24213 }
24214
24215
24216 /* OpenMP 2.5:
24217    # pragma omp barrier new-line  */
24218
24219 static void
24220 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
24221 {
24222   cp_parser_require_pragma_eol (parser, pragma_tok);
24223   finish_omp_barrier ();
24224 }
24225
24226 /* OpenMP 2.5:
24227    # pragma omp critical [(name)] new-line
24228      structured-block  */
24229
24230 static tree
24231 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok)
24232 {
24233   tree stmt, name = NULL;
24234
24235   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24236     {
24237       cp_lexer_consume_token (parser->lexer);
24238
24239       name = cp_parser_identifier (parser);
24240
24241       if (name == error_mark_node
24242           || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24243         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24244                                                /*or_comma=*/false,
24245                                                /*consume_paren=*/true);
24246       if (name == error_mark_node)
24247         name = NULL;
24248     }
24249   cp_parser_require_pragma_eol (parser, pragma_tok);
24250
24251   stmt = cp_parser_omp_structured_block (parser);
24252   return c_finish_omp_critical (input_location, stmt, name);
24253 }
24254
24255 /* OpenMP 2.5:
24256    # pragma omp flush flush-vars[opt] new-line
24257
24258    flush-vars:
24259      ( variable-list ) */
24260
24261 static void
24262 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
24263 {
24264   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24265     (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
24266   cp_parser_require_pragma_eol (parser, pragma_tok);
24267
24268   finish_omp_flush ();
24269 }
24270
24271 /* Helper function, to parse omp for increment expression.  */
24272
24273 static tree
24274 cp_parser_omp_for_cond (cp_parser *parser, tree decl)
24275 {
24276   tree cond = cp_parser_binary_expression (parser, false, true,
24277                                            PREC_NOT_OPERATOR, NULL);
24278   if (cond == error_mark_node
24279       || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24280     {
24281       cp_parser_skip_to_end_of_statement (parser);
24282       return error_mark_node;
24283     }
24284
24285   switch (TREE_CODE (cond))
24286     {
24287     case GT_EXPR:
24288     case GE_EXPR:
24289     case LT_EXPR:
24290     case LE_EXPR:
24291       break;
24292     default:
24293       return error_mark_node;
24294     }
24295
24296   /* If decl is an iterator, preserve LHS and RHS of the relational
24297      expr until finish_omp_for.  */
24298   if (decl
24299       && (type_dependent_expression_p (decl)
24300           || CLASS_TYPE_P (TREE_TYPE (decl))))
24301     return cond;
24302
24303   return build_x_binary_op (TREE_CODE (cond),
24304                             TREE_OPERAND (cond, 0), ERROR_MARK,
24305                             TREE_OPERAND (cond, 1), ERROR_MARK,
24306                             /*overload=*/NULL, tf_warning_or_error);
24307 }
24308
24309 /* Helper function, to parse omp for increment expression.  */
24310
24311 static tree
24312 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
24313 {
24314   cp_token *token = cp_lexer_peek_token (parser->lexer);
24315   enum tree_code op;
24316   tree lhs, rhs;
24317   cp_id_kind idk;
24318   bool decl_first;
24319
24320   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24321     {
24322       op = (token->type == CPP_PLUS_PLUS
24323             ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
24324       cp_lexer_consume_token (parser->lexer);
24325       lhs = cp_parser_cast_expression (parser, false, false, NULL);
24326       if (lhs != decl)
24327         return error_mark_node;
24328       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24329     }
24330
24331   lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
24332   if (lhs != decl)
24333     return error_mark_node;
24334
24335   token = cp_lexer_peek_token (parser->lexer);
24336   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24337     {
24338       op = (token->type == CPP_PLUS_PLUS
24339             ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
24340       cp_lexer_consume_token (parser->lexer);
24341       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24342     }
24343
24344   op = cp_parser_assignment_operator_opt (parser);
24345   if (op == ERROR_MARK)
24346     return error_mark_node;
24347
24348   if (op != NOP_EXPR)
24349     {
24350       rhs = cp_parser_assignment_expression (parser, false, NULL);
24351       rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
24352       return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24353     }
24354
24355   lhs = cp_parser_binary_expression (parser, false, false,
24356                                      PREC_ADDITIVE_EXPRESSION, NULL);
24357   token = cp_lexer_peek_token (parser->lexer);
24358   decl_first = lhs == decl;
24359   if (decl_first)
24360     lhs = NULL_TREE;
24361   if (token->type != CPP_PLUS
24362       && token->type != CPP_MINUS)
24363     return error_mark_node;
24364
24365   do
24366     {
24367       op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
24368       cp_lexer_consume_token (parser->lexer);
24369       rhs = cp_parser_binary_expression (parser, false, false,
24370                                          PREC_ADDITIVE_EXPRESSION, NULL);
24371       token = cp_lexer_peek_token (parser->lexer);
24372       if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
24373         {
24374           if (lhs == NULL_TREE)
24375             {
24376               if (op == PLUS_EXPR)
24377                 lhs = rhs;
24378               else
24379                 lhs = build_x_unary_op (NEGATE_EXPR, rhs, tf_warning_or_error);
24380             }
24381           else
24382             lhs = build_x_binary_op (op, lhs, ERROR_MARK, rhs, ERROR_MARK,
24383                                      NULL, tf_warning_or_error);
24384         }
24385     }
24386   while (token->type == CPP_PLUS || token->type == CPP_MINUS);
24387
24388   if (!decl_first)
24389     {
24390       if (rhs != decl || op == MINUS_EXPR)
24391         return error_mark_node;
24392       rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
24393     }
24394   else
24395     rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
24396
24397   return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24398 }
24399
24400 /* Parse the restricted form of the for statement allowed by OpenMP.  */
24401
24402 static tree
24403 cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses)
24404 {
24405   tree init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
24406   tree real_decl, initv, condv, incrv, declv;
24407   tree this_pre_body, cl;
24408   location_t loc_first;
24409   bool collapse_err = false;
24410   int i, collapse = 1, nbraces = 0;
24411   VEC(tree,gc) *for_block = make_tree_vector ();
24412
24413   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
24414     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
24415       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
24416
24417   gcc_assert (collapse >= 1);
24418
24419   declv = make_tree_vec (collapse);
24420   initv = make_tree_vec (collapse);
24421   condv = make_tree_vec (collapse);
24422   incrv = make_tree_vec (collapse);
24423
24424   loc_first = cp_lexer_peek_token (parser->lexer)->location;
24425
24426   for (i = 0; i < collapse; i++)
24427     {
24428       int bracecount = 0;
24429       bool add_private_clause = false;
24430       location_t loc;
24431
24432       if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24433         {
24434           cp_parser_error (parser, "for statement expected");
24435           return NULL;
24436         }
24437       loc = cp_lexer_consume_token (parser->lexer)->location;
24438
24439       if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24440         return NULL;
24441
24442       init = decl = real_decl = NULL;
24443       this_pre_body = push_stmt_list ();
24444       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24445         {
24446           /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
24447
24448              init-expr:
24449                        var = lb
24450                        integer-type var = lb
24451                        random-access-iterator-type var = lb
24452                        pointer-type var = lb
24453           */
24454           cp_decl_specifier_seq type_specifiers;
24455
24456           /* First, try to parse as an initialized declaration.  See
24457              cp_parser_condition, from whence the bulk of this is copied.  */
24458
24459           cp_parser_parse_tentatively (parser);
24460           cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
24461                                         /*is_trailing_return=*/false,
24462                                         &type_specifiers);
24463           if (cp_parser_parse_definitely (parser))
24464             {
24465               /* If parsing a type specifier seq succeeded, then this
24466                  MUST be a initialized declaration.  */
24467               tree asm_specification, attributes;
24468               cp_declarator *declarator;
24469
24470               declarator = cp_parser_declarator (parser,
24471                                                  CP_PARSER_DECLARATOR_NAMED,
24472                                                  /*ctor_dtor_or_conv_p=*/NULL,
24473                                                  /*parenthesized_p=*/NULL,
24474                                                  /*member_p=*/false);
24475               attributes = cp_parser_attributes_opt (parser);
24476               asm_specification = cp_parser_asm_specification_opt (parser);
24477
24478               if (declarator == cp_error_declarator) 
24479                 cp_parser_skip_to_end_of_statement (parser);
24480
24481               else 
24482                 {
24483                   tree pushed_scope, auto_node;
24484
24485                   decl = start_decl (declarator, &type_specifiers,
24486                                      SD_INITIALIZED, attributes,
24487                                      /*prefix_attributes=*/NULL_TREE,
24488                                      &pushed_scope);
24489
24490                   auto_node = type_uses_auto (TREE_TYPE (decl));
24491                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
24492                     {
24493                       if (cp_lexer_next_token_is (parser->lexer, 
24494                                                   CPP_OPEN_PAREN))
24495                         error ("parenthesized initialization is not allowed in "
24496                                "OpenMP %<for%> loop");
24497                       else
24498                         /* Trigger an error.  */
24499                         cp_parser_require (parser, CPP_EQ, RT_EQ);
24500
24501                       init = error_mark_node;
24502                       cp_parser_skip_to_end_of_statement (parser);
24503                     }
24504                   else if (CLASS_TYPE_P (TREE_TYPE (decl))
24505                            || type_dependent_expression_p (decl)
24506                            || auto_node)
24507                     {
24508                       bool is_direct_init, is_non_constant_init;
24509
24510                       init = cp_parser_initializer (parser,
24511                                                     &is_direct_init,
24512                                                     &is_non_constant_init);
24513
24514                       if (auto_node)
24515                         {
24516                           TREE_TYPE (decl)
24517                             = do_auto_deduction (TREE_TYPE (decl), init,
24518                                                  auto_node);
24519
24520                           if (!CLASS_TYPE_P (TREE_TYPE (decl))
24521                               && !type_dependent_expression_p (decl))
24522                             goto non_class;
24523                         }
24524                       
24525                       cp_finish_decl (decl, init, !is_non_constant_init,
24526                                       asm_specification,
24527                                       LOOKUP_ONLYCONVERTING);
24528                       if (CLASS_TYPE_P (TREE_TYPE (decl)))
24529                         {
24530                           VEC_safe_push (tree, gc, for_block, this_pre_body);
24531                           init = NULL_TREE;
24532                         }
24533                       else
24534                         init = pop_stmt_list (this_pre_body);
24535                       this_pre_body = NULL_TREE;
24536                     }
24537                   else
24538                     {
24539                       /* Consume '='.  */
24540                       cp_lexer_consume_token (parser->lexer);
24541                       init = cp_parser_assignment_expression (parser, false, NULL);
24542
24543                     non_class:
24544                       if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
24545                         init = error_mark_node;
24546                       else
24547                         cp_finish_decl (decl, NULL_TREE,
24548                                         /*init_const_expr_p=*/false,
24549                                         asm_specification,
24550                                         LOOKUP_ONLYCONVERTING);
24551                     }
24552
24553                   if (pushed_scope)
24554                     pop_scope (pushed_scope);
24555                 }
24556             }
24557           else 
24558             {
24559               cp_id_kind idk;
24560               /* If parsing a type specifier sequence failed, then
24561                  this MUST be a simple expression.  */
24562               cp_parser_parse_tentatively (parser);
24563               decl = cp_parser_primary_expression (parser, false, false,
24564                                                    false, &idk);
24565               if (!cp_parser_error_occurred (parser)
24566                   && decl
24567                   && DECL_P (decl)
24568                   && CLASS_TYPE_P (TREE_TYPE (decl)))
24569                 {
24570                   tree rhs;
24571
24572                   cp_parser_parse_definitely (parser);
24573                   cp_parser_require (parser, CPP_EQ, RT_EQ);
24574                   rhs = cp_parser_assignment_expression (parser, false, NULL);
24575                   finish_expr_stmt (build_x_modify_expr (decl, NOP_EXPR,
24576                                                          rhs,
24577                                                          tf_warning_or_error));
24578                   add_private_clause = true;
24579                 }
24580               else
24581                 {
24582                   decl = NULL;
24583                   cp_parser_abort_tentative_parse (parser);
24584                   init = cp_parser_expression (parser, false, NULL);
24585                   if (init)
24586                     {
24587                       if (TREE_CODE (init) == MODIFY_EXPR
24588                           || TREE_CODE (init) == MODOP_EXPR)
24589                         real_decl = TREE_OPERAND (init, 0);
24590                     }
24591                 }
24592             }
24593         }
24594       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
24595       if (this_pre_body)
24596         {
24597           this_pre_body = pop_stmt_list (this_pre_body);
24598           if (pre_body)
24599             {
24600               tree t = pre_body;
24601               pre_body = push_stmt_list ();
24602               add_stmt (t);
24603               add_stmt (this_pre_body);
24604               pre_body = pop_stmt_list (pre_body);
24605             }
24606           else
24607             pre_body = this_pre_body;
24608         }
24609
24610       if (decl)
24611         real_decl = decl;
24612       if (par_clauses != NULL && real_decl != NULL_TREE)
24613         {
24614           tree *c;
24615           for (c = par_clauses; *c ; )
24616             if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
24617                 && OMP_CLAUSE_DECL (*c) == real_decl)
24618               {
24619                 error_at (loc, "iteration variable %qD"
24620                           " should not be firstprivate", real_decl);
24621                 *c = OMP_CLAUSE_CHAIN (*c);
24622               }
24623             else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
24624                      && OMP_CLAUSE_DECL (*c) == real_decl)
24625               {
24626                 /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
24627                    change it to shared (decl) in OMP_PARALLEL_CLAUSES.  */
24628                 tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
24629                 OMP_CLAUSE_DECL (l) = real_decl;
24630                 OMP_CLAUSE_CHAIN (l) = clauses;
24631                 CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
24632                 clauses = l;
24633                 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
24634                 CP_OMP_CLAUSE_INFO (*c) = NULL;
24635                 add_private_clause = false;
24636               }
24637             else
24638               {
24639                 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
24640                     && OMP_CLAUSE_DECL (*c) == real_decl)
24641                   add_private_clause = false;
24642                 c = &OMP_CLAUSE_CHAIN (*c);
24643               }
24644         }
24645
24646       if (add_private_clause)
24647         {
24648           tree c;
24649           for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
24650             {
24651               if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
24652                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
24653                   && OMP_CLAUSE_DECL (c) == decl)
24654                 break;
24655               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
24656                        && OMP_CLAUSE_DECL (c) == decl)
24657                 error_at (loc, "iteration variable %qD "
24658                           "should not be firstprivate",
24659                           decl);
24660               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
24661                        && OMP_CLAUSE_DECL (c) == decl)
24662                 error_at (loc, "iteration variable %qD should not be reduction",
24663                           decl);
24664             }
24665           if (c == NULL)
24666             {
24667               c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
24668               OMP_CLAUSE_DECL (c) = decl;
24669               c = finish_omp_clauses (c);
24670               if (c)
24671                 {
24672                   OMP_CLAUSE_CHAIN (c) = clauses;
24673                   clauses = c;
24674                 }
24675             }
24676         }
24677
24678       cond = NULL;
24679       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24680         cond = cp_parser_omp_for_cond (parser, decl);
24681       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
24682
24683       incr = NULL;
24684       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
24685         {
24686           /* If decl is an iterator, preserve the operator on decl
24687              until finish_omp_for.  */
24688           if (decl
24689               && ((type_dependent_expression_p (decl)
24690                    && !POINTER_TYPE_P (TREE_TYPE (decl)))
24691                   || CLASS_TYPE_P (TREE_TYPE (decl))))
24692             incr = cp_parser_omp_for_incr (parser, decl);
24693           else
24694             incr = cp_parser_expression (parser, false, NULL);
24695         }
24696
24697       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24698         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24699                                                /*or_comma=*/false,
24700                                                /*consume_paren=*/true);
24701
24702       TREE_VEC_ELT (declv, i) = decl;
24703       TREE_VEC_ELT (initv, i) = init;
24704       TREE_VEC_ELT (condv, i) = cond;
24705       TREE_VEC_ELT (incrv, i) = incr;
24706
24707       if (i == collapse - 1)
24708         break;
24709
24710       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
24711          in between the collapsed for loops to be still considered perfectly
24712          nested.  Hopefully the final version clarifies this.
24713          For now handle (multiple) {'s and empty statements.  */
24714       cp_parser_parse_tentatively (parser);
24715       do
24716         {
24717           if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24718             break;
24719           else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
24720             {
24721               cp_lexer_consume_token (parser->lexer);
24722               bracecount++;
24723             }
24724           else if (bracecount
24725                    && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
24726             cp_lexer_consume_token (parser->lexer);
24727           else
24728             {
24729               loc = cp_lexer_peek_token (parser->lexer)->location;
24730               error_at (loc, "not enough collapsed for loops");
24731               collapse_err = true;
24732               cp_parser_abort_tentative_parse (parser);
24733               declv = NULL_TREE;
24734               break;
24735             }
24736         }
24737       while (1);
24738
24739       if (declv)
24740         {
24741           cp_parser_parse_definitely (parser);
24742           nbraces += bracecount;
24743         }
24744     }
24745
24746   /* Note that we saved the original contents of this flag when we entered
24747      the structured block, and so we don't need to re-save it here.  */
24748   parser->in_statement = IN_OMP_FOR;
24749
24750   /* Note that the grammar doesn't call for a structured block here,
24751      though the loop as a whole is a structured block.  */
24752   body = push_stmt_list ();
24753   cp_parser_statement (parser, NULL_TREE, false, NULL);
24754   body = pop_stmt_list (body);
24755
24756   if (declv == NULL_TREE)
24757     ret = NULL_TREE;
24758   else
24759     ret = finish_omp_for (loc_first, declv, initv, condv, incrv, body,
24760                           pre_body, clauses);
24761
24762   while (nbraces)
24763     {
24764       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24765         {
24766           cp_lexer_consume_token (parser->lexer);
24767           nbraces--;
24768         }
24769       else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
24770         cp_lexer_consume_token (parser->lexer);
24771       else
24772         {
24773           if (!collapse_err)
24774             {
24775               error_at (cp_lexer_peek_token (parser->lexer)->location,
24776                         "collapsed loops not perfectly nested");
24777             }
24778           collapse_err = true;
24779           cp_parser_statement_seq_opt (parser, NULL);
24780           if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
24781             break;
24782         }
24783     }
24784
24785   while (!VEC_empty (tree, for_block))
24786     add_stmt (pop_stmt_list (VEC_pop (tree, for_block)));
24787   release_tree_vector (for_block);
24788
24789   return ret;
24790 }
24791
24792 /* OpenMP 2.5:
24793    #pragma omp for for-clause[optseq] new-line
24794      for-loop  */
24795
24796 #define OMP_FOR_CLAUSE_MASK                             \
24797         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24798         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24799         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
24800         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24801         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
24802         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
24803         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT)              \
24804         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE))
24805
24806 static tree
24807 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok)
24808 {
24809   tree clauses, sb, ret;
24810   unsigned int save;
24811
24812   clauses = cp_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
24813                                        "#pragma omp for", pragma_tok);
24814
24815   sb = begin_omp_structured_block ();
24816   save = cp_parser_begin_omp_structured_block (parser);
24817
24818   ret = cp_parser_omp_for_loop (parser, clauses, NULL);
24819
24820   cp_parser_end_omp_structured_block (parser, save);
24821   add_stmt (finish_omp_structured_block (sb));
24822
24823   return ret;
24824 }
24825
24826 /* OpenMP 2.5:
24827    # pragma omp master new-line
24828      structured-block  */
24829
24830 static tree
24831 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok)
24832 {
24833   cp_parser_require_pragma_eol (parser, pragma_tok);
24834   return c_finish_omp_master (input_location,
24835                               cp_parser_omp_structured_block (parser));
24836 }
24837
24838 /* OpenMP 2.5:
24839    # pragma omp ordered new-line
24840      structured-block  */
24841
24842 static tree
24843 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok)
24844 {
24845   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
24846   cp_parser_require_pragma_eol (parser, pragma_tok);
24847   return c_finish_omp_ordered (loc, cp_parser_omp_structured_block (parser));
24848 }
24849
24850 /* OpenMP 2.5:
24851
24852    section-scope:
24853      { section-sequence }
24854
24855    section-sequence:
24856      section-directive[opt] structured-block
24857      section-sequence section-directive structured-block  */
24858
24859 static tree
24860 cp_parser_omp_sections_scope (cp_parser *parser)
24861 {
24862   tree stmt, substmt;
24863   bool error_suppress = false;
24864   cp_token *tok;
24865
24866   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
24867     return NULL_TREE;
24868
24869   stmt = push_stmt_list ();
24870
24871   if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION)
24872     {
24873       unsigned save;
24874
24875       substmt = begin_omp_structured_block ();
24876       save = cp_parser_begin_omp_structured_block (parser);
24877
24878       while (1)
24879         {
24880           cp_parser_statement (parser, NULL_TREE, false, NULL);
24881
24882           tok = cp_lexer_peek_token (parser->lexer);
24883           if (tok->pragma_kind == PRAGMA_OMP_SECTION)
24884             break;
24885           if (tok->type == CPP_CLOSE_BRACE)
24886             break;
24887           if (tok->type == CPP_EOF)
24888             break;
24889         }
24890
24891       cp_parser_end_omp_structured_block (parser, save);
24892       substmt = finish_omp_structured_block (substmt);
24893       substmt = build1 (OMP_SECTION, void_type_node, substmt);
24894       add_stmt (substmt);
24895     }
24896
24897   while (1)
24898     {
24899       tok = cp_lexer_peek_token (parser->lexer);
24900       if (tok->type == CPP_CLOSE_BRACE)
24901         break;
24902       if (tok->type == CPP_EOF)
24903         break;
24904
24905       if (tok->pragma_kind == PRAGMA_OMP_SECTION)
24906         {
24907           cp_lexer_consume_token (parser->lexer);
24908           cp_parser_require_pragma_eol (parser, tok);
24909           error_suppress = false;
24910         }
24911       else if (!error_suppress)
24912         {
24913           cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
24914           error_suppress = true;
24915         }
24916
24917       substmt = cp_parser_omp_structured_block (parser);
24918       substmt = build1 (OMP_SECTION, void_type_node, substmt);
24919       add_stmt (substmt);
24920     }
24921   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
24922
24923   substmt = pop_stmt_list (stmt);
24924
24925   stmt = make_node (OMP_SECTIONS);
24926   TREE_TYPE (stmt) = void_type_node;
24927   OMP_SECTIONS_BODY (stmt) = substmt;
24928
24929   add_stmt (stmt);
24930   return stmt;
24931 }
24932
24933 /* OpenMP 2.5:
24934    # pragma omp sections sections-clause[optseq] newline
24935      sections-scope  */
24936
24937 #define OMP_SECTIONS_CLAUSE_MASK                        \
24938         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24939         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24940         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
24941         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24942         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
24943
24944 static tree
24945 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok)
24946 {
24947   tree clauses, ret;
24948
24949   clauses = cp_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
24950                                        "#pragma omp sections", pragma_tok);
24951
24952   ret = cp_parser_omp_sections_scope (parser);
24953   if (ret)
24954     OMP_SECTIONS_CLAUSES (ret) = clauses;
24955
24956   return ret;
24957 }
24958
24959 /* OpenMP 2.5:
24960    # pragma parallel parallel-clause new-line
24961    # pragma parallel for parallel-for-clause new-line
24962    # pragma parallel sections parallel-sections-clause new-line  */
24963
24964 #define OMP_PARALLEL_CLAUSE_MASK                        \
24965         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
24966         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24967         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24968         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
24969         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
24970         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
24971         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24972         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
24973
24974 static tree
24975 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok)
24976 {
24977   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
24978   const char *p_name = "#pragma omp parallel";
24979   tree stmt, clauses, par_clause, ws_clause, block;
24980   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
24981   unsigned int save;
24982   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
24983
24984   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24985     {
24986       cp_lexer_consume_token (parser->lexer);
24987       p_kind = PRAGMA_OMP_PARALLEL_FOR;
24988       p_name = "#pragma omp parallel for";
24989       mask |= OMP_FOR_CLAUSE_MASK;
24990       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
24991     }
24992   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24993     {
24994       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24995       const char *p = IDENTIFIER_POINTER (id);
24996       if (strcmp (p, "sections") == 0)
24997         {
24998           cp_lexer_consume_token (parser->lexer);
24999           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
25000           p_name = "#pragma omp parallel sections";
25001           mask |= OMP_SECTIONS_CLAUSE_MASK;
25002           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
25003         }
25004     }
25005
25006   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
25007   block = begin_omp_parallel ();
25008   save = cp_parser_begin_omp_structured_block (parser);
25009
25010   switch (p_kind)
25011     {
25012     case PRAGMA_OMP_PARALLEL:
25013       cp_parser_statement (parser, NULL_TREE, false, NULL);
25014       par_clause = clauses;
25015       break;
25016
25017     case PRAGMA_OMP_PARALLEL_FOR:
25018       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25019       cp_parser_omp_for_loop (parser, ws_clause, &par_clause);
25020       break;
25021
25022     case PRAGMA_OMP_PARALLEL_SECTIONS:
25023       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
25024       stmt = cp_parser_omp_sections_scope (parser);
25025       if (stmt)
25026         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
25027       break;
25028
25029     default:
25030       gcc_unreachable ();
25031     }
25032
25033   cp_parser_end_omp_structured_block (parser, save);
25034   stmt = finish_omp_parallel (par_clause, block);
25035   if (p_kind != PRAGMA_OMP_PARALLEL)
25036     OMP_PARALLEL_COMBINED (stmt) = 1;
25037   return stmt;
25038 }
25039
25040 /* OpenMP 2.5:
25041    # pragma omp single single-clause[optseq] new-line
25042      structured-block  */
25043
25044 #define OMP_SINGLE_CLAUSE_MASK                          \
25045         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25046         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25047         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
25048         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25049
25050 static tree
25051 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok)
25052 {
25053   tree stmt = make_node (OMP_SINGLE);
25054   TREE_TYPE (stmt) = void_type_node;
25055
25056   OMP_SINGLE_CLAUSES (stmt)
25057     = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
25058                                  "#pragma omp single", pragma_tok);
25059   OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser);
25060
25061   return add_stmt (stmt);
25062 }
25063
25064 /* OpenMP 3.0:
25065    # pragma omp task task-clause[optseq] new-line
25066      structured-block  */
25067
25068 #define OMP_TASK_CLAUSE_MASK                            \
25069         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25070         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
25071         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25072         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25073         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25074         | (1u << PRAGMA_OMP_CLAUSE_SHARED))
25075
25076 static tree
25077 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok)
25078 {
25079   tree clauses, block;
25080   unsigned int save;
25081
25082   clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
25083                                        "#pragma omp task", pragma_tok);
25084   block = begin_omp_task ();
25085   save = cp_parser_begin_omp_structured_block (parser);
25086   cp_parser_statement (parser, NULL_TREE, false, NULL);
25087   cp_parser_end_omp_structured_block (parser, save);
25088   return finish_omp_task (clauses, block);
25089 }
25090
25091 /* OpenMP 3.0:
25092    # pragma omp taskwait new-line  */
25093
25094 static void
25095 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
25096 {
25097   cp_parser_require_pragma_eol (parser, pragma_tok);
25098   finish_omp_taskwait ();
25099 }
25100
25101 /* OpenMP 2.5:
25102    # pragma omp threadprivate (variable-list) */
25103
25104 static void
25105 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
25106 {
25107   tree vars;
25108
25109   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
25110   cp_parser_require_pragma_eol (parser, pragma_tok);
25111
25112   finish_omp_threadprivate (vars);
25113 }
25114
25115 /* Main entry point to OpenMP statement pragmas.  */
25116
25117 static void
25118 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok)
25119 {
25120   tree stmt;
25121
25122   switch (pragma_tok->pragma_kind)
25123     {
25124     case PRAGMA_OMP_ATOMIC:
25125       cp_parser_omp_atomic (parser, pragma_tok);
25126       return;
25127     case PRAGMA_OMP_CRITICAL:
25128       stmt = cp_parser_omp_critical (parser, pragma_tok);
25129       break;
25130     case PRAGMA_OMP_FOR:
25131       stmt = cp_parser_omp_for (parser, pragma_tok);
25132       break;
25133     case PRAGMA_OMP_MASTER:
25134       stmt = cp_parser_omp_master (parser, pragma_tok);
25135       break;
25136     case PRAGMA_OMP_ORDERED:
25137       stmt = cp_parser_omp_ordered (parser, pragma_tok);
25138       break;
25139     case PRAGMA_OMP_PARALLEL:
25140       stmt = cp_parser_omp_parallel (parser, pragma_tok);
25141       break;
25142     case PRAGMA_OMP_SECTIONS:
25143       stmt = cp_parser_omp_sections (parser, pragma_tok);
25144       break;
25145     case PRAGMA_OMP_SINGLE:
25146       stmt = cp_parser_omp_single (parser, pragma_tok);
25147       break;
25148     case PRAGMA_OMP_TASK:
25149       stmt = cp_parser_omp_task (parser, pragma_tok);
25150       break;
25151     default:
25152       gcc_unreachable ();
25153     }
25154
25155   if (stmt)
25156     SET_EXPR_LOCATION (stmt, pragma_tok->location);
25157 }
25158 \f
25159 /* The parser.  */
25160
25161 static GTY (()) cp_parser *the_parser;
25162
25163 \f
25164 /* Special handling for the first token or line in the file.  The first
25165    thing in the file might be #pragma GCC pch_preprocess, which loads a
25166    PCH file, which is a GC collection point.  So we need to handle this
25167    first pragma without benefit of an existing lexer structure.
25168
25169    Always returns one token to the caller in *FIRST_TOKEN.  This is
25170    either the true first token of the file, or the first token after
25171    the initial pragma.  */
25172
25173 static void
25174 cp_parser_initial_pragma (cp_token *first_token)
25175 {
25176   tree name = NULL;
25177
25178   cp_lexer_get_preprocessor_token (NULL, first_token);
25179   if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS)
25180     return;
25181
25182   cp_lexer_get_preprocessor_token (NULL, first_token);
25183   if (first_token->type == CPP_STRING)
25184     {
25185       name = first_token->u.value;
25186
25187       cp_lexer_get_preprocessor_token (NULL, first_token);
25188       if (first_token->type != CPP_PRAGMA_EOL)
25189         error_at (first_token->location,
25190                   "junk at end of %<#pragma GCC pch_preprocess%>");
25191     }
25192   else
25193     error_at (first_token->location, "expected string literal");
25194
25195   /* Skip to the end of the pragma.  */
25196   while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
25197     cp_lexer_get_preprocessor_token (NULL, first_token);
25198
25199   /* Now actually load the PCH file.  */
25200   if (name)
25201     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
25202
25203   /* Read one more token to return to our caller.  We have to do this
25204      after reading the PCH file in, since its pointers have to be
25205      live.  */
25206   cp_lexer_get_preprocessor_token (NULL, first_token);
25207 }
25208
25209 /* Normal parsing of a pragma token.  Here we can (and must) use the
25210    regular lexer.  */
25211
25212 static bool
25213 cp_parser_pragma (cp_parser *parser, enum pragma_context context)
25214 {
25215   cp_token *pragma_tok;
25216   unsigned int id;
25217
25218   pragma_tok = cp_lexer_consume_token (parser->lexer);
25219   gcc_assert (pragma_tok->type == CPP_PRAGMA);
25220   parser->lexer->in_pragma = true;
25221
25222   id = pragma_tok->pragma_kind;
25223   switch (id)
25224     {
25225     case PRAGMA_GCC_PCH_PREPROCESS:
25226       error_at (pragma_tok->location,
25227                 "%<#pragma GCC pch_preprocess%> must be first");
25228       break;
25229
25230     case PRAGMA_OMP_BARRIER:
25231       switch (context)
25232         {
25233         case pragma_compound:
25234           cp_parser_omp_barrier (parser, pragma_tok);
25235           return false;
25236         case pragma_stmt:
25237           error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
25238                     "used in compound statements");
25239           break;
25240         default:
25241           goto bad_stmt;
25242         }
25243       break;
25244
25245     case PRAGMA_OMP_FLUSH:
25246       switch (context)
25247         {
25248         case pragma_compound:
25249           cp_parser_omp_flush (parser, pragma_tok);
25250           return false;
25251         case pragma_stmt:
25252           error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
25253                     "used in compound statements");
25254           break;
25255         default:
25256           goto bad_stmt;
25257         }
25258       break;
25259
25260     case PRAGMA_OMP_TASKWAIT:
25261       switch (context)
25262         {
25263         case pragma_compound:
25264           cp_parser_omp_taskwait (parser, pragma_tok);
25265           return false;
25266         case pragma_stmt:
25267           error_at (pragma_tok->location,
25268                     "%<#pragma omp taskwait%> may only be "
25269                     "used in compound statements");
25270           break;
25271         default:
25272           goto bad_stmt;
25273         }
25274       break;
25275
25276     case PRAGMA_OMP_THREADPRIVATE:
25277       cp_parser_omp_threadprivate (parser, pragma_tok);
25278       return false;
25279
25280     case PRAGMA_OMP_ATOMIC:
25281     case PRAGMA_OMP_CRITICAL:
25282     case PRAGMA_OMP_FOR:
25283     case PRAGMA_OMP_MASTER:
25284     case PRAGMA_OMP_ORDERED:
25285     case PRAGMA_OMP_PARALLEL:
25286     case PRAGMA_OMP_SECTIONS:
25287     case PRAGMA_OMP_SINGLE:
25288     case PRAGMA_OMP_TASK:
25289       if (context == pragma_external)
25290         goto bad_stmt;
25291       cp_parser_omp_construct (parser, pragma_tok);
25292       return true;
25293
25294     case PRAGMA_OMP_SECTION:
25295       error_at (pragma_tok->location, 
25296                 "%<#pragma omp section%> may only be used in "
25297                 "%<#pragma omp sections%> construct");
25298       break;
25299
25300     default:
25301       gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
25302       c_invoke_pragma_handler (id);
25303       break;
25304
25305     bad_stmt:
25306       cp_parser_error (parser, "expected declaration specifiers");
25307       break;
25308     }
25309
25310   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
25311   return false;
25312 }
25313
25314 /* The interface the pragma parsers have to the lexer.  */
25315
25316 enum cpp_ttype
25317 pragma_lex (tree *value)
25318 {
25319   cp_token *tok;
25320   enum cpp_ttype ret;
25321
25322   tok = cp_lexer_peek_token (the_parser->lexer);
25323
25324   ret = tok->type;
25325   *value = tok->u.value;
25326
25327   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
25328     ret = CPP_EOF;
25329   else if (ret == CPP_STRING)
25330     *value = cp_parser_string_literal (the_parser, false, false);
25331   else
25332     {
25333       cp_lexer_consume_token (the_parser->lexer);
25334       if (ret == CPP_KEYWORD)
25335         ret = CPP_NAME;
25336     }
25337
25338   return ret;
25339 }
25340
25341 \f
25342 /* External interface.  */
25343
25344 /* Parse one entire translation unit.  */
25345
25346 void
25347 c_parse_file (void)
25348 {
25349   static bool already_called = false;
25350
25351   if (already_called)
25352     {
25353       sorry ("inter-module optimizations not implemented for C++");
25354       return;
25355     }
25356   already_called = true;
25357
25358   the_parser = cp_parser_new ();
25359   push_deferring_access_checks (flag_access_control
25360                                 ? dk_no_deferred : dk_no_check);
25361   cp_parser_translation_unit (the_parser);
25362   the_parser = NULL;
25363 }
25364
25365 #include "gt-cp-parser.h"