OSDN Git Service

PR c++/43912
[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 *);
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           cp_lexer_consume_token (parser->lexer);
7489           add_capture (lambda_expr,
7490                        /*id=*/this_identifier,
7491                        /*initializer=*/finish_this_expr(),
7492                        /*by_reference_p=*/false,
7493                        explicit_init_p);
7494           continue;
7495         }
7496
7497       /* Remember whether we want to capture as a reference or not.  */
7498       if (cp_lexer_next_token_is (parser->lexer, CPP_AND))
7499         {
7500           capture_kind = BY_REFERENCE;
7501           cp_lexer_consume_token (parser->lexer);
7502         }
7503
7504       /* Get the identifier.  */
7505       capture_token = cp_lexer_peek_token (parser->lexer);
7506       capture_id = cp_parser_identifier (parser);
7507
7508       if (capture_id == error_mark_node)
7509         /* Would be nice to have a cp_parser_skip_to_closing_x for general
7510            delimiters, but I modified this to stop on unnested ']' as well.  It
7511            was already changed to stop on unnested '}', so the
7512            "closing_parenthesis" name is no more misleading with my change.  */
7513         {
7514           cp_parser_skip_to_closing_parenthesis (parser,
7515                                                  /*recovering=*/true,
7516                                                  /*or_comma=*/true,
7517                                                  /*consume_paren=*/true);
7518           break;
7519         }
7520
7521       /* Find the initializer for this capture.  */
7522       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
7523         {
7524           /* An explicit expression exists.  */
7525           cp_lexer_consume_token (parser->lexer);
7526           pedwarn (input_location, OPT_pedantic,
7527                    "ISO C++ does not allow initializers "
7528                    "in lambda expression capture lists");
7529           capture_init_expr = cp_parser_assignment_expression (parser,
7530                                                                /*cast_p=*/true,
7531                                                                &idk);
7532           explicit_init_p = true;
7533         }
7534       else
7535         {
7536           const char* error_msg;
7537
7538           /* Turn the identifier into an id-expression.  */
7539           capture_init_expr
7540             = cp_parser_lookup_name
7541                 (parser,
7542                  capture_id,
7543                  none_type,
7544                  /*is_template=*/false,
7545                  /*is_namespace=*/false,
7546                  /*check_dependency=*/true,
7547                  /*ambiguous_decls=*/NULL,
7548                  capture_token->location);
7549
7550           capture_init_expr
7551             = finish_id_expression
7552                 (capture_id,
7553                  capture_init_expr,
7554                  parser->scope,
7555                  &idk,
7556                  /*integral_constant_expression_p=*/false,
7557                  /*allow_non_integral_constant_expression_p=*/false,
7558                  /*non_integral_constant_expression_p=*/NULL,
7559                  /*template_p=*/false,
7560                  /*done=*/true,
7561                  /*address_p=*/false,
7562                  /*template_arg_p=*/false,
7563                  &error_msg,
7564                  capture_token->location);
7565         }
7566
7567       if (TREE_CODE (capture_init_expr) == IDENTIFIER_NODE)
7568         capture_init_expr
7569           = unqualified_name_lookup_error (capture_init_expr);
7570
7571       add_capture (lambda_expr,
7572                    capture_id,
7573                    capture_init_expr,
7574                    /*by_reference_p=*/capture_kind == BY_REFERENCE,
7575                    explicit_init_p);
7576     }
7577
7578   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
7579 }
7580
7581 /* Parse the (optional) middle of a lambda expression.
7582
7583    lambda-declarator:
7584      ( parameter-declaration-clause [opt] )
7585        attribute-specifier [opt]
7586        mutable [opt]
7587        exception-specification [opt]
7588        lambda-return-type-clause [opt]
7589
7590    LAMBDA_EXPR is the current representation of the lambda expression.  */
7591
7592 static bool
7593 cp_parser_lambda_declarator_opt (cp_parser* parser, tree lambda_expr)
7594 {
7595   /* 5.1.1.4 of the standard says:
7596        If a lambda-expression does not include a lambda-declarator, it is as if
7597        the lambda-declarator were ().
7598      This means an empty parameter list, no attributes, and no exception
7599      specification.  */
7600   tree param_list = void_list_node;
7601   tree attributes = NULL_TREE;
7602   tree exception_spec = NULL_TREE;
7603   tree t;
7604
7605   /* The lambda-declarator is optional, but must begin with an opening
7606      parenthesis if present.  */
7607   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
7608     {
7609       cp_lexer_consume_token (parser->lexer);
7610
7611       begin_scope (sk_function_parms, /*entity=*/NULL_TREE);
7612
7613       /* Parse parameters.  */
7614       param_list = cp_parser_parameter_declaration_clause (parser);
7615
7616       /* Default arguments shall not be specified in the
7617          parameter-declaration-clause of a lambda-declarator.  */
7618       for (t = param_list; t; t = TREE_CHAIN (t))
7619         if (TREE_PURPOSE (t))
7620           pedwarn (DECL_SOURCE_LOCATION (TREE_VALUE (t)), OPT_pedantic,
7621                    "default argument specified for lambda parameter");
7622
7623       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
7624
7625       attributes = cp_parser_attributes_opt (parser);
7626
7627       /* Parse optional `mutable' keyword.  */
7628       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_MUTABLE))
7629         {
7630           cp_lexer_consume_token (parser->lexer);
7631           LAMBDA_EXPR_MUTABLE_P (lambda_expr) = 1;
7632         }
7633
7634       /* Parse optional exception specification.  */
7635       exception_spec = cp_parser_exception_specification_opt (parser);
7636
7637       /* Parse optional trailing return type.  */
7638       if (cp_lexer_next_token_is (parser->lexer, CPP_DEREF))
7639         {
7640           cp_lexer_consume_token (parser->lexer);
7641           LAMBDA_EXPR_RETURN_TYPE (lambda_expr) = cp_parser_type_id (parser);
7642         }
7643
7644       /* The function parameters must be in scope all the way until after the
7645          trailing-return-type in case of decltype.  */
7646       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
7647         pop_binding (DECL_NAME (t), t);
7648
7649       leave_scope ();
7650     }
7651
7652   /* Create the function call operator.
7653
7654      Messing with declarators like this is no uglier than building up the
7655      FUNCTION_DECL by hand, and this is less likely to get out of sync with
7656      other code.  */
7657   {
7658     cp_decl_specifier_seq return_type_specs;
7659     cp_declarator* declarator;
7660     tree fco;
7661     int quals;
7662     void *p;
7663
7664     clear_decl_specs (&return_type_specs);
7665     if (LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7666       return_type_specs.type = LAMBDA_EXPR_RETURN_TYPE (lambda_expr);
7667     else
7668       /* Maybe we will deduce the return type later, but we can use void
7669          as a placeholder return type anyways.  */
7670       return_type_specs.type = void_type_node;
7671
7672     p = obstack_alloc (&declarator_obstack, 0);
7673
7674     declarator = make_id_declarator (NULL_TREE, ansi_opname (CALL_EXPR),
7675                                      sfk_none);
7676
7677     quals = (LAMBDA_EXPR_MUTABLE_P (lambda_expr)
7678              ? TYPE_UNQUALIFIED : TYPE_QUAL_CONST);
7679     declarator = make_call_declarator (declarator, param_list, quals,
7680                                        VIRT_SPEC_UNSPECIFIED,
7681                                        exception_spec,
7682                                        /*late_return_type=*/NULL_TREE);
7683     declarator->id_loc = LAMBDA_EXPR_LOCATION (lambda_expr);
7684
7685     fco = grokmethod (&return_type_specs,
7686                       declarator,
7687                       attributes);
7688     if (fco != error_mark_node)
7689       {
7690         DECL_INITIALIZED_IN_CLASS_P (fco) = 1;
7691         DECL_ARTIFICIAL (fco) = 1;
7692         /* Give the object parameter a different name.  */
7693         DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure");
7694       }
7695
7696     finish_member_declaration (fco);
7697
7698     obstack_free (&declarator_obstack, p);
7699
7700     return (fco != error_mark_node);
7701   }
7702 }
7703
7704 /* Parse the body of a lambda expression, which is simply
7705
7706    compound-statement
7707
7708    but which requires special handling.
7709    LAMBDA_EXPR is the current representation of the lambda expression.  */
7710
7711 static void
7712 cp_parser_lambda_body (cp_parser* parser, tree lambda_expr)
7713 {
7714   bool nested = (current_function_decl != NULL_TREE);
7715   if (nested)
7716     push_function_context ();
7717
7718   /* Finish the function call operator
7719      - class_specifier
7720      + late_parsing_for_member
7721      + function_definition_after_declarator
7722      + ctor_initializer_opt_and_function_body  */
7723   {
7724     tree fco = lambda_function (lambda_expr);
7725     tree body;
7726     bool done = false;
7727     tree compound_stmt;
7728     tree cap;
7729
7730     /* Let the front end know that we are going to be defining this
7731        function.  */
7732     start_preparsed_function (fco,
7733                               NULL_TREE,
7734                               SF_PRE_PARSED | SF_INCLASS_INLINE);
7735
7736     start_lambda_scope (fco);
7737     body = begin_function_body ();
7738
7739     if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
7740       goto out;
7741
7742     /* Push the proxies for any explicit captures.  */
7743     for (cap = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr); cap;
7744          cap = TREE_CHAIN (cap))
7745       build_capture_proxy (TREE_PURPOSE (cap));
7746
7747     compound_stmt = begin_compound_stmt (0);
7748
7749     /* 5.1.1.4 of the standard says:
7750          If a lambda-expression does not include a trailing-return-type, it
7751          is as if the trailing-return-type denotes the following type:
7752           * if the compound-statement is of the form
7753                { return attribute-specifier [opt] expression ; }
7754              the type of the returned expression after lvalue-to-rvalue
7755              conversion (_conv.lval_ 4.1), array-to-pointer conversion
7756              (_conv.array_ 4.2), and function-to-pointer conversion
7757              (_conv.func_ 4.3);
7758           * otherwise, void.  */
7759
7760     /* In a lambda that has neither a lambda-return-type-clause
7761        nor a deducible form, errors should be reported for return statements
7762        in the body.  Since we used void as the placeholder return type, parsing
7763        the body as usual will give such desired behavior.  */
7764     if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr)
7765         && cp_lexer_peek_nth_token (parser->lexer, 1)->keyword == RID_RETURN
7766         && cp_lexer_peek_nth_token (parser->lexer, 2)->type != CPP_SEMICOLON)
7767       {
7768         tree expr = NULL_TREE;
7769         cp_id_kind idk = CP_ID_KIND_NONE;
7770
7771         /* Parse tentatively in case there's more after the initial return
7772            statement.  */
7773         cp_parser_parse_tentatively (parser);
7774
7775         cp_parser_require_keyword (parser, RID_RETURN, RT_RETURN);
7776
7777         expr = cp_parser_expression (parser, /*cast_p=*/false, &idk);
7778
7779         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
7780         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7781
7782         if (cp_parser_parse_definitely (parser))
7783           {
7784             apply_lambda_return_type (lambda_expr, lambda_return_type (expr));
7785
7786             /* Will get error here if type not deduced yet.  */
7787             finish_return_stmt (expr);
7788
7789             done = true;
7790           }
7791       }
7792
7793     if (!done)
7794       {
7795         if (!LAMBDA_EXPR_RETURN_TYPE (lambda_expr))
7796           LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = true;
7797         while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
7798           cp_parser_label_declaration (parser);
7799         cp_parser_statement_seq_opt (parser, NULL_TREE);
7800         cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
7801         LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda_expr) = false;
7802       }
7803
7804     finish_compound_stmt (compound_stmt);
7805
7806   out:
7807     finish_function_body (body);
7808     finish_lambda_scope ();
7809
7810     /* Finish the function and generate code for it if necessary.  */
7811     expand_or_defer_fn (finish_function (/*inline*/2));
7812   }
7813
7814   if (nested)
7815     pop_function_context();
7816 }
7817
7818 /* Statements [gram.stmt.stmt]  */
7819
7820 /* Parse a statement.
7821
7822    statement:
7823      labeled-statement
7824      expression-statement
7825      compound-statement
7826      selection-statement
7827      iteration-statement
7828      jump-statement
7829      declaration-statement
7830      try-block
7831
7832   IN_COMPOUND is true when the statement is nested inside a
7833   cp_parser_compound_statement; this matters for certain pragmas.
7834
7835   If IF_P is not NULL, *IF_P is set to indicate whether the statement
7836   is a (possibly labeled) if statement which is not enclosed in braces
7837   and has an else clause.  This is used to implement -Wparentheses.  */
7838
7839 static void
7840 cp_parser_statement (cp_parser* parser, tree in_statement_expr,
7841                      bool in_compound, bool *if_p)
7842 {
7843   tree statement;
7844   cp_token *token;
7845   location_t statement_location;
7846
7847  restart:
7848   if (if_p != NULL)
7849     *if_p = false;
7850   /* There is no statement yet.  */
7851   statement = NULL_TREE;
7852   /* Peek at the next token.  */
7853   token = cp_lexer_peek_token (parser->lexer);
7854   /* Remember the location of the first token in the statement.  */
7855   statement_location = token->location;
7856   /* If this is a keyword, then that will often determine what kind of
7857      statement we have.  */
7858   if (token->type == CPP_KEYWORD)
7859     {
7860       enum rid keyword = token->keyword;
7861
7862       switch (keyword)
7863         {
7864         case RID_CASE:
7865         case RID_DEFAULT:
7866           /* Looks like a labeled-statement with a case label.
7867              Parse the label, and then use tail recursion to parse
7868              the statement.  */
7869           cp_parser_label_for_labeled_statement (parser);
7870           goto restart;
7871
7872         case RID_IF:
7873         case RID_SWITCH:
7874           statement = cp_parser_selection_statement (parser, if_p);
7875           break;
7876
7877         case RID_WHILE:
7878         case RID_DO:
7879         case RID_FOR:
7880           statement = cp_parser_iteration_statement (parser);
7881           break;
7882
7883         case RID_BREAK:
7884         case RID_CONTINUE:
7885         case RID_RETURN:
7886         case RID_GOTO:
7887           statement = cp_parser_jump_statement (parser);
7888           break;
7889
7890           /* Objective-C++ exception-handling constructs.  */
7891         case RID_AT_TRY:
7892         case RID_AT_CATCH:
7893         case RID_AT_FINALLY:
7894         case RID_AT_SYNCHRONIZED:
7895         case RID_AT_THROW:
7896           statement = cp_parser_objc_statement (parser);
7897           break;
7898
7899         case RID_TRY:
7900           statement = cp_parser_try_block (parser);
7901           break;
7902
7903         case RID_NAMESPACE:
7904           /* This must be a namespace alias definition.  */
7905           cp_parser_declaration_statement (parser);
7906           return;
7907           
7908         default:
7909           /* It might be a keyword like `int' that can start a
7910              declaration-statement.  */
7911           break;
7912         }
7913     }
7914   else if (token->type == CPP_NAME)
7915     {
7916       /* If the next token is a `:', then we are looking at a
7917          labeled-statement.  */
7918       token = cp_lexer_peek_nth_token (parser->lexer, 2);
7919       if (token->type == CPP_COLON)
7920         {
7921           /* Looks like a labeled-statement with an ordinary label.
7922              Parse the label, and then use tail recursion to parse
7923              the statement.  */
7924           cp_parser_label_for_labeled_statement (parser);
7925           goto restart;
7926         }
7927     }
7928   /* Anything that starts with a `{' must be a compound-statement.  */
7929   else if (token->type == CPP_OPEN_BRACE)
7930     statement = cp_parser_compound_statement (parser, NULL, false, false);
7931   /* CPP_PRAGMA is a #pragma inside a function body, which constitutes
7932      a statement all its own.  */
7933   else if (token->type == CPP_PRAGMA)
7934     {
7935       /* Only certain OpenMP pragmas are attached to statements, and thus
7936          are considered statements themselves.  All others are not.  In
7937          the context of a compound, accept the pragma as a "statement" and
7938          return so that we can check for a close brace.  Otherwise we
7939          require a real statement and must go back and read one.  */
7940       if (in_compound)
7941         cp_parser_pragma (parser, pragma_compound);
7942       else if (!cp_parser_pragma (parser, pragma_stmt))
7943         goto restart;
7944       return;
7945     }
7946   else if (token->type == CPP_EOF)
7947     {
7948       cp_parser_error (parser, "expected statement");
7949       return;
7950     }
7951
7952   /* Everything else must be a declaration-statement or an
7953      expression-statement.  Try for the declaration-statement
7954      first, unless we are looking at a `;', in which case we know that
7955      we have an expression-statement.  */
7956   if (!statement)
7957     {
7958       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
7959         {
7960           cp_parser_parse_tentatively (parser);
7961           /* Try to parse the declaration-statement.  */
7962           cp_parser_declaration_statement (parser);
7963           /* If that worked, we're done.  */
7964           if (cp_parser_parse_definitely (parser))
7965             return;
7966         }
7967       /* Look for an expression-statement instead.  */
7968       statement = cp_parser_expression_statement (parser, in_statement_expr);
7969     }
7970
7971   /* Set the line number for the statement.  */
7972   if (statement && STATEMENT_CODE_P (TREE_CODE (statement)))
7973     SET_EXPR_LOCATION (statement, statement_location);
7974 }
7975
7976 /* Parse the label for a labeled-statement, i.e.
7977
7978    identifier :
7979    case constant-expression :
7980    default :
7981
7982    GNU Extension:
7983    case constant-expression ... constant-expression : statement
7984
7985    When a label is parsed without errors, the label is added to the
7986    parse tree by the finish_* functions, so this function doesn't
7987    have to return the label.  */
7988
7989 static void
7990 cp_parser_label_for_labeled_statement (cp_parser* parser)
7991 {
7992   cp_token *token;
7993   tree label = NULL_TREE;
7994   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
7995
7996   /* The next token should be an identifier.  */
7997   token = cp_lexer_peek_token (parser->lexer);
7998   if (token->type != CPP_NAME
7999       && token->type != CPP_KEYWORD)
8000     {
8001       cp_parser_error (parser, "expected labeled-statement");
8002       return;
8003     }
8004
8005   parser->colon_corrects_to_scope_p = false;
8006   switch (token->keyword)
8007     {
8008     case RID_CASE:
8009       {
8010         tree expr, expr_hi;
8011         cp_token *ellipsis;
8012
8013         /* Consume the `case' token.  */
8014         cp_lexer_consume_token (parser->lexer);
8015         /* Parse the constant-expression.  */
8016         expr = cp_parser_constant_expression (parser,
8017                                               /*allow_non_constant_p=*/false,
8018                                               NULL);
8019
8020         ellipsis = cp_lexer_peek_token (parser->lexer);
8021         if (ellipsis->type == CPP_ELLIPSIS)
8022           {
8023             /* Consume the `...' token.  */
8024             cp_lexer_consume_token (parser->lexer);
8025             expr_hi =
8026               cp_parser_constant_expression (parser,
8027                                              /*allow_non_constant_p=*/false,
8028                                              NULL);
8029             /* We don't need to emit warnings here, as the common code
8030                will do this for us.  */
8031           }
8032         else
8033           expr_hi = NULL_TREE;
8034
8035         if (parser->in_switch_statement_p)
8036           finish_case_label (token->location, expr, expr_hi);
8037         else
8038           error_at (token->location,
8039                     "case label %qE not within a switch statement",
8040                     expr);
8041       }
8042       break;
8043
8044     case RID_DEFAULT:
8045       /* Consume the `default' token.  */
8046       cp_lexer_consume_token (parser->lexer);
8047
8048       if (parser->in_switch_statement_p)
8049         finish_case_label (token->location, NULL_TREE, NULL_TREE);
8050       else
8051         error_at (token->location, "case label not within a switch statement");
8052       break;
8053
8054     default:
8055       /* Anything else must be an ordinary label.  */
8056       label = finish_label_stmt (cp_parser_identifier (parser));
8057       break;
8058     }
8059
8060   /* Require the `:' token.  */
8061   cp_parser_require (parser, CPP_COLON, RT_COLON);
8062
8063   /* An ordinary label may optionally be followed by attributes.
8064      However, this is only permitted if the attributes are then
8065      followed by a semicolon.  This is because, for backward
8066      compatibility, when parsing
8067        lab: __attribute__ ((unused)) int i;
8068      we want the attribute to attach to "i", not "lab".  */
8069   if (label != NULL_TREE
8070       && cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
8071     {
8072       tree attrs;
8073
8074       cp_parser_parse_tentatively (parser);
8075       attrs = cp_parser_attributes_opt (parser);
8076       if (attrs == NULL_TREE
8077           || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8078         cp_parser_abort_tentative_parse (parser);
8079       else if (!cp_parser_parse_definitely (parser))
8080         ;
8081       else
8082         cplus_decl_attributes (&label, attrs, 0);
8083     }
8084
8085   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8086 }
8087
8088 /* Parse an expression-statement.
8089
8090    expression-statement:
8091      expression [opt] ;
8092
8093    Returns the new EXPR_STMT -- or NULL_TREE if the expression
8094    statement consists of nothing more than an `;'. IN_STATEMENT_EXPR_P
8095    indicates whether this expression-statement is part of an
8096    expression statement.  */
8097
8098 static tree
8099 cp_parser_expression_statement (cp_parser* parser, tree in_statement_expr)
8100 {
8101   tree statement = NULL_TREE;
8102   cp_token *token = cp_lexer_peek_token (parser->lexer);
8103
8104   /* If the next token is a ';', then there is no expression
8105      statement.  */
8106   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8107     statement = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8108
8109   /* Give a helpful message for "A<T>::type t;" and the like.  */
8110   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
8111       && !cp_parser_uncommitted_to_tentative_parse_p (parser))
8112     {
8113       if (TREE_CODE (statement) == SCOPE_REF)
8114         error_at (token->location, "need %<typename%> before %qE because "
8115                   "%qT is a dependent scope",
8116                   statement, TREE_OPERAND (statement, 0));
8117       else if (is_overloaded_fn (statement)
8118                && DECL_CONSTRUCTOR_P (get_first_fn (statement)))
8119         {
8120           /* A::A a; */
8121           tree fn = get_first_fn (statement);
8122           error_at (token->location,
8123                     "%<%T::%D%> names the constructor, not the type",
8124                     DECL_CONTEXT (fn), DECL_NAME (fn));
8125         }
8126     }
8127
8128   /* Consume the final `;'.  */
8129   cp_parser_consume_semicolon_at_end_of_statement (parser);
8130
8131   if (in_statement_expr
8132       && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
8133     /* This is the final expression statement of a statement
8134        expression.  */
8135     statement = finish_stmt_expr_expr (statement, in_statement_expr);
8136   else if (statement)
8137     statement = finish_expr_stmt (statement);
8138   else
8139     finish_stmt ();
8140
8141   return statement;
8142 }
8143
8144 /* Parse a compound-statement.
8145
8146    compound-statement:
8147      { statement-seq [opt] }
8148
8149    GNU extension:
8150
8151    compound-statement:
8152      { label-declaration-seq [opt] statement-seq [opt] }
8153
8154    label-declaration-seq:
8155      label-declaration
8156      label-declaration-seq label-declaration
8157
8158    Returns a tree representing the statement.  */
8159
8160 static tree
8161 cp_parser_compound_statement (cp_parser *parser, tree in_statement_expr,
8162                               bool in_try, bool function_body)
8163 {
8164   tree compound_stmt;
8165
8166   /* Consume the `{'.  */
8167   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
8168     return error_mark_node;
8169   if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
8170       && !function_body)
8171     pedwarn (input_location, OPT_pedantic,
8172              "compound-statement in constexpr function");
8173   /* Begin the compound-statement.  */
8174   compound_stmt = begin_compound_stmt (in_try ? BCS_TRY_BLOCK : 0);
8175   /* If the next keyword is `__label__' we have a label declaration.  */
8176   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
8177     cp_parser_label_declaration (parser);
8178   /* Parse an (optional) statement-seq.  */
8179   cp_parser_statement_seq_opt (parser, in_statement_expr);
8180   /* Finish the compound-statement.  */
8181   finish_compound_stmt (compound_stmt);
8182   /* Consume the `}'.  */
8183   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
8184
8185   return compound_stmt;
8186 }
8187
8188 /* Parse an (optional) statement-seq.
8189
8190    statement-seq:
8191      statement
8192      statement-seq [opt] statement  */
8193
8194 static void
8195 cp_parser_statement_seq_opt (cp_parser* parser, tree in_statement_expr)
8196 {
8197   /* Scan statements until there aren't any more.  */
8198   while (true)
8199     {
8200       cp_token *token = cp_lexer_peek_token (parser->lexer);
8201
8202       /* If we are looking at a `}', then we have run out of
8203          statements; the same is true if we have reached the end
8204          of file, or have stumbled upon a stray '@end'.  */
8205       if (token->type == CPP_CLOSE_BRACE
8206           || token->type == CPP_EOF
8207           || token->type == CPP_PRAGMA_EOL
8208           || (token->type == CPP_KEYWORD && token->keyword == RID_AT_END))
8209         break;
8210       
8211       /* If we are in a compound statement and find 'else' then
8212          something went wrong.  */
8213       else if (token->type == CPP_KEYWORD && token->keyword == RID_ELSE)
8214         {
8215           if (parser->in_statement & IN_IF_STMT) 
8216             break;
8217           else
8218             {
8219               token = cp_lexer_consume_token (parser->lexer);
8220               error_at (token->location, "%<else%> without a previous %<if%>");
8221             }
8222         }
8223
8224       /* Parse the statement.  */
8225       cp_parser_statement (parser, in_statement_expr, true, NULL);
8226     }
8227 }
8228
8229 /* Parse a selection-statement.
8230
8231    selection-statement:
8232      if ( condition ) statement
8233      if ( condition ) statement else statement
8234      switch ( condition ) statement
8235
8236    Returns the new IF_STMT or SWITCH_STMT.
8237
8238    If IF_P is not NULL, *IF_P is set to indicate whether the statement
8239    is a (possibly labeled) if statement which is not enclosed in
8240    braces and has an else clause.  This is used to implement
8241    -Wparentheses.  */
8242
8243 static tree
8244 cp_parser_selection_statement (cp_parser* parser, bool *if_p)
8245 {
8246   cp_token *token;
8247   enum rid keyword;
8248
8249   if (if_p != NULL)
8250     *if_p = false;
8251
8252   /* Peek at the next token.  */
8253   token = cp_parser_require (parser, CPP_KEYWORD, RT_SELECT);
8254
8255   /* See what kind of keyword it is.  */
8256   keyword = token->keyword;
8257   switch (keyword)
8258     {
8259     case RID_IF:
8260     case RID_SWITCH:
8261       {
8262         tree statement;
8263         tree condition;
8264
8265         /* Look for the `('.  */
8266         if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
8267           {
8268             cp_parser_skip_to_end_of_statement (parser);
8269             return error_mark_node;
8270           }
8271
8272         /* Begin the selection-statement.  */
8273         if (keyword == RID_IF)
8274           statement = begin_if_stmt ();
8275         else
8276           statement = begin_switch_stmt ();
8277
8278         /* Parse the condition.  */
8279         condition = cp_parser_condition (parser);
8280         /* Look for the `)'.  */
8281         if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
8282           cp_parser_skip_to_closing_parenthesis (parser, true, false,
8283                                                  /*consume_paren=*/true);
8284
8285         if (keyword == RID_IF)
8286           {
8287             bool nested_if;
8288             unsigned char in_statement;
8289
8290             /* Add the condition.  */
8291             finish_if_stmt_cond (condition, statement);
8292
8293             /* Parse the then-clause.  */
8294             in_statement = parser->in_statement;
8295             parser->in_statement |= IN_IF_STMT;
8296             if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8297               {
8298                 location_t loc = cp_lexer_peek_token (parser->lexer)->location;
8299                 add_stmt (build_empty_stmt (loc));
8300                 cp_lexer_consume_token (parser->lexer);
8301                 if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_ELSE))
8302                   warning_at (loc, OPT_Wempty_body, "suggest braces around "
8303                               "empty body in an %<if%> statement");
8304                 nested_if = false;
8305               }
8306             else
8307               cp_parser_implicitly_scoped_statement (parser, &nested_if);
8308             parser->in_statement = in_statement;
8309
8310             finish_then_clause (statement);
8311
8312             /* If the next token is `else', parse the else-clause.  */
8313             if (cp_lexer_next_token_is_keyword (parser->lexer,
8314                                                 RID_ELSE))
8315               {
8316                 /* Consume the `else' keyword.  */
8317                 cp_lexer_consume_token (parser->lexer);
8318                 begin_else_clause (statement);
8319                 /* Parse the else-clause.  */
8320                 if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
8321                   {
8322                     location_t loc;
8323                     loc = cp_lexer_peek_token (parser->lexer)->location;
8324                     warning_at (loc,
8325                                 OPT_Wempty_body, "suggest braces around "
8326                                 "empty body in an %<else%> statement");
8327                     add_stmt (build_empty_stmt (loc));
8328                     cp_lexer_consume_token (parser->lexer);
8329                   }
8330                 else
8331                   cp_parser_implicitly_scoped_statement (parser, NULL);
8332
8333                 finish_else_clause (statement);
8334
8335                 /* If we are currently parsing a then-clause, then
8336                    IF_P will not be NULL.  We set it to true to
8337                    indicate that this if statement has an else clause.
8338                    This may trigger the Wparentheses warning below
8339                    when we get back up to the parent if statement.  */
8340                 if (if_p != NULL)
8341                   *if_p = true;
8342               }
8343             else
8344               {
8345                 /* This if statement does not have an else clause.  If
8346                    NESTED_IF is true, then the then-clause is an if
8347                    statement which does have an else clause.  We warn
8348                    about the potential ambiguity.  */
8349                 if (nested_if)
8350                   warning_at (EXPR_LOCATION (statement), OPT_Wparentheses,
8351                               "suggest explicit braces to avoid ambiguous"
8352                               " %<else%>");
8353               }
8354
8355             /* Now we're all done with the if-statement.  */
8356             finish_if_stmt (statement);
8357           }
8358         else
8359           {
8360             bool in_switch_statement_p;
8361             unsigned char in_statement;
8362
8363             /* Add the condition.  */
8364             finish_switch_cond (condition, statement);
8365
8366             /* Parse the body of the switch-statement.  */
8367             in_switch_statement_p = parser->in_switch_statement_p;
8368             in_statement = parser->in_statement;
8369             parser->in_switch_statement_p = true;
8370             parser->in_statement |= IN_SWITCH_STMT;
8371             cp_parser_implicitly_scoped_statement (parser, NULL);
8372             parser->in_switch_statement_p = in_switch_statement_p;
8373             parser->in_statement = in_statement;
8374
8375             /* Now we're all done with the switch-statement.  */
8376             finish_switch_stmt (statement);
8377           }
8378
8379         return statement;
8380       }
8381       break;
8382
8383     default:
8384       cp_parser_error (parser, "expected selection-statement");
8385       return error_mark_node;
8386     }
8387 }
8388
8389 /* Parse a condition.
8390
8391    condition:
8392      expression
8393      type-specifier-seq declarator = initializer-clause
8394      type-specifier-seq declarator braced-init-list
8395
8396    GNU Extension:
8397
8398    condition:
8399      type-specifier-seq declarator asm-specification [opt]
8400        attributes [opt] = assignment-expression
8401
8402    Returns the expression that should be tested.  */
8403
8404 static tree
8405 cp_parser_condition (cp_parser* parser)
8406 {
8407   cp_decl_specifier_seq type_specifiers;
8408   const char *saved_message;
8409   int declares_class_or_enum;
8410
8411   /* Try the declaration first.  */
8412   cp_parser_parse_tentatively (parser);
8413   /* New types are not allowed in the type-specifier-seq for a
8414      condition.  */
8415   saved_message = parser->type_definition_forbidden_message;
8416   parser->type_definition_forbidden_message
8417     = G_("types may not be defined in conditions");
8418   /* Parse the type-specifier-seq.  */
8419   cp_parser_decl_specifier_seq (parser,
8420                                 CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR,
8421                                 &type_specifiers,
8422                                 &declares_class_or_enum);
8423   /* Restore the saved message.  */
8424   parser->type_definition_forbidden_message = saved_message;
8425   /* If all is well, we might be looking at a declaration.  */
8426   if (!cp_parser_error_occurred (parser))
8427     {
8428       tree decl;
8429       tree asm_specification;
8430       tree attributes;
8431       cp_declarator *declarator;
8432       tree initializer = NULL_TREE;
8433
8434       /* Parse the declarator.  */
8435       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
8436                                          /*ctor_dtor_or_conv_p=*/NULL,
8437                                          /*parenthesized_p=*/NULL,
8438                                          /*member_p=*/false);
8439       /* Parse the attributes.  */
8440       attributes = cp_parser_attributes_opt (parser);
8441       /* Parse the asm-specification.  */
8442       asm_specification = cp_parser_asm_specification_opt (parser);
8443       /* If the next token is not an `=' or '{', then we might still be
8444          looking at an expression.  For example:
8445
8446            if (A(a).x)
8447
8448          looks like a decl-specifier-seq and a declarator -- but then
8449          there is no `=', so this is an expression.  */
8450       if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
8451           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
8452         cp_parser_simulate_error (parser);
8453         
8454       /* If we did see an `=' or '{', then we are looking at a declaration
8455          for sure.  */
8456       if (cp_parser_parse_definitely (parser))
8457         {
8458           tree pushed_scope;
8459           bool non_constant_p;
8460           bool flags = LOOKUP_ONLYCONVERTING;
8461
8462           /* Create the declaration.  */
8463           decl = start_decl (declarator, &type_specifiers,
8464                              /*initialized_p=*/true,
8465                              attributes, /*prefix_attributes=*/NULL_TREE,
8466                              &pushed_scope);
8467
8468           /* Parse the initializer.  */
8469           if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8470             {
8471               initializer = cp_parser_braced_list (parser, &non_constant_p);
8472               CONSTRUCTOR_IS_DIRECT_INIT (initializer) = 1;
8473               flags = 0;
8474             }
8475           else
8476             {
8477               /* Consume the `='.  */
8478               cp_parser_require (parser, CPP_EQ, RT_EQ);
8479               initializer = cp_parser_initializer_clause (parser, &non_constant_p);
8480             }
8481           if (BRACE_ENCLOSED_INITIALIZER_P (initializer))
8482             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
8483
8484           /* Process the initializer.  */
8485           cp_finish_decl (decl,
8486                           initializer, !non_constant_p,
8487                           asm_specification,
8488                           flags);
8489
8490           if (pushed_scope)
8491             pop_scope (pushed_scope);
8492
8493           return convert_from_reference (decl);
8494         }
8495     }
8496   /* If we didn't even get past the declarator successfully, we are
8497      definitely not looking at a declaration.  */
8498   else
8499     cp_parser_abort_tentative_parse (parser);
8500
8501   /* Otherwise, we are looking at an expression.  */
8502   return cp_parser_expression (parser, /*cast_p=*/false, NULL);
8503 }
8504
8505 /* Parses a for-statement or range-for-statement until the closing ')',
8506    not included. */
8507
8508 static tree
8509 cp_parser_for (cp_parser *parser)
8510 {
8511   tree init, scope, decl;
8512   bool is_range_for;
8513
8514   /* Begin the for-statement.  */
8515   scope = begin_for_scope (&init);
8516
8517   /* Parse the initialization.  */
8518   is_range_for = cp_parser_for_init_statement (parser, &decl);
8519
8520   if (is_range_for)
8521     return cp_parser_range_for (parser, scope, init, decl);
8522   else
8523     return cp_parser_c_for (parser, scope, init);
8524 }
8525
8526 static tree
8527 cp_parser_c_for (cp_parser *parser, tree scope, tree init)
8528 {
8529   /* Normal for loop */
8530   tree condition = NULL_TREE;
8531   tree expression = NULL_TREE;
8532   tree stmt;
8533
8534   stmt = begin_for_stmt (scope, init);
8535   /* The for-init-statement has already been parsed in
8536      cp_parser_for_init_statement, so no work is needed here.  */
8537   finish_for_init_stmt (stmt);
8538
8539   /* If there's a condition, process it.  */
8540   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8541     condition = cp_parser_condition (parser);
8542   finish_for_cond (condition, stmt);
8543   /* Look for the `;'.  */
8544   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8545
8546   /* If there's an expression, process it.  */
8547   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
8548     expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8549   finish_for_expr (expression, stmt);
8550
8551   return stmt;
8552 }
8553
8554 /* Tries to parse a range-based for-statement:
8555
8556   range-based-for:
8557     decl-specifier-seq declarator : expression
8558
8559   The decl-specifier-seq declarator and the `:' are already parsed by
8560   cp_parser_for_init_statement. If processing_template_decl it returns a
8561   newly created RANGE_FOR_STMT; if not, it is converted to a
8562   regular FOR_STMT.  */
8563
8564 static tree
8565 cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl)
8566 {
8567   tree stmt, range_expr;
8568
8569   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
8570     {
8571       bool expr_non_constant_p;
8572       range_expr = cp_parser_braced_list (parser, &expr_non_constant_p);
8573     }
8574   else
8575     range_expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8576
8577   /* If in template, STMT is converted to a normal for-statement
8578      at instantiation. If not, it is done just ahead. */
8579   if (processing_template_decl)
8580     {
8581       stmt = begin_range_for_stmt (scope, init);
8582       finish_range_for_decl (stmt, range_decl, range_expr);
8583     }
8584   else
8585     {
8586       stmt = begin_for_stmt (scope, init);
8587       stmt = cp_convert_range_for (stmt, range_decl, range_expr);
8588     }
8589   return stmt;
8590 }
8591
8592 /* Converts a range-based for-statement into a normal
8593    for-statement, as per the definition.
8594
8595       for (RANGE_DECL : RANGE_EXPR)
8596         BLOCK
8597
8598    should be equivalent to:
8599
8600       {
8601         auto &&__range = RANGE_EXPR;
8602         for (auto __begin = BEGIN_EXPR, end = END_EXPR;
8603               __begin != __end;
8604               ++__begin)
8605           {
8606               RANGE_DECL = *__begin;
8607               BLOCK
8608           }
8609       }
8610
8611    If RANGE_EXPR is an array:
8612         BEGIN_EXPR = __range
8613         END_EXPR = __range + ARRAY_SIZE(__range)
8614    Else if RANGE_EXPR has a member 'begin' or 'end':
8615         BEGIN_EXPR = __range.begin()
8616         END_EXPR = __range.end()
8617    Else:
8618         BEGIN_EXPR = begin(__range)
8619         END_EXPR = end(__range);
8620
8621    If __range has a member 'begin' but not 'end', or vice versa, we must
8622    still use the second alternative (it will surely fail, however).
8623    When calling begin()/end() in the third alternative we must use
8624    argument dependent lookup, but always considering 'std' as an associated
8625    namespace.  */
8626
8627 tree
8628 cp_convert_range_for (tree statement, tree range_decl, tree range_expr)
8629 {
8630   tree range_type, range_temp;
8631   tree begin, end;
8632   tree iter_type, begin_expr, end_expr;
8633   tree condition, expression;
8634
8635   if (range_decl == error_mark_node || range_expr == error_mark_node)
8636     /* If an error happened previously do nothing or else a lot of
8637        unhelpful errors would be issued.  */
8638     begin_expr = end_expr = iter_type = error_mark_node;
8639   else
8640     {
8641       /* Find out the type deduced by the declaration
8642          `auto &&__range = range_expr'.  */
8643       range_type = cp_build_reference_type (make_auto (), true);
8644       range_type = do_auto_deduction (range_type, range_expr,
8645                                       type_uses_auto (range_type));
8646
8647       /* Create the __range variable.  */
8648       range_temp = build_decl (input_location, VAR_DECL,
8649                                get_identifier ("__for_range"), range_type);
8650       TREE_USED (range_temp) = 1;
8651       DECL_ARTIFICIAL (range_temp) = 1;
8652       pushdecl (range_temp);
8653       cp_finish_decl (range_temp, range_expr,
8654                       /*is_constant_init*/false, NULL_TREE,
8655                       LOOKUP_ONLYCONVERTING);
8656
8657       range_temp = convert_from_reference (range_temp);
8658       iter_type = cp_parser_perform_range_for_lookup (range_temp,
8659                                                       &begin_expr, &end_expr);
8660     }
8661
8662   /* The new for initialization statement.  */
8663   begin = build_decl (input_location, VAR_DECL,
8664                       get_identifier ("__for_begin"), iter_type);
8665   TREE_USED (begin) = 1;
8666   DECL_ARTIFICIAL (begin) = 1;
8667   pushdecl (begin);
8668   cp_finish_decl (begin, begin_expr,
8669                   /*is_constant_init*/false, NULL_TREE,
8670                   LOOKUP_ONLYCONVERTING);
8671
8672   end = build_decl (input_location, VAR_DECL,
8673                     get_identifier ("__for_end"), iter_type);
8674   TREE_USED (end) = 1;
8675   DECL_ARTIFICIAL (end) = 1;
8676   pushdecl (end);
8677   cp_finish_decl (end, end_expr,
8678                   /*is_constant_init*/false, NULL_TREE,
8679                   LOOKUP_ONLYCONVERTING);
8680
8681   finish_for_init_stmt (statement);
8682
8683   /* The new for condition.  */
8684   condition = build_x_binary_op (NE_EXPR,
8685                                  begin, ERROR_MARK,
8686                                  end, ERROR_MARK,
8687                                  NULL, tf_warning_or_error);
8688   finish_for_cond (condition, statement);
8689
8690   /* The new increment expression.  */
8691   expression = finish_unary_op_expr (PREINCREMENT_EXPR, begin);
8692   finish_for_expr (expression, statement);
8693
8694   /* The declaration is initialized with *__begin inside the loop body.  */
8695   cp_finish_decl (range_decl,
8696                   build_x_indirect_ref (begin, RO_NULL, tf_warning_or_error),
8697                   /*is_constant_init*/false, NULL_TREE,
8698                   LOOKUP_ONLYCONVERTING);
8699
8700   return statement;
8701 }
8702
8703 /* Solves BEGIN_EXPR and END_EXPR as described in cp_convert_range_for.
8704    We need to solve both at the same time because the method used
8705    depends on the existence of members begin or end.
8706    Returns the type deduced for the iterator expression.  */
8707
8708 static tree
8709 cp_parser_perform_range_for_lookup (tree range, tree *begin, tree *end)
8710 {
8711   if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (range))))
8712     {
8713       error ("range-based %<for%> expression of type %qT "
8714              "has incomplete type", TREE_TYPE (range));
8715       *begin = *end = error_mark_node;
8716       return error_mark_node;
8717     }
8718   if (TREE_CODE (TREE_TYPE (range)) == ARRAY_TYPE)
8719     {
8720       /* If RANGE is an array, we will use pointer arithmetic.  */
8721       *begin = range;
8722       *end = build_binary_op (input_location, PLUS_EXPR,
8723                               range,
8724                               array_type_nelts_top (TREE_TYPE (range)),
8725                               0);
8726       return build_pointer_type (TREE_TYPE (TREE_TYPE (range)));
8727     }
8728   else
8729     {
8730       /* If it is not an array, we must do a bit of magic.  */
8731       tree id_begin, id_end;
8732       tree member_begin, member_end;
8733
8734       *begin = *end = error_mark_node;
8735
8736       id_begin = get_identifier ("begin");
8737       id_end = get_identifier ("end");
8738       member_begin = lookup_member (TREE_TYPE (range), id_begin,
8739                                     /*protect=*/2, /*want_type=*/false);
8740       member_end = lookup_member (TREE_TYPE (range), id_end,
8741                                   /*protect=*/2, /*want_type=*/false);
8742
8743       if (member_begin != NULL_TREE || member_end != NULL_TREE)
8744         {
8745           /* Use the member functions.  */
8746           if (member_begin != NULL_TREE)
8747             *begin = cp_parser_range_for_member_function (range, id_begin);
8748           else
8749             error ("range-based %<for%> expression of type %qT has an "
8750                    "%<end%> member but not a %<begin%>", TREE_TYPE (range));
8751
8752           if (member_end != NULL_TREE)
8753             *end = cp_parser_range_for_member_function (range, id_end);
8754           else
8755             error ("range-based %<for%> expression of type %qT has a "
8756                    "%<begin%> member but not an %<end%>", TREE_TYPE (range));
8757         }
8758       else
8759         {
8760           /* Use global functions with ADL.  */
8761           VEC(tree,gc) *vec;
8762           vec = make_tree_vector ();
8763
8764           VEC_safe_push (tree, gc, vec, range);
8765
8766           member_begin = perform_koenig_lookup (id_begin, vec,
8767                                                 /*include_std=*/true,
8768                                                 tf_warning_or_error);
8769           *begin = finish_call_expr (member_begin, &vec, false, true,
8770                                      tf_warning_or_error);
8771           member_end = perform_koenig_lookup (id_end, vec,
8772                                               /*include_std=*/true,
8773                                               tf_warning_or_error);
8774           *end = finish_call_expr (member_end, &vec, false, true,
8775                                    tf_warning_or_error);
8776
8777           release_tree_vector (vec);
8778         }
8779
8780       /* Last common checks.  */
8781       if (*begin == error_mark_node || *end == error_mark_node)
8782         {
8783           /* If one of the expressions is an error do no more checks.  */
8784           *begin = *end = error_mark_node;
8785           return error_mark_node;
8786         }
8787       else
8788         {
8789           tree iter_type = cv_unqualified (TREE_TYPE (*begin));
8790           /* The unqualified type of the __begin and __end temporaries should
8791              be the same, as required by the multiple auto declaration.  */
8792           if (!same_type_p (iter_type, cv_unqualified (TREE_TYPE (*end))))
8793             error ("inconsistent begin/end types in range-based %<for%> "
8794                    "statement: %qT and %qT",
8795                    TREE_TYPE (*begin), TREE_TYPE (*end));
8796           return iter_type;
8797         }
8798     }
8799 }
8800
8801 /* Helper function for cp_parser_perform_range_for_lookup.
8802    Builds a tree for RANGE.IDENTIFIER().  */
8803
8804 static tree
8805 cp_parser_range_for_member_function (tree range, tree identifier)
8806 {
8807   tree member, res;
8808   VEC(tree,gc) *vec;
8809
8810   member = finish_class_member_access_expr (range, identifier,
8811                                             false, tf_warning_or_error);
8812   if (member == error_mark_node)
8813     return error_mark_node;
8814
8815   vec = make_tree_vector ();
8816   res = finish_call_expr (member, &vec,
8817                           /*disallow_virtual=*/false,
8818                           /*koenig_p=*/false,
8819                           tf_warning_or_error);
8820   release_tree_vector (vec);
8821   return res;
8822 }
8823
8824 /* Parse an iteration-statement.
8825
8826    iteration-statement:
8827      while ( condition ) statement
8828      do statement while ( expression ) ;
8829      for ( for-init-statement condition [opt] ; expression [opt] )
8830        statement
8831
8832    Returns the new WHILE_STMT, DO_STMT, FOR_STMT or RANGE_FOR_STMT.  */
8833
8834 static tree
8835 cp_parser_iteration_statement (cp_parser* parser)
8836 {
8837   cp_token *token;
8838   enum rid keyword;
8839   tree statement;
8840   unsigned char in_statement;
8841
8842   /* Peek at the next token.  */
8843   token = cp_parser_require (parser, CPP_KEYWORD, RT_INTERATION);
8844   if (!token)
8845     return error_mark_node;
8846
8847   /* Remember whether or not we are already within an iteration
8848      statement.  */
8849   in_statement = parser->in_statement;
8850
8851   /* See what kind of keyword it is.  */
8852   keyword = token->keyword;
8853   switch (keyword)
8854     {
8855     case RID_WHILE:
8856       {
8857         tree condition;
8858
8859         /* Begin the while-statement.  */
8860         statement = begin_while_stmt ();
8861         /* Look for the `('.  */
8862         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8863         /* Parse the condition.  */
8864         condition = cp_parser_condition (parser);
8865         finish_while_stmt_cond (condition, statement);
8866         /* Look for the `)'.  */
8867         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8868         /* Parse the dependent statement.  */
8869         parser->in_statement = IN_ITERATION_STMT;
8870         cp_parser_already_scoped_statement (parser);
8871         parser->in_statement = in_statement;
8872         /* We're done with the while-statement.  */
8873         finish_while_stmt (statement);
8874       }
8875       break;
8876
8877     case RID_DO:
8878       {
8879         tree expression;
8880
8881         /* Begin the do-statement.  */
8882         statement = begin_do_stmt ();
8883         /* Parse the body of the do-statement.  */
8884         parser->in_statement = IN_ITERATION_STMT;
8885         cp_parser_implicitly_scoped_statement (parser, NULL);
8886         parser->in_statement = in_statement;
8887         finish_do_body (statement);
8888         /* Look for the `while' keyword.  */
8889         cp_parser_require_keyword (parser, RID_WHILE, RT_WHILE);
8890         /* Look for the `('.  */
8891         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8892         /* Parse the expression.  */
8893         expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
8894         /* We're done with the do-statement.  */
8895         finish_do_stmt (expression, statement);
8896         /* Look for the `)'.  */
8897         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8898         /* Look for the `;'.  */
8899         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8900       }
8901       break;
8902
8903     case RID_FOR:
8904       {
8905         /* Look for the `('.  */
8906         cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
8907
8908         statement = cp_parser_for (parser);
8909
8910         /* Look for the `)'.  */
8911         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
8912
8913         /* Parse the body of the for-statement.  */
8914         parser->in_statement = IN_ITERATION_STMT;
8915         cp_parser_already_scoped_statement (parser);
8916         parser->in_statement = in_statement;
8917
8918         /* We're done with the for-statement.  */
8919         finish_for_stmt (statement);
8920       }
8921       break;
8922
8923     default:
8924       cp_parser_error (parser, "expected iteration-statement");
8925       statement = error_mark_node;
8926       break;
8927     }
8928
8929   return statement;
8930 }
8931
8932 /* Parse a for-init-statement or the declarator of a range-based-for.
8933    Returns true if a range-based-for declaration is seen.
8934
8935    for-init-statement:
8936      expression-statement
8937      simple-declaration  */
8938
8939 static bool
8940 cp_parser_for_init_statement (cp_parser* parser, tree *decl)
8941 {
8942   /* If the next token is a `;', then we have an empty
8943      expression-statement.  Grammatically, this is also a
8944      simple-declaration, but an invalid one, because it does not
8945      declare anything.  Therefore, if we did not handle this case
8946      specially, we would issue an error message about an invalid
8947      declaration.  */
8948   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
8949     {
8950       bool is_range_for = false;
8951       bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
8952
8953       parser->colon_corrects_to_scope_p = false;
8954
8955       /* We're going to speculatively look for a declaration, falling back
8956          to an expression, if necessary.  */
8957       cp_parser_parse_tentatively (parser);
8958       /* Parse the declaration.  */
8959       cp_parser_simple_declaration (parser,
8960                                     /*function_definition_allowed_p=*/false,
8961                                     decl);
8962       parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
8963       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
8964         {
8965           /* It is a range-for, consume the ':' */
8966           cp_lexer_consume_token (parser->lexer);
8967           is_range_for = true;
8968           if (cxx_dialect < cxx0x)
8969             {
8970               error_at (cp_lexer_peek_token (parser->lexer)->location,
8971                         "range-based %<for%> loops are not allowed "
8972                         "in C++98 mode");
8973               *decl = error_mark_node;
8974             }
8975         }
8976       else
8977           /* The ';' is not consumed yet because we told
8978              cp_parser_simple_declaration not to.  */
8979           cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
8980
8981       if (cp_parser_parse_definitely (parser))
8982         return is_range_for;
8983       /* If the tentative parse failed, then we shall need to look for an
8984          expression-statement.  */
8985     }
8986   /* If we are here, it is an expression-statement.  */
8987   cp_parser_expression_statement (parser, NULL_TREE);
8988   return false;
8989 }
8990
8991 /* Parse a jump-statement.
8992
8993    jump-statement:
8994      break ;
8995      continue ;
8996      return expression [opt] ;
8997      return braced-init-list ;
8998      goto identifier ;
8999
9000    GNU extension:
9001
9002    jump-statement:
9003      goto * expression ;
9004
9005    Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR.  */
9006
9007 static tree
9008 cp_parser_jump_statement (cp_parser* parser)
9009 {
9010   tree statement = error_mark_node;
9011   cp_token *token;
9012   enum rid keyword;
9013   unsigned char in_statement;
9014
9015   /* Peek at the next token.  */
9016   token = cp_parser_require (parser, CPP_KEYWORD, RT_JUMP);
9017   if (!token)
9018     return error_mark_node;
9019
9020   /* See what kind of keyword it is.  */
9021   keyword = token->keyword;
9022   switch (keyword)
9023     {
9024     case RID_BREAK:
9025       in_statement = parser->in_statement & ~IN_IF_STMT;      
9026       switch (in_statement)
9027         {
9028         case 0:
9029           error_at (token->location, "break statement not within loop or switch");
9030           break;
9031         default:
9032           gcc_assert ((in_statement & IN_SWITCH_STMT)
9033                       || in_statement == IN_ITERATION_STMT);
9034           statement = finish_break_stmt ();
9035           break;
9036         case IN_OMP_BLOCK:
9037           error_at (token->location, "invalid exit from OpenMP structured block");
9038           break;
9039         case IN_OMP_FOR:
9040           error_at (token->location, "break statement used with OpenMP for loop");
9041           break;
9042         }
9043       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9044       break;
9045
9046     case RID_CONTINUE:
9047       switch (parser->in_statement & ~(IN_SWITCH_STMT | IN_IF_STMT))
9048         {
9049         case 0:
9050           error_at (token->location, "continue statement not within a loop");
9051           break;
9052         case IN_ITERATION_STMT:
9053         case IN_OMP_FOR:
9054           statement = finish_continue_stmt ();
9055           break;
9056         case IN_OMP_BLOCK:
9057           error_at (token->location, "invalid exit from OpenMP structured block");
9058           break;
9059         default:
9060           gcc_unreachable ();
9061         }
9062       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9063       break;
9064
9065     case RID_RETURN:
9066       {
9067         tree expr;
9068         bool expr_non_constant_p;
9069
9070         if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9071           {
9072             maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
9073             expr = cp_parser_braced_list (parser, &expr_non_constant_p);
9074           }
9075         else if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
9076           expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
9077         else
9078           /* If the next token is a `;', then there is no
9079              expression.  */
9080           expr = NULL_TREE;
9081         /* Build the return-statement.  */
9082         statement = finish_return_stmt (expr);
9083         /* Look for the final `;'.  */
9084         cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9085       }
9086       break;
9087
9088     case RID_GOTO:
9089       /* Create the goto-statement.  */
9090       if (cp_lexer_next_token_is (parser->lexer, CPP_MULT))
9091         {
9092           /* Issue a warning about this use of a GNU extension.  */
9093           pedwarn (token->location, OPT_pedantic, "ISO C++ forbids computed gotos");
9094           /* Consume the '*' token.  */
9095           cp_lexer_consume_token (parser->lexer);
9096           /* Parse the dependent expression.  */
9097           finish_goto_stmt (cp_parser_expression (parser, /*cast_p=*/false, NULL));
9098         }
9099       else
9100         finish_goto_stmt (cp_parser_identifier (parser));
9101       /* Look for the final `;'.  */
9102       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9103       break;
9104
9105     default:
9106       cp_parser_error (parser, "expected jump-statement");
9107       break;
9108     }
9109
9110   return statement;
9111 }
9112
9113 /* Parse a declaration-statement.
9114
9115    declaration-statement:
9116      block-declaration  */
9117
9118 static void
9119 cp_parser_declaration_statement (cp_parser* parser)
9120 {
9121   void *p;
9122
9123   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9124   p = obstack_alloc (&declarator_obstack, 0);
9125
9126  /* Parse the block-declaration.  */
9127   cp_parser_block_declaration (parser, /*statement_p=*/true);
9128
9129   /* Free any declarators allocated.  */
9130   obstack_free (&declarator_obstack, p);
9131
9132   /* Finish off the statement.  */
9133   finish_stmt ();
9134 }
9135
9136 /* Some dependent statements (like `if (cond) statement'), are
9137    implicitly in their own scope.  In other words, if the statement is
9138    a single statement (as opposed to a compound-statement), it is
9139    none-the-less treated as if it were enclosed in braces.  Any
9140    declarations appearing in the dependent statement are out of scope
9141    after control passes that point.  This function parses a statement,
9142    but ensures that is in its own scope, even if it is not a
9143    compound-statement.
9144
9145    If IF_P is not NULL, *IF_P is set to indicate whether the statement
9146    is a (possibly labeled) if statement which is not enclosed in
9147    braces and has an else clause.  This is used to implement
9148    -Wparentheses.
9149
9150    Returns the new statement.  */
9151
9152 static tree
9153 cp_parser_implicitly_scoped_statement (cp_parser* parser, bool *if_p)
9154 {
9155   tree statement;
9156
9157   if (if_p != NULL)
9158     *if_p = false;
9159
9160   /* Mark if () ; with a special NOP_EXPR.  */
9161   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9162     {
9163       location_t loc = cp_lexer_peek_token (parser->lexer)->location;
9164       cp_lexer_consume_token (parser->lexer);
9165       statement = add_stmt (build_empty_stmt (loc));
9166     }
9167   /* if a compound is opened, we simply parse the statement directly.  */
9168   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
9169     statement = cp_parser_compound_statement (parser, NULL, false, false);
9170   /* If the token is not a `{', then we must take special action.  */
9171   else
9172     {
9173       /* Create a compound-statement.  */
9174       statement = begin_compound_stmt (0);
9175       /* Parse the dependent-statement.  */
9176       cp_parser_statement (parser, NULL_TREE, false, if_p);
9177       /* Finish the dummy compound-statement.  */
9178       finish_compound_stmt (statement);
9179     }
9180
9181   /* Return the statement.  */
9182   return statement;
9183 }
9184
9185 /* For some dependent statements (like `while (cond) statement'), we
9186    have already created a scope.  Therefore, even if the dependent
9187    statement is a compound-statement, we do not want to create another
9188    scope.  */
9189
9190 static void
9191 cp_parser_already_scoped_statement (cp_parser* parser)
9192 {
9193   /* If the token is a `{', then we must take special action.  */
9194   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
9195     cp_parser_statement (parser, NULL_TREE, false, NULL);
9196   else
9197     {
9198       /* Avoid calling cp_parser_compound_statement, so that we
9199          don't create a new scope.  Do everything else by hand.  */
9200       cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
9201       /* If the next keyword is `__label__' we have a label declaration.  */
9202       while (cp_lexer_next_token_is_keyword (parser->lexer, RID_LABEL))
9203         cp_parser_label_declaration (parser);
9204       /* Parse an (optional) statement-seq.  */
9205       cp_parser_statement_seq_opt (parser, NULL_TREE);
9206       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
9207     }
9208 }
9209
9210 /* Declarations [gram.dcl.dcl] */
9211
9212 /* Parse an optional declaration-sequence.
9213
9214    declaration-seq:
9215      declaration
9216      declaration-seq declaration  */
9217
9218 static void
9219 cp_parser_declaration_seq_opt (cp_parser* parser)
9220 {
9221   while (true)
9222     {
9223       cp_token *token;
9224
9225       token = cp_lexer_peek_token (parser->lexer);
9226
9227       if (token->type == CPP_CLOSE_BRACE
9228           || token->type == CPP_EOF
9229           || token->type == CPP_PRAGMA_EOL)
9230         break;
9231
9232       if (token->type == CPP_SEMICOLON)
9233         {
9234           /* A declaration consisting of a single semicolon is
9235              invalid.  Allow it unless we're being pedantic.  */
9236           cp_lexer_consume_token (parser->lexer);
9237           if (!in_system_header)
9238             pedwarn (input_location, OPT_pedantic, "extra %<;%>");
9239           continue;
9240         }
9241
9242       /* If we're entering or exiting a region that's implicitly
9243          extern "C", modify the lang context appropriately.  */
9244       if (!parser->implicit_extern_c && token->implicit_extern_c)
9245         {
9246           push_lang_context (lang_name_c);
9247           parser->implicit_extern_c = true;
9248         }
9249       else if (parser->implicit_extern_c && !token->implicit_extern_c)
9250         {
9251           pop_lang_context ();
9252           parser->implicit_extern_c = false;
9253         }
9254
9255       if (token->type == CPP_PRAGMA)
9256         {
9257           /* A top-level declaration can consist solely of a #pragma.
9258              A nested declaration cannot, so this is done here and not
9259              in cp_parser_declaration.  (A #pragma at block scope is
9260              handled in cp_parser_statement.)  */
9261           cp_parser_pragma (parser, pragma_external);
9262           continue;
9263         }
9264
9265       /* Parse the declaration itself.  */
9266       cp_parser_declaration (parser);
9267     }
9268 }
9269
9270 /* Parse a declaration.
9271
9272    declaration:
9273      block-declaration
9274      function-definition
9275      template-declaration
9276      explicit-instantiation
9277      explicit-specialization
9278      linkage-specification
9279      namespace-definition
9280
9281    GNU extension:
9282
9283    declaration:
9284       __extension__ declaration */
9285
9286 static void
9287 cp_parser_declaration (cp_parser* parser)
9288 {
9289   cp_token token1;
9290   cp_token token2;
9291   int saved_pedantic;
9292   void *p;
9293   tree attributes = NULL_TREE;
9294
9295   /* Check for the `__extension__' keyword.  */
9296   if (cp_parser_extension_opt (parser, &saved_pedantic))
9297     {
9298       /* Parse the qualified declaration.  */
9299       cp_parser_declaration (parser);
9300       /* Restore the PEDANTIC flag.  */
9301       pedantic = saved_pedantic;
9302
9303       return;
9304     }
9305
9306   /* Try to figure out what kind of declaration is present.  */
9307   token1 = *cp_lexer_peek_token (parser->lexer);
9308
9309   if (token1.type != CPP_EOF)
9310     token2 = *cp_lexer_peek_nth_token (parser->lexer, 2);
9311   else
9312     {
9313       token2.type = CPP_EOF;
9314       token2.keyword = RID_MAX;
9315     }
9316
9317   /* Get the high-water mark for the DECLARATOR_OBSTACK.  */
9318   p = obstack_alloc (&declarator_obstack, 0);
9319
9320   /* If the next token is `extern' and the following token is a string
9321      literal, then we have a linkage specification.  */
9322   if (token1.keyword == RID_EXTERN
9323       && cp_parser_is_string_literal (&token2))
9324     cp_parser_linkage_specification (parser);
9325   /* If the next token is `template', then we have either a template
9326      declaration, an explicit instantiation, or an explicit
9327      specialization.  */
9328   else if (token1.keyword == RID_TEMPLATE)
9329     {
9330       /* `template <>' indicates a template specialization.  */
9331       if (token2.type == CPP_LESS
9332           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
9333         cp_parser_explicit_specialization (parser);
9334       /* `template <' indicates a template declaration.  */
9335       else if (token2.type == CPP_LESS)
9336         cp_parser_template_declaration (parser, /*member_p=*/false);
9337       /* Anything else must be an explicit instantiation.  */
9338       else
9339         cp_parser_explicit_instantiation (parser);
9340     }
9341   /* If the next token is `export', then we have a template
9342      declaration.  */
9343   else if (token1.keyword == RID_EXPORT)
9344     cp_parser_template_declaration (parser, /*member_p=*/false);
9345   /* If the next token is `extern', 'static' or 'inline' and the one
9346      after that is `template', we have a GNU extended explicit
9347      instantiation directive.  */
9348   else if (cp_parser_allow_gnu_extensions_p (parser)
9349            && (token1.keyword == RID_EXTERN
9350                || token1.keyword == RID_STATIC
9351                || token1.keyword == RID_INLINE)
9352            && token2.keyword == RID_TEMPLATE)
9353     cp_parser_explicit_instantiation (parser);
9354   /* If the next token is `namespace', check for a named or unnamed
9355      namespace definition.  */
9356   else if (token1.keyword == RID_NAMESPACE
9357            && (/* A named namespace definition.  */
9358                (token2.type == CPP_NAME
9359                 && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
9360                     != CPP_EQ))
9361                /* An unnamed namespace definition.  */
9362                || token2.type == CPP_OPEN_BRACE
9363                || token2.keyword == RID_ATTRIBUTE))
9364     cp_parser_namespace_definition (parser);
9365   /* An inline (associated) namespace definition.  */
9366   else if (token1.keyword == RID_INLINE
9367            && token2.keyword == RID_NAMESPACE)
9368     cp_parser_namespace_definition (parser);
9369   /* Objective-C++ declaration/definition.  */
9370   else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
9371     cp_parser_objc_declaration (parser, NULL_TREE);
9372   else if (c_dialect_objc ()
9373            && token1.keyword == RID_ATTRIBUTE
9374            && cp_parser_objc_valid_prefix_attributes (parser, &attributes))
9375     cp_parser_objc_declaration (parser, attributes);
9376   /* We must have either a block declaration or a function
9377      definition.  */
9378   else
9379     /* Try to parse a block-declaration, or a function-definition.  */
9380     cp_parser_block_declaration (parser, /*statement_p=*/false);
9381
9382   /* Free any declarators allocated.  */
9383   obstack_free (&declarator_obstack, p);
9384 }
9385
9386 /* Parse a block-declaration.
9387
9388    block-declaration:
9389      simple-declaration
9390      asm-definition
9391      namespace-alias-definition
9392      using-declaration
9393      using-directive
9394
9395    GNU Extension:
9396
9397    block-declaration:
9398      __extension__ block-declaration
9399
9400    C++0x Extension:
9401
9402    block-declaration:
9403      static_assert-declaration
9404
9405    If STATEMENT_P is TRUE, then this block-declaration is occurring as
9406    part of a declaration-statement.  */
9407
9408 static void
9409 cp_parser_block_declaration (cp_parser *parser,
9410                              bool      statement_p)
9411 {
9412   cp_token *token1;
9413   int saved_pedantic;
9414
9415   /* Check for the `__extension__' keyword.  */
9416   if (cp_parser_extension_opt (parser, &saved_pedantic))
9417     {
9418       /* Parse the qualified declaration.  */
9419       cp_parser_block_declaration (parser, statement_p);
9420       /* Restore the PEDANTIC flag.  */
9421       pedantic = saved_pedantic;
9422
9423       return;
9424     }
9425
9426   /* Peek at the next token to figure out which kind of declaration is
9427      present.  */
9428   token1 = cp_lexer_peek_token (parser->lexer);
9429
9430   /* If the next keyword is `asm', we have an asm-definition.  */
9431   if (token1->keyword == RID_ASM)
9432     {
9433       if (statement_p)
9434         cp_parser_commit_to_tentative_parse (parser);
9435       cp_parser_asm_definition (parser);
9436     }
9437   /* If the next keyword is `namespace', we have a
9438      namespace-alias-definition.  */
9439   else if (token1->keyword == RID_NAMESPACE)
9440     cp_parser_namespace_alias_definition (parser);
9441   /* If the next keyword is `using', we have either a
9442      using-declaration or a using-directive.  */
9443   else if (token1->keyword == RID_USING)
9444     {
9445       cp_token *token2;
9446
9447       if (statement_p)
9448         cp_parser_commit_to_tentative_parse (parser);
9449       /* If the token after `using' is `namespace', then we have a
9450          using-directive.  */
9451       token2 = cp_lexer_peek_nth_token (parser->lexer, 2);
9452       if (token2->keyword == RID_NAMESPACE)
9453         cp_parser_using_directive (parser);
9454       /* Otherwise, it's a using-declaration.  */
9455       else
9456         cp_parser_using_declaration (parser,
9457                                      /*access_declaration_p=*/false);
9458     }
9459   /* If the next keyword is `__label__' we have a misplaced label
9460      declaration.  */
9461   else if (token1->keyword == RID_LABEL)
9462     {
9463       cp_lexer_consume_token (parser->lexer);
9464       error_at (token1->location, "%<__label__%> not at the beginning of a block");
9465       cp_parser_skip_to_end_of_statement (parser);
9466       /* If the next token is now a `;', consume it.  */
9467       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9468         cp_lexer_consume_token (parser->lexer);
9469     }
9470   /* If the next token is `static_assert' we have a static assertion.  */
9471   else if (token1->keyword == RID_STATIC_ASSERT)
9472     cp_parser_static_assert (parser, /*member_p=*/false);
9473   /* Anything else must be a simple-declaration.  */
9474   else
9475     cp_parser_simple_declaration (parser, !statement_p,
9476                                   /*maybe_range_for_decl*/NULL);
9477 }
9478
9479 /* Parse a simple-declaration.
9480
9481    simple-declaration:
9482      decl-specifier-seq [opt] init-declarator-list [opt] ;
9483
9484    init-declarator-list:
9485      init-declarator
9486      init-declarator-list , init-declarator
9487
9488    If FUNCTION_DEFINITION_ALLOWED_P is TRUE, then we also recognize a
9489    function-definition as a simple-declaration.
9490
9491    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
9492    parsed declaration if it is an uninitialized single declarator not followed
9493    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
9494    if present, will not be consumed.  */
9495
9496 static void
9497 cp_parser_simple_declaration (cp_parser* parser,
9498                               bool function_definition_allowed_p,
9499                               tree *maybe_range_for_decl)
9500 {
9501   cp_decl_specifier_seq decl_specifiers;
9502   int declares_class_or_enum;
9503   bool saw_declarator;
9504
9505   if (maybe_range_for_decl)
9506     *maybe_range_for_decl = NULL_TREE;
9507
9508   /* Defer access checks until we know what is being declared; the
9509      checks for names appearing in the decl-specifier-seq should be
9510      done as if we were in the scope of the thing being declared.  */
9511   push_deferring_access_checks (dk_deferred);
9512
9513   /* Parse the decl-specifier-seq.  We have to keep track of whether
9514      or not the decl-specifier-seq declares a named class or
9515      enumeration type, since that is the only case in which the
9516      init-declarator-list is allowed to be empty.
9517
9518      [dcl.dcl]
9519
9520      In a simple-declaration, the optional init-declarator-list can be
9521      omitted only when declaring a class or enumeration, that is when
9522      the decl-specifier-seq contains either a class-specifier, an
9523      elaborated-type-specifier, or an enum-specifier.  */
9524   cp_parser_decl_specifier_seq (parser,
9525                                 CP_PARSER_FLAGS_OPTIONAL,
9526                                 &decl_specifiers,
9527                                 &declares_class_or_enum);
9528   /* We no longer need to defer access checks.  */
9529   stop_deferring_access_checks ();
9530
9531   /* In a block scope, a valid declaration must always have a
9532      decl-specifier-seq.  By not trying to parse declarators, we can
9533      resolve the declaration/expression ambiguity more quickly.  */
9534   if (!function_definition_allowed_p
9535       && !decl_specifiers.any_specifiers_p)
9536     {
9537       cp_parser_error (parser, "expected declaration");
9538       goto done;
9539     }
9540
9541   /* If the next two tokens are both identifiers, the code is
9542      erroneous. The usual cause of this situation is code like:
9543
9544        T t;
9545
9546      where "T" should name a type -- but does not.  */
9547   if (!decl_specifiers.any_type_specifiers_p
9548       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
9549     {
9550       /* If parsing tentatively, we should commit; we really are
9551          looking at a declaration.  */
9552       cp_parser_commit_to_tentative_parse (parser);
9553       /* Give up.  */
9554       goto done;
9555     }
9556
9557   /* If we have seen at least one decl-specifier, and the next token
9558      is not a parenthesis, then we must be looking at a declaration.
9559      (After "int (" we might be looking at a functional cast.)  */
9560   if (decl_specifiers.any_specifiers_p
9561       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN)
9562       && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
9563       && !cp_parser_error_occurred (parser))
9564     cp_parser_commit_to_tentative_parse (parser);
9565
9566   /* Keep going until we hit the `;' at the end of the simple
9567      declaration.  */
9568   saw_declarator = false;
9569   while (cp_lexer_next_token_is_not (parser->lexer,
9570                                      CPP_SEMICOLON))
9571     {
9572       cp_token *token;
9573       bool function_definition_p;
9574       tree decl;
9575
9576       if (saw_declarator)
9577         {
9578           /* If we are processing next declarator, coma is expected */
9579           token = cp_lexer_peek_token (parser->lexer);
9580           gcc_assert (token->type == CPP_COMMA);
9581           cp_lexer_consume_token (parser->lexer);
9582           if (maybe_range_for_decl)
9583             *maybe_range_for_decl = error_mark_node;
9584         }
9585       else
9586         saw_declarator = true;
9587
9588       /* Parse the init-declarator.  */
9589       decl = cp_parser_init_declarator (parser, &decl_specifiers,
9590                                         /*checks=*/NULL,
9591                                         function_definition_allowed_p,
9592                                         /*member_p=*/false,
9593                                         declares_class_or_enum,
9594                                         &function_definition_p,
9595                                         maybe_range_for_decl);
9596       /* If an error occurred while parsing tentatively, exit quickly.
9597          (That usually happens when in the body of a function; each
9598          statement is treated as a declaration-statement until proven
9599          otherwise.)  */
9600       if (cp_parser_error_occurred (parser))
9601         goto done;
9602       /* Handle function definitions specially.  */
9603       if (function_definition_p)
9604         {
9605           /* If the next token is a `,', then we are probably
9606              processing something like:
9607
9608                void f() {}, *p;
9609
9610              which is erroneous.  */
9611           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
9612             {
9613               cp_token *token = cp_lexer_peek_token (parser->lexer);
9614               error_at (token->location,
9615                         "mixing"
9616                         " declarations and function-definitions is forbidden");
9617             }
9618           /* Otherwise, we're done with the list of declarators.  */
9619           else
9620             {
9621               pop_deferring_access_checks ();
9622               return;
9623             }
9624         }
9625       if (maybe_range_for_decl && *maybe_range_for_decl == NULL_TREE)
9626         *maybe_range_for_decl = decl;
9627       /* The next token should be either a `,' or a `;'.  */
9628       token = cp_lexer_peek_token (parser->lexer);
9629       /* If it's a `,', there are more declarators to come.  */
9630       if (token->type == CPP_COMMA)
9631         /* will be consumed next time around */;
9632       /* If it's a `;', we are done.  */
9633       else if (token->type == CPP_SEMICOLON || maybe_range_for_decl)
9634         break;
9635       /* Anything else is an error.  */
9636       else
9637         {
9638           /* If we have already issued an error message we don't need
9639              to issue another one.  */
9640           if (decl != error_mark_node
9641               || cp_parser_uncommitted_to_tentative_parse_p (parser))
9642             cp_parser_error (parser, "expected %<,%> or %<;%>");
9643           /* Skip tokens until we reach the end of the statement.  */
9644           cp_parser_skip_to_end_of_statement (parser);
9645           /* If the next token is now a `;', consume it.  */
9646           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
9647             cp_lexer_consume_token (parser->lexer);
9648           goto done;
9649         }
9650       /* After the first time around, a function-definition is not
9651          allowed -- even if it was OK at first.  For example:
9652
9653            int i, f() {}
9654
9655          is not valid.  */
9656       function_definition_allowed_p = false;
9657     }
9658
9659   /* Issue an error message if no declarators are present, and the
9660      decl-specifier-seq does not itself declare a class or
9661      enumeration.  */
9662   if (!saw_declarator)
9663     {
9664       if (cp_parser_declares_only_class_p (parser))
9665         shadow_tag (&decl_specifiers);
9666       /* Perform any deferred access checks.  */
9667       perform_deferred_access_checks ();
9668     }
9669
9670   /* Consume the `;'.  */
9671   if (!maybe_range_for_decl)
9672       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
9673
9674  done:
9675   pop_deferring_access_checks ();
9676 }
9677
9678 /* Parse a decl-specifier-seq.
9679
9680    decl-specifier-seq:
9681      decl-specifier-seq [opt] decl-specifier
9682
9683    decl-specifier:
9684      storage-class-specifier
9685      type-specifier
9686      function-specifier
9687      friend
9688      typedef
9689
9690    GNU Extension:
9691
9692    decl-specifier:
9693      attributes
9694
9695    Set *DECL_SPECS to a representation of the decl-specifier-seq.
9696
9697    The parser flags FLAGS is used to control type-specifier parsing.
9698
9699    *DECLARES_CLASS_OR_ENUM is set to the bitwise or of the following
9700    flags:
9701
9702      1: one of the decl-specifiers is an elaborated-type-specifier
9703         (i.e., a type declaration)
9704      2: one of the decl-specifiers is an enum-specifier or a
9705         class-specifier (i.e., a type definition)
9706
9707    */
9708
9709 static void
9710 cp_parser_decl_specifier_seq (cp_parser* parser,
9711                               cp_parser_flags flags,
9712                               cp_decl_specifier_seq *decl_specs,
9713                               int* declares_class_or_enum)
9714 {
9715   bool constructor_possible_p = !parser->in_declarator_p;
9716   cp_token *start_token = NULL;
9717
9718   /* Clear DECL_SPECS.  */
9719   clear_decl_specs (decl_specs);
9720
9721   /* Assume no class or enumeration type is declared.  */
9722   *declares_class_or_enum = 0;
9723
9724   /* Keep reading specifiers until there are no more to read.  */
9725   while (true)
9726     {
9727       bool constructor_p;
9728       bool found_decl_spec;
9729       cp_token *token;
9730
9731       /* Peek at the next token.  */
9732       token = cp_lexer_peek_token (parser->lexer);
9733
9734       /* Save the first token of the decl spec list for error
9735          reporting.  */
9736       if (!start_token)
9737         start_token = token;
9738       /* Handle attributes.  */
9739       if (token->keyword == RID_ATTRIBUTE)
9740         {
9741           /* Parse the attributes.  */
9742           decl_specs->attributes
9743             = chainon (decl_specs->attributes,
9744                        cp_parser_attributes_opt (parser));
9745           continue;
9746         }
9747       /* Assume we will find a decl-specifier keyword.  */
9748       found_decl_spec = true;
9749       /* If the next token is an appropriate keyword, we can simply
9750          add it to the list.  */
9751       switch (token->keyword)
9752         {
9753           /* decl-specifier:
9754                friend
9755                constexpr */
9756         case RID_FRIEND:
9757           if (!at_class_scope_p ())
9758             {
9759               error_at (token->location, "%<friend%> used outside of class");
9760               cp_lexer_purge_token (parser->lexer);
9761             }
9762           else
9763             {
9764               ++decl_specs->specs[(int) ds_friend];
9765               /* Consume the token.  */
9766               cp_lexer_consume_token (parser->lexer);
9767             }
9768           break;
9769
9770         case RID_CONSTEXPR:
9771           ++decl_specs->specs[(int) ds_constexpr];
9772           cp_lexer_consume_token (parser->lexer);
9773           break;
9774
9775           /* function-specifier:
9776                inline
9777                virtual
9778                explicit  */
9779         case RID_INLINE:
9780         case RID_VIRTUAL:
9781         case RID_EXPLICIT:
9782           cp_parser_function_specifier_opt (parser, decl_specs);
9783           break;
9784
9785           /* decl-specifier:
9786                typedef  */
9787         case RID_TYPEDEF:
9788           ++decl_specs->specs[(int) ds_typedef];
9789           /* Consume the token.  */
9790           cp_lexer_consume_token (parser->lexer);
9791           /* A constructor declarator cannot appear in a typedef.  */
9792           constructor_possible_p = false;
9793           /* The "typedef" keyword can only occur in a declaration; we
9794              may as well commit at this point.  */
9795           cp_parser_commit_to_tentative_parse (parser);
9796
9797           if (decl_specs->storage_class != sc_none)
9798             decl_specs->conflicting_specifiers_p = true;
9799           break;
9800
9801           /* storage-class-specifier:
9802                auto
9803                register
9804                static
9805                extern
9806                mutable
9807
9808              GNU Extension:
9809                thread  */
9810         case RID_AUTO:
9811           if (cxx_dialect == cxx98) 
9812             {
9813               /* Consume the token.  */
9814               cp_lexer_consume_token (parser->lexer);
9815
9816               /* Complain about `auto' as a storage specifier, if
9817                  we're complaining about C++0x compatibility.  */
9818               warning_at (token->location, OPT_Wc__0x_compat, "%<auto%>"
9819                           " will change meaning in C++0x; please remove it");
9820
9821               /* Set the storage class anyway.  */
9822               cp_parser_set_storage_class (parser, decl_specs, RID_AUTO,
9823                                            token->location);
9824             }
9825           else
9826             /* C++0x auto type-specifier.  */
9827             found_decl_spec = false;
9828           break;
9829
9830         case RID_REGISTER:
9831         case RID_STATIC:
9832         case RID_EXTERN:
9833         case RID_MUTABLE:
9834           /* Consume the token.  */
9835           cp_lexer_consume_token (parser->lexer);
9836           cp_parser_set_storage_class (parser, decl_specs, token->keyword,
9837                                        token->location);
9838           break;
9839         case RID_THREAD:
9840           /* Consume the token.  */
9841           cp_lexer_consume_token (parser->lexer);
9842           ++decl_specs->specs[(int) ds_thread];
9843           break;
9844
9845         default:
9846           /* We did not yet find a decl-specifier yet.  */
9847           found_decl_spec = false;
9848           break;
9849         }
9850
9851       if (found_decl_spec
9852           && (flags & CP_PARSER_FLAGS_ONLY_TYPE_OR_CONSTEXPR)
9853           && token->keyword != RID_CONSTEXPR)
9854         error ("decl-specifier invalid in condition");
9855
9856       /* Constructors are a special case.  The `S' in `S()' is not a
9857          decl-specifier; it is the beginning of the declarator.  */
9858       constructor_p
9859         = (!found_decl_spec
9860            && constructor_possible_p
9861            && (cp_parser_constructor_declarator_p
9862                (parser, decl_specs->specs[(int) ds_friend] != 0)));
9863
9864       /* If we don't have a DECL_SPEC yet, then we must be looking at
9865          a type-specifier.  */
9866       if (!found_decl_spec && !constructor_p)
9867         {
9868           int decl_spec_declares_class_or_enum;
9869           bool is_cv_qualifier;
9870           tree type_spec;
9871
9872           type_spec
9873             = cp_parser_type_specifier (parser, flags,
9874                                         decl_specs,
9875                                         /*is_declaration=*/true,
9876                                         &decl_spec_declares_class_or_enum,
9877                                         &is_cv_qualifier);
9878           *declares_class_or_enum |= decl_spec_declares_class_or_enum;
9879
9880           /* If this type-specifier referenced a user-defined type
9881              (a typedef, class-name, etc.), then we can't allow any
9882              more such type-specifiers henceforth.
9883
9884              [dcl.spec]
9885
9886              The longest sequence of decl-specifiers that could
9887              possibly be a type name is taken as the
9888              decl-specifier-seq of a declaration.  The sequence shall
9889              be self-consistent as described below.
9890
9891              [dcl.type]
9892
9893              As a general rule, at most one type-specifier is allowed
9894              in the complete decl-specifier-seq of a declaration.  The
9895              only exceptions are the following:
9896
9897              -- const or volatile can be combined with any other
9898                 type-specifier.
9899
9900              -- signed or unsigned can be combined with char, long,
9901                 short, or int.
9902
9903              -- ..
9904
9905              Example:
9906
9907                typedef char* Pc;
9908                void g (const int Pc);
9909
9910              Here, Pc is *not* part of the decl-specifier seq; it's
9911              the declarator.  Therefore, once we see a type-specifier
9912              (other than a cv-qualifier), we forbid any additional
9913              user-defined types.  We *do* still allow things like `int
9914              int' to be considered a decl-specifier-seq, and issue the
9915              error message later.  */
9916           if (type_spec && !is_cv_qualifier)
9917             flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
9918           /* A constructor declarator cannot follow a type-specifier.  */
9919           if (type_spec)
9920             {
9921               constructor_possible_p = false;
9922               found_decl_spec = true;
9923               if (!is_cv_qualifier)
9924                 decl_specs->any_type_specifiers_p = true;
9925             }
9926         }
9927
9928       /* If we still do not have a DECL_SPEC, then there are no more
9929          decl-specifiers.  */
9930       if (!found_decl_spec)
9931         break;
9932
9933       decl_specs->any_specifiers_p = true;
9934       /* After we see one decl-specifier, further decl-specifiers are
9935          always optional.  */
9936       flags |= CP_PARSER_FLAGS_OPTIONAL;
9937     }
9938
9939   cp_parser_check_decl_spec (decl_specs, start_token->location);
9940
9941   /* Don't allow a friend specifier with a class definition.  */
9942   if (decl_specs->specs[(int) ds_friend] != 0
9943       && (*declares_class_or_enum & 2))
9944     error_at (start_token->location,
9945               "class definition may not be declared a friend");
9946 }
9947
9948 /* Parse an (optional) storage-class-specifier.
9949
9950    storage-class-specifier:
9951      auto
9952      register
9953      static
9954      extern
9955      mutable
9956
9957    GNU Extension:
9958
9959    storage-class-specifier:
9960      thread
9961
9962    Returns an IDENTIFIER_NODE corresponding to the keyword used.  */
9963
9964 static tree
9965 cp_parser_storage_class_specifier_opt (cp_parser* parser)
9966 {
9967   switch (cp_lexer_peek_token (parser->lexer)->keyword)
9968     {
9969     case RID_AUTO:
9970       if (cxx_dialect != cxx98)
9971         return NULL_TREE;
9972       /* Fall through for C++98.  */
9973
9974     case RID_REGISTER:
9975     case RID_STATIC:
9976     case RID_EXTERN:
9977     case RID_MUTABLE:
9978     case RID_THREAD:
9979       /* Consume the token.  */
9980       return cp_lexer_consume_token (parser->lexer)->u.value;
9981
9982     default:
9983       return NULL_TREE;
9984     }
9985 }
9986
9987 /* Parse an (optional) function-specifier.
9988
9989    function-specifier:
9990      inline
9991      virtual
9992      explicit
9993
9994    Returns an IDENTIFIER_NODE corresponding to the keyword used.
9995    Updates DECL_SPECS, if it is non-NULL.  */
9996
9997 static tree
9998 cp_parser_function_specifier_opt (cp_parser* parser,
9999                                   cp_decl_specifier_seq *decl_specs)
10000 {
10001   cp_token *token = cp_lexer_peek_token (parser->lexer);
10002   switch (token->keyword)
10003     {
10004     case RID_INLINE:
10005       if (decl_specs)
10006         ++decl_specs->specs[(int) ds_inline];
10007       break;
10008
10009     case RID_VIRTUAL:
10010       /* 14.5.2.3 [temp.mem]
10011
10012          A member function template shall not be virtual.  */
10013       if (PROCESSING_REAL_TEMPLATE_DECL_P ())
10014         error_at (token->location, "templates may not be %<virtual%>");
10015       else if (decl_specs)
10016         ++decl_specs->specs[(int) ds_virtual];
10017       break;
10018
10019     case RID_EXPLICIT:
10020       if (decl_specs)
10021         ++decl_specs->specs[(int) ds_explicit];
10022       break;
10023
10024     default:
10025       return NULL_TREE;
10026     }
10027
10028   /* Consume the token.  */
10029   return cp_lexer_consume_token (parser->lexer)->u.value;
10030 }
10031
10032 /* Parse a linkage-specification.
10033
10034    linkage-specification:
10035      extern string-literal { declaration-seq [opt] }
10036      extern string-literal declaration  */
10037
10038 static void
10039 cp_parser_linkage_specification (cp_parser* parser)
10040 {
10041   tree linkage;
10042
10043   /* Look for the `extern' keyword.  */
10044   cp_parser_require_keyword (parser, RID_EXTERN, RT_EXTERN);
10045
10046   /* Look for the string-literal.  */
10047   linkage = cp_parser_string_literal (parser, false, false);
10048
10049   /* Transform the literal into an identifier.  If the literal is a
10050      wide-character string, or contains embedded NULs, then we can't
10051      handle it as the user wants.  */
10052   if (strlen (TREE_STRING_POINTER (linkage))
10053       != (size_t) (TREE_STRING_LENGTH (linkage) - 1))
10054     {
10055       cp_parser_error (parser, "invalid linkage-specification");
10056       /* Assume C++ linkage.  */
10057       linkage = lang_name_cplusplus;
10058     }
10059   else
10060     linkage = get_identifier (TREE_STRING_POINTER (linkage));
10061
10062   /* We're now using the new linkage.  */
10063   push_lang_context (linkage);
10064
10065   /* If the next token is a `{', then we're using the first
10066      production.  */
10067   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10068     {
10069       /* Consume the `{' token.  */
10070       cp_lexer_consume_token (parser->lexer);
10071       /* Parse the declarations.  */
10072       cp_parser_declaration_seq_opt (parser);
10073       /* Look for the closing `}'.  */
10074       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
10075     }
10076   /* Otherwise, there's just one declaration.  */
10077   else
10078     {
10079       bool saved_in_unbraced_linkage_specification_p;
10080
10081       saved_in_unbraced_linkage_specification_p
10082         = parser->in_unbraced_linkage_specification_p;
10083       parser->in_unbraced_linkage_specification_p = true;
10084       cp_parser_declaration (parser);
10085       parser->in_unbraced_linkage_specification_p
10086         = saved_in_unbraced_linkage_specification_p;
10087     }
10088
10089   /* We're done with the linkage-specification.  */
10090   pop_lang_context ();
10091 }
10092
10093 /* Parse a static_assert-declaration.
10094
10095    static_assert-declaration:
10096      static_assert ( constant-expression , string-literal ) ; 
10097
10098    If MEMBER_P, this static_assert is a class member.  */
10099
10100 static void 
10101 cp_parser_static_assert(cp_parser *parser, bool member_p)
10102 {
10103   tree condition;
10104   tree message;
10105   cp_token *token;
10106   location_t saved_loc;
10107   bool dummy;
10108
10109   /* Peek at the `static_assert' token so we can keep track of exactly
10110      where the static assertion started.  */
10111   token = cp_lexer_peek_token (parser->lexer);
10112   saved_loc = token->location;
10113
10114   /* Look for the `static_assert' keyword.  */
10115   if (!cp_parser_require_keyword (parser, RID_STATIC_ASSERT, 
10116                                   RT_STATIC_ASSERT))
10117     return;
10118
10119   /*  We know we are in a static assertion; commit to any tentative
10120       parse.  */
10121   if (cp_parser_parsing_tentatively (parser))
10122     cp_parser_commit_to_tentative_parse (parser);
10123
10124   /* Parse the `(' starting the static assertion condition.  */
10125   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
10126
10127   /* Parse the constant-expression.  Allow a non-constant expression
10128      here in order to give better diagnostics in finish_static_assert.  */
10129   condition = 
10130     cp_parser_constant_expression (parser,
10131                                    /*allow_non_constant_p=*/true,
10132                                    /*non_constant_p=*/&dummy);
10133
10134   /* Parse the separating `,'.  */
10135   cp_parser_require (parser, CPP_COMMA, RT_COMMA);
10136
10137   /* Parse the string-literal message.  */
10138   message = cp_parser_string_literal (parser, 
10139                                       /*translate=*/false,
10140                                       /*wide_ok=*/true);
10141
10142   /* A `)' completes the static assertion.  */
10143   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10144     cp_parser_skip_to_closing_parenthesis (parser, 
10145                                            /*recovering=*/true, 
10146                                            /*or_comma=*/false,
10147                                            /*consume_paren=*/true);
10148
10149   /* A semicolon terminates the declaration.  */
10150   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
10151
10152   /* Complete the static assertion, which may mean either processing 
10153      the static assert now or saving it for template instantiation.  */
10154   finish_static_assert (condition, message, saved_loc, member_p);
10155 }
10156
10157 /* Parse a `decltype' type. Returns the type. 
10158
10159    simple-type-specifier:
10160      decltype ( expression )  */
10161
10162 static tree
10163 cp_parser_decltype (cp_parser *parser)
10164 {
10165   tree expr;
10166   bool id_expression_or_member_access_p = false;
10167   const char *saved_message;
10168   bool saved_integral_constant_expression_p;
10169   bool saved_non_integral_constant_expression_p;
10170   cp_token *id_expr_start_token;
10171
10172   /* Look for the `decltype' token.  */
10173   if (!cp_parser_require_keyword (parser, RID_DECLTYPE, RT_DECLTYPE))
10174     return error_mark_node;
10175
10176   /* Types cannot be defined in a `decltype' expression.  Save away the
10177      old message.  */
10178   saved_message = parser->type_definition_forbidden_message;
10179
10180   /* And create the new one.  */
10181   parser->type_definition_forbidden_message
10182     = G_("types may not be defined in %<decltype%> expressions");
10183
10184   /* The restrictions on constant-expressions do not apply inside
10185      decltype expressions.  */
10186   saved_integral_constant_expression_p
10187     = parser->integral_constant_expression_p;
10188   saved_non_integral_constant_expression_p
10189     = parser->non_integral_constant_expression_p;
10190   parser->integral_constant_expression_p = false;
10191
10192   /* Do not actually evaluate the expression.  */
10193   ++cp_unevaluated_operand;
10194
10195   /* Do not warn about problems with the expression.  */
10196   ++c_inhibit_evaluation_warnings;
10197
10198   /* Parse the opening `('.  */
10199   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
10200     return error_mark_node;
10201   
10202   /* First, try parsing an id-expression.  */
10203   id_expr_start_token = cp_lexer_peek_token (parser->lexer);
10204   cp_parser_parse_tentatively (parser);
10205   expr = cp_parser_id_expression (parser,
10206                                   /*template_keyword_p=*/false,
10207                                   /*check_dependency_p=*/true,
10208                                   /*template_p=*/NULL,
10209                                   /*declarator_p=*/false,
10210                                   /*optional_p=*/false);
10211
10212   if (!cp_parser_error_occurred (parser) && expr != error_mark_node)
10213     {
10214       bool non_integral_constant_expression_p = false;
10215       tree id_expression = expr;
10216       cp_id_kind idk;
10217       const char *error_msg;
10218
10219       if (TREE_CODE (expr) == IDENTIFIER_NODE)
10220         /* Lookup the name we got back from the id-expression.  */
10221         expr = cp_parser_lookup_name (parser, expr,
10222                                       none_type,
10223                                       /*is_template=*/false,
10224                                       /*is_namespace=*/false,
10225                                       /*check_dependency=*/true,
10226                                       /*ambiguous_decls=*/NULL,
10227                                       id_expr_start_token->location);
10228
10229       if (expr
10230           && expr != error_mark_node
10231           && TREE_CODE (expr) != TEMPLATE_ID_EXPR
10232           && TREE_CODE (expr) != TYPE_DECL
10233           && (TREE_CODE (expr) != BIT_NOT_EXPR
10234               || !TYPE_P (TREE_OPERAND (expr, 0)))
10235           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10236         {
10237           /* Complete lookup of the id-expression.  */
10238           expr = (finish_id_expression
10239                   (id_expression, expr, parser->scope, &idk,
10240                    /*integral_constant_expression_p=*/false,
10241                    /*allow_non_integral_constant_expression_p=*/true,
10242                    &non_integral_constant_expression_p,
10243                    /*template_p=*/false,
10244                    /*done=*/true,
10245                    /*address_p=*/false,
10246                    /*template_arg_p=*/false,
10247                    &error_msg,
10248                    id_expr_start_token->location));
10249
10250           if (expr == error_mark_node)
10251             /* We found an id-expression, but it was something that we
10252                should not have found. This is an error, not something
10253                we can recover from, so note that we found an
10254                id-expression and we'll recover as gracefully as
10255                possible.  */
10256             id_expression_or_member_access_p = true;
10257         }
10258
10259       if (expr 
10260           && expr != error_mark_node
10261           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10262         /* We have an id-expression.  */
10263         id_expression_or_member_access_p = true;
10264     }
10265
10266   if (!id_expression_or_member_access_p)
10267     {
10268       /* Abort the id-expression parse.  */
10269       cp_parser_abort_tentative_parse (parser);
10270
10271       /* Parsing tentatively, again.  */
10272       cp_parser_parse_tentatively (parser);
10273
10274       /* Parse a class member access.  */
10275       expr = cp_parser_postfix_expression (parser, /*address_p=*/false,
10276                                            /*cast_p=*/false,
10277                                            /*member_access_only_p=*/true, NULL);
10278
10279       if (expr 
10280           && expr != error_mark_node
10281           && cp_lexer_peek_token (parser->lexer)->type == CPP_CLOSE_PAREN)
10282         /* We have an id-expression.  */
10283         id_expression_or_member_access_p = true;
10284     }
10285
10286   if (id_expression_or_member_access_p)
10287     /* We have parsed the complete id-expression or member access.  */
10288     cp_parser_parse_definitely (parser);
10289   else
10290     {
10291       bool saved_greater_than_is_operator_p;
10292
10293       /* Abort our attempt to parse an id-expression or member access
10294          expression.  */
10295       cp_parser_abort_tentative_parse (parser);
10296
10297       /* Within a parenthesized expression, a `>' token is always
10298          the greater-than operator.  */
10299       saved_greater_than_is_operator_p
10300         = parser->greater_than_is_operator_p;
10301       parser->greater_than_is_operator_p = true;
10302
10303       /* Parse a full expression.  */
10304       expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
10305
10306       /* The `>' token might be the end of a template-id or
10307          template-parameter-list now.  */
10308       parser->greater_than_is_operator_p
10309         = saved_greater_than_is_operator_p;
10310     }
10311
10312   /* Go back to evaluating expressions.  */
10313   --cp_unevaluated_operand;
10314   --c_inhibit_evaluation_warnings;
10315
10316   /* Restore the old message and the integral constant expression
10317      flags.  */
10318   parser->type_definition_forbidden_message = saved_message;
10319   parser->integral_constant_expression_p
10320     = saved_integral_constant_expression_p;
10321   parser->non_integral_constant_expression_p
10322     = saved_non_integral_constant_expression_p;
10323
10324   if (expr == error_mark_node)
10325     {
10326       /* Skip everything up to the closing `)'.  */
10327       cp_parser_skip_to_closing_parenthesis (parser, true, false,
10328                                              /*consume_paren=*/true);
10329       return error_mark_node;
10330     }
10331   
10332   /* Parse to the closing `)'.  */
10333   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
10334     {
10335       cp_parser_skip_to_closing_parenthesis (parser, true, false,
10336                                              /*consume_paren=*/true);
10337       return error_mark_node;
10338     }
10339
10340   return finish_decltype_type (expr, id_expression_or_member_access_p,
10341                                tf_warning_or_error);
10342 }
10343
10344 /* Special member functions [gram.special] */
10345
10346 /* Parse a conversion-function-id.
10347
10348    conversion-function-id:
10349      operator conversion-type-id
10350
10351    Returns an IDENTIFIER_NODE representing the operator.  */
10352
10353 static tree
10354 cp_parser_conversion_function_id (cp_parser* parser)
10355 {
10356   tree type;
10357   tree saved_scope;
10358   tree saved_qualifying_scope;
10359   tree saved_object_scope;
10360   tree pushed_scope = NULL_TREE;
10361
10362   /* Look for the `operator' token.  */
10363   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10364     return error_mark_node;
10365   /* When we parse the conversion-type-id, the current scope will be
10366      reset.  However, we need that information in able to look up the
10367      conversion function later, so we save it here.  */
10368   saved_scope = parser->scope;
10369   saved_qualifying_scope = parser->qualifying_scope;
10370   saved_object_scope = parser->object_scope;
10371   /* We must enter the scope of the class so that the names of
10372      entities declared within the class are available in the
10373      conversion-type-id.  For example, consider:
10374
10375        struct S {
10376          typedef int I;
10377          operator I();
10378        };
10379
10380        S::operator I() { ... }
10381
10382      In order to see that `I' is a type-name in the definition, we
10383      must be in the scope of `S'.  */
10384   if (saved_scope)
10385     pushed_scope = push_scope (saved_scope);
10386   /* Parse the conversion-type-id.  */
10387   type = cp_parser_conversion_type_id (parser);
10388   /* Leave the scope of the class, if any.  */
10389   if (pushed_scope)
10390     pop_scope (pushed_scope);
10391   /* Restore the saved scope.  */
10392   parser->scope = saved_scope;
10393   parser->qualifying_scope = saved_qualifying_scope;
10394   parser->object_scope = saved_object_scope;
10395   /* If the TYPE is invalid, indicate failure.  */
10396   if (type == error_mark_node)
10397     return error_mark_node;
10398   return mangle_conv_op_name_for_type (type);
10399 }
10400
10401 /* Parse a conversion-type-id:
10402
10403    conversion-type-id:
10404      type-specifier-seq conversion-declarator [opt]
10405
10406    Returns the TYPE specified.  */
10407
10408 static tree
10409 cp_parser_conversion_type_id (cp_parser* parser)
10410 {
10411   tree attributes;
10412   cp_decl_specifier_seq type_specifiers;
10413   cp_declarator *declarator;
10414   tree type_specified;
10415
10416   /* Parse the attributes.  */
10417   attributes = cp_parser_attributes_opt (parser);
10418   /* Parse the type-specifiers.  */
10419   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
10420                                 /*is_trailing_return=*/false,
10421                                 &type_specifiers);
10422   /* If that didn't work, stop.  */
10423   if (type_specifiers.type == error_mark_node)
10424     return error_mark_node;
10425   /* Parse the conversion-declarator.  */
10426   declarator = cp_parser_conversion_declarator_opt (parser);
10427
10428   type_specified =  grokdeclarator (declarator, &type_specifiers, TYPENAME,
10429                                     /*initialized=*/0, &attributes);
10430   if (attributes)
10431     cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
10432
10433   /* Don't give this error when parsing tentatively.  This happens to
10434      work because we always parse this definitively once.  */
10435   if (! cp_parser_uncommitted_to_tentative_parse_p (parser)
10436       && type_uses_auto (type_specified))
10437     {
10438       error ("invalid use of %<auto%> in conversion operator");
10439       return error_mark_node;
10440     }
10441
10442   return type_specified;
10443 }
10444
10445 /* Parse an (optional) conversion-declarator.
10446
10447    conversion-declarator:
10448      ptr-operator conversion-declarator [opt]
10449
10450    */
10451
10452 static cp_declarator *
10453 cp_parser_conversion_declarator_opt (cp_parser* parser)
10454 {
10455   enum tree_code code;
10456   tree class_type;
10457   cp_cv_quals cv_quals;
10458
10459   /* We don't know if there's a ptr-operator next, or not.  */
10460   cp_parser_parse_tentatively (parser);
10461   /* Try the ptr-operator.  */
10462   code = cp_parser_ptr_operator (parser, &class_type, &cv_quals);
10463   /* If it worked, look for more conversion-declarators.  */
10464   if (cp_parser_parse_definitely (parser))
10465     {
10466       cp_declarator *declarator;
10467
10468       /* Parse another optional declarator.  */
10469       declarator = cp_parser_conversion_declarator_opt (parser);
10470
10471       return cp_parser_make_indirect_declarator
10472         (code, class_type, cv_quals, declarator);
10473    }
10474
10475   return NULL;
10476 }
10477
10478 /* Parse an (optional) ctor-initializer.
10479
10480    ctor-initializer:
10481      : mem-initializer-list
10482
10483    Returns TRUE iff the ctor-initializer was actually present.  */
10484
10485 static bool
10486 cp_parser_ctor_initializer_opt (cp_parser* parser)
10487 {
10488   /* If the next token is not a `:', then there is no
10489      ctor-initializer.  */
10490   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
10491     {
10492       /* Do default initialization of any bases and members.  */
10493       if (DECL_CONSTRUCTOR_P (current_function_decl))
10494         finish_mem_initializers (NULL_TREE);
10495
10496       return false;
10497     }
10498
10499   /* Consume the `:' token.  */
10500   cp_lexer_consume_token (parser->lexer);
10501   /* And the mem-initializer-list.  */
10502   cp_parser_mem_initializer_list (parser);
10503
10504   return true;
10505 }
10506
10507 /* Parse a mem-initializer-list.
10508
10509    mem-initializer-list:
10510      mem-initializer ... [opt]
10511      mem-initializer ... [opt] , mem-initializer-list  */
10512
10513 static void
10514 cp_parser_mem_initializer_list (cp_parser* parser)
10515 {
10516   tree mem_initializer_list = NULL_TREE;
10517   cp_token *token = cp_lexer_peek_token (parser->lexer);
10518
10519   /* Let the semantic analysis code know that we are starting the
10520      mem-initializer-list.  */
10521   if (!DECL_CONSTRUCTOR_P (current_function_decl))
10522     error_at (token->location,
10523               "only constructors take member initializers");
10524
10525   /* Loop through the list.  */
10526   while (true)
10527     {
10528       tree mem_initializer;
10529
10530       token = cp_lexer_peek_token (parser->lexer);
10531       /* Parse the mem-initializer.  */
10532       mem_initializer = cp_parser_mem_initializer (parser);
10533       /* If the next token is a `...', we're expanding member initializers. */
10534       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
10535         {
10536           /* Consume the `...'. */
10537           cp_lexer_consume_token (parser->lexer);
10538
10539           /* The TREE_PURPOSE must be a _TYPE, because base-specifiers
10540              can be expanded but members cannot. */
10541           if (mem_initializer != error_mark_node
10542               && !TYPE_P (TREE_PURPOSE (mem_initializer)))
10543             {
10544               error_at (token->location,
10545                         "cannot expand initializer for member %<%D%>",
10546                         TREE_PURPOSE (mem_initializer));
10547               mem_initializer = error_mark_node;
10548             }
10549
10550           /* Construct the pack expansion type. */
10551           if (mem_initializer != error_mark_node)
10552             mem_initializer = make_pack_expansion (mem_initializer);
10553         }
10554       /* Add it to the list, unless it was erroneous.  */
10555       if (mem_initializer != error_mark_node)
10556         {
10557           TREE_CHAIN (mem_initializer) = mem_initializer_list;
10558           mem_initializer_list = mem_initializer;
10559         }
10560       /* If the next token is not a `,', we're done.  */
10561       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
10562         break;
10563       /* Consume the `,' token.  */
10564       cp_lexer_consume_token (parser->lexer);
10565     }
10566
10567   /* Perform semantic analysis.  */
10568   if (DECL_CONSTRUCTOR_P (current_function_decl))
10569     finish_mem_initializers (mem_initializer_list);
10570 }
10571
10572 /* Parse a mem-initializer.
10573
10574    mem-initializer:
10575      mem-initializer-id ( expression-list [opt] )
10576      mem-initializer-id braced-init-list
10577
10578    GNU extension:
10579
10580    mem-initializer:
10581      ( expression-list [opt] )
10582
10583    Returns a TREE_LIST.  The TREE_PURPOSE is the TYPE (for a base
10584    class) or FIELD_DECL (for a non-static data member) to initialize;
10585    the TREE_VALUE is the expression-list.  An empty initialization
10586    list is represented by void_list_node.  */
10587
10588 static tree
10589 cp_parser_mem_initializer (cp_parser* parser)
10590 {
10591   tree mem_initializer_id;
10592   tree expression_list;
10593   tree member;
10594   cp_token *token = cp_lexer_peek_token (parser->lexer);
10595
10596   /* Find out what is being initialized.  */
10597   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
10598     {
10599       permerror (token->location,
10600                  "anachronistic old-style base class initializer");
10601       mem_initializer_id = NULL_TREE;
10602     }
10603   else
10604     {
10605       mem_initializer_id = cp_parser_mem_initializer_id (parser);
10606       if (mem_initializer_id == error_mark_node)
10607         return mem_initializer_id;
10608     }
10609   member = expand_member_init (mem_initializer_id);
10610   if (member && !DECL_P (member))
10611     in_base_initializer = 1;
10612
10613   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
10614     {
10615       bool expr_non_constant_p;
10616       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
10617       expression_list = cp_parser_braced_list (parser, &expr_non_constant_p);
10618       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
10619       expression_list = build_tree_list (NULL_TREE, expression_list);
10620     }
10621   else
10622     {
10623       VEC(tree,gc)* vec;
10624       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
10625                                                      /*cast_p=*/false,
10626                                                      /*allow_expansion_p=*/true,
10627                                                      /*non_constant_p=*/NULL);
10628       if (vec == NULL)
10629         return error_mark_node;
10630       expression_list = build_tree_list_vec (vec);
10631       release_tree_vector (vec);
10632     }
10633
10634   if (expression_list == error_mark_node)
10635     return error_mark_node;
10636   if (!expression_list)
10637     expression_list = void_type_node;
10638
10639   in_base_initializer = 0;
10640
10641   return member ? build_tree_list (member, expression_list) : error_mark_node;
10642 }
10643
10644 /* Parse a mem-initializer-id.
10645
10646    mem-initializer-id:
10647      :: [opt] nested-name-specifier [opt] class-name
10648      identifier
10649
10650    Returns a TYPE indicating the class to be initializer for the first
10651    production.  Returns an IDENTIFIER_NODE indicating the data member
10652    to be initialized for the second production.  */
10653
10654 static tree
10655 cp_parser_mem_initializer_id (cp_parser* parser)
10656 {
10657   bool global_scope_p;
10658   bool nested_name_specifier_p;
10659   bool template_p = false;
10660   tree id;
10661
10662   cp_token *token = cp_lexer_peek_token (parser->lexer);
10663
10664   /* `typename' is not allowed in this context ([temp.res]).  */
10665   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
10666     {
10667       error_at (token->location, 
10668                 "keyword %<typename%> not allowed in this context (a qualified "
10669                 "member initializer is implicitly a type)");
10670       cp_lexer_consume_token (parser->lexer);
10671     }
10672   /* Look for the optional `::' operator.  */
10673   global_scope_p
10674     = (cp_parser_global_scope_opt (parser,
10675                                    /*current_scope_valid_p=*/false)
10676        != NULL_TREE);
10677   /* Look for the optional nested-name-specifier.  The simplest way to
10678      implement:
10679
10680        [temp.res]
10681
10682        The keyword `typename' is not permitted in a base-specifier or
10683        mem-initializer; in these contexts a qualified name that
10684        depends on a template-parameter is implicitly assumed to be a
10685        type name.
10686
10687      is to assume that we have seen the `typename' keyword at this
10688      point.  */
10689   nested_name_specifier_p
10690     = (cp_parser_nested_name_specifier_opt (parser,
10691                                             /*typename_keyword_p=*/true,
10692                                             /*check_dependency_p=*/true,
10693                                             /*type_p=*/true,
10694                                             /*is_declaration=*/true)
10695        != NULL_TREE);
10696   if (nested_name_specifier_p)
10697     template_p = cp_parser_optional_template_keyword (parser);
10698   /* If there is a `::' operator or a nested-name-specifier, then we
10699      are definitely looking for a class-name.  */
10700   if (global_scope_p || nested_name_specifier_p)
10701     return cp_parser_class_name (parser,
10702                                  /*typename_keyword_p=*/true,
10703                                  /*template_keyword_p=*/template_p,
10704                                  typename_type,
10705                                  /*check_dependency_p=*/true,
10706                                  /*class_head_p=*/false,
10707                                  /*is_declaration=*/true);
10708   /* Otherwise, we could also be looking for an ordinary identifier.  */
10709   cp_parser_parse_tentatively (parser);
10710   /* Try a class-name.  */
10711   id = cp_parser_class_name (parser,
10712                              /*typename_keyword_p=*/true,
10713                              /*template_keyword_p=*/false,
10714                              none_type,
10715                              /*check_dependency_p=*/true,
10716                              /*class_head_p=*/false,
10717                              /*is_declaration=*/true);
10718   /* If we found one, we're done.  */
10719   if (cp_parser_parse_definitely (parser))
10720     return id;
10721   /* Otherwise, look for an ordinary identifier.  */
10722   return cp_parser_identifier (parser);
10723 }
10724
10725 /* Overloading [gram.over] */
10726
10727 /* Parse an operator-function-id.
10728
10729    operator-function-id:
10730      operator operator
10731
10732    Returns an IDENTIFIER_NODE for the operator which is a
10733    human-readable spelling of the identifier, e.g., `operator +'.  */
10734
10735 static tree
10736 cp_parser_operator_function_id (cp_parser* parser)
10737 {
10738   /* Look for the `operator' keyword.  */
10739   if (!cp_parser_require_keyword (parser, RID_OPERATOR, RT_OPERATOR))
10740     return error_mark_node;
10741   /* And then the name of the operator itself.  */
10742   return cp_parser_operator (parser);
10743 }
10744
10745 /* Parse an operator.
10746
10747    operator:
10748      new delete new[] delete[] + - * / % ^ & | ~ ! = < >
10749      += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= &&
10750      || ++ -- , ->* -> () []
10751
10752    GNU Extensions:
10753
10754    operator:
10755      <? >? <?= >?=
10756
10757    Returns an IDENTIFIER_NODE for the operator which is a
10758    human-readable spelling of the identifier, e.g., `operator +'.  */
10759
10760 static tree
10761 cp_parser_operator (cp_parser* parser)
10762 {
10763   tree id = NULL_TREE;
10764   cp_token *token;
10765
10766   /* Peek at the next token.  */
10767   token = cp_lexer_peek_token (parser->lexer);
10768   /* Figure out which operator we have.  */
10769   switch (token->type)
10770     {
10771     case CPP_KEYWORD:
10772       {
10773         enum tree_code op;
10774
10775         /* The keyword should be either `new' or `delete'.  */
10776         if (token->keyword == RID_NEW)
10777           op = NEW_EXPR;
10778         else if (token->keyword == RID_DELETE)
10779           op = DELETE_EXPR;
10780         else
10781           break;
10782
10783         /* Consume the `new' or `delete' token.  */
10784         cp_lexer_consume_token (parser->lexer);
10785
10786         /* Peek at the next token.  */
10787         token = cp_lexer_peek_token (parser->lexer);
10788         /* If it's a `[' token then this is the array variant of the
10789            operator.  */
10790         if (token->type == CPP_OPEN_SQUARE)
10791           {
10792             /* Consume the `[' token.  */
10793             cp_lexer_consume_token (parser->lexer);
10794             /* Look for the `]' token.  */
10795             cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10796             id = ansi_opname (op == NEW_EXPR
10797                               ? VEC_NEW_EXPR : VEC_DELETE_EXPR);
10798           }
10799         /* Otherwise, we have the non-array variant.  */
10800         else
10801           id = ansi_opname (op);
10802
10803         return id;
10804       }
10805
10806     case CPP_PLUS:
10807       id = ansi_opname (PLUS_EXPR);
10808       break;
10809
10810     case CPP_MINUS:
10811       id = ansi_opname (MINUS_EXPR);
10812       break;
10813
10814     case CPP_MULT:
10815       id = ansi_opname (MULT_EXPR);
10816       break;
10817
10818     case CPP_DIV:
10819       id = ansi_opname (TRUNC_DIV_EXPR);
10820       break;
10821
10822     case CPP_MOD:
10823       id = ansi_opname (TRUNC_MOD_EXPR);
10824       break;
10825
10826     case CPP_XOR:
10827       id = ansi_opname (BIT_XOR_EXPR);
10828       break;
10829
10830     case CPP_AND:
10831       id = ansi_opname (BIT_AND_EXPR);
10832       break;
10833
10834     case CPP_OR:
10835       id = ansi_opname (BIT_IOR_EXPR);
10836       break;
10837
10838     case CPP_COMPL:
10839       id = ansi_opname (BIT_NOT_EXPR);
10840       break;
10841
10842     case CPP_NOT:
10843       id = ansi_opname (TRUTH_NOT_EXPR);
10844       break;
10845
10846     case CPP_EQ:
10847       id = ansi_assopname (NOP_EXPR);
10848       break;
10849
10850     case CPP_LESS:
10851       id = ansi_opname (LT_EXPR);
10852       break;
10853
10854     case CPP_GREATER:
10855       id = ansi_opname (GT_EXPR);
10856       break;
10857
10858     case CPP_PLUS_EQ:
10859       id = ansi_assopname (PLUS_EXPR);
10860       break;
10861
10862     case CPP_MINUS_EQ:
10863       id = ansi_assopname (MINUS_EXPR);
10864       break;
10865
10866     case CPP_MULT_EQ:
10867       id = ansi_assopname (MULT_EXPR);
10868       break;
10869
10870     case CPP_DIV_EQ:
10871       id = ansi_assopname (TRUNC_DIV_EXPR);
10872       break;
10873
10874     case CPP_MOD_EQ:
10875       id = ansi_assopname (TRUNC_MOD_EXPR);
10876       break;
10877
10878     case CPP_XOR_EQ:
10879       id = ansi_assopname (BIT_XOR_EXPR);
10880       break;
10881
10882     case CPP_AND_EQ:
10883       id = ansi_assopname (BIT_AND_EXPR);
10884       break;
10885
10886     case CPP_OR_EQ:
10887       id = ansi_assopname (BIT_IOR_EXPR);
10888       break;
10889
10890     case CPP_LSHIFT:
10891       id = ansi_opname (LSHIFT_EXPR);
10892       break;
10893
10894     case CPP_RSHIFT:
10895       id = ansi_opname (RSHIFT_EXPR);
10896       break;
10897
10898     case CPP_LSHIFT_EQ:
10899       id = ansi_assopname (LSHIFT_EXPR);
10900       break;
10901
10902     case CPP_RSHIFT_EQ:
10903       id = ansi_assopname (RSHIFT_EXPR);
10904       break;
10905
10906     case CPP_EQ_EQ:
10907       id = ansi_opname (EQ_EXPR);
10908       break;
10909
10910     case CPP_NOT_EQ:
10911       id = ansi_opname (NE_EXPR);
10912       break;
10913
10914     case CPP_LESS_EQ:
10915       id = ansi_opname (LE_EXPR);
10916       break;
10917
10918     case CPP_GREATER_EQ:
10919       id = ansi_opname (GE_EXPR);
10920       break;
10921
10922     case CPP_AND_AND:
10923       id = ansi_opname (TRUTH_ANDIF_EXPR);
10924       break;
10925
10926     case CPP_OR_OR:
10927       id = ansi_opname (TRUTH_ORIF_EXPR);
10928       break;
10929
10930     case CPP_PLUS_PLUS:
10931       id = ansi_opname (POSTINCREMENT_EXPR);
10932       break;
10933
10934     case CPP_MINUS_MINUS:
10935       id = ansi_opname (PREDECREMENT_EXPR);
10936       break;
10937
10938     case CPP_COMMA:
10939       id = ansi_opname (COMPOUND_EXPR);
10940       break;
10941
10942     case CPP_DEREF_STAR:
10943       id = ansi_opname (MEMBER_REF);
10944       break;
10945
10946     case CPP_DEREF:
10947       id = ansi_opname (COMPONENT_REF);
10948       break;
10949
10950     case CPP_OPEN_PAREN:
10951       /* Consume the `('.  */
10952       cp_lexer_consume_token (parser->lexer);
10953       /* Look for the matching `)'.  */
10954       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
10955       return ansi_opname (CALL_EXPR);
10956
10957     case CPP_OPEN_SQUARE:
10958       /* Consume the `['.  */
10959       cp_lexer_consume_token (parser->lexer);
10960       /* Look for the matching `]'.  */
10961       cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
10962       return ansi_opname (ARRAY_REF);
10963
10964     default:
10965       /* Anything else is an error.  */
10966       break;
10967     }
10968
10969   /* If we have selected an identifier, we need to consume the
10970      operator token.  */
10971   if (id)
10972     cp_lexer_consume_token (parser->lexer);
10973   /* Otherwise, no valid operator name was present.  */
10974   else
10975     {
10976       cp_parser_error (parser, "expected operator");
10977       id = error_mark_node;
10978     }
10979
10980   return id;
10981 }
10982
10983 /* Parse a template-declaration.
10984
10985    template-declaration:
10986      export [opt] template < template-parameter-list > declaration
10987
10988    If MEMBER_P is TRUE, this template-declaration occurs within a
10989    class-specifier.
10990
10991    The grammar rule given by the standard isn't correct.  What
10992    is really meant is:
10993
10994    template-declaration:
10995      export [opt] template-parameter-list-seq
10996        decl-specifier-seq [opt] init-declarator [opt] ;
10997      export [opt] template-parameter-list-seq
10998        function-definition
10999
11000    template-parameter-list-seq:
11001      template-parameter-list-seq [opt]
11002      template < template-parameter-list >  */
11003
11004 static void
11005 cp_parser_template_declaration (cp_parser* parser, bool member_p)
11006 {
11007   /* Check for `export'.  */
11008   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXPORT))
11009     {
11010       /* Consume the `export' token.  */
11011       cp_lexer_consume_token (parser->lexer);
11012       /* Warn that we do not support `export'.  */
11013       warning (0, "keyword %<export%> not implemented, and will be ignored");
11014     }
11015
11016   cp_parser_template_declaration_after_export (parser, member_p);
11017 }
11018
11019 /* Parse a template-parameter-list.
11020
11021    template-parameter-list:
11022      template-parameter
11023      template-parameter-list , template-parameter
11024
11025    Returns a TREE_LIST.  Each node represents a template parameter.
11026    The nodes are connected via their TREE_CHAINs.  */
11027
11028 static tree
11029 cp_parser_template_parameter_list (cp_parser* parser)
11030 {
11031   tree parameter_list = NULL_TREE;
11032
11033   begin_template_parm_list ();
11034
11035   /* The loop below parses the template parms.  We first need to know
11036      the total number of template parms to be able to compute proper
11037      canonical types of each dependent type. So after the loop, when
11038      we know the total number of template parms,
11039      end_template_parm_list computes the proper canonical types and
11040      fixes up the dependent types accordingly.  */
11041   while (true)
11042     {
11043       tree parameter;
11044       bool is_non_type;
11045       bool is_parameter_pack;
11046       location_t parm_loc;
11047
11048       /* Parse the template-parameter.  */
11049       parm_loc = cp_lexer_peek_token (parser->lexer)->location;
11050       parameter = cp_parser_template_parameter (parser, 
11051                                                 &is_non_type,
11052                                                 &is_parameter_pack);
11053       /* Add it to the list.  */
11054       if (parameter != error_mark_node)
11055         parameter_list = process_template_parm (parameter_list,
11056                                                 parm_loc,
11057                                                 parameter,
11058                                                 is_non_type,
11059                                                 is_parameter_pack,
11060                                                 0);
11061       else
11062        {
11063          tree err_parm = build_tree_list (parameter, parameter);
11064          parameter_list = chainon (parameter_list, err_parm);
11065        }
11066
11067       /* If the next token is not a `,', we're done.  */
11068       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11069         break;
11070       /* Otherwise, consume the `,' token.  */
11071       cp_lexer_consume_token (parser->lexer);
11072     }
11073
11074   return end_template_parm_list (parameter_list);
11075 }
11076
11077 /* Parse a template-parameter.
11078
11079    template-parameter:
11080      type-parameter
11081      parameter-declaration
11082
11083    If all goes well, returns a TREE_LIST.  The TREE_VALUE represents
11084    the parameter.  The TREE_PURPOSE is the default value, if any.
11085    Returns ERROR_MARK_NODE on failure.  *IS_NON_TYPE is set to true
11086    iff this parameter is a non-type parameter.  *IS_PARAMETER_PACK is
11087    set to true iff this parameter is a parameter pack. */
11088
11089 static tree
11090 cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
11091                               bool *is_parameter_pack)
11092 {
11093   cp_token *token;
11094   cp_parameter_declarator *parameter_declarator;
11095   cp_declarator *id_declarator;
11096   tree parm;
11097
11098   /* Assume it is a type parameter or a template parameter.  */
11099   *is_non_type = false;
11100   /* Assume it not a parameter pack. */
11101   *is_parameter_pack = false;
11102   /* Peek at the next token.  */
11103   token = cp_lexer_peek_token (parser->lexer);
11104   /* If it is `class' or `template', we have a type-parameter.  */
11105   if (token->keyword == RID_TEMPLATE)
11106     return cp_parser_type_parameter (parser, is_parameter_pack);
11107   /* If it is `class' or `typename' we do not know yet whether it is a
11108      type parameter or a non-type parameter.  Consider:
11109
11110        template <typename T, typename T::X X> ...
11111
11112      or:
11113
11114        template <class C, class D*> ...
11115
11116      Here, the first parameter is a type parameter, and the second is
11117      a non-type parameter.  We can tell by looking at the token after
11118      the identifier -- if it is a `,', `=', or `>' then we have a type
11119      parameter.  */
11120   if (token->keyword == RID_TYPENAME || token->keyword == RID_CLASS)
11121     {
11122       /* Peek at the token after `class' or `typename'.  */
11123       token = cp_lexer_peek_nth_token (parser->lexer, 2);
11124       /* If it's an ellipsis, we have a template type parameter
11125          pack. */
11126       if (token->type == CPP_ELLIPSIS)
11127         return cp_parser_type_parameter (parser, is_parameter_pack);
11128       /* If it's an identifier, skip it.  */
11129       if (token->type == CPP_NAME)
11130         token = cp_lexer_peek_nth_token (parser->lexer, 3);
11131       /* Now, see if the token looks like the end of a template
11132          parameter.  */
11133       if (token->type == CPP_COMMA
11134           || token->type == CPP_EQ
11135           || token->type == CPP_GREATER)
11136         return cp_parser_type_parameter (parser, is_parameter_pack);
11137     }
11138
11139   /* Otherwise, it is a non-type parameter.
11140
11141      [temp.param]
11142
11143      When parsing a default template-argument for a non-type
11144      template-parameter, the first non-nested `>' is taken as the end
11145      of the template parameter-list rather than a greater-than
11146      operator.  */
11147   *is_non_type = true;
11148   parameter_declarator
11149      = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
11150                                         /*parenthesized_p=*/NULL);
11151
11152   /* If the parameter declaration is marked as a parameter pack, set
11153      *IS_PARAMETER_PACK to notify the caller. Also, unmark the
11154      declarator's PACK_EXPANSION_P, otherwise we'll get errors from
11155      grokdeclarator. */
11156   if (parameter_declarator
11157       && parameter_declarator->declarator
11158       && parameter_declarator->declarator->parameter_pack_p)
11159     {
11160       *is_parameter_pack = true;
11161       parameter_declarator->declarator->parameter_pack_p = false;
11162     }
11163
11164   /* If the next token is an ellipsis, and we don't already have it
11165      marked as a parameter pack, then we have a parameter pack (that
11166      has no declarator).  */
11167   if (!*is_parameter_pack
11168       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
11169       && declarator_can_be_parameter_pack (parameter_declarator->declarator))
11170     {
11171       /* Consume the `...'.  */
11172       cp_lexer_consume_token (parser->lexer);
11173       maybe_warn_variadic_templates ();
11174       
11175       *is_parameter_pack = true;
11176     }
11177   /* We might end up with a pack expansion as the type of the non-type
11178      template parameter, in which case this is a non-type template
11179      parameter pack.  */
11180   else if (parameter_declarator
11181            && parameter_declarator->decl_specifiers.type
11182            && PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type))
11183     {
11184       *is_parameter_pack = true;
11185       parameter_declarator->decl_specifiers.type = 
11186         PACK_EXPANSION_PATTERN (parameter_declarator->decl_specifiers.type);
11187     }
11188
11189   if (*is_parameter_pack && cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11190     {
11191       /* Parameter packs cannot have default arguments.  However, a
11192          user may try to do so, so we'll parse them and give an
11193          appropriate diagnostic here.  */
11194
11195       /* Consume the `='.  */
11196       cp_token *start_token = cp_lexer_peek_token (parser->lexer);
11197       cp_lexer_consume_token (parser->lexer);
11198       
11199       /* Find the name of the parameter pack.  */     
11200       id_declarator = parameter_declarator->declarator;
11201       while (id_declarator && id_declarator->kind != cdk_id)
11202         id_declarator = id_declarator->declarator;
11203       
11204       if (id_declarator && id_declarator->kind == cdk_id)
11205         error_at (start_token->location,
11206                   "template parameter pack %qD cannot have a default argument",
11207                   id_declarator->u.id.unqualified_name);
11208       else
11209         error_at (start_token->location,
11210                   "template parameter pack cannot have a default argument");
11211       
11212       /* Parse the default argument, but throw away the result.  */
11213       cp_parser_default_argument (parser, /*template_parm_p=*/true);
11214     }
11215
11216   parm = grokdeclarator (parameter_declarator->declarator,
11217                          &parameter_declarator->decl_specifiers,
11218                          TPARM, /*initialized=*/0,
11219                          /*attrlist=*/NULL);
11220   if (parm == error_mark_node)
11221     return error_mark_node;
11222
11223   return build_tree_list (parameter_declarator->default_argument, parm);
11224 }
11225
11226 /* Parse a type-parameter.
11227
11228    type-parameter:
11229      class identifier [opt]
11230      class identifier [opt] = type-id
11231      typename identifier [opt]
11232      typename identifier [opt] = type-id
11233      template < template-parameter-list > class identifier [opt]
11234      template < template-parameter-list > class identifier [opt]
11235        = id-expression
11236
11237    GNU Extension (variadic templates):
11238
11239    type-parameter:
11240      class ... identifier [opt]
11241      typename ... identifier [opt]
11242
11243    Returns a TREE_LIST.  The TREE_VALUE is itself a TREE_LIST.  The
11244    TREE_PURPOSE is the default-argument, if any.  The TREE_VALUE is
11245    the declaration of the parameter.
11246
11247    Sets *IS_PARAMETER_PACK if this is a template parameter pack. */
11248
11249 static tree
11250 cp_parser_type_parameter (cp_parser* parser, bool *is_parameter_pack)
11251 {
11252   cp_token *token;
11253   tree parameter;
11254
11255   /* Look for a keyword to tell us what kind of parameter this is.  */
11256   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_TYPENAME_TEMPLATE);
11257   if (!token)
11258     return error_mark_node;
11259
11260   switch (token->keyword)
11261     {
11262     case RID_CLASS:
11263     case RID_TYPENAME:
11264       {
11265         tree identifier;
11266         tree default_argument;
11267
11268         /* If the next token is an ellipsis, we have a template
11269            argument pack. */
11270         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11271           {
11272             /* Consume the `...' token. */
11273             cp_lexer_consume_token (parser->lexer);
11274             maybe_warn_variadic_templates ();
11275
11276             *is_parameter_pack = true;
11277           }
11278
11279         /* If the next token is an identifier, then it names the
11280            parameter.  */
11281         if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
11282           identifier = cp_parser_identifier (parser);
11283         else
11284           identifier = NULL_TREE;
11285
11286         /* Create the parameter.  */
11287         parameter = finish_template_type_parm (class_type_node, identifier);
11288
11289         /* If the next token is an `=', we have a default argument.  */
11290         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11291           {
11292             /* Consume the `=' token.  */
11293             cp_lexer_consume_token (parser->lexer);
11294             /* Parse the default-argument.  */
11295             push_deferring_access_checks (dk_no_deferred);
11296             default_argument = cp_parser_type_id (parser);
11297
11298             /* Template parameter packs cannot have default
11299                arguments. */
11300             if (*is_parameter_pack)
11301               {
11302                 if (identifier)
11303                   error_at (token->location,
11304                             "template parameter pack %qD cannot have a "
11305                             "default argument", identifier);
11306                 else
11307                   error_at (token->location,
11308                             "template parameter packs cannot have "
11309                             "default arguments");
11310                 default_argument = NULL_TREE;
11311               }
11312             pop_deferring_access_checks ();
11313           }
11314         else
11315           default_argument = NULL_TREE;
11316
11317         /* Create the combined representation of the parameter and the
11318            default argument.  */
11319         parameter = build_tree_list (default_argument, parameter);
11320       }
11321       break;
11322
11323     case RID_TEMPLATE:
11324       {
11325         tree identifier;
11326         tree default_argument;
11327
11328         /* Look for the `<'.  */
11329         cp_parser_require (parser, CPP_LESS, RT_LESS);
11330         /* Parse the template-parameter-list.  */
11331         cp_parser_template_parameter_list (parser);
11332         /* Look for the `>'.  */
11333         cp_parser_require (parser, CPP_GREATER, RT_GREATER);
11334         /* Look for the `class' keyword.  */
11335         cp_parser_require_keyword (parser, RID_CLASS, RT_CLASS);
11336         /* If the next token is an ellipsis, we have a template
11337            argument pack. */
11338         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11339           {
11340             /* Consume the `...' token. */
11341             cp_lexer_consume_token (parser->lexer);
11342             maybe_warn_variadic_templates ();
11343
11344             *is_parameter_pack = true;
11345           }
11346         /* If the next token is an `=', then there is a
11347            default-argument.  If the next token is a `>', we are at
11348            the end of the parameter-list.  If the next token is a `,',
11349            then we are at the end of this parameter.  */
11350         if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ)
11351             && cp_lexer_next_token_is_not (parser->lexer, CPP_GREATER)
11352             && cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
11353           {
11354             identifier = cp_parser_identifier (parser);
11355             /* Treat invalid names as if the parameter were nameless.  */
11356             if (identifier == error_mark_node)
11357               identifier = NULL_TREE;
11358           }
11359         else
11360           identifier = NULL_TREE;
11361
11362         /* Create the template parameter.  */
11363         parameter = finish_template_template_parm (class_type_node,
11364                                                    identifier);
11365
11366         /* If the next token is an `=', then there is a
11367            default-argument.  */
11368         if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
11369           {
11370             bool is_template;
11371
11372             /* Consume the `='.  */
11373             cp_lexer_consume_token (parser->lexer);
11374             /* Parse the id-expression.  */
11375             push_deferring_access_checks (dk_no_deferred);
11376             /* save token before parsing the id-expression, for error
11377                reporting */
11378             token = cp_lexer_peek_token (parser->lexer);
11379             default_argument
11380               = cp_parser_id_expression (parser,
11381                                          /*template_keyword_p=*/false,
11382                                          /*check_dependency_p=*/true,
11383                                          /*template_p=*/&is_template,
11384                                          /*declarator_p=*/false,
11385                                          /*optional_p=*/false);
11386             if (TREE_CODE (default_argument) == TYPE_DECL)
11387               /* If the id-expression was a template-id that refers to
11388                  a template-class, we already have the declaration here,
11389                  so no further lookup is needed.  */
11390                  ;
11391             else
11392               /* Look up the name.  */
11393               default_argument
11394                 = cp_parser_lookup_name (parser, default_argument,
11395                                          none_type,
11396                                          /*is_template=*/is_template,
11397                                          /*is_namespace=*/false,
11398                                          /*check_dependency=*/true,
11399                                          /*ambiguous_decls=*/NULL,
11400                                          token->location);
11401             /* See if the default argument is valid.  */
11402             default_argument
11403               = check_template_template_default_arg (default_argument);
11404
11405             /* Template parameter packs cannot have default
11406                arguments. */
11407             if (*is_parameter_pack)
11408               {
11409                 if (identifier)
11410                   error_at (token->location,
11411                             "template parameter pack %qD cannot "
11412                             "have a default argument",
11413                             identifier);
11414                 else
11415                   error_at (token->location, "template parameter packs cannot "
11416                             "have default arguments");
11417                 default_argument = NULL_TREE;
11418               }
11419             pop_deferring_access_checks ();
11420           }
11421         else
11422           default_argument = NULL_TREE;
11423
11424         /* Create the combined representation of the parameter and the
11425            default argument.  */
11426         parameter = build_tree_list (default_argument, parameter);
11427       }
11428       break;
11429
11430     default:
11431       gcc_unreachable ();
11432       break;
11433     }
11434
11435   return parameter;
11436 }
11437
11438 /* Parse a template-id.
11439
11440    template-id:
11441      template-name < template-argument-list [opt] >
11442
11443    If TEMPLATE_KEYWORD_P is TRUE, then we have just seen the
11444    `template' keyword.  In this case, a TEMPLATE_ID_EXPR will be
11445    returned.  Otherwise, if the template-name names a function, or set
11446    of functions, returns a TEMPLATE_ID_EXPR.  If the template-name
11447    names a class, returns a TYPE_DECL for the specialization.
11448
11449    If CHECK_DEPENDENCY_P is FALSE, names are looked up in
11450    uninstantiated templates.  */
11451
11452 static tree
11453 cp_parser_template_id (cp_parser *parser,
11454                        bool template_keyword_p,
11455                        bool check_dependency_p,
11456                        bool is_declaration)
11457 {
11458   int i;
11459   tree templ;
11460   tree arguments;
11461   tree template_id;
11462   cp_token_position start_of_id = 0;
11463   deferred_access_check *chk;
11464   VEC (deferred_access_check,gc) *access_check;
11465   cp_token *next_token = NULL, *next_token_2 = NULL;
11466   bool is_identifier;
11467
11468   /* If the next token corresponds to a template-id, there is no need
11469      to reparse it.  */
11470   next_token = cp_lexer_peek_token (parser->lexer);
11471   if (next_token->type == CPP_TEMPLATE_ID)
11472     {
11473       struct tree_check *check_value;
11474
11475       /* Get the stored value.  */
11476       check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
11477       /* Perform any access checks that were deferred.  */
11478       access_check = check_value->checks;
11479       if (access_check)
11480         {
11481           FOR_EACH_VEC_ELT (deferred_access_check, access_check, i, chk)
11482             perform_or_defer_access_check (chk->binfo,
11483                                            chk->decl,
11484                                            chk->diag_decl);
11485         }
11486       /* Return the stored value.  */
11487       return check_value->value;
11488     }
11489
11490   /* Avoid performing name lookup if there is no possibility of
11491      finding a template-id.  */
11492   if ((next_token->type != CPP_NAME && next_token->keyword != RID_OPERATOR)
11493       || (next_token->type == CPP_NAME
11494           && !cp_parser_nth_token_starts_template_argument_list_p
11495                (parser, 2)))
11496     {
11497       cp_parser_error (parser, "expected template-id");
11498       return error_mark_node;
11499     }
11500
11501   /* Remember where the template-id starts.  */
11502   if (cp_parser_uncommitted_to_tentative_parse_p (parser))
11503     start_of_id = cp_lexer_token_position (parser->lexer, false);
11504
11505   push_deferring_access_checks (dk_deferred);
11506
11507   /* Parse the template-name.  */
11508   is_identifier = false;
11509   templ = cp_parser_template_name (parser, template_keyword_p,
11510                                    check_dependency_p,
11511                                    is_declaration,
11512                                    &is_identifier);
11513   if (templ == error_mark_node || is_identifier)
11514     {
11515       pop_deferring_access_checks ();
11516       return templ;
11517     }
11518
11519   /* If we find the sequence `[:' after a template-name, it's probably
11520      a digraph-typo for `< ::'. Substitute the tokens and check if we can
11521      parse correctly the argument list.  */
11522   next_token = cp_lexer_peek_token (parser->lexer);
11523   next_token_2 = cp_lexer_peek_nth_token (parser->lexer, 2);
11524   if (next_token->type == CPP_OPEN_SQUARE
11525       && next_token->flags & DIGRAPH
11526       && next_token_2->type == CPP_COLON
11527       && !(next_token_2->flags & PREV_WHITE))
11528     {
11529       cp_parser_parse_tentatively (parser);
11530       /* Change `:' into `::'.  */
11531       next_token_2->type = CPP_SCOPE;
11532       /* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
11533          CPP_LESS.  */
11534       cp_lexer_consume_token (parser->lexer);
11535
11536       /* Parse the arguments.  */
11537       arguments = cp_parser_enclosed_template_argument_list (parser);
11538       if (!cp_parser_parse_definitely (parser))
11539         {
11540           /* If we couldn't parse an argument list, then we revert our changes
11541              and return simply an error. Maybe this is not a template-id
11542              after all.  */
11543           next_token_2->type = CPP_COLON;
11544           cp_parser_error (parser, "expected %<<%>");
11545           pop_deferring_access_checks ();
11546           return error_mark_node;
11547         }
11548       /* Otherwise, emit an error about the invalid digraph, but continue
11549          parsing because we got our argument list.  */
11550       if (permerror (next_token->location,
11551                      "%<<::%> cannot begin a template-argument list"))
11552         {
11553           static bool hint = false;
11554           inform (next_token->location,
11555                   "%<<:%> is an alternate spelling for %<[%>."
11556                   " Insert whitespace between %<<%> and %<::%>");
11557           if (!hint && !flag_permissive)
11558             {
11559               inform (next_token->location, "(if you use %<-fpermissive%>"
11560                       " G++ will accept your code)");
11561               hint = true;
11562             }
11563         }
11564     }
11565   else
11566     {
11567       /* Look for the `<' that starts the template-argument-list.  */
11568       if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
11569         {
11570           pop_deferring_access_checks ();
11571           return error_mark_node;
11572         }
11573       /* Parse the arguments.  */
11574       arguments = cp_parser_enclosed_template_argument_list (parser);
11575     }
11576
11577   /* Build a representation of the specialization.  */
11578   if (TREE_CODE (templ) == IDENTIFIER_NODE)
11579     template_id = build_min_nt (TEMPLATE_ID_EXPR, templ, arguments);
11580   else if (DECL_CLASS_TEMPLATE_P (templ)
11581            || DECL_TEMPLATE_TEMPLATE_PARM_P (templ))
11582     {
11583       bool entering_scope;
11584       /* In "template <typename T> ... A<T>::", A<T> is the abstract A
11585          template (rather than some instantiation thereof) only if
11586          is not nested within some other construct.  For example, in
11587          "template <typename T> void f(T) { A<T>::", A<T> is just an
11588          instantiation of A.  */
11589       entering_scope = (template_parm_scope_p ()
11590                         && cp_lexer_next_token_is (parser->lexer,
11591                                                    CPP_SCOPE));
11592       template_id
11593         = finish_template_type (templ, arguments, entering_scope);
11594     }
11595   else
11596     {
11597       /* If it's not a class-template or a template-template, it should be
11598          a function-template.  */
11599       gcc_assert ((DECL_FUNCTION_TEMPLATE_P (templ)
11600                    || TREE_CODE (templ) == OVERLOAD
11601                    || BASELINK_P (templ)));
11602
11603       template_id = lookup_template_function (templ, arguments);
11604     }
11605
11606   /* If parsing tentatively, replace the sequence of tokens that makes
11607      up the template-id with a CPP_TEMPLATE_ID token.  That way,
11608      should we re-parse the token stream, we will not have to repeat
11609      the effort required to do the parse, nor will we issue duplicate
11610      error messages about problems during instantiation of the
11611      template.  */
11612   if (start_of_id)
11613     {
11614       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
11615
11616       /* Reset the contents of the START_OF_ID token.  */
11617       token->type = CPP_TEMPLATE_ID;
11618       /* Retrieve any deferred checks.  Do not pop this access checks yet
11619          so the memory will not be reclaimed during token replacing below.  */
11620       token->u.tree_check_value = ggc_alloc_cleared_tree_check ();
11621       token->u.tree_check_value->value = template_id;
11622       token->u.tree_check_value->checks = get_deferred_access_checks ();
11623       token->keyword = RID_MAX;
11624
11625       /* Purge all subsequent tokens.  */
11626       cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
11627
11628       /* ??? Can we actually assume that, if template_id ==
11629          error_mark_node, we will have issued a diagnostic to the
11630          user, as opposed to simply marking the tentative parse as
11631          failed?  */
11632       if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
11633         error_at (token->location, "parse error in template argument list");
11634     }
11635
11636   pop_deferring_access_checks ();
11637   return template_id;
11638 }
11639
11640 /* Parse a template-name.
11641
11642    template-name:
11643      identifier
11644
11645    The standard should actually say:
11646
11647    template-name:
11648      identifier
11649      operator-function-id
11650
11651    A defect report has been filed about this issue.
11652
11653    A conversion-function-id cannot be a template name because they cannot
11654    be part of a template-id. In fact, looking at this code:
11655
11656    a.operator K<int>()
11657
11658    the conversion-function-id is "operator K<int>", and K<int> is a type-id.
11659    It is impossible to call a templated conversion-function-id with an
11660    explicit argument list, since the only allowed template parameter is
11661    the type to which it is converting.
11662
11663    If TEMPLATE_KEYWORD_P is true, then we have just seen the
11664    `template' keyword, in a construction like:
11665
11666      T::template f<3>()
11667
11668    In that case `f' is taken to be a template-name, even though there
11669    is no way of knowing for sure.
11670
11671    Returns the TEMPLATE_DECL for the template, or an OVERLOAD if the
11672    name refers to a set of overloaded functions, at least one of which
11673    is a template, or an IDENTIFIER_NODE with the name of the template,
11674    if TEMPLATE_KEYWORD_P is true.  If CHECK_DEPENDENCY_P is FALSE,
11675    names are looked up inside uninstantiated templates.  */
11676
11677 static tree
11678 cp_parser_template_name (cp_parser* parser,
11679                          bool template_keyword_p,
11680                          bool check_dependency_p,
11681                          bool is_declaration,
11682                          bool *is_identifier)
11683 {
11684   tree identifier;
11685   tree decl;
11686   tree fns;
11687   cp_token *token = cp_lexer_peek_token (parser->lexer);
11688
11689   /* If the next token is `operator', then we have either an
11690      operator-function-id or a conversion-function-id.  */
11691   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_OPERATOR))
11692     {
11693       /* We don't know whether we're looking at an
11694          operator-function-id or a conversion-function-id.  */
11695       cp_parser_parse_tentatively (parser);
11696       /* Try an operator-function-id.  */
11697       identifier = cp_parser_operator_function_id (parser);
11698       /* If that didn't work, try a conversion-function-id.  */
11699       if (!cp_parser_parse_definitely (parser))
11700         {
11701           cp_parser_error (parser, "expected template-name");
11702           return error_mark_node;
11703         }
11704     }
11705   /* Look for the identifier.  */
11706   else
11707     identifier = cp_parser_identifier (parser);
11708
11709   /* If we didn't find an identifier, we don't have a template-id.  */
11710   if (identifier == error_mark_node)
11711     return error_mark_node;
11712
11713   /* If the name immediately followed the `template' keyword, then it
11714      is a template-name.  However, if the next token is not `<', then
11715      we do not treat it as a template-name, since it is not being used
11716      as part of a template-id.  This enables us to handle constructs
11717      like:
11718
11719        template <typename T> struct S { S(); };
11720        template <typename T> S<T>::S();
11721
11722      correctly.  We would treat `S' as a template -- if it were `S<T>'
11723      -- but we do not if there is no `<'.  */
11724
11725   if (processing_template_decl
11726       && cp_parser_nth_token_starts_template_argument_list_p (parser, 1))
11727     {
11728       /* In a declaration, in a dependent context, we pretend that the
11729          "template" keyword was present in order to improve error
11730          recovery.  For example, given:
11731
11732            template <typename T> void f(T::X<int>);
11733
11734          we want to treat "X<int>" as a template-id.  */
11735       if (is_declaration
11736           && !template_keyword_p
11737           && parser->scope && TYPE_P (parser->scope)
11738           && check_dependency_p
11739           && dependent_scope_p (parser->scope)
11740           /* Do not do this for dtors (or ctors), since they never
11741              need the template keyword before their name.  */
11742           && !constructor_name_p (identifier, parser->scope))
11743         {
11744           cp_token_position start = 0;
11745
11746           /* Explain what went wrong.  */
11747           error_at (token->location, "non-template %qD used as template",
11748                     identifier);
11749           inform (token->location, "use %<%T::template %D%> to indicate that it is a template",
11750                   parser->scope, identifier);
11751           /* If parsing tentatively, find the location of the "<" token.  */
11752           if (cp_parser_simulate_error (parser))
11753             start = cp_lexer_token_position (parser->lexer, true);
11754           /* Parse the template arguments so that we can issue error
11755              messages about them.  */
11756           cp_lexer_consume_token (parser->lexer);
11757           cp_parser_enclosed_template_argument_list (parser);
11758           /* Skip tokens until we find a good place from which to
11759              continue parsing.  */
11760           cp_parser_skip_to_closing_parenthesis (parser,
11761                                                  /*recovering=*/true,
11762                                                  /*or_comma=*/true,
11763                                                  /*consume_paren=*/false);
11764           /* If parsing tentatively, permanently remove the
11765              template argument list.  That will prevent duplicate
11766              error messages from being issued about the missing
11767              "template" keyword.  */
11768           if (start)
11769             cp_lexer_purge_tokens_after (parser->lexer, start);
11770           if (is_identifier)
11771             *is_identifier = true;
11772           return identifier;
11773         }
11774
11775       /* If the "template" keyword is present, then there is generally
11776          no point in doing name-lookup, so we just return IDENTIFIER.
11777          But, if the qualifying scope is non-dependent then we can
11778          (and must) do name-lookup normally.  */
11779       if (template_keyword_p
11780           && (!parser->scope
11781               || (TYPE_P (parser->scope)
11782                   && dependent_type_p (parser->scope))))
11783         return identifier;
11784     }
11785
11786   /* Look up the name.  */
11787   decl = cp_parser_lookup_name (parser, identifier,
11788                                 none_type,
11789                                 /*is_template=*/true,
11790                                 /*is_namespace=*/false,
11791                                 check_dependency_p,
11792                                 /*ambiguous_decls=*/NULL,
11793                                 token->location);
11794
11795   /* If DECL is a template, then the name was a template-name.  */
11796   if (TREE_CODE (decl) == TEMPLATE_DECL)
11797     ;
11798   else
11799     {
11800       tree fn = NULL_TREE;
11801
11802       /* The standard does not explicitly indicate whether a name that
11803          names a set of overloaded declarations, some of which are
11804          templates, is a template-name.  However, such a name should
11805          be a template-name; otherwise, there is no way to form a
11806          template-id for the overloaded templates.  */
11807       fns = BASELINK_P (decl) ? BASELINK_FUNCTIONS (decl) : decl;
11808       if (TREE_CODE (fns) == OVERLOAD)
11809         for (fn = fns; fn; fn = OVL_NEXT (fn))
11810           if (TREE_CODE (OVL_CURRENT (fn)) == TEMPLATE_DECL)
11811             break;
11812
11813       if (!fn)
11814         {
11815           /* The name does not name a template.  */
11816           cp_parser_error (parser, "expected template-name");
11817           return error_mark_node;
11818         }
11819     }
11820
11821   /* If DECL is dependent, and refers to a function, then just return
11822      its name; we will look it up again during template instantiation.  */
11823   if (DECL_FUNCTION_TEMPLATE_P (decl) || !DECL_P (decl))
11824     {
11825       tree scope = CP_DECL_CONTEXT (get_first_fn (decl));
11826       if (TYPE_P (scope) && dependent_type_p (scope))
11827         return identifier;
11828     }
11829
11830   return decl;
11831 }
11832
11833 /* Parse a template-argument-list.
11834
11835    template-argument-list:
11836      template-argument ... [opt]
11837      template-argument-list , template-argument ... [opt]
11838
11839    Returns a TREE_VEC containing the arguments.  */
11840
11841 static tree
11842 cp_parser_template_argument_list (cp_parser* parser)
11843 {
11844   tree fixed_args[10];
11845   unsigned n_args = 0;
11846   unsigned alloced = 10;
11847   tree *arg_ary = fixed_args;
11848   tree vec;
11849   bool saved_in_template_argument_list_p;
11850   bool saved_ice_p;
11851   bool saved_non_ice_p;
11852
11853   saved_in_template_argument_list_p = parser->in_template_argument_list_p;
11854   parser->in_template_argument_list_p = true;
11855   /* Even if the template-id appears in an integral
11856      constant-expression, the contents of the argument list do
11857      not.  */
11858   saved_ice_p = parser->integral_constant_expression_p;
11859   parser->integral_constant_expression_p = false;
11860   saved_non_ice_p = parser->non_integral_constant_expression_p;
11861   parser->non_integral_constant_expression_p = false;
11862   /* Parse the arguments.  */
11863   do
11864     {
11865       tree argument;
11866
11867       if (n_args)
11868         /* Consume the comma.  */
11869         cp_lexer_consume_token (parser->lexer);
11870
11871       /* Parse the template-argument.  */
11872       argument = cp_parser_template_argument (parser);
11873
11874       /* If the next token is an ellipsis, we're expanding a template
11875          argument pack. */
11876       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
11877         {
11878           if (argument == error_mark_node)
11879             {
11880               cp_token *token = cp_lexer_peek_token (parser->lexer);
11881               error_at (token->location,
11882                         "expected parameter pack before %<...%>");
11883             }
11884           /* Consume the `...' token. */
11885           cp_lexer_consume_token (parser->lexer);
11886
11887           /* Make the argument into a TYPE_PACK_EXPANSION or
11888              EXPR_PACK_EXPANSION. */
11889           argument = make_pack_expansion (argument);
11890         }
11891
11892       if (n_args == alloced)
11893         {
11894           alloced *= 2;
11895
11896           if (arg_ary == fixed_args)
11897             {
11898               arg_ary = XNEWVEC (tree, alloced);
11899               memcpy (arg_ary, fixed_args, sizeof (tree) * n_args);
11900             }
11901           else
11902             arg_ary = XRESIZEVEC (tree, arg_ary, alloced);
11903         }
11904       arg_ary[n_args++] = argument;
11905     }
11906   while (cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
11907
11908   vec = make_tree_vec (n_args);
11909
11910   while (n_args--)
11911     TREE_VEC_ELT (vec, n_args) = arg_ary[n_args];
11912
11913   if (arg_ary != fixed_args)
11914     free (arg_ary);
11915   parser->non_integral_constant_expression_p = saved_non_ice_p;
11916   parser->integral_constant_expression_p = saved_ice_p;
11917   parser->in_template_argument_list_p = saved_in_template_argument_list_p;
11918 #ifdef ENABLE_CHECKING
11919   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (vec, TREE_VEC_LENGTH (vec));
11920 #endif
11921   return vec;
11922 }
11923
11924 /* Parse a template-argument.
11925
11926    template-argument:
11927      assignment-expression
11928      type-id
11929      id-expression
11930
11931    The representation is that of an assignment-expression, type-id, or
11932    id-expression -- except that the qualified id-expression is
11933    evaluated, so that the value returned is either a DECL or an
11934    OVERLOAD.
11935
11936    Although the standard says "assignment-expression", it forbids
11937    throw-expressions or assignments in the template argument.
11938    Therefore, we use "conditional-expression" instead.  */
11939
11940 static tree
11941 cp_parser_template_argument (cp_parser* parser)
11942 {
11943   tree argument;
11944   bool template_p;
11945   bool address_p;
11946   bool maybe_type_id = false;
11947   cp_token *token = NULL, *argument_start_token = NULL;
11948   cp_id_kind idk;
11949
11950   /* There's really no way to know what we're looking at, so we just
11951      try each alternative in order.
11952
11953        [temp.arg]
11954
11955        In a template-argument, an ambiguity between a type-id and an
11956        expression is resolved to a type-id, regardless of the form of
11957        the corresponding template-parameter.
11958
11959      Therefore, we try a type-id first.  */
11960   cp_parser_parse_tentatively (parser);
11961   argument = cp_parser_template_type_arg (parser);
11962   /* If there was no error parsing the type-id but the next token is a
11963      '>>', our behavior depends on which dialect of C++ we're
11964      parsing. In C++98, we probably found a typo for '> >'. But there
11965      are type-id which are also valid expressions. For instance:
11966
11967      struct X { int operator >> (int); };
11968      template <int V> struct Foo {};
11969      Foo<X () >> 5> r;
11970
11971      Here 'X()' is a valid type-id of a function type, but the user just
11972      wanted to write the expression "X() >> 5". Thus, we remember that we
11973      found a valid type-id, but we still try to parse the argument as an
11974      expression to see what happens. 
11975
11976      In C++0x, the '>>' will be considered two separate '>'
11977      tokens.  */
11978   if (!cp_parser_error_occurred (parser)
11979       && cxx_dialect == cxx98
11980       && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
11981     {
11982       maybe_type_id = true;
11983       cp_parser_abort_tentative_parse (parser);
11984     }
11985   else
11986     {
11987       /* If the next token isn't a `,' or a `>', then this argument wasn't
11988       really finished. This means that the argument is not a valid
11989       type-id.  */
11990       if (!cp_parser_next_token_ends_template_argument_p (parser))
11991         cp_parser_error (parser, "expected template-argument");
11992       /* If that worked, we're done.  */
11993       if (cp_parser_parse_definitely (parser))
11994         return argument;
11995     }
11996   /* We're still not sure what the argument will be.  */
11997   cp_parser_parse_tentatively (parser);
11998   /* Try a template.  */
11999   argument_start_token = cp_lexer_peek_token (parser->lexer);
12000   argument = cp_parser_id_expression (parser,
12001                                       /*template_keyword_p=*/false,
12002                                       /*check_dependency_p=*/true,
12003                                       &template_p,
12004                                       /*declarator_p=*/false,
12005                                       /*optional_p=*/false);
12006   /* If the next token isn't a `,' or a `>', then this argument wasn't
12007      really finished.  */
12008   if (!cp_parser_next_token_ends_template_argument_p (parser))
12009     cp_parser_error (parser, "expected template-argument");
12010   if (!cp_parser_error_occurred (parser))
12011     {
12012       /* Figure out what is being referred to.  If the id-expression
12013          was for a class template specialization, then we will have a
12014          TYPE_DECL at this point.  There is no need to do name lookup
12015          at this point in that case.  */
12016       if (TREE_CODE (argument) != TYPE_DECL)
12017         argument = cp_parser_lookup_name (parser, argument,
12018                                           none_type,
12019                                           /*is_template=*/template_p,
12020                                           /*is_namespace=*/false,
12021                                           /*check_dependency=*/true,
12022                                           /*ambiguous_decls=*/NULL,
12023                                           argument_start_token->location);
12024       if (TREE_CODE (argument) != TEMPLATE_DECL
12025           && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
12026         cp_parser_error (parser, "expected template-name");
12027     }
12028   if (cp_parser_parse_definitely (parser))
12029     return argument;
12030   /* It must be a non-type argument.  There permitted cases are given
12031      in [temp.arg.nontype]:
12032
12033      -- an integral constant-expression of integral or enumeration
12034         type; or
12035
12036      -- the name of a non-type template-parameter; or
12037
12038      -- the name of an object or function with external linkage...
12039
12040      -- the address of an object or function with external linkage...
12041
12042      -- a pointer to member...  */
12043   /* Look for a non-type template parameter.  */
12044   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
12045     {
12046       cp_parser_parse_tentatively (parser);
12047       argument = cp_parser_primary_expression (parser,
12048                                                /*address_p=*/false,
12049                                                /*cast_p=*/false,
12050                                                /*template_arg_p=*/true,
12051                                                &idk);
12052       if (TREE_CODE (argument) != TEMPLATE_PARM_INDEX
12053           || !cp_parser_next_token_ends_template_argument_p (parser))
12054         cp_parser_simulate_error (parser);
12055       if (cp_parser_parse_definitely (parser))
12056         return argument;
12057     }
12058
12059   /* If the next token is "&", the argument must be the address of an
12060      object or function with external linkage.  */
12061   address_p = cp_lexer_next_token_is (parser->lexer, CPP_AND);
12062   if (address_p)
12063     cp_lexer_consume_token (parser->lexer);
12064   /* See if we might have an id-expression.  */
12065   token = cp_lexer_peek_token (parser->lexer);
12066   if (token->type == CPP_NAME
12067       || token->keyword == RID_OPERATOR
12068       || token->type == CPP_SCOPE
12069       || token->type == CPP_TEMPLATE_ID
12070       || token->type == CPP_NESTED_NAME_SPECIFIER)
12071     {
12072       cp_parser_parse_tentatively (parser);
12073       argument = cp_parser_primary_expression (parser,
12074                                                address_p,
12075                                                /*cast_p=*/false,
12076                                                /*template_arg_p=*/true,
12077                                                &idk);
12078       if (cp_parser_error_occurred (parser)
12079           || !cp_parser_next_token_ends_template_argument_p (parser))
12080         cp_parser_abort_tentative_parse (parser);
12081       else
12082         {
12083           tree probe;
12084
12085           if (TREE_CODE (argument) == INDIRECT_REF)
12086             {
12087               gcc_assert (REFERENCE_REF_P (argument));
12088               argument = TREE_OPERAND (argument, 0);
12089             }
12090
12091           /* If we're in a template, we represent a qualified-id referring
12092              to a static data member as a SCOPE_REF even if the scope isn't
12093              dependent so that we can check access control later.  */
12094           probe = argument;
12095           if (TREE_CODE (probe) == SCOPE_REF)
12096             probe = TREE_OPERAND (probe, 1);
12097           if (TREE_CODE (probe) == VAR_DECL)
12098             {
12099               /* A variable without external linkage might still be a
12100                  valid constant-expression, so no error is issued here
12101                  if the external-linkage check fails.  */
12102               if (!address_p && !DECL_EXTERNAL_LINKAGE_P (probe))
12103                 cp_parser_simulate_error (parser);
12104             }
12105           else if (is_overloaded_fn (argument))
12106             /* All overloaded functions are allowed; if the external
12107                linkage test does not pass, an error will be issued
12108                later.  */
12109             ;
12110           else if (address_p
12111                    && (TREE_CODE (argument) == OFFSET_REF
12112                        || TREE_CODE (argument) == SCOPE_REF))
12113             /* A pointer-to-member.  */
12114             ;
12115           else if (TREE_CODE (argument) == TEMPLATE_PARM_INDEX)
12116             ;
12117           else
12118             cp_parser_simulate_error (parser);
12119
12120           if (cp_parser_parse_definitely (parser))
12121             {
12122               if (address_p)
12123                 argument = build_x_unary_op (ADDR_EXPR, argument,
12124                                              tf_warning_or_error);
12125               return argument;
12126             }
12127         }
12128     }
12129   /* If the argument started with "&", there are no other valid
12130      alternatives at this point.  */
12131   if (address_p)
12132     {
12133       cp_parser_error (parser, "invalid non-type template argument");
12134       return error_mark_node;
12135     }
12136
12137   /* If the argument wasn't successfully parsed as a type-id followed
12138      by '>>', the argument can only be a constant expression now.
12139      Otherwise, we try parsing the constant-expression tentatively,
12140      because the argument could really be a type-id.  */
12141   if (maybe_type_id)
12142     cp_parser_parse_tentatively (parser);
12143   argument = cp_parser_constant_expression (parser,
12144                                             /*allow_non_constant_p=*/false,
12145                                             /*non_constant_p=*/NULL);
12146   argument = fold_non_dependent_expr (argument);
12147   if (!maybe_type_id)
12148     return argument;
12149   if (!cp_parser_next_token_ends_template_argument_p (parser))
12150     cp_parser_error (parser, "expected template-argument");
12151   if (cp_parser_parse_definitely (parser))
12152     return argument;
12153   /* We did our best to parse the argument as a non type-id, but that
12154      was the only alternative that matched (albeit with a '>' after
12155      it). We can assume it's just a typo from the user, and a
12156      diagnostic will then be issued.  */
12157   return cp_parser_template_type_arg (parser);
12158 }
12159
12160 /* Parse an explicit-instantiation.
12161
12162    explicit-instantiation:
12163      template declaration
12164
12165    Although the standard says `declaration', what it really means is:
12166
12167    explicit-instantiation:
12168      template decl-specifier-seq [opt] declarator [opt] ;
12169
12170    Things like `template int S<int>::i = 5, int S<double>::j;' are not
12171    supposed to be allowed.  A defect report has been filed about this
12172    issue.
12173
12174    GNU Extension:
12175
12176    explicit-instantiation:
12177      storage-class-specifier template
12178        decl-specifier-seq [opt] declarator [opt] ;
12179      function-specifier template
12180        decl-specifier-seq [opt] declarator [opt] ;  */
12181
12182 static void
12183 cp_parser_explicit_instantiation (cp_parser* parser)
12184 {
12185   int declares_class_or_enum;
12186   cp_decl_specifier_seq decl_specifiers;
12187   tree extension_specifier = NULL_TREE;
12188
12189   timevar_push (TV_TEMPLATE_INST);
12190
12191   /* Look for an (optional) storage-class-specifier or
12192      function-specifier.  */
12193   if (cp_parser_allow_gnu_extensions_p (parser))
12194     {
12195       extension_specifier
12196         = cp_parser_storage_class_specifier_opt (parser);
12197       if (!extension_specifier)
12198         extension_specifier
12199           = cp_parser_function_specifier_opt (parser,
12200                                               /*decl_specs=*/NULL);
12201     }
12202
12203   /* Look for the `template' keyword.  */
12204   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12205   /* Let the front end know that we are processing an explicit
12206      instantiation.  */
12207   begin_explicit_instantiation ();
12208   /* [temp.explicit] says that we are supposed to ignore access
12209      control while processing explicit instantiation directives.  */
12210   push_deferring_access_checks (dk_no_check);
12211   /* Parse a decl-specifier-seq.  */
12212   cp_parser_decl_specifier_seq (parser,
12213                                 CP_PARSER_FLAGS_OPTIONAL,
12214                                 &decl_specifiers,
12215                                 &declares_class_or_enum);
12216   /* If there was exactly one decl-specifier, and it declared a class,
12217      and there's no declarator, then we have an explicit type
12218      instantiation.  */
12219   if (declares_class_or_enum && cp_parser_declares_only_class_p (parser))
12220     {
12221       tree type;
12222
12223       type = check_tag_decl (&decl_specifiers);
12224       /* Turn access control back on for names used during
12225          template instantiation.  */
12226       pop_deferring_access_checks ();
12227       if (type)
12228         do_type_instantiation (type, extension_specifier,
12229                                /*complain=*/tf_error);
12230     }
12231   else
12232     {
12233       cp_declarator *declarator;
12234       tree decl;
12235
12236       /* Parse the declarator.  */
12237       declarator
12238         = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
12239                                 /*ctor_dtor_or_conv_p=*/NULL,
12240                                 /*parenthesized_p=*/NULL,
12241                                 /*member_p=*/false);
12242       if (declares_class_or_enum & 2)
12243         cp_parser_check_for_definition_in_return_type (declarator,
12244                                                        decl_specifiers.type,
12245                                                        decl_specifiers.type_location);
12246       if (declarator != cp_error_declarator)
12247         {
12248           if (decl_specifiers.specs[(int)ds_inline])
12249             permerror (input_location, "explicit instantiation shall not use"
12250                        " %<inline%> specifier");
12251           if (decl_specifiers.specs[(int)ds_constexpr])
12252             permerror (input_location, "explicit instantiation shall not use"
12253                        " %<constexpr%> specifier");
12254
12255           decl = grokdeclarator (declarator, &decl_specifiers,
12256                                  NORMAL, 0, &decl_specifiers.attributes);
12257           /* Turn access control back on for names used during
12258              template instantiation.  */
12259           pop_deferring_access_checks ();
12260           /* Do the explicit instantiation.  */
12261           do_decl_instantiation (decl, extension_specifier);
12262         }
12263       else
12264         {
12265           pop_deferring_access_checks ();
12266           /* Skip the body of the explicit instantiation.  */
12267           cp_parser_skip_to_end_of_statement (parser);
12268         }
12269     }
12270   /* We're done with the instantiation.  */
12271   end_explicit_instantiation ();
12272
12273   cp_parser_consume_semicolon_at_end_of_statement (parser);
12274
12275   timevar_pop (TV_TEMPLATE_INST);
12276 }
12277
12278 /* Parse an explicit-specialization.
12279
12280    explicit-specialization:
12281      template < > declaration
12282
12283    Although the standard says `declaration', what it really means is:
12284
12285    explicit-specialization:
12286      template <> decl-specifier [opt] init-declarator [opt] ;
12287      template <> function-definition
12288      template <> explicit-specialization
12289      template <> template-declaration  */
12290
12291 static void
12292 cp_parser_explicit_specialization (cp_parser* parser)
12293 {
12294   bool need_lang_pop;
12295   cp_token *token = cp_lexer_peek_token (parser->lexer);
12296
12297   /* Look for the `template' keyword.  */
12298   cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE);
12299   /* Look for the `<'.  */
12300   cp_parser_require (parser, CPP_LESS, RT_LESS);
12301   /* Look for the `>'.  */
12302   cp_parser_require (parser, CPP_GREATER, RT_GREATER);
12303   /* We have processed another parameter list.  */
12304   ++parser->num_template_parameter_lists;
12305   /* [temp]
12306
12307      A template ... explicit specialization ... shall not have C
12308      linkage.  */
12309   if (current_lang_name == lang_name_c)
12310     {
12311       error_at (token->location, "template specialization with C linkage");
12312       /* Give it C++ linkage to avoid confusing other parts of the
12313          front end.  */
12314       push_lang_context (lang_name_cplusplus);
12315       need_lang_pop = true;
12316     }
12317   else
12318     need_lang_pop = false;
12319   /* Let the front end know that we are beginning a specialization.  */
12320   if (!begin_specialization ())
12321     {
12322       end_specialization ();
12323       return;
12324     }
12325
12326   /* If the next keyword is `template', we need to figure out whether
12327      or not we're looking a template-declaration.  */
12328   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
12329     {
12330       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
12331           && cp_lexer_peek_nth_token (parser->lexer, 3)->type != CPP_GREATER)
12332         cp_parser_template_declaration_after_export (parser,
12333                                                      /*member_p=*/false);
12334       else
12335         cp_parser_explicit_specialization (parser);
12336     }
12337   else
12338     /* Parse the dependent declaration.  */
12339     cp_parser_single_declaration (parser,
12340                                   /*checks=*/NULL,
12341                                   /*member_p=*/false,
12342                                   /*explicit_specialization_p=*/true,
12343                                   /*friend_p=*/NULL);
12344   /* We're done with the specialization.  */
12345   end_specialization ();
12346   /* For the erroneous case of a template with C linkage, we pushed an
12347      implicit C++ linkage scope; exit that scope now.  */
12348   if (need_lang_pop)
12349     pop_lang_context ();
12350   /* We're done with this parameter list.  */
12351   --parser->num_template_parameter_lists;
12352 }
12353
12354 /* Parse a type-specifier.
12355
12356    type-specifier:
12357      simple-type-specifier
12358      class-specifier
12359      enum-specifier
12360      elaborated-type-specifier
12361      cv-qualifier
12362
12363    GNU Extension:
12364
12365    type-specifier:
12366      __complex__
12367
12368    Returns a representation of the type-specifier.  For a
12369    class-specifier, enum-specifier, or elaborated-type-specifier, a
12370    TREE_TYPE is returned; otherwise, a TYPE_DECL is returned.
12371
12372    The parser flags FLAGS is used to control type-specifier parsing.
12373
12374    If IS_DECLARATION is TRUE, then this type-specifier is appearing
12375    in a decl-specifier-seq.
12376
12377    If DECLARES_CLASS_OR_ENUM is non-NULL, and the type-specifier is a
12378    class-specifier, enum-specifier, or elaborated-type-specifier, then
12379    *DECLARES_CLASS_OR_ENUM is set to a nonzero value.  The value is 1
12380    if a type is declared; 2 if it is defined.  Otherwise, it is set to
12381    zero.
12382
12383    If IS_CV_QUALIFIER is non-NULL, and the type-specifier is a
12384    cv-qualifier, then IS_CV_QUALIFIER is set to TRUE.  Otherwise, it
12385    is set to FALSE.  */
12386
12387 static tree
12388 cp_parser_type_specifier (cp_parser* parser,
12389                           cp_parser_flags flags,
12390                           cp_decl_specifier_seq *decl_specs,
12391                           bool is_declaration,
12392                           int* declares_class_or_enum,
12393                           bool* is_cv_qualifier)
12394 {
12395   tree type_spec = NULL_TREE;
12396   cp_token *token;
12397   enum rid keyword;
12398   cp_decl_spec ds = ds_last;
12399
12400   /* Assume this type-specifier does not declare a new type.  */
12401   if (declares_class_or_enum)
12402     *declares_class_or_enum = 0;
12403   /* And that it does not specify a cv-qualifier.  */
12404   if (is_cv_qualifier)
12405     *is_cv_qualifier = false;
12406   /* Peek at the next token.  */
12407   token = cp_lexer_peek_token (parser->lexer);
12408
12409   /* If we're looking at a keyword, we can use that to guide the
12410      production we choose.  */
12411   keyword = token->keyword;
12412   switch (keyword)
12413     {
12414     case RID_ENUM:
12415       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12416         goto elaborated_type_specifier;
12417
12418       /* Look for the enum-specifier.  */
12419       type_spec = cp_parser_enum_specifier (parser);
12420       /* If that worked, we're done.  */
12421       if (type_spec)
12422         {
12423           if (declares_class_or_enum)
12424             *declares_class_or_enum = 2;
12425           if (decl_specs)
12426             cp_parser_set_decl_spec_type (decl_specs,
12427                                           type_spec,
12428                                           token->location,
12429                                           /*user_defined_p=*/true);
12430           return type_spec;
12431         }
12432       else
12433         goto elaborated_type_specifier;
12434
12435       /* Any of these indicate either a class-specifier, or an
12436          elaborated-type-specifier.  */
12437     case RID_CLASS:
12438     case RID_STRUCT:
12439     case RID_UNION:
12440       if ((flags & CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS))
12441         goto elaborated_type_specifier;
12442
12443       /* Parse tentatively so that we can back up if we don't find a
12444          class-specifier.  */
12445       cp_parser_parse_tentatively (parser);
12446       /* Look for the class-specifier.  */
12447       type_spec = cp_parser_class_specifier (parser);
12448       invoke_plugin_callbacks (PLUGIN_FINISH_TYPE, type_spec);
12449       /* If that worked, we're done.  */
12450       if (cp_parser_parse_definitely (parser))
12451         {
12452           if (declares_class_or_enum)
12453             *declares_class_or_enum = 2;
12454           if (decl_specs)
12455             cp_parser_set_decl_spec_type (decl_specs,
12456                                           type_spec,
12457                                           token->location,
12458                                           /*user_defined_p=*/true);
12459           return type_spec;
12460         }
12461
12462       /* Fall through.  */
12463     elaborated_type_specifier:
12464       /* We're declaring (not defining) a class or enum.  */
12465       if (declares_class_or_enum)
12466         *declares_class_or_enum = 1;
12467
12468       /* Fall through.  */
12469     case RID_TYPENAME:
12470       /* Look for an elaborated-type-specifier.  */
12471       type_spec
12472         = (cp_parser_elaborated_type_specifier
12473            (parser,
12474             decl_specs && decl_specs->specs[(int) ds_friend],
12475             is_declaration));
12476       if (decl_specs)
12477         cp_parser_set_decl_spec_type (decl_specs,
12478                                       type_spec,
12479                                       token->location,
12480                                       /*user_defined_p=*/true);
12481       return type_spec;
12482
12483     case RID_CONST:
12484       ds = ds_const;
12485       if (is_cv_qualifier)
12486         *is_cv_qualifier = true;
12487       break;
12488
12489     case RID_VOLATILE:
12490       ds = ds_volatile;
12491       if (is_cv_qualifier)
12492         *is_cv_qualifier = true;
12493       break;
12494
12495     case RID_RESTRICT:
12496       ds = ds_restrict;
12497       if (is_cv_qualifier)
12498         *is_cv_qualifier = true;
12499       break;
12500
12501     case RID_COMPLEX:
12502       /* The `__complex__' keyword is a GNU extension.  */
12503       ds = ds_complex;
12504       break;
12505
12506     default:
12507       break;
12508     }
12509
12510   /* Handle simple keywords.  */
12511   if (ds != ds_last)
12512     {
12513       if (decl_specs)
12514         {
12515           ++decl_specs->specs[(int)ds];
12516           decl_specs->any_specifiers_p = true;
12517         }
12518       return cp_lexer_consume_token (parser->lexer)->u.value;
12519     }
12520
12521   /* If we do not already have a type-specifier, assume we are looking
12522      at a simple-type-specifier.  */
12523   type_spec = cp_parser_simple_type_specifier (parser,
12524                                                decl_specs,
12525                                                flags);
12526
12527   /* If we didn't find a type-specifier, and a type-specifier was not
12528      optional in this context, issue an error message.  */
12529   if (!type_spec && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12530     {
12531       cp_parser_error (parser, "expected type specifier");
12532       return error_mark_node;
12533     }
12534
12535   return type_spec;
12536 }
12537
12538 /* Parse a simple-type-specifier.
12539
12540    simple-type-specifier:
12541      :: [opt] nested-name-specifier [opt] type-name
12542      :: [opt] nested-name-specifier template template-id
12543      char
12544      wchar_t
12545      bool
12546      short
12547      int
12548      long
12549      signed
12550      unsigned
12551      float
12552      double
12553      void
12554
12555    C++0x Extension:
12556
12557    simple-type-specifier:
12558      auto
12559      decltype ( expression )   
12560      char16_t
12561      char32_t
12562      __underlying_type ( type-id )
12563
12564    GNU Extension:
12565
12566    simple-type-specifier:
12567      __int128
12568      __typeof__ unary-expression
12569      __typeof__ ( type-id )
12570
12571    Returns the indicated TYPE_DECL.  If DECL_SPECS is not NULL, it is
12572    appropriately updated.  */
12573
12574 static tree
12575 cp_parser_simple_type_specifier (cp_parser* parser,
12576                                  cp_decl_specifier_seq *decl_specs,
12577                                  cp_parser_flags flags)
12578 {
12579   tree type = NULL_TREE;
12580   cp_token *token;
12581
12582   /* Peek at the next token.  */
12583   token = cp_lexer_peek_token (parser->lexer);
12584
12585   /* If we're looking at a keyword, things are easy.  */
12586   switch (token->keyword)
12587     {
12588     case RID_CHAR:
12589       if (decl_specs)
12590         decl_specs->explicit_char_p = true;
12591       type = char_type_node;
12592       break;
12593     case RID_CHAR16:
12594       type = char16_type_node;
12595       break;
12596     case RID_CHAR32:
12597       type = char32_type_node;
12598       break;
12599     case RID_WCHAR:
12600       type = wchar_type_node;
12601       break;
12602     case RID_BOOL:
12603       type = boolean_type_node;
12604       break;
12605     case RID_SHORT:
12606       if (decl_specs)
12607         ++decl_specs->specs[(int) ds_short];
12608       type = short_integer_type_node;
12609       break;
12610     case RID_INT:
12611       if (decl_specs)
12612         decl_specs->explicit_int_p = true;
12613       type = integer_type_node;
12614       break;
12615     case RID_INT128:
12616       if (!int128_integer_type_node)
12617         break;
12618       if (decl_specs)
12619         decl_specs->explicit_int128_p = true;
12620       type = int128_integer_type_node;
12621       break;
12622     case RID_LONG:
12623       if (decl_specs)
12624         ++decl_specs->specs[(int) ds_long];
12625       type = long_integer_type_node;
12626       break;
12627     case RID_SIGNED:
12628       if (decl_specs)
12629         ++decl_specs->specs[(int) ds_signed];
12630       type = integer_type_node;
12631       break;
12632     case RID_UNSIGNED:
12633       if (decl_specs)
12634         ++decl_specs->specs[(int) ds_unsigned];
12635       type = unsigned_type_node;
12636       break;
12637     case RID_FLOAT:
12638       type = float_type_node;
12639       break;
12640     case RID_DOUBLE:
12641       type = double_type_node;
12642       break;
12643     case RID_VOID:
12644       type = void_type_node;
12645       break;
12646       
12647     case RID_AUTO:
12648       maybe_warn_cpp0x (CPP0X_AUTO);
12649       type = make_auto ();
12650       break;
12651
12652     case RID_DECLTYPE:
12653       /* Parse the `decltype' type.  */
12654       type = cp_parser_decltype (parser);
12655
12656       if (decl_specs)
12657         cp_parser_set_decl_spec_type (decl_specs, type,
12658                                       token->location,
12659                                       /*user_defined_p=*/true);
12660
12661       return type;
12662
12663     case RID_TYPEOF:
12664       /* Consume the `typeof' token.  */
12665       cp_lexer_consume_token (parser->lexer);
12666       /* Parse the operand to `typeof'.  */
12667       type = cp_parser_sizeof_operand (parser, RID_TYPEOF);
12668       /* If it is not already a TYPE, take its type.  */
12669       if (!TYPE_P (type))
12670         type = finish_typeof (type);
12671
12672       if (decl_specs)
12673         cp_parser_set_decl_spec_type (decl_specs, type,
12674                                       token->location,
12675                                       /*user_defined_p=*/true);
12676
12677       return type;
12678
12679     case RID_UNDERLYING_TYPE:
12680       type = cp_parser_trait_expr (parser, RID_UNDERLYING_TYPE);
12681
12682       if (decl_specs)
12683         cp_parser_set_decl_spec_type (decl_specs, type,
12684                                       token->location,
12685                                       /*user_defined_p=*/true);
12686
12687       return type;
12688
12689     default:
12690       break;
12691     }
12692
12693   /* If the type-specifier was for a built-in type, we're done.  */
12694   if (type)
12695     {
12696       /* Record the type.  */
12697       if (decl_specs
12698           && (token->keyword != RID_SIGNED
12699               && token->keyword != RID_UNSIGNED
12700               && token->keyword != RID_SHORT
12701               && token->keyword != RID_LONG))
12702         cp_parser_set_decl_spec_type (decl_specs,
12703                                       type,
12704                                       token->location,
12705                                       /*user_defined=*/false);
12706       if (decl_specs)
12707         decl_specs->any_specifiers_p = true;
12708
12709       /* Consume the token.  */
12710       cp_lexer_consume_token (parser->lexer);
12711
12712       /* There is no valid C++ program where a non-template type is
12713          followed by a "<".  That usually indicates that the user thought
12714          that the type was a template.  */
12715       cp_parser_check_for_invalid_template_id (parser, type, token->location);
12716
12717       return TYPE_NAME (type);
12718     }
12719
12720   /* The type-specifier must be a user-defined type.  */
12721   if (!(flags & CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES))
12722     {
12723       bool qualified_p;
12724       bool global_p;
12725
12726       /* Don't gobble tokens or issue error messages if this is an
12727          optional type-specifier.  */
12728       if (flags & CP_PARSER_FLAGS_OPTIONAL)
12729         cp_parser_parse_tentatively (parser);
12730
12731       /* Look for the optional `::' operator.  */
12732       global_p
12733         = (cp_parser_global_scope_opt (parser,
12734                                        /*current_scope_valid_p=*/false)
12735            != NULL_TREE);
12736       /* Look for the nested-name specifier.  */
12737       qualified_p
12738         = (cp_parser_nested_name_specifier_opt (parser,
12739                                                 /*typename_keyword_p=*/false,
12740                                                 /*check_dependency_p=*/true,
12741                                                 /*type_p=*/false,
12742                                                 /*is_declaration=*/false)
12743            != NULL_TREE);
12744       token = cp_lexer_peek_token (parser->lexer);
12745       /* If we have seen a nested-name-specifier, and the next token
12746          is `template', then we are using the template-id production.  */
12747       if (parser->scope
12748           && cp_parser_optional_template_keyword (parser))
12749         {
12750           /* Look for the template-id.  */
12751           type = cp_parser_template_id (parser,
12752                                         /*template_keyword_p=*/true,
12753                                         /*check_dependency_p=*/true,
12754                                         /*is_declaration=*/false);
12755           /* If the template-id did not name a type, we are out of
12756              luck.  */
12757           if (TREE_CODE (type) != TYPE_DECL)
12758             {
12759               cp_parser_error (parser, "expected template-id for type");
12760               type = NULL_TREE;
12761             }
12762         }
12763       /* Otherwise, look for a type-name.  */
12764       else
12765         type = cp_parser_type_name (parser);
12766       /* Keep track of all name-lookups performed in class scopes.  */
12767       if (type
12768           && !global_p
12769           && !qualified_p
12770           && TREE_CODE (type) == TYPE_DECL
12771           && TREE_CODE (DECL_NAME (type)) == IDENTIFIER_NODE)
12772         maybe_note_name_used_in_class (DECL_NAME (type), type);
12773       /* If it didn't work out, we don't have a TYPE.  */
12774       if ((flags & CP_PARSER_FLAGS_OPTIONAL)
12775           && !cp_parser_parse_definitely (parser))
12776         type = NULL_TREE;
12777       if (type && decl_specs)
12778         cp_parser_set_decl_spec_type (decl_specs, type,
12779                                       token->location,
12780                                       /*user_defined=*/true);
12781     }
12782
12783   /* If we didn't get a type-name, issue an error message.  */
12784   if (!type && !(flags & CP_PARSER_FLAGS_OPTIONAL))
12785     {
12786       cp_parser_error (parser, "expected type-name");
12787       return error_mark_node;
12788     }
12789
12790   if (type && type != error_mark_node)
12791     {
12792       /* See if TYPE is an Objective-C type, and if so, parse and
12793          accept any protocol references following it.  Do this before
12794          the cp_parser_check_for_invalid_template_id() call, because
12795          Objective-C types can be followed by '<...>' which would
12796          enclose protocol names rather than template arguments, and so
12797          everything is fine.  */
12798       if (c_dialect_objc () && !parser->scope
12799           && (objc_is_id (type) || objc_is_class_name (type)))
12800         {
12801           tree protos = cp_parser_objc_protocol_refs_opt (parser);
12802           tree qual_type = objc_get_protocol_qualified_type (type, protos);
12803
12804           /* Clobber the "unqualified" type previously entered into
12805              DECL_SPECS with the new, improved protocol-qualified version.  */
12806           if (decl_specs)
12807             decl_specs->type = qual_type;
12808
12809           return qual_type;
12810         }
12811
12812       /* There is no valid C++ program where a non-template type is
12813          followed by a "<".  That usually indicates that the user
12814          thought that the type was a template.  */
12815       cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type),
12816                                                token->location);
12817     }
12818
12819   return type;
12820 }
12821
12822 /* Parse a type-name.
12823
12824    type-name:
12825      class-name
12826      enum-name
12827      typedef-name
12828
12829    enum-name:
12830      identifier
12831
12832    typedef-name:
12833      identifier
12834
12835    Returns a TYPE_DECL for the type.  */
12836
12837 static tree
12838 cp_parser_type_name (cp_parser* parser)
12839 {
12840   tree type_decl;
12841
12842   /* We can't know yet whether it is a class-name or not.  */
12843   cp_parser_parse_tentatively (parser);
12844   /* Try a class-name.  */
12845   type_decl = cp_parser_class_name (parser,
12846                                     /*typename_keyword_p=*/false,
12847                                     /*template_keyword_p=*/false,
12848                                     none_type,
12849                                     /*check_dependency_p=*/true,
12850                                     /*class_head_p=*/false,
12851                                     /*is_declaration=*/false);
12852   /* If it's not a class-name, keep looking.  */
12853   if (!cp_parser_parse_definitely (parser))
12854     {
12855       /* It must be a typedef-name or an enum-name.  */
12856       return cp_parser_nonclass_name (parser);
12857     }
12858
12859   return type_decl;
12860 }
12861
12862 /* Parse a non-class type-name, that is, either an enum-name or a typedef-name.
12863
12864    enum-name:
12865      identifier
12866
12867    typedef-name:
12868      identifier
12869
12870    Returns a TYPE_DECL for the type.  */
12871
12872 static tree
12873 cp_parser_nonclass_name (cp_parser* parser)
12874 {
12875   tree type_decl;
12876   tree identifier;
12877
12878   cp_token *token = cp_lexer_peek_token (parser->lexer);
12879   identifier = cp_parser_identifier (parser);
12880   if (identifier == error_mark_node)
12881     return error_mark_node;
12882
12883   /* Look up the type-name.  */
12884   type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location);
12885
12886   if (TREE_CODE (type_decl) != TYPE_DECL
12887       && (objc_is_id (identifier) || objc_is_class_name (identifier)))
12888     {
12889       /* See if this is an Objective-C type.  */
12890       tree protos = cp_parser_objc_protocol_refs_opt (parser);
12891       tree type = objc_get_protocol_qualified_type (identifier, protos);
12892       if (type)
12893         type_decl = TYPE_NAME (type);
12894     }
12895
12896   /* Issue an error if we did not find a type-name.  */
12897   if (TREE_CODE (type_decl) != TYPE_DECL
12898       /* In Objective-C, we have the complication that class names are
12899          normally type names and start declarations (eg, the
12900          "NSObject" in "NSObject *object;"), but can be used in an
12901          Objective-C 2.0 dot-syntax (as in "NSObject.version") which
12902          is an expression.  So, a classname followed by a dot is not a
12903          valid type-name.  */
12904       || (objc_is_class_name (TREE_TYPE (type_decl))
12905           && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT))
12906     {
12907       if (!cp_parser_simulate_error (parser))
12908         cp_parser_name_lookup_error (parser, identifier, type_decl,
12909                                      NLE_TYPE, token->location);
12910       return error_mark_node;
12911     }
12912   /* Remember that the name was used in the definition of the
12913      current class so that we can check later to see if the
12914      meaning would have been different after the class was
12915      entirely defined.  */
12916   else if (type_decl != error_mark_node
12917            && !parser->scope)
12918     maybe_note_name_used_in_class (identifier, type_decl);
12919   
12920   return type_decl;
12921 }
12922
12923 /* Parse an elaborated-type-specifier.  Note that the grammar given
12924    here incorporates the resolution to DR68.
12925
12926    elaborated-type-specifier:
12927      class-key :: [opt] nested-name-specifier [opt] identifier
12928      class-key :: [opt] nested-name-specifier [opt] template [opt] template-id
12929      enum-key :: [opt] nested-name-specifier [opt] identifier
12930      typename :: [opt] nested-name-specifier identifier
12931      typename :: [opt] nested-name-specifier template [opt]
12932        template-id
12933
12934    GNU extension:
12935
12936    elaborated-type-specifier:
12937      class-key attributes :: [opt] nested-name-specifier [opt] identifier
12938      class-key attributes :: [opt] nested-name-specifier [opt]
12939                template [opt] template-id
12940      enum attributes :: [opt] nested-name-specifier [opt] identifier
12941
12942    If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
12943    declared `friend'.  If IS_DECLARATION is TRUE, then this
12944    elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
12945    something is being declared.
12946
12947    Returns the TYPE specified.  */
12948
12949 static tree
12950 cp_parser_elaborated_type_specifier (cp_parser* parser,
12951                                      bool is_friend,
12952                                      bool is_declaration)
12953 {
12954   enum tag_types tag_type;
12955   tree identifier;
12956   tree type = NULL_TREE;
12957   tree attributes = NULL_TREE;
12958   tree globalscope;
12959   cp_token *token = NULL;
12960
12961   /* See if we're looking at the `enum' keyword.  */
12962   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
12963     {
12964       /* Consume the `enum' token.  */
12965       cp_lexer_consume_token (parser->lexer);
12966       /* Remember that it's an enumeration type.  */
12967       tag_type = enum_type;
12968       /* Issue a warning if the `struct' or `class' key (for C++0x scoped
12969          enums) is used here.  */
12970       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
12971           || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
12972         {
12973             pedwarn (input_location, 0, "elaborated-type-specifier "
12974                       "for a scoped enum must not use the %<%D%> keyword",
12975                       cp_lexer_peek_token (parser->lexer)->u.value);
12976           /* Consume the `struct' or `class' and parse it anyway.  */
12977           cp_lexer_consume_token (parser->lexer);
12978         }
12979       /* Parse the attributes.  */
12980       attributes = cp_parser_attributes_opt (parser);
12981     }
12982   /* Or, it might be `typename'.  */
12983   else if (cp_lexer_next_token_is_keyword (parser->lexer,
12984                                            RID_TYPENAME))
12985     {
12986       /* Consume the `typename' token.  */
12987       cp_lexer_consume_token (parser->lexer);
12988       /* Remember that it's a `typename' type.  */
12989       tag_type = typename_type;
12990     }
12991   /* Otherwise it must be a class-key.  */
12992   else
12993     {
12994       tag_type = cp_parser_class_key (parser);
12995       if (tag_type == none_type)
12996         return error_mark_node;
12997       /* Parse the attributes.  */
12998       attributes = cp_parser_attributes_opt (parser);
12999     }
13000
13001   /* Look for the `::' operator.  */
13002   globalscope =  cp_parser_global_scope_opt (parser,
13003                                              /*current_scope_valid_p=*/false);
13004   /* Look for the nested-name-specifier.  */
13005   if (tag_type == typename_type && !globalscope)
13006     {
13007       if (!cp_parser_nested_name_specifier (parser,
13008                                            /*typename_keyword_p=*/true,
13009                                            /*check_dependency_p=*/true,
13010                                            /*type_p=*/true,
13011                                             is_declaration))
13012         return error_mark_node;
13013     }
13014   else
13015     /* Even though `typename' is not present, the proposed resolution
13016        to Core Issue 180 says that in `class A<T>::B', `B' should be
13017        considered a type-name, even if `A<T>' is dependent.  */
13018     cp_parser_nested_name_specifier_opt (parser,
13019                                          /*typename_keyword_p=*/true,
13020                                          /*check_dependency_p=*/true,
13021                                          /*type_p=*/true,
13022                                          is_declaration);
13023  /* For everything but enumeration types, consider a template-id.
13024     For an enumeration type, consider only a plain identifier.  */
13025   if (tag_type != enum_type)
13026     {
13027       bool template_p = false;
13028       tree decl;
13029
13030       /* Allow the `template' keyword.  */
13031       template_p = cp_parser_optional_template_keyword (parser);
13032       /* If we didn't see `template', we don't know if there's a
13033          template-id or not.  */
13034       if (!template_p)
13035         cp_parser_parse_tentatively (parser);
13036       /* Parse the template-id.  */
13037       token = cp_lexer_peek_token (parser->lexer);
13038       decl = cp_parser_template_id (parser, template_p,
13039                                     /*check_dependency_p=*/true,
13040                                     is_declaration);
13041       /* If we didn't find a template-id, look for an ordinary
13042          identifier.  */
13043       if (!template_p && !cp_parser_parse_definitely (parser))
13044         ;
13045       /* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
13046          in effect, then we must assume that, upon instantiation, the
13047          template will correspond to a class.  */
13048       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
13049                && tag_type == typename_type)
13050         type = make_typename_type (parser->scope, decl,
13051                                    typename_type,
13052                                    /*complain=*/tf_error);
13053       /* If the `typename' keyword is in effect and DECL is not a type
13054          decl. Then type is non existant.   */
13055       else if (tag_type == typename_type && TREE_CODE (decl) != TYPE_DECL)
13056         type = NULL_TREE; 
13057       else 
13058         type = TREE_TYPE (decl);
13059     }
13060
13061   if (!type)
13062     {
13063       token = cp_lexer_peek_token (parser->lexer);
13064       identifier = cp_parser_identifier (parser);
13065
13066       if (identifier == error_mark_node)
13067         {
13068           parser->scope = NULL_TREE;
13069           return error_mark_node;
13070         }
13071
13072       /* For a `typename', we needn't call xref_tag.  */
13073       if (tag_type == typename_type
13074           && TREE_CODE (parser->scope) != NAMESPACE_DECL)
13075         return cp_parser_make_typename_type (parser, parser->scope,
13076                                              identifier,
13077                                              token->location);
13078       /* Look up a qualified name in the usual way.  */
13079       if (parser->scope)
13080         {
13081           tree decl;
13082           tree ambiguous_decls;
13083
13084           decl = cp_parser_lookup_name (parser, identifier,
13085                                         tag_type,
13086                                         /*is_template=*/false,
13087                                         /*is_namespace=*/false,
13088                                         /*check_dependency=*/true,
13089                                         &ambiguous_decls,
13090                                         token->location);
13091
13092           /* If the lookup was ambiguous, an error will already have been
13093              issued.  */
13094           if (ambiguous_decls)
13095             return error_mark_node;
13096
13097           /* If we are parsing friend declaration, DECL may be a
13098              TEMPLATE_DECL tree node here.  However, we need to check
13099              whether this TEMPLATE_DECL results in valid code.  Consider
13100              the following example:
13101
13102                namespace N {
13103                  template <class T> class C {};
13104                }
13105                class X {
13106                  template <class T> friend class N::C; // #1, valid code
13107                };
13108                template <class T> class Y {
13109                  friend class N::C;                    // #2, invalid code
13110                };
13111
13112              For both case #1 and #2, we arrive at a TEMPLATE_DECL after
13113              name lookup of `N::C'.  We see that friend declaration must
13114              be template for the code to be valid.  Note that
13115              processing_template_decl does not work here since it is
13116              always 1 for the above two cases.  */
13117
13118           decl = (cp_parser_maybe_treat_template_as_class
13119                   (decl, /*tag_name_p=*/is_friend
13120                          && parser->num_template_parameter_lists));
13121
13122           if (TREE_CODE (decl) != TYPE_DECL)
13123             {
13124               cp_parser_diagnose_invalid_type_name (parser,
13125                                                     parser->scope,
13126                                                     identifier,
13127                                                     token->location);
13128               return error_mark_node;
13129             }
13130
13131           if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
13132             {
13133               bool allow_template = (parser->num_template_parameter_lists
13134                                       || DECL_SELF_REFERENCE_P (decl));
13135               type = check_elaborated_type_specifier (tag_type, decl, 
13136                                                       allow_template);
13137
13138               if (type == error_mark_node)
13139                 return error_mark_node;
13140             }
13141
13142           /* Forward declarations of nested types, such as
13143
13144                class C1::C2;
13145                class C1::C2::C3;
13146
13147              are invalid unless all components preceding the final '::'
13148              are complete.  If all enclosing types are complete, these
13149              declarations become merely pointless.
13150
13151              Invalid forward declarations of nested types are errors
13152              caught elsewhere in parsing.  Those that are pointless arrive
13153              here.  */
13154
13155           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
13156               && !is_friend && !processing_explicit_instantiation)
13157             warning (0, "declaration %qD does not declare anything", decl);
13158
13159           type = TREE_TYPE (decl);
13160         }
13161       else
13162         {
13163           /* An elaborated-type-specifier sometimes introduces a new type and
13164              sometimes names an existing type.  Normally, the rule is that it
13165              introduces a new type only if there is not an existing type of
13166              the same name already in scope.  For example, given:
13167
13168                struct S {};
13169                void f() { struct S s; }
13170
13171              the `struct S' in the body of `f' is the same `struct S' as in
13172              the global scope; the existing definition is used.  However, if
13173              there were no global declaration, this would introduce a new
13174              local class named `S'.
13175
13176              An exception to this rule applies to the following code:
13177
13178                namespace N { struct S; }
13179
13180              Here, the elaborated-type-specifier names a new type
13181              unconditionally; even if there is already an `S' in the
13182              containing scope this declaration names a new type.
13183              This exception only applies if the elaborated-type-specifier
13184              forms the complete declaration:
13185
13186                [class.name]
13187
13188                A declaration consisting solely of `class-key identifier ;' is
13189                either a redeclaration of the name in the current scope or a
13190                forward declaration of the identifier as a class name.  It
13191                introduces the name into the current scope.
13192
13193              We are in this situation precisely when the next token is a `;'.
13194
13195              An exception to the exception is that a `friend' declaration does
13196              *not* name a new type; i.e., given:
13197
13198                struct S { friend struct T; };
13199
13200              `T' is not a new type in the scope of `S'.
13201
13202              Also, `new struct S' or `sizeof (struct S)' never results in the
13203              definition of a new type; a new type can only be declared in a
13204              declaration context.  */
13205
13206           tag_scope ts;
13207           bool template_p;
13208
13209           if (is_friend)
13210             /* Friends have special name lookup rules.  */
13211             ts = ts_within_enclosing_non_class;
13212           else if (is_declaration
13213                    && cp_lexer_next_token_is (parser->lexer,
13214                                               CPP_SEMICOLON))
13215             /* This is a `class-key identifier ;' */
13216             ts = ts_current;
13217           else
13218             ts = ts_global;
13219
13220           template_p =
13221             (parser->num_template_parameter_lists
13222              && (cp_parser_next_token_starts_class_definition_p (parser)
13223                  || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)));
13224           /* An unqualified name was used to reference this type, so
13225              there were no qualifying templates.  */
13226           if (!cp_parser_check_template_parameters (parser,
13227                                                     /*num_templates=*/0,
13228                                                     token->location,
13229                                                     /*declarator=*/NULL))
13230             return error_mark_node;
13231           type = xref_tag (tag_type, identifier, ts, template_p);
13232         }
13233     }
13234
13235   if (type == error_mark_node)
13236     return error_mark_node;
13237
13238   /* Allow attributes on forward declarations of classes.  */
13239   if (attributes)
13240     {
13241       if (TREE_CODE (type) == TYPENAME_TYPE)
13242         warning (OPT_Wattributes,
13243                  "attributes ignored on uninstantiated type");
13244       else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
13245                && ! processing_explicit_instantiation)
13246         warning (OPT_Wattributes,
13247                  "attributes ignored on template instantiation");
13248       else if (is_declaration && cp_parser_declares_only_class_p (parser))
13249         cplus_decl_attributes (&type, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
13250       else
13251         warning (OPT_Wattributes,
13252                  "attributes ignored on elaborated-type-specifier that is not a forward declaration");
13253     }
13254
13255   if (tag_type != enum_type)
13256     cp_parser_check_class_key (tag_type, type);
13257
13258   /* A "<" cannot follow an elaborated type specifier.  If that
13259      happens, the user was probably trying to form a template-id.  */
13260   cp_parser_check_for_invalid_template_id (parser, type, token->location);
13261
13262   return type;
13263 }
13264
13265 /* Parse an enum-specifier.
13266
13267    enum-specifier:
13268      enum-head { enumerator-list [opt] }
13269
13270    enum-head:
13271      enum-key identifier [opt] enum-base [opt]
13272      enum-key nested-name-specifier identifier enum-base [opt]
13273
13274    enum-key:
13275      enum
13276      enum class   [C++0x]
13277      enum struct  [C++0x]
13278
13279    enum-base:   [C++0x]
13280      : type-specifier-seq
13281
13282    opaque-enum-specifier:
13283      enum-key identifier enum-base [opt] ;
13284
13285    GNU Extensions:
13286      enum-key attributes[opt] identifier [opt] enum-base [opt] 
13287        { enumerator-list [opt] }attributes[opt]
13288
13289    Returns an ENUM_TYPE representing the enumeration, or NULL_TREE
13290    if the token stream isn't an enum-specifier after all.  */
13291
13292 static tree
13293 cp_parser_enum_specifier (cp_parser* parser)
13294 {
13295   tree identifier;
13296   tree type = NULL_TREE;
13297   tree prev_scope;
13298   tree nested_name_specifier = NULL_TREE;
13299   tree attributes;
13300   bool scoped_enum_p = false;
13301   bool has_underlying_type = false;
13302   bool nested_being_defined = false;
13303   bool new_value_list = false;
13304   bool is_new_type = false;
13305   bool is_anonymous = false;
13306   tree underlying_type = NULL_TREE;
13307   cp_token *type_start_token = NULL;
13308   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
13309
13310   parser->colon_corrects_to_scope_p = false;
13311
13312   /* Parse tentatively so that we can back up if we don't find a
13313      enum-specifier.  */
13314   cp_parser_parse_tentatively (parser);
13315
13316   /* Caller guarantees that the current token is 'enum', an identifier
13317      possibly follows, and the token after that is an opening brace.
13318      If we don't have an identifier, fabricate an anonymous name for
13319      the enumeration being defined.  */
13320   cp_lexer_consume_token (parser->lexer);
13321
13322   /* Parse the "class" or "struct", which indicates a scoped
13323      enumeration type in C++0x.  */
13324   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_CLASS)
13325       || cp_lexer_next_token_is_keyword (parser->lexer, RID_STRUCT))
13326     {
13327       if (cxx_dialect < cxx0x)
13328         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13329
13330       /* Consume the `struct' or `class' token.  */
13331       cp_lexer_consume_token (parser->lexer);
13332
13333       scoped_enum_p = true;
13334     }
13335
13336   attributes = cp_parser_attributes_opt (parser);
13337
13338   /* Clear the qualification.  */
13339   parser->scope = NULL_TREE;
13340   parser->qualifying_scope = NULL_TREE;
13341   parser->object_scope = NULL_TREE;
13342
13343   /* Figure out in what scope the declaration is being placed.  */
13344   prev_scope = current_scope ();
13345
13346   type_start_token = cp_lexer_peek_token (parser->lexer);
13347
13348   push_deferring_access_checks (dk_no_check);
13349   nested_name_specifier
13350       = cp_parser_nested_name_specifier_opt (parser,
13351                                              /*typename_keyword_p=*/true,
13352                                              /*check_dependency_p=*/false,
13353                                              /*type_p=*/false,
13354                                              /*is_declaration=*/false);
13355
13356   if (nested_name_specifier)
13357     {
13358       tree name;
13359
13360       identifier = cp_parser_identifier (parser);
13361       name =  cp_parser_lookup_name (parser, identifier,
13362                                      enum_type,
13363                                      /*is_template=*/false,
13364                                      /*is_namespace=*/false,
13365                                      /*check_dependency=*/true,
13366                                      /*ambiguous_decls=*/NULL,
13367                                      input_location);
13368       if (name)
13369         {
13370           type = TREE_TYPE (name);
13371           if (TREE_CODE (type) == TYPENAME_TYPE)
13372             {
13373               /* Are template enums allowed in ISO? */
13374               if (template_parm_scope_p ())
13375                 pedwarn (type_start_token->location, OPT_pedantic,
13376                          "%qD is an enumeration template", name);
13377               /* ignore a typename reference, for it will be solved by name
13378                  in start_enum.  */
13379               type = NULL_TREE;
13380             }
13381         }
13382       else
13383         error_at (type_start_token->location,
13384                   "%qD is not an enumerator-name", identifier);
13385     }
13386   else
13387     {
13388       if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13389         identifier = cp_parser_identifier (parser);
13390       else
13391         {
13392           identifier = make_anon_name ();
13393           is_anonymous = true;
13394         }
13395     }
13396   pop_deferring_access_checks ();
13397
13398   /* Check for the `:' that denotes a specified underlying type in C++0x.
13399      Note that a ':' could also indicate a bitfield width, however.  */
13400   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
13401     {
13402       cp_decl_specifier_seq type_specifiers;
13403
13404       /* Consume the `:'.  */
13405       cp_lexer_consume_token (parser->lexer);
13406
13407       /* Parse the type-specifier-seq.  */
13408       cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
13409                                     /*is_trailing_return=*/false,
13410                                     &type_specifiers);
13411
13412       /* At this point this is surely not elaborated type specifier.  */
13413       if (!cp_parser_parse_definitely (parser))
13414         return NULL_TREE;
13415
13416       if (cxx_dialect < cxx0x)
13417         maybe_warn_cpp0x (CPP0X_SCOPED_ENUMS);
13418
13419       has_underlying_type = true;
13420
13421       /* If that didn't work, stop.  */
13422       if (type_specifiers.type != error_mark_node)
13423         {
13424           underlying_type = grokdeclarator (NULL, &type_specifiers, TYPENAME,
13425                                             /*initialized=*/0, NULL);
13426           if (underlying_type == error_mark_node)
13427             underlying_type = NULL_TREE;
13428         }
13429     }
13430
13431   /* Look for the `{' but don't consume it yet.  */
13432   if (!cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13433     {
13434       if (cxx_dialect < cxx0x || (!scoped_enum_p && !underlying_type))
13435         {
13436           cp_parser_error (parser, "expected %<{%>");
13437           if (has_underlying_type)
13438             {
13439               type = NULL_TREE;
13440               goto out;
13441             }
13442         }
13443       /* An opaque-enum-specifier must have a ';' here.  */
13444       if ((scoped_enum_p || underlying_type)
13445           && cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
13446         {
13447           cp_parser_error (parser, "expected %<;%> or %<{%>");
13448           if (has_underlying_type)
13449             {
13450               type = NULL_TREE;
13451               goto out;
13452             }
13453         }
13454     }
13455
13456   if (!has_underlying_type && !cp_parser_parse_definitely (parser))
13457     return NULL_TREE;
13458
13459   if (nested_name_specifier)
13460     {
13461       if (CLASS_TYPE_P (nested_name_specifier))
13462         {
13463           nested_being_defined = TYPE_BEING_DEFINED (nested_name_specifier);
13464           TYPE_BEING_DEFINED (nested_name_specifier) = 1;
13465           push_scope (nested_name_specifier);
13466         }
13467       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13468         {
13469           push_nested_namespace (nested_name_specifier);
13470         }
13471     }
13472
13473   /* Issue an error message if type-definitions are forbidden here.  */
13474   if (!cp_parser_check_type_definition (parser))
13475     type = error_mark_node;
13476   else
13477     /* Create the new type.  We do this before consuming the opening
13478        brace so the enum will be recorded as being on the line of its
13479        tag (or the 'enum' keyword, if there is no tag).  */
13480     type = start_enum (identifier, type, underlying_type,
13481                        scoped_enum_p, &is_new_type);
13482
13483   /* If the next token is not '{' it is an opaque-enum-specifier or an
13484      elaborated-type-specifier.  */
13485   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
13486     {
13487       timevar_push (TV_PARSE_ENUM);
13488       if (nested_name_specifier)
13489         {
13490           /* The following catches invalid code such as:
13491              enum class S<int>::E { A, B, C }; */
13492           if (!processing_specialization
13493               && CLASS_TYPE_P (nested_name_specifier)
13494               && CLASSTYPE_USE_TEMPLATE (nested_name_specifier))
13495             error_at (type_start_token->location, "cannot add an enumerator "
13496                       "list to a template instantiation");
13497
13498           /* If that scope does not contain the scope in which the
13499              class was originally declared, the program is invalid.  */
13500           if (prev_scope && !is_ancestor (prev_scope, nested_name_specifier))
13501             {
13502               if (at_namespace_scope_p ())
13503                 error_at (type_start_token->location,
13504                           "declaration of %qD in namespace %qD which does not "
13505                           "enclose %qD",
13506                           type, prev_scope, nested_name_specifier);
13507               else
13508                 error_at (type_start_token->location,
13509                           "declaration of %qD in %qD which does not enclose %qD",
13510                           type, prev_scope, nested_name_specifier);
13511               type = error_mark_node;
13512             }
13513         }
13514
13515       if (scoped_enum_p)
13516         begin_scope (sk_scoped_enum, type);
13517
13518       /* Consume the opening brace.  */
13519       cp_lexer_consume_token (parser->lexer);
13520
13521       if (type == error_mark_node)
13522         ; /* Nothing to add */
13523       else if (OPAQUE_ENUM_P (type)
13524                || (cxx_dialect > cxx98 && processing_specialization))
13525         {
13526           new_value_list = true;
13527           SET_OPAQUE_ENUM_P (type, false);
13528           DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
13529         }
13530       else
13531         {
13532           error_at (type_start_token->location, "multiple definition of %q#T", type);
13533           error_at (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
13534                     "previous definition here");
13535           type = error_mark_node;
13536         }
13537
13538       if (type == error_mark_node)
13539         cp_parser_skip_to_end_of_block_or_statement (parser);
13540       /* If the next token is not '}', then there are some enumerators.  */
13541       else if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
13542         cp_parser_enumerator_list (parser, type);
13543
13544       /* Consume the final '}'.  */
13545       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13546
13547       if (scoped_enum_p)
13548         finish_scope ();
13549       timevar_pop (TV_PARSE_ENUM);
13550     }
13551   else
13552     {
13553       /* If a ';' follows, then it is an opaque-enum-specifier
13554         and additional restrictions apply.  */
13555       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
13556         {
13557           if (is_anonymous)
13558             error_at (type_start_token->location,
13559                       "opaque-enum-specifier without name");
13560           else if (nested_name_specifier)
13561             error_at (type_start_token->location,
13562                       "opaque-enum-specifier must use a simple identifier");
13563         }
13564     }
13565
13566   /* Look for trailing attributes to apply to this enumeration, and
13567      apply them if appropriate.  */
13568   if (cp_parser_allow_gnu_extensions_p (parser))
13569     {
13570       tree trailing_attr = cp_parser_attributes_opt (parser);
13571       trailing_attr = chainon (trailing_attr, attributes);
13572       cplus_decl_attributes (&type,
13573                              trailing_attr,
13574                              (int) ATTR_FLAG_TYPE_IN_PLACE);
13575     }
13576
13577   /* Finish up the enumeration.  */
13578   if (type != error_mark_node)
13579     {
13580       if (new_value_list)
13581         finish_enum_value_list (type);
13582       if (is_new_type)
13583         finish_enum (type);
13584     }
13585
13586   if (nested_name_specifier)
13587     {
13588       if (CLASS_TYPE_P (nested_name_specifier))
13589         {
13590           TYPE_BEING_DEFINED (nested_name_specifier) = nested_being_defined;
13591           pop_scope (nested_name_specifier);
13592         }
13593       else if (TREE_CODE (nested_name_specifier) == NAMESPACE_DECL)
13594         {
13595           pop_nested_namespace (nested_name_specifier);
13596         }
13597     }
13598  out:
13599   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
13600   return type;
13601 }
13602
13603 /* Parse an enumerator-list.  The enumerators all have the indicated
13604    TYPE.
13605
13606    enumerator-list:
13607      enumerator-definition
13608      enumerator-list , enumerator-definition  */
13609
13610 static void
13611 cp_parser_enumerator_list (cp_parser* parser, tree type)
13612 {
13613   while (true)
13614     {
13615       /* Parse an enumerator-definition.  */
13616       cp_parser_enumerator_definition (parser, type);
13617
13618       /* If the next token is not a ',', we've reached the end of
13619          the list.  */
13620       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
13621         break;
13622       /* Otherwise, consume the `,' and keep going.  */
13623       cp_lexer_consume_token (parser->lexer);
13624       /* If the next token is a `}', there is a trailing comma.  */
13625       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
13626         {
13627           if (!in_system_header)
13628             pedwarn (input_location, OPT_pedantic, "comma at end of enumerator list");
13629           break;
13630         }
13631     }
13632 }
13633
13634 /* Parse an enumerator-definition.  The enumerator has the indicated
13635    TYPE.
13636
13637    enumerator-definition:
13638      enumerator
13639      enumerator = constant-expression
13640
13641    enumerator:
13642      identifier  */
13643
13644 static void
13645 cp_parser_enumerator_definition (cp_parser* parser, tree type)
13646 {
13647   tree identifier;
13648   tree value;
13649   location_t loc;
13650
13651   /* Save the input location because we are interested in the location
13652      of the identifier and not the location of the explicit value.  */
13653   loc = cp_lexer_peek_token (parser->lexer)->location;
13654
13655   /* Look for the identifier.  */
13656   identifier = cp_parser_identifier (parser);
13657   if (identifier == error_mark_node)
13658     return;
13659
13660   /* If the next token is an '=', then there is an explicit value.  */
13661   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
13662     {
13663       /* Consume the `=' token.  */
13664       cp_lexer_consume_token (parser->lexer);
13665       /* Parse the value.  */
13666       value = cp_parser_constant_expression (parser,
13667                                              /*allow_non_constant_p=*/false,
13668                                              NULL);
13669     }
13670   else
13671     value = NULL_TREE;
13672
13673   /* If we are processing a template, make sure the initializer of the
13674      enumerator doesn't contain any bare template parameter pack.  */
13675   if (check_for_bare_parameter_packs (value))
13676     value = error_mark_node;
13677
13678   /* integral_constant_value will pull out this expression, so make sure
13679      it's folded as appropriate.  */
13680   value = fold_non_dependent_expr (value);
13681
13682   /* Create the enumerator.  */
13683   build_enumerator (identifier, value, type, loc);
13684 }
13685
13686 /* Parse a namespace-name.
13687
13688    namespace-name:
13689      original-namespace-name
13690      namespace-alias
13691
13692    Returns the NAMESPACE_DECL for the namespace.  */
13693
13694 static tree
13695 cp_parser_namespace_name (cp_parser* parser)
13696 {
13697   tree identifier;
13698   tree namespace_decl;
13699
13700   cp_token *token = cp_lexer_peek_token (parser->lexer);
13701
13702   /* Get the name of the namespace.  */
13703   identifier = cp_parser_identifier (parser);
13704   if (identifier == error_mark_node)
13705     return error_mark_node;
13706
13707   /* Look up the identifier in the currently active scope.  Look only
13708      for namespaces, due to:
13709
13710        [basic.lookup.udir]
13711
13712        When looking up a namespace-name in a using-directive or alias
13713        definition, only namespace names are considered.
13714
13715      And:
13716
13717        [basic.lookup.qual]
13718
13719        During the lookup of a name preceding the :: scope resolution
13720        operator, object, function, and enumerator names are ignored.
13721
13722      (Note that cp_parser_qualifying_entity only calls this
13723      function if the token after the name is the scope resolution
13724      operator.)  */
13725   namespace_decl = cp_parser_lookup_name (parser, identifier,
13726                                           none_type,
13727                                           /*is_template=*/false,
13728                                           /*is_namespace=*/true,
13729                                           /*check_dependency=*/true,
13730                                           /*ambiguous_decls=*/NULL,
13731                                           token->location);
13732   /* If it's not a namespace, issue an error.  */
13733   if (namespace_decl == error_mark_node
13734       || TREE_CODE (namespace_decl) != NAMESPACE_DECL)
13735     {
13736       if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
13737         error_at (token->location, "%qD is not a namespace-name", identifier);
13738       cp_parser_error (parser, "expected namespace-name");
13739       namespace_decl = error_mark_node;
13740     }
13741
13742   return namespace_decl;
13743 }
13744
13745 /* Parse a namespace-definition.
13746
13747    namespace-definition:
13748      named-namespace-definition
13749      unnamed-namespace-definition
13750
13751    named-namespace-definition:
13752      original-namespace-definition
13753      extension-namespace-definition
13754
13755    original-namespace-definition:
13756      namespace identifier { namespace-body }
13757
13758    extension-namespace-definition:
13759      namespace original-namespace-name { namespace-body }
13760
13761    unnamed-namespace-definition:
13762      namespace { namespace-body } */
13763
13764 static void
13765 cp_parser_namespace_definition (cp_parser* parser)
13766 {
13767   tree identifier, attribs;
13768   bool has_visibility;
13769   bool is_inline;
13770
13771   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_INLINE))
13772     {
13773       maybe_warn_cpp0x (CPP0X_INLINE_NAMESPACES);
13774       is_inline = true;
13775       cp_lexer_consume_token (parser->lexer);
13776     }
13777   else
13778     is_inline = false;
13779
13780   /* Look for the `namespace' keyword.  */
13781   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
13782
13783   /* Get the name of the namespace.  We do not attempt to distinguish
13784      between an original-namespace-definition and an
13785      extension-namespace-definition at this point.  The semantic
13786      analysis routines are responsible for that.  */
13787   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
13788     identifier = cp_parser_identifier (parser);
13789   else
13790     identifier = NULL_TREE;
13791
13792   /* Parse any specified attributes.  */
13793   attribs = cp_parser_attributes_opt (parser);
13794
13795   /* Look for the `{' to start the namespace.  */
13796   cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE);
13797   /* Start the namespace.  */
13798   push_namespace (identifier);
13799
13800   /* "inline namespace" is equivalent to a stub namespace definition
13801      followed by a strong using directive.  */
13802   if (is_inline)
13803     {
13804       tree name_space = current_namespace;
13805       /* Set up namespace association.  */
13806       DECL_NAMESPACE_ASSOCIATIONS (name_space)
13807         = tree_cons (CP_DECL_CONTEXT (name_space), NULL_TREE,
13808                      DECL_NAMESPACE_ASSOCIATIONS (name_space));
13809       /* Import the contents of the inline namespace.  */
13810       pop_namespace ();
13811       do_using_directive (name_space);
13812       push_namespace (identifier);
13813     }
13814
13815   has_visibility = handle_namespace_attrs (current_namespace, attribs);
13816
13817   /* Parse the body of the namespace.  */
13818   cp_parser_namespace_body (parser);
13819
13820   if (has_visibility)
13821     pop_visibility (1);
13822
13823   /* Finish the namespace.  */
13824   pop_namespace ();
13825   /* Look for the final `}'.  */
13826   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
13827 }
13828
13829 /* Parse a namespace-body.
13830
13831    namespace-body:
13832      declaration-seq [opt]  */
13833
13834 static void
13835 cp_parser_namespace_body (cp_parser* parser)
13836 {
13837   cp_parser_declaration_seq_opt (parser);
13838 }
13839
13840 /* Parse a namespace-alias-definition.
13841
13842    namespace-alias-definition:
13843      namespace identifier = qualified-namespace-specifier ;  */
13844
13845 static void
13846 cp_parser_namespace_alias_definition (cp_parser* parser)
13847 {
13848   tree identifier;
13849   tree namespace_specifier;
13850
13851   cp_token *token = cp_lexer_peek_token (parser->lexer);
13852
13853   /* Look for the `namespace' keyword.  */
13854   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
13855   /* Look for the identifier.  */
13856   identifier = cp_parser_identifier (parser);
13857   if (identifier == error_mark_node)
13858     return;
13859   /* Look for the `=' token.  */
13860   if (!cp_parser_uncommitted_to_tentative_parse_p (parser)
13861       && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) 
13862     {
13863       error_at (token->location, "%<namespace%> definition is not allowed here");
13864       /* Skip the definition.  */
13865       cp_lexer_consume_token (parser->lexer);
13866       if (cp_parser_skip_to_closing_brace (parser))
13867         cp_lexer_consume_token (parser->lexer);
13868       return;
13869     }
13870   cp_parser_require (parser, CPP_EQ, RT_EQ);
13871   /* Look for the qualified-namespace-specifier.  */
13872   namespace_specifier
13873     = cp_parser_qualified_namespace_specifier (parser);
13874   /* Look for the `;' token.  */
13875   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
13876
13877   /* Register the alias in the symbol table.  */
13878   do_namespace_alias (identifier, namespace_specifier);
13879 }
13880
13881 /* Parse a qualified-namespace-specifier.
13882
13883    qualified-namespace-specifier:
13884      :: [opt] nested-name-specifier [opt] namespace-name
13885
13886    Returns a NAMESPACE_DECL corresponding to the specified
13887    namespace.  */
13888
13889 static tree
13890 cp_parser_qualified_namespace_specifier (cp_parser* parser)
13891 {
13892   /* Look for the optional `::'.  */
13893   cp_parser_global_scope_opt (parser,
13894                               /*current_scope_valid_p=*/false);
13895
13896   /* Look for the optional nested-name-specifier.  */
13897   cp_parser_nested_name_specifier_opt (parser,
13898                                        /*typename_keyword_p=*/false,
13899                                        /*check_dependency_p=*/true,
13900                                        /*type_p=*/false,
13901                                        /*is_declaration=*/true);
13902
13903   return cp_parser_namespace_name (parser);
13904 }
13905
13906 /* Parse a using-declaration, or, if ACCESS_DECLARATION_P is true, an
13907    access declaration.
13908
13909    using-declaration:
13910      using typename [opt] :: [opt] nested-name-specifier unqualified-id ;
13911      using :: unqualified-id ;  
13912
13913    access-declaration:
13914      qualified-id ;  
13915
13916    */
13917
13918 static bool
13919 cp_parser_using_declaration (cp_parser* parser, 
13920                              bool access_declaration_p)
13921 {
13922   cp_token *token;
13923   bool typename_p = false;
13924   bool global_scope_p;
13925   tree decl;
13926   tree identifier;
13927   tree qscope;
13928
13929   if (access_declaration_p)
13930     cp_parser_parse_tentatively (parser);
13931   else
13932     {
13933       /* Look for the `using' keyword.  */
13934       cp_parser_require_keyword (parser, RID_USING, RT_USING);
13935       
13936       /* Peek at the next token.  */
13937       token = cp_lexer_peek_token (parser->lexer);
13938       /* See if it's `typename'.  */
13939       if (token->keyword == RID_TYPENAME)
13940         {
13941           /* Remember that we've seen it.  */
13942           typename_p = true;
13943           /* Consume the `typename' token.  */
13944           cp_lexer_consume_token (parser->lexer);
13945         }
13946     }
13947
13948   /* Look for the optional global scope qualification.  */
13949   global_scope_p
13950     = (cp_parser_global_scope_opt (parser,
13951                                    /*current_scope_valid_p=*/false)
13952        != NULL_TREE);
13953
13954   /* If we saw `typename', or didn't see `::', then there must be a
13955      nested-name-specifier present.  */
13956   if (typename_p || !global_scope_p)
13957     qscope = cp_parser_nested_name_specifier (parser, typename_p,
13958                                               /*check_dependency_p=*/true,
13959                                               /*type_p=*/false,
13960                                               /*is_declaration=*/true);
13961   /* Otherwise, we could be in either of the two productions.  In that
13962      case, treat the nested-name-specifier as optional.  */
13963   else
13964     qscope = cp_parser_nested_name_specifier_opt (parser,
13965                                                   /*typename_keyword_p=*/false,
13966                                                   /*check_dependency_p=*/true,
13967                                                   /*type_p=*/false,
13968                                                   /*is_declaration=*/true);
13969   if (!qscope)
13970     qscope = global_namespace;
13971
13972   if (access_declaration_p && cp_parser_error_occurred (parser))
13973     /* Something has already gone wrong; there's no need to parse
13974        further.  Since an error has occurred, the return value of
13975        cp_parser_parse_definitely will be false, as required.  */
13976     return cp_parser_parse_definitely (parser);
13977
13978   token = cp_lexer_peek_token (parser->lexer);
13979   /* Parse the unqualified-id.  */
13980   identifier = cp_parser_unqualified_id (parser,
13981                                          /*template_keyword_p=*/false,
13982                                          /*check_dependency_p=*/true,
13983                                          /*declarator_p=*/true,
13984                                          /*optional_p=*/false);
13985
13986   if (access_declaration_p)
13987     {
13988       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
13989         cp_parser_simulate_error (parser);
13990       if (!cp_parser_parse_definitely (parser))
13991         return false;
13992     }
13993
13994   /* The function we call to handle a using-declaration is different
13995      depending on what scope we are in.  */
13996   if (qscope == error_mark_node || identifier == error_mark_node)
13997     ;
13998   else if (TREE_CODE (identifier) != IDENTIFIER_NODE
13999            && TREE_CODE (identifier) != BIT_NOT_EXPR)
14000     /* [namespace.udecl]
14001
14002        A using declaration shall not name a template-id.  */
14003     error_at (token->location,
14004               "a template-id may not appear in a using-declaration");
14005   else
14006     {
14007       if (at_class_scope_p ())
14008         {
14009           /* Create the USING_DECL.  */
14010           decl = do_class_using_decl (parser->scope, identifier);
14011
14012           if (check_for_bare_parameter_packs (decl))
14013             return false;
14014           else
14015             /* Add it to the list of members in this class.  */
14016             finish_member_declaration (decl);
14017         }
14018       else
14019         {
14020           decl = cp_parser_lookup_name_simple (parser,
14021                                                identifier,
14022                                                token->location);
14023           if (decl == error_mark_node)
14024             cp_parser_name_lookup_error (parser, identifier,
14025                                          decl, NLE_NULL,
14026                                          token->location);
14027           else if (check_for_bare_parameter_packs (decl))
14028             return false;
14029           else if (!at_namespace_scope_p ())
14030             do_local_using_decl (decl, qscope, identifier);
14031           else
14032             do_toplevel_using_decl (decl, qscope, identifier);
14033         }
14034     }
14035
14036   /* Look for the final `;'.  */
14037   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14038   
14039   return true;
14040 }
14041
14042 /* Parse a using-directive.
14043
14044    using-directive:
14045      using namespace :: [opt] nested-name-specifier [opt]
14046        namespace-name ;  */
14047
14048 static void
14049 cp_parser_using_directive (cp_parser* parser)
14050 {
14051   tree namespace_decl;
14052   tree attribs;
14053
14054   /* Look for the `using' keyword.  */
14055   cp_parser_require_keyword (parser, RID_USING, RT_USING);
14056   /* And the `namespace' keyword.  */
14057   cp_parser_require_keyword (parser, RID_NAMESPACE, RT_NAMESPACE);
14058   /* Look for the optional `::' operator.  */
14059   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
14060   /* And the optional nested-name-specifier.  */
14061   cp_parser_nested_name_specifier_opt (parser,
14062                                        /*typename_keyword_p=*/false,
14063                                        /*check_dependency_p=*/true,
14064                                        /*type_p=*/false,
14065                                        /*is_declaration=*/true);
14066   /* Get the namespace being used.  */
14067   namespace_decl = cp_parser_namespace_name (parser);
14068   /* And any specified attributes.  */
14069   attribs = cp_parser_attributes_opt (parser);
14070   /* Update the symbol table.  */
14071   parse_using_directive (namespace_decl, attribs);
14072   /* Look for the final `;'.  */
14073   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14074 }
14075
14076 /* Parse an asm-definition.
14077
14078    asm-definition:
14079      asm ( string-literal ) ;
14080
14081    GNU Extension:
14082
14083    asm-definition:
14084      asm volatile [opt] ( string-literal ) ;
14085      asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
14086      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14087                           : asm-operand-list [opt] ) ;
14088      asm volatile [opt] ( string-literal : asm-operand-list [opt]
14089                           : asm-operand-list [opt]
14090                           : asm-clobber-list [opt] ) ;
14091      asm volatile [opt] goto ( string-literal : : asm-operand-list [opt]
14092                                : asm-clobber-list [opt]
14093                                : asm-goto-list ) ;  */
14094
14095 static void
14096 cp_parser_asm_definition (cp_parser* parser)
14097 {
14098   tree string;
14099   tree outputs = NULL_TREE;
14100   tree inputs = NULL_TREE;
14101   tree clobbers = NULL_TREE;
14102   tree labels = NULL_TREE;
14103   tree asm_stmt;
14104   bool volatile_p = false;
14105   bool extended_p = false;
14106   bool invalid_inputs_p = false;
14107   bool invalid_outputs_p = false;
14108   bool goto_p = false;
14109   required_token missing = RT_NONE;
14110
14111   /* Look for the `asm' keyword.  */
14112   cp_parser_require_keyword (parser, RID_ASM, RT_ASM);
14113   /* See if the next token is `volatile'.  */
14114   if (cp_parser_allow_gnu_extensions_p (parser)
14115       && cp_lexer_next_token_is_keyword (parser->lexer, RID_VOLATILE))
14116     {
14117       /* Remember that we saw the `volatile' keyword.  */
14118       volatile_p = true;
14119       /* Consume the token.  */
14120       cp_lexer_consume_token (parser->lexer);
14121     }
14122   if (cp_parser_allow_gnu_extensions_p (parser)
14123       && parser->in_function_body
14124       && cp_lexer_next_token_is_keyword (parser->lexer, RID_GOTO))
14125     {
14126       /* Remember that we saw the `goto' keyword.  */
14127       goto_p = true;
14128       /* Consume the token.  */
14129       cp_lexer_consume_token (parser->lexer);
14130     }
14131   /* Look for the opening `('.  */
14132   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
14133     return;
14134   /* Look for the string.  */
14135   string = cp_parser_string_literal (parser, false, false);
14136   if (string == error_mark_node)
14137     {
14138       cp_parser_skip_to_closing_parenthesis (parser, true, false,
14139                                              /*consume_paren=*/true);
14140       return;
14141     }
14142
14143   /* If we're allowing GNU extensions, check for the extended assembly
14144      syntax.  Unfortunately, the `:' tokens need not be separated by
14145      a space in C, and so, for compatibility, we tolerate that here
14146      too.  Doing that means that we have to treat the `::' operator as
14147      two `:' tokens.  */
14148   if (cp_parser_allow_gnu_extensions_p (parser)
14149       && parser->in_function_body
14150       && (cp_lexer_next_token_is (parser->lexer, CPP_COLON)
14151           || cp_lexer_next_token_is (parser->lexer, CPP_SCOPE)))
14152     {
14153       bool inputs_p = false;
14154       bool clobbers_p = false;
14155       bool labels_p = false;
14156
14157       /* The extended syntax was used.  */
14158       extended_p = true;
14159
14160       /* Look for outputs.  */
14161       if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14162         {
14163           /* Consume the `:'.  */
14164           cp_lexer_consume_token (parser->lexer);
14165           /* Parse the output-operands.  */
14166           if (cp_lexer_next_token_is_not (parser->lexer,
14167                                           CPP_COLON)
14168               && cp_lexer_next_token_is_not (parser->lexer,
14169                                              CPP_SCOPE)
14170               && cp_lexer_next_token_is_not (parser->lexer,
14171                                              CPP_CLOSE_PAREN)
14172               && !goto_p)
14173             outputs = cp_parser_asm_operand_list (parser);
14174
14175             if (outputs == error_mark_node)
14176               invalid_outputs_p = true;
14177         }
14178       /* If the next token is `::', there are no outputs, and the
14179          next token is the beginning of the inputs.  */
14180       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14181         /* The inputs are coming next.  */
14182         inputs_p = true;
14183
14184       /* Look for inputs.  */
14185       if (inputs_p
14186           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14187         {
14188           /* Consume the `:' or `::'.  */
14189           cp_lexer_consume_token (parser->lexer);
14190           /* Parse the output-operands.  */
14191           if (cp_lexer_next_token_is_not (parser->lexer,
14192                                           CPP_COLON)
14193               && cp_lexer_next_token_is_not (parser->lexer,
14194                                              CPP_SCOPE)
14195               && cp_lexer_next_token_is_not (parser->lexer,
14196                                              CPP_CLOSE_PAREN))
14197             inputs = cp_parser_asm_operand_list (parser);
14198
14199             if (inputs == error_mark_node)
14200               invalid_inputs_p = true;
14201         }
14202       else if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14203         /* The clobbers are coming next.  */
14204         clobbers_p = true;
14205
14206       /* Look for clobbers.  */
14207       if (clobbers_p
14208           || cp_lexer_next_token_is (parser->lexer, CPP_COLON))
14209         {
14210           clobbers_p = true;
14211           /* Consume the `:' or `::'.  */
14212           cp_lexer_consume_token (parser->lexer);
14213           /* Parse the clobbers.  */
14214           if (cp_lexer_next_token_is_not (parser->lexer,
14215                                           CPP_COLON)
14216               && cp_lexer_next_token_is_not (parser->lexer,
14217                                              CPP_CLOSE_PAREN))
14218             clobbers = cp_parser_asm_clobber_list (parser);
14219         }
14220       else if (goto_p
14221                && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
14222         /* The labels are coming next.  */
14223         labels_p = true;
14224
14225       /* Look for labels.  */
14226       if (labels_p
14227           || (goto_p && cp_lexer_next_token_is (parser->lexer, CPP_COLON)))
14228         {
14229           labels_p = true;
14230           /* Consume the `:' or `::'.  */
14231           cp_lexer_consume_token (parser->lexer);
14232           /* Parse the labels.  */
14233           labels = cp_parser_asm_label_list (parser);
14234         }
14235
14236       if (goto_p && !labels_p)
14237         missing = clobbers_p ? RT_COLON : RT_COLON_SCOPE;
14238     }
14239   else if (goto_p)
14240     missing = RT_COLON_SCOPE;
14241
14242   /* Look for the closing `)'.  */
14243   if (!cp_parser_require (parser, missing ? CPP_COLON : CPP_CLOSE_PAREN,
14244                           missing ? missing : RT_CLOSE_PAREN))
14245     cp_parser_skip_to_closing_parenthesis (parser, true, false,
14246                                            /*consume_paren=*/true);
14247   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
14248
14249   if (!invalid_inputs_p && !invalid_outputs_p)
14250     {
14251       /* Create the ASM_EXPR.  */
14252       if (parser->in_function_body)
14253         {
14254           asm_stmt = finish_asm_stmt (volatile_p, string, outputs,
14255                                       inputs, clobbers, labels);
14256           /* If the extended syntax was not used, mark the ASM_EXPR.  */
14257           if (!extended_p)
14258             {
14259               tree temp = asm_stmt;
14260               if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
14261                 temp = TREE_OPERAND (temp, 0);
14262
14263               ASM_INPUT_P (temp) = 1;
14264             }
14265         }
14266       else
14267         cgraph_add_asm_node (string);
14268     }
14269 }
14270
14271 /* Declarators [gram.dcl.decl] */
14272
14273 /* Parse an init-declarator.
14274
14275    init-declarator:
14276      declarator initializer [opt]
14277
14278    GNU Extension:
14279
14280    init-declarator:
14281      declarator asm-specification [opt] attributes [opt] initializer [opt]
14282
14283    function-definition:
14284      decl-specifier-seq [opt] declarator ctor-initializer [opt]
14285        function-body
14286      decl-specifier-seq [opt] declarator function-try-block
14287
14288    GNU Extension:
14289
14290    function-definition:
14291      __extension__ function-definition
14292
14293    The DECL_SPECIFIERS apply to this declarator.  Returns a
14294    representation of the entity declared.  If MEMBER_P is TRUE, then
14295    this declarator appears in a class scope.  The new DECL created by
14296    this declarator is returned.
14297
14298    The CHECKS are access checks that should be performed once we know
14299    what entity is being declared (and, therefore, what classes have
14300    befriended it).
14301
14302    If FUNCTION_DEFINITION_ALLOWED_P then we handle the declarator and
14303    for a function-definition here as well.  If the declarator is a
14304    declarator for a function-definition, *FUNCTION_DEFINITION_P will
14305    be TRUE upon return.  By that point, the function-definition will
14306    have been completely parsed.
14307
14308    FUNCTION_DEFINITION_P may be NULL if FUNCTION_DEFINITION_ALLOWED_P
14309    is FALSE.
14310
14311    If MAYBE_RANGE_FOR_DECL is not NULL, the pointed tree will be set to the
14312    parsed declaration if it is an uninitialized single declarator not followed
14313    by a `;', or to error_mark_node otherwise. Either way, the trailing `;',
14314    if present, will not be consumed.  If returned, this declarator will be
14315    created with SD_INITIALIZED but will not call cp_finish_decl.  */
14316
14317 static tree
14318 cp_parser_init_declarator (cp_parser* parser,
14319                            cp_decl_specifier_seq *decl_specifiers,
14320                            VEC (deferred_access_check,gc)* checks,
14321                            bool function_definition_allowed_p,
14322                            bool member_p,
14323                            int declares_class_or_enum,
14324                            bool* function_definition_p,
14325                            tree* maybe_range_for_decl)
14326 {
14327   cp_token *token = NULL, *asm_spec_start_token = NULL,
14328            *attributes_start_token = NULL;
14329   cp_declarator *declarator;
14330   tree prefix_attributes;
14331   tree attributes;
14332   tree asm_specification;
14333   tree initializer;
14334   tree decl = NULL_TREE;
14335   tree scope;
14336   int is_initialized;
14337   /* Only valid if IS_INITIALIZED is true.  In that case, CPP_EQ if
14338      initialized with "= ..", CPP_OPEN_PAREN if initialized with
14339      "(...)".  */
14340   enum cpp_ttype initialization_kind;
14341   bool is_direct_init = false;
14342   bool is_non_constant_init;
14343   int ctor_dtor_or_conv_p;
14344   bool friend_p;
14345   tree pushed_scope = NULL_TREE;
14346   bool range_for_decl_p = false;
14347
14348   /* Gather the attributes that were provided with the
14349      decl-specifiers.  */
14350   prefix_attributes = decl_specifiers->attributes;
14351
14352   /* Assume that this is not the declarator for a function
14353      definition.  */
14354   if (function_definition_p)
14355     *function_definition_p = false;
14356
14357   /* Defer access checks while parsing the declarator; we cannot know
14358      what names are accessible until we know what is being
14359      declared.  */
14360   resume_deferring_access_checks ();
14361
14362   /* Parse the declarator.  */
14363   token = cp_lexer_peek_token (parser->lexer);
14364   declarator
14365     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
14366                             &ctor_dtor_or_conv_p,
14367                             /*parenthesized_p=*/NULL,
14368                             /*member_p=*/false);
14369   /* Gather up the deferred checks.  */
14370   stop_deferring_access_checks ();
14371
14372   /* If the DECLARATOR was erroneous, there's no need to go
14373      further.  */
14374   if (declarator == cp_error_declarator)
14375     return error_mark_node;
14376
14377   /* Check that the number of template-parameter-lists is OK.  */
14378   if (!cp_parser_check_declarator_template_parameters (parser, declarator,
14379                                                        token->location))
14380     return error_mark_node;
14381
14382   if (declares_class_or_enum & 2)
14383     cp_parser_check_for_definition_in_return_type (declarator,
14384                                                    decl_specifiers->type,
14385                                                    decl_specifiers->type_location);
14386
14387   /* Figure out what scope the entity declared by the DECLARATOR is
14388      located in.  `grokdeclarator' sometimes changes the scope, so
14389      we compute it now.  */
14390   scope = get_scope_of_declarator (declarator);
14391
14392   /* Perform any lookups in the declared type which were thought to be
14393      dependent, but are not in the scope of the declarator.  */
14394   decl_specifiers->type
14395     = maybe_update_decl_type (decl_specifiers->type, scope);
14396
14397   /* If we're allowing GNU extensions, look for an asm-specification
14398      and attributes.  */
14399   if (cp_parser_allow_gnu_extensions_p (parser))
14400     {
14401       /* Look for an asm-specification.  */
14402       asm_spec_start_token = cp_lexer_peek_token (parser->lexer);
14403       asm_specification = cp_parser_asm_specification_opt (parser);
14404       /* And attributes.  */
14405       attributes_start_token = cp_lexer_peek_token (parser->lexer);
14406       attributes = cp_parser_attributes_opt (parser);
14407     }
14408   else
14409     {
14410       asm_specification = NULL_TREE;
14411       attributes = NULL_TREE;
14412     }
14413
14414   /* Peek at the next token.  */
14415   token = cp_lexer_peek_token (parser->lexer);
14416   /* Check to see if the token indicates the start of a
14417      function-definition.  */
14418   if (function_declarator_p (declarator)
14419       && cp_parser_token_starts_function_definition_p (token))
14420     {
14421       if (!function_definition_allowed_p)
14422         {
14423           /* If a function-definition should not appear here, issue an
14424              error message.  */
14425           cp_parser_error (parser,
14426                            "a function-definition is not allowed here");
14427           return error_mark_node;
14428         }
14429       else
14430         {
14431           location_t func_brace_location
14432             = cp_lexer_peek_token (parser->lexer)->location;
14433
14434           /* Neither attributes nor an asm-specification are allowed
14435              on a function-definition.  */
14436           if (asm_specification)
14437             error_at (asm_spec_start_token->location,
14438                       "an asm-specification is not allowed "
14439                       "on a function-definition");
14440           if (attributes)
14441             error_at (attributes_start_token->location,
14442                       "attributes are not allowed on a function-definition");
14443           /* This is a function-definition.  */
14444           *function_definition_p = true;
14445
14446           /* Parse the function definition.  */
14447           if (member_p)
14448             decl = cp_parser_save_member_function_body (parser,
14449                                                         decl_specifiers,
14450                                                         declarator,
14451                                                         prefix_attributes);
14452           else
14453             decl
14454               = (cp_parser_function_definition_from_specifiers_and_declarator
14455                  (parser, decl_specifiers, prefix_attributes, declarator));
14456
14457           if (decl != error_mark_node && DECL_STRUCT_FUNCTION (decl))
14458             {
14459               /* This is where the prologue starts...  */
14460               DECL_STRUCT_FUNCTION (decl)->function_start_locus
14461                 = func_brace_location;
14462             }
14463
14464           return decl;
14465         }
14466     }
14467
14468   /* [dcl.dcl]
14469
14470      Only in function declarations for constructors, destructors, and
14471      type conversions can the decl-specifier-seq be omitted.
14472
14473      We explicitly postpone this check past the point where we handle
14474      function-definitions because we tolerate function-definitions
14475      that are missing their return types in some modes.  */
14476   if (!decl_specifiers->any_specifiers_p && ctor_dtor_or_conv_p <= 0)
14477     {
14478       cp_parser_error (parser,
14479                        "expected constructor, destructor, or type conversion");
14480       return error_mark_node;
14481     }
14482
14483   /* An `=' or an `(', or an '{' in C++0x, indicates an initializer.  */
14484   if (token->type == CPP_EQ
14485       || token->type == CPP_OPEN_PAREN
14486       || token->type == CPP_OPEN_BRACE)
14487     {
14488       is_initialized = SD_INITIALIZED;
14489       initialization_kind = token->type;
14490       if (maybe_range_for_decl)
14491         *maybe_range_for_decl = error_mark_node;
14492
14493       if (token->type == CPP_EQ
14494           && function_declarator_p (declarator))
14495         {
14496           cp_token *t2 = cp_lexer_peek_nth_token (parser->lexer, 2);
14497           if (t2->keyword == RID_DEFAULT)
14498             is_initialized = SD_DEFAULTED;
14499           else if (t2->keyword == RID_DELETE)
14500             is_initialized = SD_DELETED;
14501         }
14502     }
14503   else
14504     {
14505       /* If the init-declarator isn't initialized and isn't followed by a
14506          `,' or `;', it's not a valid init-declarator.  */
14507       if (token->type != CPP_COMMA
14508           && token->type != CPP_SEMICOLON)
14509         {
14510           if (maybe_range_for_decl && *maybe_range_for_decl != error_mark_node)
14511             range_for_decl_p = true;
14512           else
14513             {
14514               cp_parser_error (parser, "expected initializer");
14515               return error_mark_node;
14516             }
14517         }
14518       is_initialized = SD_UNINITIALIZED;
14519       initialization_kind = CPP_EOF;
14520     }
14521
14522   /* Because start_decl has side-effects, we should only call it if we
14523      know we're going ahead.  By this point, we know that we cannot
14524      possibly be looking at any other construct.  */
14525   cp_parser_commit_to_tentative_parse (parser);
14526
14527   /* If the decl specifiers were bad, issue an error now that we're
14528      sure this was intended to be a declarator.  Then continue
14529      declaring the variable(s), as int, to try to cut down on further
14530      errors.  */
14531   if (decl_specifiers->any_specifiers_p
14532       && decl_specifiers->type == error_mark_node)
14533     {
14534       cp_parser_error (parser, "invalid type in declaration");
14535       decl_specifiers->type = integer_type_node;
14536     }
14537
14538   /* Check to see whether or not this declaration is a friend.  */
14539   friend_p = cp_parser_friend_p (decl_specifiers);
14540
14541   /* Enter the newly declared entry in the symbol table.  If we're
14542      processing a declaration in a class-specifier, we wait until
14543      after processing the initializer.  */
14544   if (!member_p)
14545     {
14546       if (parser->in_unbraced_linkage_specification_p)
14547         decl_specifiers->storage_class = sc_extern;
14548       decl = start_decl (declarator, decl_specifiers,
14549                          range_for_decl_p? SD_INITIALIZED : is_initialized,
14550                          attributes, prefix_attributes,
14551                          &pushed_scope);
14552       /* Adjust location of decl if declarator->id_loc is more appropriate:
14553          set, and decl wasn't merged with another decl, in which case its
14554          location would be different from input_location, and more accurate.  */
14555       if (DECL_P (decl)
14556           && declarator->id_loc != UNKNOWN_LOCATION
14557           && DECL_SOURCE_LOCATION (decl) == input_location)
14558         DECL_SOURCE_LOCATION (decl) = declarator->id_loc;
14559     }
14560   else if (scope)
14561     /* Enter the SCOPE.  That way unqualified names appearing in the
14562        initializer will be looked up in SCOPE.  */
14563     pushed_scope = push_scope (scope);
14564
14565   /* Perform deferred access control checks, now that we know in which
14566      SCOPE the declared entity resides.  */
14567   if (!member_p && decl)
14568     {
14569       tree saved_current_function_decl = NULL_TREE;
14570
14571       /* If the entity being declared is a function, pretend that we
14572          are in its scope.  If it is a `friend', it may have access to
14573          things that would not otherwise be accessible.  */
14574       if (TREE_CODE (decl) == FUNCTION_DECL)
14575         {
14576           saved_current_function_decl = current_function_decl;
14577           current_function_decl = decl;
14578         }
14579
14580       /* Perform access checks for template parameters.  */
14581       cp_parser_perform_template_parameter_access_checks (checks);
14582
14583       /* Perform the access control checks for the declarator and the
14584          decl-specifiers.  */
14585       perform_deferred_access_checks ();
14586
14587       /* Restore the saved value.  */
14588       if (TREE_CODE (decl) == FUNCTION_DECL)
14589         current_function_decl = saved_current_function_decl;
14590     }
14591
14592   /* Parse the initializer.  */
14593   initializer = NULL_TREE;
14594   is_direct_init = false;
14595   is_non_constant_init = true;
14596   if (is_initialized)
14597     {
14598       if (function_declarator_p (declarator))
14599         {
14600           cp_token *initializer_start_token = cp_lexer_peek_token (parser->lexer);
14601            if (initialization_kind == CPP_EQ)
14602              initializer = cp_parser_pure_specifier (parser);
14603            else
14604              {
14605                /* If the declaration was erroneous, we don't really
14606                   know what the user intended, so just silently
14607                   consume the initializer.  */
14608                if (decl != error_mark_node)
14609                  error_at (initializer_start_token->location,
14610                            "initializer provided for function");
14611                cp_parser_skip_to_closing_parenthesis (parser,
14612                                                       /*recovering=*/true,
14613                                                       /*or_comma=*/false,
14614                                                       /*consume_paren=*/true);
14615              }
14616         }
14617       else
14618         {
14619           /* We want to record the extra mangling scope for in-class
14620              initializers of class members and initializers of static data
14621              member templates.  The former is a C++0x feature which isn't
14622              implemented yet, and I expect it will involve deferring
14623              parsing of the initializer until end of class as with default
14624              arguments.  So right here we only handle the latter.  */
14625           if (!member_p && processing_template_decl)
14626             start_lambda_scope (decl);
14627           initializer = cp_parser_initializer (parser,
14628                                                &is_direct_init,
14629                                                &is_non_constant_init);
14630           if (!member_p && processing_template_decl)
14631             finish_lambda_scope ();
14632         }
14633     }
14634
14635   /* The old parser allows attributes to appear after a parenthesized
14636      initializer.  Mark Mitchell proposed removing this functionality
14637      on the GCC mailing lists on 2002-08-13.  This parser accepts the
14638      attributes -- but ignores them.  */
14639   if (cp_parser_allow_gnu_extensions_p (parser)
14640       && initialization_kind == CPP_OPEN_PAREN)
14641     if (cp_parser_attributes_opt (parser))
14642       warning (OPT_Wattributes,
14643                "attributes after parenthesized initializer ignored");
14644
14645   /* For an in-class declaration, use `grokfield' to create the
14646      declaration.  */
14647   if (member_p)
14648     {
14649       if (pushed_scope)
14650         {
14651           pop_scope (pushed_scope);
14652           pushed_scope = NULL_TREE;
14653         }
14654       decl = grokfield (declarator, decl_specifiers,
14655                         initializer, !is_non_constant_init,
14656                         /*asmspec=*/NULL_TREE,
14657                         prefix_attributes);
14658       if (decl && TREE_CODE (decl) == FUNCTION_DECL)
14659         cp_parser_save_default_args (parser, decl);
14660     }
14661
14662   /* Finish processing the declaration.  But, skip member
14663      declarations.  */
14664   if (!member_p && decl && decl != error_mark_node && !range_for_decl_p)
14665     {
14666       cp_finish_decl (decl,
14667                       initializer, !is_non_constant_init,
14668                       asm_specification,
14669                       /* If the initializer is in parentheses, then this is
14670                          a direct-initialization, which means that an
14671                          `explicit' constructor is OK.  Otherwise, an
14672                          `explicit' constructor cannot be used.  */
14673                       ((is_direct_init || !is_initialized)
14674                        ? LOOKUP_NORMAL : LOOKUP_IMPLICIT));
14675     }
14676   else if ((cxx_dialect != cxx98) && friend_p
14677            && decl && TREE_CODE (decl) == FUNCTION_DECL)
14678     /* Core issue #226 (C++0x only): A default template-argument
14679        shall not be specified in a friend class template
14680        declaration. */
14681     check_default_tmpl_args (decl, current_template_parms, /*is_primary=*/1, 
14682                              /*is_partial=*/0, /*is_friend_decl=*/1);
14683
14684   if (!friend_p && pushed_scope)
14685     pop_scope (pushed_scope);
14686
14687   return decl;
14688 }
14689
14690 /* Parse a declarator.
14691
14692    declarator:
14693      direct-declarator
14694      ptr-operator declarator
14695
14696    abstract-declarator:
14697      ptr-operator abstract-declarator [opt]
14698      direct-abstract-declarator
14699
14700    GNU Extensions:
14701
14702    declarator:
14703      attributes [opt] direct-declarator
14704      attributes [opt] ptr-operator declarator
14705
14706    abstract-declarator:
14707      attributes [opt] ptr-operator abstract-declarator [opt]
14708      attributes [opt] direct-abstract-declarator
14709
14710    If CTOR_DTOR_OR_CONV_P is not NULL, *CTOR_DTOR_OR_CONV_P is used to
14711    detect constructor, destructor or conversion operators. It is set
14712    to -1 if the declarator is a name, and +1 if it is a
14713    function. Otherwise it is set to zero. Usually you just want to
14714    test for >0, but internally the negative value is used.
14715
14716    (The reason for CTOR_DTOR_OR_CONV_P is that a declaration must have
14717    a decl-specifier-seq unless it declares a constructor, destructor,
14718    or conversion.  It might seem that we could check this condition in
14719    semantic analysis, rather than parsing, but that makes it difficult
14720    to handle something like `f()'.  We want to notice that there are
14721    no decl-specifiers, and therefore realize that this is an
14722    expression, not a declaration.)
14723
14724    If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
14725    the declarator is a direct-declarator of the form "(...)".
14726
14727    MEMBER_P is true iff this declarator is a member-declarator.  */
14728
14729 static cp_declarator *
14730 cp_parser_declarator (cp_parser* parser,
14731                       cp_parser_declarator_kind dcl_kind,
14732                       int* ctor_dtor_or_conv_p,
14733                       bool* parenthesized_p,
14734                       bool member_p)
14735 {
14736   cp_declarator *declarator;
14737   enum tree_code code;
14738   cp_cv_quals cv_quals;
14739   tree class_type;
14740   tree attributes = NULL_TREE;
14741
14742   /* Assume this is not a constructor, destructor, or type-conversion
14743      operator.  */
14744   if (ctor_dtor_or_conv_p)
14745     *ctor_dtor_or_conv_p = 0;
14746
14747   if (cp_parser_allow_gnu_extensions_p (parser))
14748     attributes = cp_parser_attributes_opt (parser);
14749
14750   /* Check for the ptr-operator production.  */
14751   cp_parser_parse_tentatively (parser);
14752   /* Parse the ptr-operator.  */
14753   code = cp_parser_ptr_operator (parser,
14754                                  &class_type,
14755                                  &cv_quals);
14756   /* If that worked, then we have a ptr-operator.  */
14757   if (cp_parser_parse_definitely (parser))
14758     {
14759       /* If a ptr-operator was found, then this declarator was not
14760          parenthesized.  */
14761       if (parenthesized_p)
14762         *parenthesized_p = true;
14763       /* The dependent declarator is optional if we are parsing an
14764          abstract-declarator.  */
14765       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED)
14766         cp_parser_parse_tentatively (parser);
14767
14768       /* Parse the dependent declarator.  */
14769       declarator = cp_parser_declarator (parser, dcl_kind,
14770                                          /*ctor_dtor_or_conv_p=*/NULL,
14771                                          /*parenthesized_p=*/NULL,
14772                                          /*member_p=*/false);
14773
14774       /* If we are parsing an abstract-declarator, we must handle the
14775          case where the dependent declarator is absent.  */
14776       if (dcl_kind != CP_PARSER_DECLARATOR_NAMED
14777           && !cp_parser_parse_definitely (parser))
14778         declarator = NULL;
14779
14780       declarator = cp_parser_make_indirect_declarator
14781         (code, class_type, cv_quals, declarator);
14782     }
14783   /* Everything else is a direct-declarator.  */
14784   else
14785     {
14786       if (parenthesized_p)
14787         *parenthesized_p = cp_lexer_next_token_is (parser->lexer,
14788                                                    CPP_OPEN_PAREN);
14789       declarator = cp_parser_direct_declarator (parser, dcl_kind,
14790                                                 ctor_dtor_or_conv_p,
14791                                                 member_p);
14792     }
14793
14794   if (attributes && declarator && declarator != cp_error_declarator)
14795     declarator->attributes = attributes;
14796
14797   return declarator;
14798 }
14799
14800 /* Parse a direct-declarator or direct-abstract-declarator.
14801
14802    direct-declarator:
14803      declarator-id
14804      direct-declarator ( parameter-declaration-clause )
14805        cv-qualifier-seq [opt]
14806        exception-specification [opt]
14807      direct-declarator [ constant-expression [opt] ]
14808      ( declarator )
14809
14810    direct-abstract-declarator:
14811      direct-abstract-declarator [opt]
14812        ( parameter-declaration-clause )
14813        cv-qualifier-seq [opt]
14814        exception-specification [opt]
14815      direct-abstract-declarator [opt] [ constant-expression [opt] ]
14816      ( abstract-declarator )
14817
14818    Returns a representation of the declarator.  DCL_KIND is
14819    CP_PARSER_DECLARATOR_ABSTRACT, if we are parsing a
14820    direct-abstract-declarator.  It is CP_PARSER_DECLARATOR_NAMED, if
14821    we are parsing a direct-declarator.  It is
14822    CP_PARSER_DECLARATOR_EITHER, if we can accept either - in the case
14823    of ambiguity we prefer an abstract declarator, as per
14824    [dcl.ambig.res].  CTOR_DTOR_OR_CONV_P and MEMBER_P are as for
14825    cp_parser_declarator.  */
14826
14827 static cp_declarator *
14828 cp_parser_direct_declarator (cp_parser* parser,
14829                              cp_parser_declarator_kind dcl_kind,
14830                              int* ctor_dtor_or_conv_p,
14831                              bool member_p)
14832 {
14833   cp_token *token;
14834   cp_declarator *declarator = NULL;
14835   tree scope = NULL_TREE;
14836   bool saved_default_arg_ok_p = parser->default_arg_ok_p;
14837   bool saved_in_declarator_p = parser->in_declarator_p;
14838   bool first = true;
14839   tree pushed_scope = NULL_TREE;
14840
14841   while (true)
14842     {
14843       /* Peek at the next token.  */
14844       token = cp_lexer_peek_token (parser->lexer);
14845       if (token->type == CPP_OPEN_PAREN)
14846         {
14847           /* This is either a parameter-declaration-clause, or a
14848              parenthesized declarator. When we know we are parsing a
14849              named declarator, it must be a parenthesized declarator
14850              if FIRST is true. For instance, `(int)' is a
14851              parameter-declaration-clause, with an omitted
14852              direct-abstract-declarator. But `((*))', is a
14853              parenthesized abstract declarator. Finally, when T is a
14854              template parameter `(T)' is a
14855              parameter-declaration-clause, and not a parenthesized
14856              named declarator.
14857
14858              We first try and parse a parameter-declaration-clause,
14859              and then try a nested declarator (if FIRST is true).
14860
14861              It is not an error for it not to be a
14862              parameter-declaration-clause, even when FIRST is
14863              false. Consider,
14864
14865                int i (int);
14866                int i (3);
14867
14868              The first is the declaration of a function while the
14869              second is the definition of a variable, including its
14870              initializer.
14871
14872              Having seen only the parenthesis, we cannot know which of
14873              these two alternatives should be selected.  Even more
14874              complex are examples like:
14875
14876                int i (int (a));
14877                int i (int (3));
14878
14879              The former is a function-declaration; the latter is a
14880              variable initialization.
14881
14882              Thus again, we try a parameter-declaration-clause, and if
14883              that fails, we back out and return.  */
14884
14885           if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
14886             {
14887               tree params;
14888               unsigned saved_num_template_parameter_lists;
14889               bool is_declarator = false;
14890               tree t;
14891
14892               /* In a member-declarator, the only valid interpretation
14893                  of a parenthesis is the start of a
14894                  parameter-declaration-clause.  (It is invalid to
14895                  initialize a static data member with a parenthesized
14896                  initializer; only the "=" form of initialization is
14897                  permitted.)  */
14898               if (!member_p)
14899                 cp_parser_parse_tentatively (parser);
14900
14901               /* Consume the `('.  */
14902               cp_lexer_consume_token (parser->lexer);
14903               if (first)
14904                 {
14905                   /* If this is going to be an abstract declarator, we're
14906                      in a declarator and we can't have default args.  */
14907                   parser->default_arg_ok_p = false;
14908                   parser->in_declarator_p = true;
14909                 }
14910
14911               /* Inside the function parameter list, surrounding
14912                  template-parameter-lists do not apply.  */
14913               saved_num_template_parameter_lists
14914                 = parser->num_template_parameter_lists;
14915               parser->num_template_parameter_lists = 0;
14916
14917               begin_scope (sk_function_parms, NULL_TREE);
14918
14919               /* Parse the parameter-declaration-clause.  */
14920               params = cp_parser_parameter_declaration_clause (parser);
14921
14922               parser->num_template_parameter_lists
14923                 = saved_num_template_parameter_lists;
14924
14925               /* Consume the `)'.  */
14926               cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
14927
14928               /* If all went well, parse the cv-qualifier-seq and the
14929                  exception-specification.  */
14930               if (member_p || cp_parser_parse_definitely (parser))
14931                 {
14932                   cp_cv_quals cv_quals;
14933                   cp_virt_specifiers virt_specifiers;
14934                   tree exception_specification;
14935                   tree late_return;
14936
14937                   is_declarator = true;
14938
14939                   if (ctor_dtor_or_conv_p)
14940                     *ctor_dtor_or_conv_p = *ctor_dtor_or_conv_p < 0;
14941                   first = false;
14942
14943                   /* Parse the cv-qualifier-seq.  */
14944                   cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
14945                   /* And the exception-specification.  */
14946                   exception_specification
14947                     = cp_parser_exception_specification_opt (parser);
14948                   /* Parse the virt-specifier-seq.  */
14949                   virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
14950
14951                   late_return
14952                     = cp_parser_late_return_type_opt (parser);
14953
14954                   /* Create the function-declarator.  */
14955                   declarator = make_call_declarator (declarator,
14956                                                      params,
14957                                                      cv_quals,
14958                                                      virt_specifiers,
14959                                                      exception_specification,
14960                                                      late_return);
14961                   /* Any subsequent parameter lists are to do with
14962                      return type, so are not those of the declared
14963                      function.  */
14964                   parser->default_arg_ok_p = false;
14965                 }
14966
14967               /* Remove the function parms from scope.  */
14968               for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
14969                 pop_binding (DECL_NAME (t), t);
14970               leave_scope();
14971
14972               if (is_declarator)
14973                 /* Repeat the main loop.  */
14974                 continue;
14975             }
14976
14977           /* If this is the first, we can try a parenthesized
14978              declarator.  */
14979           if (first)
14980             {
14981               bool saved_in_type_id_in_expr_p;
14982
14983               parser->default_arg_ok_p = saved_default_arg_ok_p;
14984               parser->in_declarator_p = saved_in_declarator_p;
14985
14986               /* Consume the `('.  */
14987               cp_lexer_consume_token (parser->lexer);
14988               /* Parse the nested declarator.  */
14989               saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
14990               parser->in_type_id_in_expr_p = true;
14991               declarator
14992                 = cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
14993                                         /*parenthesized_p=*/NULL,
14994                                         member_p);
14995               parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
14996               first = false;
14997               /* Expect a `)'.  */
14998               if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
14999                 declarator = cp_error_declarator;
15000               if (declarator == cp_error_declarator)
15001                 break;
15002
15003               goto handle_declarator;
15004             }
15005           /* Otherwise, we must be done.  */
15006           else
15007             break;
15008         }
15009       else if ((!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED)
15010                && token->type == CPP_OPEN_SQUARE)
15011         {
15012           /* Parse an array-declarator.  */
15013           tree bounds;
15014
15015           if (ctor_dtor_or_conv_p)
15016             *ctor_dtor_or_conv_p = 0;
15017
15018           first = false;
15019           parser->default_arg_ok_p = false;
15020           parser->in_declarator_p = true;
15021           /* Consume the `['.  */
15022           cp_lexer_consume_token (parser->lexer);
15023           /* Peek at the next token.  */
15024           token = cp_lexer_peek_token (parser->lexer);
15025           /* If the next token is `]', then there is no
15026              constant-expression.  */
15027           if (token->type != CPP_CLOSE_SQUARE)
15028             {
15029               bool non_constant_p;
15030
15031               bounds
15032                 = cp_parser_constant_expression (parser,
15033                                                  /*allow_non_constant=*/true,
15034                                                  &non_constant_p);
15035               if (!non_constant_p)
15036                 /* OK */;
15037               /* Normally, the array bound must be an integral constant
15038                  expression.  However, as an extension, we allow VLAs
15039                  in function scopes as long as they aren't part of a
15040                  parameter declaration.  */
15041               else if (!parser->in_function_body
15042                        || current_binding_level->kind == sk_function_parms)
15043                 {
15044                   cp_parser_error (parser,
15045                                    "array bound is not an integer constant");
15046                   bounds = error_mark_node;
15047                 }
15048               else if (processing_template_decl && !error_operand_p (bounds))
15049                 {
15050                   /* Remember this wasn't a constant-expression.  */
15051                   bounds = build_nop (TREE_TYPE (bounds), bounds);
15052                   TREE_SIDE_EFFECTS (bounds) = 1;
15053                 }
15054             }
15055           else
15056             bounds = NULL_TREE;
15057           /* Look for the closing `]'.  */
15058           if (!cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
15059             {
15060               declarator = cp_error_declarator;
15061               break;
15062             }
15063
15064           declarator = make_array_declarator (declarator, bounds);
15065         }
15066       else if (first && dcl_kind != CP_PARSER_DECLARATOR_ABSTRACT)
15067         {
15068           {
15069             tree qualifying_scope;
15070             tree unqualified_name;
15071             special_function_kind sfk;
15072             bool abstract_ok;
15073             bool pack_expansion_p = false;
15074             cp_token *declarator_id_start_token;
15075
15076             /* Parse a declarator-id */
15077             abstract_ok = (dcl_kind == CP_PARSER_DECLARATOR_EITHER);
15078             if (abstract_ok)
15079               {
15080                 cp_parser_parse_tentatively (parser);
15081
15082                 /* If we see an ellipsis, we should be looking at a
15083                    parameter pack. */
15084                 if (token->type == CPP_ELLIPSIS)
15085                   {
15086                     /* Consume the `...' */
15087                     cp_lexer_consume_token (parser->lexer);
15088
15089                     pack_expansion_p = true;
15090                   }
15091               }
15092
15093             declarator_id_start_token = cp_lexer_peek_token (parser->lexer);
15094             unqualified_name
15095               = cp_parser_declarator_id (parser, /*optional_p=*/abstract_ok);
15096             qualifying_scope = parser->scope;
15097             if (abstract_ok)
15098               {
15099                 bool okay = false;
15100
15101                 if (!unqualified_name && pack_expansion_p)
15102                   {
15103                     /* Check whether an error occurred. */
15104                     okay = !cp_parser_error_occurred (parser);
15105
15106                     /* We already consumed the ellipsis to mark a
15107                        parameter pack, but we have no way to report it,
15108                        so abort the tentative parse. We will be exiting
15109                        immediately anyway. */
15110                     cp_parser_abort_tentative_parse (parser);
15111                   }
15112                 else
15113                   okay = cp_parser_parse_definitely (parser);
15114
15115                 if (!okay)
15116                   unqualified_name = error_mark_node;
15117                 else if (unqualified_name
15118                          && (qualifying_scope
15119                              || (TREE_CODE (unqualified_name)
15120                                  != IDENTIFIER_NODE)))
15121                   {
15122                     cp_parser_error (parser, "expected unqualified-id");
15123                     unqualified_name = error_mark_node;
15124                   }
15125               }
15126
15127             if (!unqualified_name)
15128               return NULL;
15129             if (unqualified_name == error_mark_node)
15130               {
15131                 declarator = cp_error_declarator;
15132                 pack_expansion_p = false;
15133                 declarator->parameter_pack_p = false;
15134                 break;
15135               }
15136
15137             if (qualifying_scope && at_namespace_scope_p ()
15138                 && TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
15139               {
15140                 /* In the declaration of a member of a template class
15141                    outside of the class itself, the SCOPE will sometimes
15142                    be a TYPENAME_TYPE.  For example, given:
15143
15144                    template <typename T>
15145                    int S<T>::R::i = 3;
15146
15147                    the SCOPE will be a TYPENAME_TYPE for `S<T>::R'.  In
15148                    this context, we must resolve S<T>::R to an ordinary
15149                    type, rather than a typename type.
15150
15151                    The reason we normally avoid resolving TYPENAME_TYPEs
15152                    is that a specialization of `S' might render
15153                    `S<T>::R' not a type.  However, if `S' is
15154                    specialized, then this `i' will not be used, so there
15155                    is no harm in resolving the types here.  */
15156                 tree type;
15157
15158                 /* Resolve the TYPENAME_TYPE.  */
15159                 type = resolve_typename_type (qualifying_scope,
15160                                               /*only_current_p=*/false);
15161                 /* If that failed, the declarator is invalid.  */
15162                 if (TREE_CODE (type) == TYPENAME_TYPE)
15163                   {
15164                     if (typedef_variant_p (type))
15165                       error_at (declarator_id_start_token->location,
15166                                 "cannot define member of dependent typedef "
15167                                 "%qT", type);
15168                     else
15169                       error_at (declarator_id_start_token->location,
15170                                 "%<%T::%E%> is not a type",
15171                                 TYPE_CONTEXT (qualifying_scope),
15172                                 TYPE_IDENTIFIER (qualifying_scope));
15173                   }
15174                 qualifying_scope = type;
15175               }
15176
15177             sfk = sfk_none;
15178
15179             if (unqualified_name)
15180               {
15181                 tree class_type;
15182
15183                 if (qualifying_scope
15184                     && CLASS_TYPE_P (qualifying_scope))
15185                   class_type = qualifying_scope;
15186                 else
15187                   class_type = current_class_type;
15188
15189                 if (TREE_CODE (unqualified_name) == TYPE_DECL)
15190                   {
15191                     tree name_type = TREE_TYPE (unqualified_name);
15192                     if (class_type && same_type_p (name_type, class_type))
15193                       {
15194                         if (qualifying_scope
15195                             && CLASSTYPE_USE_TEMPLATE (name_type))
15196                           {
15197                             error_at (declarator_id_start_token->location,
15198                                       "invalid use of constructor as a template");
15199                             inform (declarator_id_start_token->location,
15200                                     "use %<%T::%D%> instead of %<%T::%D%> to "
15201                                     "name the constructor in a qualified name",
15202                                     class_type,
15203                                     DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
15204                                     class_type, name_type);
15205                             declarator = cp_error_declarator;
15206                             break;
15207                           }
15208                         else
15209                           unqualified_name = constructor_name (class_type);
15210                       }
15211                     else
15212                       {
15213                         /* We do not attempt to print the declarator
15214                            here because we do not have enough
15215                            information about its original syntactic
15216                            form.  */
15217                         cp_parser_error (parser, "invalid declarator");
15218                         declarator = cp_error_declarator;
15219                         break;
15220                       }
15221                   }
15222
15223                 if (class_type)
15224                   {
15225                     if (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
15226                       sfk = sfk_destructor;
15227                     else if (IDENTIFIER_TYPENAME_P (unqualified_name))
15228                       sfk = sfk_conversion;
15229                     else if (/* There's no way to declare a constructor
15230                                 for an anonymous type, even if the type
15231                                 got a name for linkage purposes.  */
15232                              !TYPE_WAS_ANONYMOUS (class_type)
15233                              && constructor_name_p (unqualified_name,
15234                                                     class_type))
15235                       {
15236                         unqualified_name = constructor_name (class_type);
15237                         sfk = sfk_constructor;
15238                       }
15239                     else if (is_overloaded_fn (unqualified_name)
15240                              && DECL_CONSTRUCTOR_P (get_first_fn
15241                                                     (unqualified_name)))
15242                       sfk = sfk_constructor;
15243
15244                     if (ctor_dtor_or_conv_p && sfk != sfk_none)
15245                       *ctor_dtor_or_conv_p = -1;
15246                   }
15247               }
15248             declarator = make_id_declarator (qualifying_scope,
15249                                              unqualified_name,
15250                                              sfk);
15251             declarator->id_loc = token->location;
15252             declarator->parameter_pack_p = pack_expansion_p;
15253
15254             if (pack_expansion_p)
15255               maybe_warn_variadic_templates ();
15256           }
15257
15258         handle_declarator:;
15259           scope = get_scope_of_declarator (declarator);
15260           if (scope)
15261             /* Any names that appear after the declarator-id for a
15262                member are looked up in the containing scope.  */
15263             pushed_scope = push_scope (scope);
15264           parser->in_declarator_p = true;
15265           if ((ctor_dtor_or_conv_p && *ctor_dtor_or_conv_p)
15266               || (declarator && declarator->kind == cdk_id))
15267             /* Default args are only allowed on function
15268                declarations.  */
15269             parser->default_arg_ok_p = saved_default_arg_ok_p;
15270           else
15271             parser->default_arg_ok_p = false;
15272
15273           first = false;
15274         }
15275       /* We're done.  */
15276       else
15277         break;
15278     }
15279
15280   /* For an abstract declarator, we might wind up with nothing at this
15281      point.  That's an error; the declarator is not optional.  */
15282   if (!declarator)
15283     cp_parser_error (parser, "expected declarator");
15284
15285   /* If we entered a scope, we must exit it now.  */
15286   if (pushed_scope)
15287     pop_scope (pushed_scope);
15288
15289   parser->default_arg_ok_p = saved_default_arg_ok_p;
15290   parser->in_declarator_p = saved_in_declarator_p;
15291
15292   return declarator;
15293 }
15294
15295 /* Parse a ptr-operator.
15296
15297    ptr-operator:
15298      * cv-qualifier-seq [opt]
15299      &
15300      :: [opt] nested-name-specifier * cv-qualifier-seq [opt]
15301
15302    GNU Extension:
15303
15304    ptr-operator:
15305      & cv-qualifier-seq [opt]
15306
15307    Returns INDIRECT_REF if a pointer, or pointer-to-member, was used.
15308    Returns ADDR_EXPR if a reference was used, or NON_LVALUE_EXPR for
15309    an rvalue reference. In the case of a pointer-to-member, *TYPE is
15310    filled in with the TYPE containing the member.  *CV_QUALS is
15311    filled in with the cv-qualifier-seq, or TYPE_UNQUALIFIED, if there
15312    are no cv-qualifiers.  Returns ERROR_MARK if an error occurred.
15313    Note that the tree codes returned by this function have nothing
15314    to do with the types of trees that will be eventually be created
15315    to represent the pointer or reference type being parsed. They are
15316    just constants with suggestive names. */
15317 static enum tree_code
15318 cp_parser_ptr_operator (cp_parser* parser,
15319                         tree* type,
15320                         cp_cv_quals *cv_quals)
15321 {
15322   enum tree_code code = ERROR_MARK;
15323   cp_token *token;
15324
15325   /* Assume that it's not a pointer-to-member.  */
15326   *type = NULL_TREE;
15327   /* And that there are no cv-qualifiers.  */
15328   *cv_quals = TYPE_UNQUALIFIED;
15329
15330   /* Peek at the next token.  */
15331   token = cp_lexer_peek_token (parser->lexer);
15332
15333   /* If it's a `*', `&' or `&&' we have a pointer or reference.  */
15334   if (token->type == CPP_MULT)
15335     code = INDIRECT_REF;
15336   else if (token->type == CPP_AND)
15337     code = ADDR_EXPR;
15338   else if ((cxx_dialect != cxx98) &&
15339            token->type == CPP_AND_AND) /* C++0x only */
15340     code = NON_LVALUE_EXPR;
15341
15342   if (code != ERROR_MARK)
15343     {
15344       /* Consume the `*', `&' or `&&'.  */
15345       cp_lexer_consume_token (parser->lexer);
15346
15347       /* A `*' can be followed by a cv-qualifier-seq, and so can a
15348          `&', if we are allowing GNU extensions.  (The only qualifier
15349          that can legally appear after `&' is `restrict', but that is
15350          enforced during semantic analysis.  */
15351       if (code == INDIRECT_REF
15352           || cp_parser_allow_gnu_extensions_p (parser))
15353         *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15354     }
15355   else
15356     {
15357       /* Try the pointer-to-member case.  */
15358       cp_parser_parse_tentatively (parser);
15359       /* Look for the optional `::' operator.  */
15360       cp_parser_global_scope_opt (parser,
15361                                   /*current_scope_valid_p=*/false);
15362       /* Look for the nested-name specifier.  */
15363       token = cp_lexer_peek_token (parser->lexer);
15364       cp_parser_nested_name_specifier (parser,
15365                                        /*typename_keyword_p=*/false,
15366                                        /*check_dependency_p=*/true,
15367                                        /*type_p=*/false,
15368                                        /*is_declaration=*/false);
15369       /* If we found it, and the next token is a `*', then we are
15370          indeed looking at a pointer-to-member operator.  */
15371       if (!cp_parser_error_occurred (parser)
15372           && cp_parser_require (parser, CPP_MULT, RT_MULT))
15373         {
15374           /* Indicate that the `*' operator was used.  */
15375           code = INDIRECT_REF;
15376
15377           if (TREE_CODE (parser->scope) == NAMESPACE_DECL)
15378             error_at (token->location, "%qD is a namespace", parser->scope);
15379           else
15380             {
15381               /* The type of which the member is a member is given by the
15382                  current SCOPE.  */
15383               *type = parser->scope;
15384               /* The next name will not be qualified.  */
15385               parser->scope = NULL_TREE;
15386               parser->qualifying_scope = NULL_TREE;
15387               parser->object_scope = NULL_TREE;
15388               /* Look for the optional cv-qualifier-seq.  */
15389               *cv_quals = cp_parser_cv_qualifier_seq_opt (parser);
15390             }
15391         }
15392       /* If that didn't work we don't have a ptr-operator.  */
15393       if (!cp_parser_parse_definitely (parser))
15394         cp_parser_error (parser, "expected ptr-operator");
15395     }
15396
15397   return code;
15398 }
15399
15400 /* Parse an (optional) cv-qualifier-seq.
15401
15402    cv-qualifier-seq:
15403      cv-qualifier cv-qualifier-seq [opt]
15404
15405    cv-qualifier:
15406      const
15407      volatile
15408
15409    GNU Extension:
15410
15411    cv-qualifier:
15412      __restrict__
15413
15414    Returns a bitmask representing the cv-qualifiers.  */
15415
15416 static cp_cv_quals
15417 cp_parser_cv_qualifier_seq_opt (cp_parser* parser)
15418 {
15419   cp_cv_quals cv_quals = TYPE_UNQUALIFIED;
15420
15421   while (true)
15422     {
15423       cp_token *token;
15424       cp_cv_quals cv_qualifier;
15425
15426       /* Peek at the next token.  */
15427       token = cp_lexer_peek_token (parser->lexer);
15428       /* See if it's a cv-qualifier.  */
15429       switch (token->keyword)
15430         {
15431         case RID_CONST:
15432           cv_qualifier = TYPE_QUAL_CONST;
15433           break;
15434
15435         case RID_VOLATILE:
15436           cv_qualifier = TYPE_QUAL_VOLATILE;
15437           break;
15438
15439         case RID_RESTRICT:
15440           cv_qualifier = TYPE_QUAL_RESTRICT;
15441           break;
15442
15443         default:
15444           cv_qualifier = TYPE_UNQUALIFIED;
15445           break;
15446         }
15447
15448       if (!cv_qualifier)
15449         break;
15450
15451       if (cv_quals & cv_qualifier)
15452         {
15453           error_at (token->location, "duplicate cv-qualifier");
15454           cp_lexer_purge_token (parser->lexer);
15455         }
15456       else
15457         {
15458           cp_lexer_consume_token (parser->lexer);
15459           cv_quals |= cv_qualifier;
15460         }
15461     }
15462
15463   return cv_quals;
15464 }
15465
15466 /* Parse an (optional) virt-specifier-seq.
15467
15468    virt-specifier-seq:
15469      virt-specifier virt-specifier-seq [opt]
15470
15471    virt-specifier:
15472      override
15473      final
15474
15475    Returns a bitmask representing the virt-specifiers.  */
15476
15477 static cp_virt_specifiers
15478 cp_parser_virt_specifier_seq_opt (cp_parser* parser)
15479 {
15480   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
15481
15482   while (true)
15483     {
15484       cp_token *token;
15485       cp_virt_specifiers virt_specifier;
15486
15487       /* Peek at the next token.  */
15488       token = cp_lexer_peek_token (parser->lexer);
15489       /* See if it's a virt-specifier-qualifier.  */
15490       if (token->type != CPP_NAME)
15491         break;
15492       if (!strcmp (IDENTIFIER_POINTER(token->u.value), "override"))
15493         virt_specifier = VIRT_SPEC_OVERRIDE;
15494       else if (!strcmp (IDENTIFIER_POINTER(token->u.value), "final"))
15495         virt_specifier = VIRT_SPEC_FINAL;
15496       else
15497         break;
15498
15499       if (virt_specifiers & virt_specifier)
15500         {
15501           error_at (token->location, "duplicate virt-specifier");
15502           cp_lexer_purge_token (parser->lexer);
15503         }
15504       else
15505         {
15506           cp_lexer_consume_token (parser->lexer);
15507           virt_specifiers |= virt_specifier;
15508         }
15509     }
15510   return virt_specifiers;
15511 }
15512
15513 /* Parse a late-specified return type, if any.  This is not a separate
15514    non-terminal, but part of a function declarator, which looks like
15515
15516    -> trailing-type-specifier-seq abstract-declarator(opt)
15517
15518    Returns the type indicated by the type-id.  */
15519
15520 static tree
15521 cp_parser_late_return_type_opt (cp_parser* parser)
15522 {
15523   cp_token *token;
15524
15525   /* Peek at the next token.  */
15526   token = cp_lexer_peek_token (parser->lexer);
15527   /* A late-specified return type is indicated by an initial '->'. */
15528   if (token->type != CPP_DEREF)
15529     return NULL_TREE;
15530
15531   /* Consume the ->.  */
15532   cp_lexer_consume_token (parser->lexer);
15533
15534   return cp_parser_trailing_type_id (parser);
15535 }
15536
15537 /* Parse a declarator-id.
15538
15539    declarator-id:
15540      id-expression
15541      :: [opt] nested-name-specifier [opt] type-name
15542
15543    In the `id-expression' case, the value returned is as for
15544    cp_parser_id_expression if the id-expression was an unqualified-id.
15545    If the id-expression was a qualified-id, then a SCOPE_REF is
15546    returned.  The first operand is the scope (either a NAMESPACE_DECL
15547    or TREE_TYPE), but the second is still just a representation of an
15548    unqualified-id.  */
15549
15550 static tree
15551 cp_parser_declarator_id (cp_parser* parser, bool optional_p)
15552 {
15553   tree id;
15554   /* The expression must be an id-expression.  Assume that qualified
15555      names are the names of types so that:
15556
15557        template <class T>
15558        int S<T>::R::i = 3;
15559
15560      will work; we must treat `S<T>::R' as the name of a type.
15561      Similarly, assume that qualified names are templates, where
15562      required, so that:
15563
15564        template <class T>
15565        int S<T>::R<T>::i = 3;
15566
15567      will work, too.  */
15568   id = cp_parser_id_expression (parser,
15569                                 /*template_keyword_p=*/false,
15570                                 /*check_dependency_p=*/false,
15571                                 /*template_p=*/NULL,
15572                                 /*declarator_p=*/true,
15573                                 optional_p);
15574   if (id && BASELINK_P (id))
15575     id = BASELINK_FUNCTIONS (id);
15576   return id;
15577 }
15578
15579 /* Parse a type-id.
15580
15581    type-id:
15582      type-specifier-seq abstract-declarator [opt]
15583
15584    Returns the TYPE specified.  */
15585
15586 static tree
15587 cp_parser_type_id_1 (cp_parser* parser, bool is_template_arg,
15588                      bool is_trailing_return)
15589 {
15590   cp_decl_specifier_seq type_specifier_seq;
15591   cp_declarator *abstract_declarator;
15592
15593   /* Parse the type-specifier-seq.  */
15594   cp_parser_type_specifier_seq (parser, /*is_declaration=*/false,
15595                                 is_trailing_return,
15596                                 &type_specifier_seq);
15597   if (type_specifier_seq.type == error_mark_node)
15598     return error_mark_node;
15599
15600   /* There might or might not be an abstract declarator.  */
15601   cp_parser_parse_tentatively (parser);
15602   /* Look for the declarator.  */
15603   abstract_declarator
15604     = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_ABSTRACT, NULL,
15605                             /*parenthesized_p=*/NULL,
15606                             /*member_p=*/false);
15607   /* Check to see if there really was a declarator.  */
15608   if (!cp_parser_parse_definitely (parser))
15609     abstract_declarator = NULL;
15610
15611   if (type_specifier_seq.type
15612       && type_uses_auto (type_specifier_seq.type))
15613     {
15614       /* A type-id with type 'auto' is only ok if the abstract declarator
15615          is a function declarator with a late-specified return type.  */
15616       if (abstract_declarator
15617           && abstract_declarator->kind == cdk_function
15618           && abstract_declarator->u.function.late_return_type)
15619         /* OK */;
15620       else
15621         {
15622           error ("invalid use of %<auto%>");
15623           return error_mark_node;
15624         }
15625     }
15626   
15627   return groktypename (&type_specifier_seq, abstract_declarator,
15628                        is_template_arg);
15629 }
15630
15631 static tree cp_parser_type_id (cp_parser *parser)
15632 {
15633   return cp_parser_type_id_1 (parser, false, false);
15634 }
15635
15636 static tree cp_parser_template_type_arg (cp_parser *parser)
15637 {
15638   tree r;
15639   const char *saved_message = parser->type_definition_forbidden_message;
15640   parser->type_definition_forbidden_message
15641     = G_("types may not be defined in template arguments");
15642   r = cp_parser_type_id_1 (parser, true, false);
15643   parser->type_definition_forbidden_message = saved_message;
15644   return r;
15645 }
15646
15647 static tree cp_parser_trailing_type_id (cp_parser *parser)
15648 {
15649   return cp_parser_type_id_1 (parser, false, true);
15650 }
15651
15652 /* Parse a type-specifier-seq.
15653
15654    type-specifier-seq:
15655      type-specifier type-specifier-seq [opt]
15656
15657    GNU extension:
15658
15659    type-specifier-seq:
15660      attributes type-specifier-seq [opt]
15661
15662    If IS_DECLARATION is true, we are at the start of a "condition" or
15663    exception-declaration, so we might be followed by a declarator-id.
15664
15665    If IS_TRAILING_RETURN is true, we are in a trailing-return-type,
15666    i.e. we've just seen "->".
15667
15668    Sets *TYPE_SPECIFIER_SEQ to represent the sequence.  */
15669
15670 static void
15671 cp_parser_type_specifier_seq (cp_parser* parser,
15672                               bool is_declaration,
15673                               bool is_trailing_return,
15674                               cp_decl_specifier_seq *type_specifier_seq)
15675 {
15676   bool seen_type_specifier = false;
15677   cp_parser_flags flags = CP_PARSER_FLAGS_OPTIONAL;
15678   cp_token *start_token = NULL;
15679
15680   /* Clear the TYPE_SPECIFIER_SEQ.  */
15681   clear_decl_specs (type_specifier_seq);
15682
15683   /* In the context of a trailing return type, enum E { } is an
15684      elaborated-type-specifier followed by a function-body, not an
15685      enum-specifier.  */
15686   if (is_trailing_return)
15687     flags |= CP_PARSER_FLAGS_NO_TYPE_DEFINITIONS;
15688
15689   /* Parse the type-specifiers and attributes.  */
15690   while (true)
15691     {
15692       tree type_specifier;
15693       bool is_cv_qualifier;
15694
15695       /* Check for attributes first.  */
15696       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
15697         {
15698           type_specifier_seq->attributes =
15699             chainon (type_specifier_seq->attributes,
15700                      cp_parser_attributes_opt (parser));
15701           continue;
15702         }
15703
15704       /* record the token of the beginning of the type specifier seq,
15705          for error reporting purposes*/
15706      if (!start_token)
15707        start_token = cp_lexer_peek_token (parser->lexer);
15708
15709       /* Look for the type-specifier.  */
15710       type_specifier = cp_parser_type_specifier (parser,
15711                                                  flags,
15712                                                  type_specifier_seq,
15713                                                  /*is_declaration=*/false,
15714                                                  NULL,
15715                                                  &is_cv_qualifier);
15716       if (!type_specifier)
15717         {
15718           /* If the first type-specifier could not be found, this is not a
15719              type-specifier-seq at all.  */
15720           if (!seen_type_specifier)
15721             {
15722               cp_parser_error (parser, "expected type-specifier");
15723               type_specifier_seq->type = error_mark_node;
15724               return;
15725             }
15726           /* If subsequent type-specifiers could not be found, the
15727              type-specifier-seq is complete.  */
15728           break;
15729         }
15730
15731       seen_type_specifier = true;
15732       /* The standard says that a condition can be:
15733
15734             type-specifier-seq declarator = assignment-expression
15735
15736          However, given:
15737
15738            struct S {};
15739            if (int S = ...)
15740
15741          we should treat the "S" as a declarator, not as a
15742          type-specifier.  The standard doesn't say that explicitly for
15743          type-specifier-seq, but it does say that for
15744          decl-specifier-seq in an ordinary declaration.  Perhaps it
15745          would be clearer just to allow a decl-specifier-seq here, and
15746          then add a semantic restriction that if any decl-specifiers
15747          that are not type-specifiers appear, the program is invalid.  */
15748       if (is_declaration && !is_cv_qualifier)
15749         flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
15750     }
15751
15752   cp_parser_check_decl_spec (type_specifier_seq, start_token->location);
15753 }
15754
15755 /* Parse a parameter-declaration-clause.
15756
15757    parameter-declaration-clause:
15758      parameter-declaration-list [opt] ... [opt]
15759      parameter-declaration-list , ...
15760
15761    Returns a representation for the parameter declarations.  A return
15762    value of NULL indicates a parameter-declaration-clause consisting
15763    only of an ellipsis.  */
15764
15765 static tree
15766 cp_parser_parameter_declaration_clause (cp_parser* parser)
15767 {
15768   tree parameters;
15769   cp_token *token;
15770   bool ellipsis_p;
15771   bool is_error;
15772
15773   /* Peek at the next token.  */
15774   token = cp_lexer_peek_token (parser->lexer);
15775   /* Check for trivial parameter-declaration-clauses.  */
15776   if (token->type == CPP_ELLIPSIS)
15777     {
15778       /* Consume the `...' token.  */
15779       cp_lexer_consume_token (parser->lexer);
15780       return NULL_TREE;
15781     }
15782   else if (token->type == CPP_CLOSE_PAREN)
15783     /* There are no parameters.  */
15784     {
15785 #ifndef NO_IMPLICIT_EXTERN_C
15786       if (in_system_header && current_class_type == NULL
15787           && current_lang_name == lang_name_c)
15788         return NULL_TREE;
15789       else
15790 #endif
15791         return void_list_node;
15792     }
15793   /* Check for `(void)', too, which is a special case.  */
15794   else if (token->keyword == RID_VOID
15795            && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
15796                == CPP_CLOSE_PAREN))
15797     {
15798       /* Consume the `void' token.  */
15799       cp_lexer_consume_token (parser->lexer);
15800       /* There are no parameters.  */
15801       return void_list_node;
15802     }
15803
15804   /* Parse the parameter-declaration-list.  */
15805   parameters = cp_parser_parameter_declaration_list (parser, &is_error);
15806   /* If a parse error occurred while parsing the
15807      parameter-declaration-list, then the entire
15808      parameter-declaration-clause is erroneous.  */
15809   if (is_error)
15810     return NULL;
15811
15812   /* Peek at the next token.  */
15813   token = cp_lexer_peek_token (parser->lexer);
15814   /* If it's a `,', the clause should terminate with an ellipsis.  */
15815   if (token->type == CPP_COMMA)
15816     {
15817       /* Consume the `,'.  */
15818       cp_lexer_consume_token (parser->lexer);
15819       /* Expect an ellipsis.  */
15820       ellipsis_p
15821         = (cp_parser_require (parser, CPP_ELLIPSIS, RT_ELLIPSIS) != NULL);
15822     }
15823   /* It might also be `...' if the optional trailing `,' was
15824      omitted.  */
15825   else if (token->type == CPP_ELLIPSIS)
15826     {
15827       /* Consume the `...' token.  */
15828       cp_lexer_consume_token (parser->lexer);
15829       /* And remember that we saw it.  */
15830       ellipsis_p = true;
15831     }
15832   else
15833     ellipsis_p = false;
15834
15835   /* Finish the parameter list.  */
15836   if (!ellipsis_p)
15837     parameters = chainon (parameters, void_list_node);
15838
15839   return parameters;
15840 }
15841
15842 /* Parse a parameter-declaration-list.
15843
15844    parameter-declaration-list:
15845      parameter-declaration
15846      parameter-declaration-list , parameter-declaration
15847
15848    Returns a representation of the parameter-declaration-list, as for
15849    cp_parser_parameter_declaration_clause.  However, the
15850    `void_list_node' is never appended to the list.  Upon return,
15851    *IS_ERROR will be true iff an error occurred.  */
15852
15853 static tree
15854 cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
15855 {
15856   tree parameters = NULL_TREE;
15857   tree *tail = &parameters; 
15858   bool saved_in_unbraced_linkage_specification_p;
15859   int index = 0;
15860
15861   /* Assume all will go well.  */
15862   *is_error = false;
15863   /* The special considerations that apply to a function within an
15864      unbraced linkage specifications do not apply to the parameters
15865      to the function.  */
15866   saved_in_unbraced_linkage_specification_p 
15867     = parser->in_unbraced_linkage_specification_p;
15868   parser->in_unbraced_linkage_specification_p = false;
15869
15870   /* Look for more parameters.  */
15871   while (true)
15872     {
15873       cp_parameter_declarator *parameter;
15874       tree decl = error_mark_node;
15875       bool parenthesized_p;
15876       /* Parse the parameter.  */
15877       parameter
15878         = cp_parser_parameter_declaration (parser,
15879                                            /*template_parm_p=*/false,
15880                                            &parenthesized_p);
15881
15882       /* We don't know yet if the enclosing context is deprecated, so wait
15883          and warn in grokparms if appropriate.  */
15884       deprecated_state = DEPRECATED_SUPPRESS;
15885
15886       if (parameter)
15887         decl = grokdeclarator (parameter->declarator,
15888                                &parameter->decl_specifiers,
15889                                PARM,
15890                                parameter->default_argument != NULL_TREE,
15891                                &parameter->decl_specifiers.attributes);
15892
15893       deprecated_state = DEPRECATED_NORMAL;
15894
15895       /* If a parse error occurred parsing the parameter declaration,
15896          then the entire parameter-declaration-list is erroneous.  */
15897       if (decl == error_mark_node)
15898         {
15899           *is_error = true;
15900           parameters = error_mark_node;
15901           break;
15902         }
15903
15904       if (parameter->decl_specifiers.attributes)
15905         cplus_decl_attributes (&decl,
15906                                parameter->decl_specifiers.attributes,
15907                                0);
15908       if (DECL_NAME (decl))
15909         decl = pushdecl (decl);
15910
15911       if (decl != error_mark_node)
15912         {
15913           retrofit_lang_decl (decl);
15914           DECL_PARM_INDEX (decl) = ++index;
15915           DECL_PARM_LEVEL (decl) = function_parm_depth ();
15916         }
15917
15918       /* Add the new parameter to the list.  */
15919       *tail = build_tree_list (parameter->default_argument, decl);
15920       tail = &TREE_CHAIN (*tail);
15921
15922       /* Peek at the next token.  */
15923       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN)
15924           || cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)
15925           /* These are for Objective-C++ */
15926           || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
15927           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
15928         /* The parameter-declaration-list is complete.  */
15929         break;
15930       else if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
15931         {
15932           cp_token *token;
15933
15934           /* Peek at the next token.  */
15935           token = cp_lexer_peek_nth_token (parser->lexer, 2);
15936           /* If it's an ellipsis, then the list is complete.  */
15937           if (token->type == CPP_ELLIPSIS)
15938             break;
15939           /* Otherwise, there must be more parameters.  Consume the
15940              `,'.  */
15941           cp_lexer_consume_token (parser->lexer);
15942           /* When parsing something like:
15943
15944                 int i(float f, double d)
15945
15946              we can tell after seeing the declaration for "f" that we
15947              are not looking at an initialization of a variable "i",
15948              but rather at the declaration of a function "i".
15949
15950              Due to the fact that the parsing of template arguments
15951              (as specified to a template-id) requires backtracking we
15952              cannot use this technique when inside a template argument
15953              list.  */
15954           if (!parser->in_template_argument_list_p
15955               && !parser->in_type_id_in_expr_p
15956               && cp_parser_uncommitted_to_tentative_parse_p (parser)
15957               /* However, a parameter-declaration of the form
15958                  "foat(f)" (which is a valid declaration of a
15959                  parameter "f") can also be interpreted as an
15960                  expression (the conversion of "f" to "float").  */
15961               && !parenthesized_p)
15962             cp_parser_commit_to_tentative_parse (parser);
15963         }
15964       else
15965         {
15966           cp_parser_error (parser, "expected %<,%> or %<...%>");
15967           if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
15968             cp_parser_skip_to_closing_parenthesis (parser,
15969                                                    /*recovering=*/true,
15970                                                    /*or_comma=*/false,
15971                                                    /*consume_paren=*/false);
15972           break;
15973         }
15974     }
15975
15976   parser->in_unbraced_linkage_specification_p
15977     = saved_in_unbraced_linkage_specification_p;
15978
15979   return parameters;
15980 }
15981
15982 /* Parse a parameter declaration.
15983
15984    parameter-declaration:
15985      decl-specifier-seq ... [opt] declarator
15986      decl-specifier-seq declarator = assignment-expression
15987      decl-specifier-seq ... [opt] abstract-declarator [opt]
15988      decl-specifier-seq abstract-declarator [opt] = assignment-expression
15989
15990    If TEMPLATE_PARM_P is TRUE, then this parameter-declaration
15991    declares a template parameter.  (In that case, a non-nested `>'
15992    token encountered during the parsing of the assignment-expression
15993    is not interpreted as a greater-than operator.)
15994
15995    Returns a representation of the parameter, or NULL if an error
15996    occurs.  If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to
15997    true iff the declarator is of the form "(p)".  */
15998
15999 static cp_parameter_declarator *
16000 cp_parser_parameter_declaration (cp_parser *parser,
16001                                  bool template_parm_p,
16002                                  bool *parenthesized_p)
16003 {
16004   int declares_class_or_enum;
16005   cp_decl_specifier_seq decl_specifiers;
16006   cp_declarator *declarator;
16007   tree default_argument;
16008   cp_token *token = NULL, *declarator_token_start = NULL;
16009   const char *saved_message;
16010
16011   /* In a template parameter, `>' is not an operator.
16012
16013      [temp.param]
16014
16015      When parsing a default template-argument for a non-type
16016      template-parameter, the first non-nested `>' is taken as the end
16017      of the template parameter-list rather than a greater-than
16018      operator.  */
16019
16020   /* Type definitions may not appear in parameter types.  */
16021   saved_message = parser->type_definition_forbidden_message;
16022   parser->type_definition_forbidden_message
16023     = G_("types may not be defined in parameter types");
16024
16025   /* Parse the declaration-specifiers.  */
16026   cp_parser_decl_specifier_seq (parser,
16027                                 CP_PARSER_FLAGS_NONE,
16028                                 &decl_specifiers,
16029                                 &declares_class_or_enum);
16030
16031   /* Complain about missing 'typename' or other invalid type names.  */
16032   if (!decl_specifiers.any_type_specifiers_p)
16033     cp_parser_parse_and_diagnose_invalid_type_name (parser);
16034
16035   /* If an error occurred, there's no reason to attempt to parse the
16036      rest of the declaration.  */
16037   if (cp_parser_error_occurred (parser))
16038     {
16039       parser->type_definition_forbidden_message = saved_message;
16040       return NULL;
16041     }
16042
16043   /* Peek at the next token.  */
16044   token = cp_lexer_peek_token (parser->lexer);
16045
16046   /* If the next token is a `)', `,', `=', `>', or `...', then there
16047      is no declarator. However, when variadic templates are enabled,
16048      there may be a declarator following `...'.  */
16049   if (token->type == CPP_CLOSE_PAREN
16050       || token->type == CPP_COMMA
16051       || token->type == CPP_EQ
16052       || token->type == CPP_GREATER)
16053     {
16054       declarator = NULL;
16055       if (parenthesized_p)
16056         *parenthesized_p = false;
16057     }
16058   /* Otherwise, there should be a declarator.  */
16059   else
16060     {
16061       bool saved_default_arg_ok_p = parser->default_arg_ok_p;
16062       parser->default_arg_ok_p = false;
16063
16064       /* After seeing a decl-specifier-seq, if the next token is not a
16065          "(", there is no possibility that the code is a valid
16066          expression.  Therefore, if parsing tentatively, we commit at
16067          this point.  */
16068       if (!parser->in_template_argument_list_p
16069           /* In an expression context, having seen:
16070
16071                (int((char ...
16072
16073              we cannot be sure whether we are looking at a
16074              function-type (taking a "char" as a parameter) or a cast
16075              of some object of type "char" to "int".  */
16076           && !parser->in_type_id_in_expr_p
16077           && cp_parser_uncommitted_to_tentative_parse_p (parser)
16078           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
16079           && cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
16080         cp_parser_commit_to_tentative_parse (parser);
16081       /* Parse the declarator.  */
16082       declarator_token_start = token;
16083       declarator = cp_parser_declarator (parser,
16084                                          CP_PARSER_DECLARATOR_EITHER,
16085                                          /*ctor_dtor_or_conv_p=*/NULL,
16086                                          parenthesized_p,
16087                                          /*member_p=*/false);
16088       parser->default_arg_ok_p = saved_default_arg_ok_p;
16089       /* After the declarator, allow more attributes.  */
16090       decl_specifiers.attributes
16091         = chainon (decl_specifiers.attributes,
16092                    cp_parser_attributes_opt (parser));
16093     }
16094
16095   /* If the next token is an ellipsis, and we have not seen a
16096      declarator name, and the type of the declarator contains parameter
16097      packs but it is not a TYPE_PACK_EXPANSION, then we actually have
16098      a parameter pack expansion expression. Otherwise, leave the
16099      ellipsis for a C-style variadic function. */
16100   token = cp_lexer_peek_token (parser->lexer);
16101   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16102     {
16103       tree type = decl_specifiers.type;
16104
16105       if (type && DECL_P (type))
16106         type = TREE_TYPE (type);
16107
16108       if (type
16109           && TREE_CODE (type) != TYPE_PACK_EXPANSION
16110           && declarator_can_be_parameter_pack (declarator)
16111           && (!declarator || !declarator->parameter_pack_p)
16112           && uses_parameter_packs (type))
16113         {
16114           /* Consume the `...'. */
16115           cp_lexer_consume_token (parser->lexer);
16116           maybe_warn_variadic_templates ();
16117           
16118           /* Build a pack expansion type */
16119           if (declarator)
16120             declarator->parameter_pack_p = true;
16121           else
16122             decl_specifiers.type = make_pack_expansion (type);
16123         }
16124     }
16125
16126   /* The restriction on defining new types applies only to the type
16127      of the parameter, not to the default argument.  */
16128   parser->type_definition_forbidden_message = saved_message;
16129
16130   /* If the next token is `=', then process a default argument.  */
16131   if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
16132     {
16133       /* Consume the `='.  */
16134       cp_lexer_consume_token (parser->lexer);
16135
16136       /* If we are defining a class, then the tokens that make up the
16137          default argument must be saved and processed later.  */
16138       if (!template_parm_p && at_class_scope_p ()
16139           && TYPE_BEING_DEFINED (current_class_type)
16140           && !LAMBDA_TYPE_P (current_class_type))
16141         {
16142           unsigned depth = 0;
16143           int maybe_template_id = 0;
16144           cp_token *first_token;
16145           cp_token *token;
16146
16147           /* Add tokens until we have processed the entire default
16148              argument.  We add the range [first_token, token).  */
16149           first_token = cp_lexer_peek_token (parser->lexer);
16150           while (true)
16151             {
16152               bool done = false;
16153
16154               /* Peek at the next token.  */
16155               token = cp_lexer_peek_token (parser->lexer);
16156               /* What we do depends on what token we have.  */
16157               switch (token->type)
16158                 {
16159                   /* In valid code, a default argument must be
16160                      immediately followed by a `,' `)', or `...'.  */
16161                 case CPP_COMMA:
16162                   if (depth == 0 && maybe_template_id)
16163                     {
16164                       /* If we've seen a '<', we might be in a
16165                          template-argument-list.  Until Core issue 325 is
16166                          resolved, we don't know how this situation ought
16167                          to be handled, so try to DTRT.  We check whether
16168                          what comes after the comma is a valid parameter
16169                          declaration list.  If it is, then the comma ends
16170                          the default argument; otherwise the default
16171                          argument continues.  */
16172                       bool error = false;
16173                       tree t;
16174
16175                       /* Set ITALP so cp_parser_parameter_declaration_list
16176                          doesn't decide to commit to this parse.  */
16177                       bool saved_italp = parser->in_template_argument_list_p;
16178                       parser->in_template_argument_list_p = true;
16179
16180                       cp_parser_parse_tentatively (parser);
16181                       cp_lexer_consume_token (parser->lexer);
16182                       begin_scope (sk_function_parms, NULL_TREE);
16183                       cp_parser_parameter_declaration_list (parser, &error);
16184                       for (t = current_binding_level->names; t; t = DECL_CHAIN (t))
16185                         pop_binding (DECL_NAME (t), t);
16186                       leave_scope ();
16187                       if (!cp_parser_error_occurred (parser) && !error)
16188                         done = true;
16189                       cp_parser_abort_tentative_parse (parser);
16190
16191                       parser->in_template_argument_list_p = saved_italp;
16192                       break;
16193                     }
16194                 case CPP_CLOSE_PAREN:
16195                 case CPP_ELLIPSIS:
16196                   /* If we run into a non-nested `;', `}', or `]',
16197                      then the code is invalid -- but the default
16198                      argument is certainly over.  */
16199                 case CPP_SEMICOLON:
16200                 case CPP_CLOSE_BRACE:
16201                 case CPP_CLOSE_SQUARE:
16202                   if (depth == 0)
16203                     done = true;
16204                   /* Update DEPTH, if necessary.  */
16205                   else if (token->type == CPP_CLOSE_PAREN
16206                            || token->type == CPP_CLOSE_BRACE
16207                            || token->type == CPP_CLOSE_SQUARE)
16208                     --depth;
16209                   break;
16210
16211                 case CPP_OPEN_PAREN:
16212                 case CPP_OPEN_SQUARE:
16213                 case CPP_OPEN_BRACE:
16214                   ++depth;
16215                   break;
16216
16217                 case CPP_LESS:
16218                   if (depth == 0)
16219                     /* This might be the comparison operator, or it might
16220                        start a template argument list.  */
16221                     ++maybe_template_id;
16222                   break;
16223
16224                 case CPP_RSHIFT:
16225                   if (cxx_dialect == cxx98)
16226                     break;
16227                   /* Fall through for C++0x, which treats the `>>'
16228                      operator like two `>' tokens in certain
16229                      cases.  */
16230
16231                 case CPP_GREATER:
16232                   if (depth == 0)
16233                     {
16234                       /* This might be an operator, or it might close a
16235                          template argument list.  But if a previous '<'
16236                          started a template argument list, this will have
16237                          closed it, so we can't be in one anymore.  */
16238                       maybe_template_id -= 1 + (token->type == CPP_RSHIFT);
16239                       if (maybe_template_id < 0)
16240                         maybe_template_id = 0;
16241                     }
16242                   break;
16243
16244                   /* If we run out of tokens, issue an error message.  */
16245                 case CPP_EOF:
16246                 case CPP_PRAGMA_EOL:
16247                   error_at (token->location, "file ends in default argument");
16248                   done = true;
16249                   break;
16250
16251                 case CPP_NAME:
16252                 case CPP_SCOPE:
16253                   /* In these cases, we should look for template-ids.
16254                      For example, if the default argument is
16255                      `X<int, double>()', we need to do name lookup to
16256                      figure out whether or not `X' is a template; if
16257                      so, the `,' does not end the default argument.
16258
16259                      That is not yet done.  */
16260                   break;
16261
16262                 default:
16263                   break;
16264                 }
16265
16266               /* If we've reached the end, stop.  */
16267               if (done)
16268                 break;
16269
16270               /* Add the token to the token block.  */
16271               token = cp_lexer_consume_token (parser->lexer);
16272             }
16273
16274           /* Create a DEFAULT_ARG to represent the unparsed default
16275              argument.  */
16276           default_argument = make_node (DEFAULT_ARG);
16277           DEFARG_TOKENS (default_argument)
16278             = cp_token_cache_new (first_token, token);
16279           DEFARG_INSTANTIATIONS (default_argument) = NULL;
16280         }
16281       /* Outside of a class definition, we can just parse the
16282          assignment-expression.  */
16283       else
16284         {
16285           token = cp_lexer_peek_token (parser->lexer);
16286           default_argument 
16287             = cp_parser_default_argument (parser, template_parm_p);
16288         }
16289
16290       if (!parser->default_arg_ok_p)
16291         {
16292           if (flag_permissive)
16293             warning (0, "deprecated use of default argument for parameter of non-function");
16294           else
16295             {
16296               error_at (token->location,
16297                         "default arguments are only "
16298                         "permitted for function parameters");
16299               default_argument = NULL_TREE;
16300             }
16301         }
16302       else if ((declarator && declarator->parameter_pack_p)
16303                || (decl_specifiers.type
16304                    && PACK_EXPANSION_P (decl_specifiers.type)))
16305         {
16306           /* Find the name of the parameter pack.  */     
16307           cp_declarator *id_declarator = declarator;
16308           while (id_declarator && id_declarator->kind != cdk_id)
16309             id_declarator = id_declarator->declarator;
16310           
16311           if (id_declarator && id_declarator->kind == cdk_id)
16312             error_at (declarator_token_start->location,
16313                       template_parm_p 
16314                       ? "template parameter pack %qD"
16315                       " cannot have a default argument"
16316                       : "parameter pack %qD cannot have a default argument",
16317                       id_declarator->u.id.unqualified_name);
16318           else
16319             error_at (declarator_token_start->location,
16320                       template_parm_p 
16321                       ? "template parameter pack cannot have a default argument"
16322                       : "parameter pack cannot have a default argument");
16323           
16324           default_argument = NULL_TREE;
16325         }
16326     }
16327   else
16328     default_argument = NULL_TREE;
16329
16330   return make_parameter_declarator (&decl_specifiers,
16331                                     declarator,
16332                                     default_argument);
16333 }
16334
16335 /* Parse a default argument and return it.
16336
16337    TEMPLATE_PARM_P is true if this is a default argument for a
16338    non-type template parameter.  */
16339 static tree
16340 cp_parser_default_argument (cp_parser *parser, bool template_parm_p)
16341 {
16342   tree default_argument = NULL_TREE;
16343   bool saved_greater_than_is_operator_p;
16344   bool saved_local_variables_forbidden_p;
16345
16346   /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is
16347      set correctly.  */
16348   saved_greater_than_is_operator_p = parser->greater_than_is_operator_p;
16349   parser->greater_than_is_operator_p = !template_parm_p;
16350   /* Local variable names (and the `this' keyword) may not
16351      appear in a default argument.  */
16352   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
16353   parser->local_variables_forbidden_p = true;
16354   /* Parse the assignment-expression.  */
16355   if (template_parm_p)
16356     push_deferring_access_checks (dk_no_deferred);
16357   default_argument
16358     = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
16359   if (template_parm_p)
16360     pop_deferring_access_checks ();
16361   parser->greater_than_is_operator_p = saved_greater_than_is_operator_p;
16362   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
16363
16364   return default_argument;
16365 }
16366
16367 /* Parse a function-body.
16368
16369    function-body:
16370      compound_statement  */
16371
16372 static void
16373 cp_parser_function_body (cp_parser *parser)
16374 {
16375   cp_parser_compound_statement (parser, NULL, false, true);
16376 }
16377
16378 /* Parse a ctor-initializer-opt followed by a function-body.  Return
16379    true if a ctor-initializer was present.  */
16380
16381 static bool
16382 cp_parser_ctor_initializer_opt_and_function_body (cp_parser *parser)
16383 {
16384   tree body, list;
16385   bool ctor_initializer_p;
16386   const bool check_body_p =
16387      DECL_CONSTRUCTOR_P (current_function_decl)
16388      && DECL_DECLARED_CONSTEXPR_P (current_function_decl);
16389   tree last = NULL;
16390
16391   /* Begin the function body.  */
16392   body = begin_function_body ();
16393   /* Parse the optional ctor-initializer.  */
16394   ctor_initializer_p = cp_parser_ctor_initializer_opt (parser);
16395
16396   /* If we're parsing a constexpr constructor definition, we need
16397      to check that the constructor body is indeed empty.  However,
16398      before we get to cp_parser_function_body lot of junk has been
16399      generated, so we can't just check that we have an empty block.
16400      Rather we take a snapshot of the outermost block, and check whether
16401      cp_parser_function_body changed its state.  */
16402   if (check_body_p)
16403     {
16404       list = body;
16405       if (TREE_CODE (list) == BIND_EXPR)
16406         list = BIND_EXPR_BODY (list);
16407       if (TREE_CODE (list) == STATEMENT_LIST
16408           && STATEMENT_LIST_TAIL (list) != NULL)
16409         last = STATEMENT_LIST_TAIL (list)->stmt;
16410     }
16411   /* Parse the function-body.  */
16412   cp_parser_function_body (parser);
16413   if (check_body_p)
16414     check_constexpr_ctor_body (last, list);
16415   /* Finish the function body.  */
16416   finish_function_body (body);
16417
16418   return ctor_initializer_p;
16419 }
16420
16421 /* Parse an initializer.
16422
16423    initializer:
16424      = initializer-clause
16425      ( expression-list )
16426
16427    Returns an expression representing the initializer.  If no
16428    initializer is present, NULL_TREE is returned.
16429
16430    *IS_DIRECT_INIT is set to FALSE if the `= initializer-clause'
16431    production is used, and TRUE otherwise.  *IS_DIRECT_INIT is
16432    set to TRUE if there is no initializer present.  If there is an
16433    initializer, and it is not a constant-expression, *NON_CONSTANT_P
16434    is set to true; otherwise it is set to false.  */
16435
16436 static tree
16437 cp_parser_initializer (cp_parser* parser, bool* is_direct_init,
16438                        bool* non_constant_p)
16439 {
16440   cp_token *token;
16441   tree init;
16442
16443   /* Peek at the next token.  */
16444   token = cp_lexer_peek_token (parser->lexer);
16445
16446   /* Let our caller know whether or not this initializer was
16447      parenthesized.  */
16448   *is_direct_init = (token->type != CPP_EQ);
16449   /* Assume that the initializer is constant.  */
16450   *non_constant_p = false;
16451
16452   if (token->type == CPP_EQ)
16453     {
16454       /* Consume the `='.  */
16455       cp_lexer_consume_token (parser->lexer);
16456       /* Parse the initializer-clause.  */
16457       init = cp_parser_initializer_clause (parser, non_constant_p);
16458     }
16459   else if (token->type == CPP_OPEN_PAREN)
16460     {
16461       VEC(tree,gc) *vec;
16462       vec = cp_parser_parenthesized_expression_list (parser, non_attr,
16463                                                      /*cast_p=*/false,
16464                                                      /*allow_expansion_p=*/true,
16465                                                      non_constant_p);
16466       if (vec == NULL)
16467         return error_mark_node;
16468       init = build_tree_list_vec (vec);
16469       release_tree_vector (vec);
16470     }
16471   else if (token->type == CPP_OPEN_BRACE)
16472     {
16473       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
16474       init = cp_parser_braced_list (parser, non_constant_p);
16475       CONSTRUCTOR_IS_DIRECT_INIT (init) = 1;
16476     }
16477   else
16478     {
16479       /* Anything else is an error.  */
16480       cp_parser_error (parser, "expected initializer");
16481       init = error_mark_node;
16482     }
16483
16484   return init;
16485 }
16486
16487 /* Parse an initializer-clause.
16488
16489    initializer-clause:
16490      assignment-expression
16491      braced-init-list
16492
16493    Returns an expression representing the initializer.
16494
16495    If the `assignment-expression' production is used the value
16496    returned is simply a representation for the expression.
16497
16498    Otherwise, calls cp_parser_braced_list.  */
16499
16500 static tree
16501 cp_parser_initializer_clause (cp_parser* parser, bool* non_constant_p)
16502 {
16503   tree initializer;
16504
16505   /* Assume the expression is constant.  */
16506   *non_constant_p = false;
16507
16508   /* If it is not a `{', then we are looking at an
16509      assignment-expression.  */
16510   if (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE))
16511     {
16512       initializer
16513         = cp_parser_constant_expression (parser,
16514                                         /*allow_non_constant_p=*/true,
16515                                         non_constant_p);
16516       if (!*non_constant_p)
16517         {
16518           /* We only want to fold if this is really a constant
16519              expression.  FIXME Actually, we don't want to fold here, but in
16520              cp_finish_decl.  */
16521           tree folded = fold_non_dependent_expr (initializer);
16522           folded = maybe_constant_value (folded);
16523           if (TREE_CONSTANT (folded))
16524             initializer = folded;
16525         }
16526     }
16527   else
16528     initializer = cp_parser_braced_list (parser, non_constant_p);
16529
16530   return initializer;
16531 }
16532
16533 /* Parse a brace-enclosed initializer list.
16534
16535    braced-init-list:
16536      { initializer-list , [opt] }
16537      { }
16538
16539    Returns a CONSTRUCTOR.  The CONSTRUCTOR_ELTS will be
16540    the elements of the initializer-list (or NULL, if the last
16541    production is used).  The TREE_TYPE for the CONSTRUCTOR will be
16542    NULL_TREE.  There is no way to detect whether or not the optional
16543    trailing `,' was provided.  NON_CONSTANT_P is as for
16544    cp_parser_initializer.  */     
16545
16546 static tree
16547 cp_parser_braced_list (cp_parser* parser, bool* non_constant_p)
16548 {
16549   tree initializer;
16550
16551   /* Consume the `{' token.  */
16552   cp_lexer_consume_token (parser->lexer);
16553   /* Create a CONSTRUCTOR to represent the braced-initializer.  */
16554   initializer = make_node (CONSTRUCTOR);
16555   /* If it's not a `}', then there is a non-trivial initializer.  */
16556   if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_BRACE))
16557     {
16558       /* Parse the initializer list.  */
16559       CONSTRUCTOR_ELTS (initializer)
16560         = cp_parser_initializer_list (parser, non_constant_p);
16561       /* A trailing `,' token is allowed.  */
16562       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
16563         cp_lexer_consume_token (parser->lexer);
16564     }
16565   /* Now, there should be a trailing `}'.  */
16566   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16567   TREE_TYPE (initializer) = init_list_type_node;
16568   return initializer;
16569 }
16570
16571 /* Parse an initializer-list.
16572
16573    initializer-list:
16574      initializer-clause ... [opt]
16575      initializer-list , initializer-clause ... [opt]
16576
16577    GNU Extension:
16578
16579    initializer-list:
16580      identifier : initializer-clause
16581      initializer-list, identifier : initializer-clause
16582
16583    Returns a VEC of constructor_elt.  The VALUE of each elt is an expression
16584    for the initializer.  If the INDEX of the elt is non-NULL, it is the
16585    IDENTIFIER_NODE naming the field to initialize.  NON_CONSTANT_P is
16586    as for cp_parser_initializer.  */
16587
16588 static VEC(constructor_elt,gc) *
16589 cp_parser_initializer_list (cp_parser* parser, bool* non_constant_p)
16590 {
16591   VEC(constructor_elt,gc) *v = NULL;
16592
16593   /* Assume all of the expressions are constant.  */
16594   *non_constant_p = false;
16595
16596   /* Parse the rest of the list.  */
16597   while (true)
16598     {
16599       cp_token *token;
16600       tree identifier;
16601       tree initializer;
16602       bool clause_non_constant_p;
16603
16604       /* If the next token is an identifier and the following one is a
16605          colon, we are looking at the GNU designated-initializer
16606          syntax.  */
16607       if (cp_parser_allow_gnu_extensions_p (parser)
16608           && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
16609           && cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_COLON)
16610         {
16611           /* Warn the user that they are using an extension.  */
16612           pedwarn (input_location, OPT_pedantic, 
16613                    "ISO C++ does not allow designated initializers");
16614           /* Consume the identifier.  */
16615           identifier = cp_lexer_consume_token (parser->lexer)->u.value;
16616           /* Consume the `:'.  */
16617           cp_lexer_consume_token (parser->lexer);
16618         }
16619       else
16620         identifier = NULL_TREE;
16621
16622       /* Parse the initializer.  */
16623       initializer = cp_parser_initializer_clause (parser,
16624                                                   &clause_non_constant_p);
16625       /* If any clause is non-constant, so is the entire initializer.  */
16626       if (clause_non_constant_p)
16627         *non_constant_p = true;
16628
16629       /* If we have an ellipsis, this is an initializer pack
16630          expansion.  */
16631       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
16632         {
16633           /* Consume the `...'.  */
16634           cp_lexer_consume_token (parser->lexer);
16635
16636           /* Turn the initializer into an initializer expansion.  */
16637           initializer = make_pack_expansion (initializer);
16638         }
16639
16640       /* Add it to the vector.  */
16641       CONSTRUCTOR_APPEND_ELT(v, identifier, initializer);
16642
16643       /* If the next token is not a comma, we have reached the end of
16644          the list.  */
16645       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
16646         break;
16647
16648       /* Peek at the next token.  */
16649       token = cp_lexer_peek_nth_token (parser->lexer, 2);
16650       /* If the next token is a `}', then we're still done.  An
16651          initializer-clause can have a trailing `,' after the
16652          initializer-list and before the closing `}'.  */
16653       if (token->type == CPP_CLOSE_BRACE)
16654         break;
16655
16656       /* Consume the `,' token.  */
16657       cp_lexer_consume_token (parser->lexer);
16658     }
16659
16660   return v;
16661 }
16662
16663 /* Classes [gram.class] */
16664
16665 /* Parse a class-name.
16666
16667    class-name:
16668      identifier
16669      template-id
16670
16671    TYPENAME_KEYWORD_P is true iff the `typename' keyword has been used
16672    to indicate that names looked up in dependent types should be
16673    assumed to be types.  TEMPLATE_KEYWORD_P is true iff the `template'
16674    keyword has been used to indicate that the name that appears next
16675    is a template.  TAG_TYPE indicates the explicit tag given before
16676    the type name, if any.  If CHECK_DEPENDENCY_P is FALSE, names are
16677    looked up in dependent scopes.  If CLASS_HEAD_P is TRUE, this class
16678    is the class being defined in a class-head.
16679
16680    Returns the TYPE_DECL representing the class.  */
16681
16682 static tree
16683 cp_parser_class_name (cp_parser *parser,
16684                       bool typename_keyword_p,
16685                       bool template_keyword_p,
16686                       enum tag_types tag_type,
16687                       bool check_dependency_p,
16688                       bool class_head_p,
16689                       bool is_declaration)
16690 {
16691   tree decl;
16692   tree scope;
16693   bool typename_p;
16694   cp_token *token;
16695   tree identifier = NULL_TREE;
16696
16697   /* All class-names start with an identifier.  */
16698   token = cp_lexer_peek_token (parser->lexer);
16699   if (token->type != CPP_NAME && token->type != CPP_TEMPLATE_ID)
16700     {
16701       cp_parser_error (parser, "expected class-name");
16702       return error_mark_node;
16703     }
16704
16705   /* PARSER->SCOPE can be cleared when parsing the template-arguments
16706      to a template-id, so we save it here.  */
16707   scope = parser->scope;
16708   if (scope == error_mark_node)
16709     return error_mark_node;
16710
16711   /* Any name names a type if we're following the `typename' keyword
16712      in a qualified name where the enclosing scope is type-dependent.  */
16713   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
16714                 && dependent_type_p (scope));
16715   /* Handle the common case (an identifier, but not a template-id)
16716      efficiently.  */
16717   if (token->type == CPP_NAME
16718       && !cp_parser_nth_token_starts_template_argument_list_p (parser, 2))
16719     {
16720       cp_token *identifier_token;
16721       bool ambiguous_p;
16722
16723       /* Look for the identifier.  */
16724       identifier_token = cp_lexer_peek_token (parser->lexer);
16725       ambiguous_p = identifier_token->ambiguous_p;
16726       identifier = cp_parser_identifier (parser);
16727       /* If the next token isn't an identifier, we are certainly not
16728          looking at a class-name.  */
16729       if (identifier == error_mark_node)
16730         decl = error_mark_node;
16731       /* If we know this is a type-name, there's no need to look it
16732          up.  */
16733       else if (typename_p)
16734         decl = identifier;
16735       else
16736         {
16737           tree ambiguous_decls;
16738           /* If we already know that this lookup is ambiguous, then
16739              we've already issued an error message; there's no reason
16740              to check again.  */
16741           if (ambiguous_p)
16742             {
16743               cp_parser_simulate_error (parser);
16744               return error_mark_node;
16745             }
16746           /* If the next token is a `::', then the name must be a type
16747              name.
16748
16749              [basic.lookup.qual]
16750
16751              During the lookup for a name preceding the :: scope
16752              resolution operator, object, function, and enumerator
16753              names are ignored.  */
16754           if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16755             tag_type = typename_type;
16756           /* Look up the name.  */
16757           decl = cp_parser_lookup_name (parser, identifier,
16758                                         tag_type,
16759                                         /*is_template=*/false,
16760                                         /*is_namespace=*/false,
16761                                         check_dependency_p,
16762                                         &ambiguous_decls,
16763                                         identifier_token->location);
16764           if (ambiguous_decls)
16765             {
16766               if (cp_parser_parsing_tentatively (parser))
16767                 cp_parser_simulate_error (parser);
16768               return error_mark_node;
16769             }
16770         }
16771     }
16772   else
16773     {
16774       /* Try a template-id.  */
16775       decl = cp_parser_template_id (parser, template_keyword_p,
16776                                     check_dependency_p,
16777                                     is_declaration);
16778       if (decl == error_mark_node)
16779         return error_mark_node;
16780     }
16781
16782   decl = cp_parser_maybe_treat_template_as_class (decl, class_head_p);
16783
16784   /* If this is a typename, create a TYPENAME_TYPE.  */
16785   if (typename_p && decl != error_mark_node)
16786     {
16787       decl = make_typename_type (scope, decl, typename_type,
16788                                  /*complain=*/tf_error);
16789       if (decl != error_mark_node)
16790         decl = TYPE_NAME (decl);
16791     }
16792
16793   /* Check to see that it is really the name of a class.  */
16794   if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
16795       && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
16796       && cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
16797     /* Situations like this:
16798
16799          template <typename T> struct A {
16800            typename T::template X<int>::I i;
16801          };
16802
16803        are problematic.  Is `T::template X<int>' a class-name?  The
16804        standard does not seem to be definitive, but there is no other
16805        valid interpretation of the following `::'.  Therefore, those
16806        names are considered class-names.  */
16807     {
16808       decl = make_typename_type (scope, decl, tag_type, tf_error);
16809       if (decl != error_mark_node)
16810         decl = TYPE_NAME (decl);
16811     }
16812   else if (TREE_CODE (decl) != TYPE_DECL
16813            || TREE_TYPE (decl) == error_mark_node
16814            || !MAYBE_CLASS_TYPE_P (TREE_TYPE (decl))
16815            /* In Objective-C 2.0, a classname followed by '.' starts a
16816               dot-syntax expression, and it's not a type-name.  */
16817            || (c_dialect_objc ()
16818                && cp_lexer_peek_token (parser->lexer)->type == CPP_DOT 
16819                && objc_is_class_name (decl)))
16820     decl = error_mark_node;
16821
16822   if (decl == error_mark_node)
16823     cp_parser_error (parser, "expected class-name");
16824   else if (identifier && !parser->scope)
16825     maybe_note_name_used_in_class (identifier, decl);
16826
16827   return decl;
16828 }
16829
16830 /* Parse a class-specifier.
16831
16832    class-specifier:
16833      class-head { member-specification [opt] }
16834
16835    Returns the TREE_TYPE representing the class.  */
16836
16837 static tree
16838 cp_parser_class_specifier_1 (cp_parser* parser)
16839 {
16840   tree type;
16841   tree attributes = NULL_TREE;
16842   bool nested_name_specifier_p;
16843   unsigned saved_num_template_parameter_lists;
16844   bool saved_in_function_body;
16845   bool saved_in_unbraced_linkage_specification_p;
16846   tree old_scope = NULL_TREE;
16847   tree scope = NULL_TREE;
16848   tree bases;
16849   cp_token *closing_brace;
16850
16851   push_deferring_access_checks (dk_no_deferred);
16852
16853   /* Parse the class-head.  */
16854   type = cp_parser_class_head (parser,
16855                                &nested_name_specifier_p,
16856                                &attributes,
16857                                &bases);
16858   /* If the class-head was a semantic disaster, skip the entire body
16859      of the class.  */
16860   if (!type)
16861     {
16862       cp_parser_skip_to_end_of_block_or_statement (parser);
16863       pop_deferring_access_checks ();
16864       return error_mark_node;
16865     }
16866
16867   /* Look for the `{'.  */
16868   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
16869     {
16870       pop_deferring_access_checks ();
16871       return error_mark_node;
16872     }
16873
16874   /* Process the base classes. If they're invalid, skip the 
16875      entire class body.  */
16876   if (!xref_basetypes (type, bases))
16877     {
16878       /* Consuming the closing brace yields better error messages
16879          later on.  */
16880       if (cp_parser_skip_to_closing_brace (parser))
16881         cp_lexer_consume_token (parser->lexer);
16882       pop_deferring_access_checks ();
16883       return error_mark_node;
16884     }
16885
16886   /* Issue an error message if type-definitions are forbidden here.  */
16887   cp_parser_check_type_definition (parser);
16888   /* Remember that we are defining one more class.  */
16889   ++parser->num_classes_being_defined;
16890   /* Inside the class, surrounding template-parameter-lists do not
16891      apply.  */
16892   saved_num_template_parameter_lists
16893     = parser->num_template_parameter_lists;
16894   parser->num_template_parameter_lists = 0;
16895   /* We are not in a function body.  */
16896   saved_in_function_body = parser->in_function_body;
16897   parser->in_function_body = false;
16898   /* We are not immediately inside an extern "lang" block.  */
16899   saved_in_unbraced_linkage_specification_p
16900     = parser->in_unbraced_linkage_specification_p;
16901   parser->in_unbraced_linkage_specification_p = false;
16902
16903   /* Start the class.  */
16904   if (nested_name_specifier_p)
16905     {
16906       scope = CP_DECL_CONTEXT (TYPE_MAIN_DECL (type));
16907       old_scope = push_inner_scope (scope);
16908     }
16909   type = begin_class_definition (type, attributes);
16910
16911   if (type == error_mark_node)
16912     /* If the type is erroneous, skip the entire body of the class.  */
16913     cp_parser_skip_to_closing_brace (parser);
16914   else
16915     /* Parse the member-specification.  */
16916     cp_parser_member_specification_opt (parser);
16917
16918   /* Look for the trailing `}'.  */
16919   closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
16920   /* Look for trailing attributes to apply to this class.  */
16921   if (cp_parser_allow_gnu_extensions_p (parser))
16922     attributes = cp_parser_attributes_opt (parser);
16923   if (type != error_mark_node)
16924     type = finish_struct (type, attributes);
16925   if (nested_name_specifier_p)
16926     pop_inner_scope (old_scope, scope);
16927
16928   /* We've finished a type definition.  Check for the common syntax
16929      error of forgetting a semicolon after the definition.  We need to
16930      be careful, as we can't just check for not-a-semicolon and be done
16931      with it; the user might have typed:
16932
16933      class X { } c = ...;
16934      class X { } *p = ...;
16935
16936      and so forth.  Instead, enumerate all the possible tokens that
16937      might follow this production; if we don't see one of them, then
16938      complain and silently insert the semicolon.  */
16939   {
16940     cp_token *token = cp_lexer_peek_token (parser->lexer);
16941     bool want_semicolon = true;
16942
16943     switch (token->type)
16944       {
16945       case CPP_NAME:
16946       case CPP_SEMICOLON:
16947       case CPP_MULT:
16948       case CPP_AND:
16949       case CPP_OPEN_PAREN:
16950       case CPP_CLOSE_PAREN:
16951       case CPP_COMMA:
16952         want_semicolon = false;
16953         break;
16954
16955         /* While it's legal for type qualifiers and storage class
16956            specifiers to follow type definitions in the grammar, only
16957            compiler testsuites contain code like that.  Assume that if
16958            we see such code, then what we're really seeing is a case
16959            like:
16960
16961            class X { }
16962            const <type> var = ...;
16963
16964            or
16965
16966            class Y { }
16967            static <type> func (...) ...
16968
16969            i.e. the qualifier or specifier applies to the next
16970            declaration.  To do so, however, we need to look ahead one
16971            more token to see if *that* token is a type specifier.
16972
16973            This code could be improved to handle:
16974
16975            class Z { }
16976            static const <type> var = ...;  */
16977       case CPP_KEYWORD:
16978         if (keyword_is_decl_specifier (token->keyword))
16979           {
16980             cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2);
16981
16982             /* Handling user-defined types here would be nice, but very
16983                tricky.  */
16984             want_semicolon
16985               = (lookahead->type == CPP_KEYWORD
16986                  && keyword_begins_type_specifier (lookahead->keyword));
16987           }
16988         break;
16989       default:
16990         break;
16991       }
16992
16993     /* If we don't have a type, then something is very wrong and we
16994        shouldn't try to do anything clever.  Likewise for not seeing the
16995        closing brace.  */
16996     if (closing_brace && TYPE_P (type) && want_semicolon)
16997       {
16998         cp_token_position prev
16999           = cp_lexer_previous_token_position (parser->lexer);
17000         cp_token *prev_token = cp_lexer_token_at (parser->lexer, prev);
17001         location_t loc = prev_token->location;
17002
17003         if (CLASSTYPE_DECLARED_CLASS (type))
17004           error_at (loc, "expected %<;%> after class definition");
17005         else if (TREE_CODE (type) == RECORD_TYPE)
17006           error_at (loc, "expected %<;%> after struct definition");
17007         else if (TREE_CODE (type) == UNION_TYPE)
17008           error_at (loc, "expected %<;%> after union definition");
17009         else
17010           gcc_unreachable ();
17011
17012         /* Unget one token and smash it to look as though we encountered
17013            a semicolon in the input stream.  */
17014         cp_lexer_set_token_position (parser->lexer, prev);
17015         token = cp_lexer_peek_token (parser->lexer);
17016         token->type = CPP_SEMICOLON;
17017         token->keyword = RID_MAX;
17018       }
17019   }
17020
17021   /* If this class is not itself within the scope of another class,
17022      then we need to parse the bodies of all of the queued function
17023      definitions.  Note that the queued functions defined in a class
17024      are not always processed immediately following the
17025      class-specifier for that class.  Consider:
17026
17027        struct A {
17028          struct B { void f() { sizeof (A); } };
17029        };
17030
17031      If `f' were processed before the processing of `A' were
17032      completed, there would be no way to compute the size of `A'.
17033      Note that the nesting we are interested in here is lexical --
17034      not the semantic nesting given by TYPE_CONTEXT.  In particular,
17035      for:
17036
17037        struct A { struct B; };
17038        struct A::B { void f() { } };
17039
17040      there is no need to delay the parsing of `A::B::f'.  */
17041   if (--parser->num_classes_being_defined == 0)
17042     {
17043       tree fn;
17044       tree class_type = NULL_TREE;
17045       tree pushed_scope = NULL_TREE;
17046       unsigned ix;
17047       cp_default_arg_entry *e;
17048
17049       /* In a first pass, parse default arguments to the functions.
17050          Then, in a second pass, parse the bodies of the functions.
17051          This two-phased approach handles cases like:
17052
17053             struct S {
17054               void f() { g(); }
17055               void g(int i = 3);
17056             };
17057
17058          */
17059       FOR_EACH_VEC_ELT (cp_default_arg_entry, unparsed_funs_with_default_args,
17060                         ix, e)
17061         {
17062           fn = e->decl;
17063           /* If there are default arguments that have not yet been processed,
17064              take care of them now.  */
17065           if (class_type != e->class_type)
17066             {
17067               if (pushed_scope)
17068                 pop_scope (pushed_scope);
17069               class_type = e->class_type;
17070               pushed_scope = push_scope (class_type);
17071             }
17072           /* Make sure that any template parameters are in scope.  */
17073           maybe_begin_member_template_processing (fn);
17074           /* Parse the default argument expressions.  */
17075           cp_parser_late_parsing_default_args (parser, fn);
17076           /* Remove any template parameters from the symbol table.  */
17077           maybe_end_member_template_processing ();
17078         }
17079       if (pushed_scope)
17080         pop_scope (pushed_scope);
17081       VEC_truncate (cp_default_arg_entry, unparsed_funs_with_default_args, 0);
17082       /* Now parse the body of the functions.  */
17083       FOR_EACH_VEC_ELT (tree, unparsed_funs_with_definitions, ix, fn)
17084         cp_parser_late_parsing_for_member (parser, fn);
17085       VEC_truncate (tree, unparsed_funs_with_definitions, 0);
17086     }
17087
17088   /* Put back any saved access checks.  */
17089   pop_deferring_access_checks ();
17090
17091   /* Restore saved state.  */
17092   parser->in_function_body = saved_in_function_body;
17093   parser->num_template_parameter_lists
17094     = saved_num_template_parameter_lists;
17095   parser->in_unbraced_linkage_specification_p
17096     = saved_in_unbraced_linkage_specification_p;
17097
17098   return type;
17099 }
17100
17101 static tree
17102 cp_parser_class_specifier (cp_parser* parser)
17103 {
17104   tree ret;
17105   timevar_push (TV_PARSE_STRUCT);
17106   ret = cp_parser_class_specifier_1 (parser);
17107   timevar_pop (TV_PARSE_STRUCT);
17108   return ret;
17109 }
17110
17111 /* Parse a class-head.
17112
17113    class-head:
17114      class-key identifier [opt] base-clause [opt]
17115      class-key nested-name-specifier identifier class-virt-specifier [opt] base-clause [opt]
17116      class-key nested-name-specifier [opt] template-id
17117        base-clause [opt]
17118
17119    class-virt-specifier:
17120      final
17121
17122    GNU Extensions:
17123      class-key attributes identifier [opt] base-clause [opt]
17124      class-key attributes nested-name-specifier identifier base-clause [opt]
17125      class-key attributes nested-name-specifier [opt] template-id
17126        base-clause [opt]
17127
17128    Upon return BASES is initialized to the list of base classes (or
17129    NULL, if there are none) in the same form returned by
17130    cp_parser_base_clause.
17131
17132    Returns the TYPE of the indicated class.  Sets
17133    *NESTED_NAME_SPECIFIER_P to TRUE iff one of the productions
17134    involving a nested-name-specifier was used, and FALSE otherwise.
17135
17136    Returns error_mark_node if this is not a class-head.
17137
17138    Returns NULL_TREE if the class-head is syntactically valid, but
17139    semantically invalid in a way that means we should skip the entire
17140    body of the class.  */
17141
17142 static tree
17143 cp_parser_class_head (cp_parser* parser,
17144                       bool* nested_name_specifier_p,
17145                       tree *attributes_p,
17146                       tree *bases)
17147 {
17148   tree nested_name_specifier;
17149   enum tag_types class_key;
17150   tree id = NULL_TREE;
17151   tree type = NULL_TREE;
17152   tree attributes;
17153   cp_virt_specifiers virt_specifiers = VIRT_SPEC_UNSPECIFIED;
17154   bool template_id_p = false;
17155   bool qualified_p = false;
17156   bool invalid_nested_name_p = false;
17157   bool invalid_explicit_specialization_p = false;
17158   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17159   tree pushed_scope = NULL_TREE;
17160   unsigned num_templates;
17161   cp_token *type_start_token = NULL, *nested_name_specifier_token_start = NULL;
17162   /* Assume no nested-name-specifier will be present.  */
17163   *nested_name_specifier_p = false;
17164   /* Assume no template parameter lists will be used in defining the
17165      type.  */
17166   num_templates = 0;
17167   parser->colon_corrects_to_scope_p = false;
17168
17169   *bases = NULL_TREE;
17170
17171   /* Look for the class-key.  */
17172   class_key = cp_parser_class_key (parser);
17173   if (class_key == none_type)
17174     return error_mark_node;
17175
17176   /* Parse the attributes.  */
17177   attributes = cp_parser_attributes_opt (parser);
17178
17179   /* If the next token is `::', that is invalid -- but sometimes
17180      people do try to write:
17181
17182        struct ::S {};
17183
17184      Handle this gracefully by accepting the extra qualifier, and then
17185      issuing an error about it later if this really is a
17186      class-head.  If it turns out just to be an elaborated type
17187      specifier, remain silent.  */
17188   if (cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false))
17189     qualified_p = true;
17190
17191   push_deferring_access_checks (dk_no_check);
17192
17193   /* Determine the name of the class.  Begin by looking for an
17194      optional nested-name-specifier.  */
17195   nested_name_specifier_token_start = cp_lexer_peek_token (parser->lexer);
17196   nested_name_specifier
17197     = cp_parser_nested_name_specifier_opt (parser,
17198                                            /*typename_keyword_p=*/false,
17199                                            /*check_dependency_p=*/false,
17200                                            /*type_p=*/false,
17201                                            /*is_declaration=*/false);
17202   /* If there was a nested-name-specifier, then there *must* be an
17203      identifier.  */
17204   if (nested_name_specifier)
17205     {
17206       type_start_token = cp_lexer_peek_token (parser->lexer);
17207       /* Although the grammar says `identifier', it really means
17208          `class-name' or `template-name'.  You are only allowed to
17209          define a class that has already been declared with this
17210          syntax.
17211
17212          The proposed resolution for Core Issue 180 says that wherever
17213          you see `class T::X' you should treat `X' as a type-name.
17214
17215          It is OK to define an inaccessible class; for example:
17216
17217            class A { class B; };
17218            class A::B {};
17219
17220          We do not know if we will see a class-name, or a
17221          template-name.  We look for a class-name first, in case the
17222          class-name is a template-id; if we looked for the
17223          template-name first we would stop after the template-name.  */
17224       cp_parser_parse_tentatively (parser);
17225       type = cp_parser_class_name (parser,
17226                                    /*typename_keyword_p=*/false,
17227                                    /*template_keyword_p=*/false,
17228                                    class_type,
17229                                    /*check_dependency_p=*/false,
17230                                    /*class_head_p=*/true,
17231                                    /*is_declaration=*/false);
17232       /* If that didn't work, ignore the nested-name-specifier.  */
17233       if (!cp_parser_parse_definitely (parser))
17234         {
17235           invalid_nested_name_p = true;
17236           type_start_token = cp_lexer_peek_token (parser->lexer);
17237           id = cp_parser_identifier (parser);
17238           if (id == error_mark_node)
17239             id = NULL_TREE;
17240         }
17241       /* If we could not find a corresponding TYPE, treat this
17242          declaration like an unqualified declaration.  */
17243       if (type == error_mark_node)
17244         nested_name_specifier = NULL_TREE;
17245       /* Otherwise, count the number of templates used in TYPE and its
17246          containing scopes.  */
17247       else
17248         {
17249           tree scope;
17250
17251           for (scope = TREE_TYPE (type);
17252                scope && TREE_CODE (scope) != NAMESPACE_DECL;
17253                scope = (TYPE_P (scope)
17254                         ? TYPE_CONTEXT (scope)
17255                         : DECL_CONTEXT (scope)))
17256             if (TYPE_P (scope)
17257                 && CLASS_TYPE_P (scope)
17258                 && CLASSTYPE_TEMPLATE_INFO (scope)
17259                 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope))
17260                 && !CLASSTYPE_TEMPLATE_SPECIALIZATION (scope))
17261               ++num_templates;
17262         }
17263     }
17264   /* Otherwise, the identifier is optional.  */
17265   else
17266     {
17267       /* We don't know whether what comes next is a template-id,
17268          an identifier, or nothing at all.  */
17269       cp_parser_parse_tentatively (parser);
17270       /* Check for a template-id.  */
17271       type_start_token = cp_lexer_peek_token (parser->lexer);
17272       id = cp_parser_template_id (parser,
17273                                   /*template_keyword_p=*/false,
17274                                   /*check_dependency_p=*/true,
17275                                   /*is_declaration=*/true);
17276       /* If that didn't work, it could still be an identifier.  */
17277       if (!cp_parser_parse_definitely (parser))
17278         {
17279           if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
17280             {
17281               type_start_token = cp_lexer_peek_token (parser->lexer);
17282               id = cp_parser_identifier (parser);
17283             }
17284           else
17285             id = NULL_TREE;
17286         }
17287       else
17288         {
17289           template_id_p = true;
17290           ++num_templates;
17291         }
17292     }
17293
17294   pop_deferring_access_checks ();
17295
17296   if (id)
17297     {
17298       cp_parser_check_for_invalid_template_id (parser, id,
17299                                                type_start_token->location);
17300       virt_specifiers = cp_parser_virt_specifier_seq_opt (parser);
17301     }
17302
17303   /* If it's not a `:' or a `{' then we can't really be looking at a
17304      class-head, since a class-head only appears as part of a
17305      class-specifier.  We have to detect this situation before calling
17306      xref_tag, since that has irreversible side-effects.  */
17307   if (!cp_parser_next_token_starts_class_definition_p (parser))
17308     {
17309       cp_parser_error (parser, "expected %<{%> or %<:%>");
17310       type = error_mark_node;
17311       goto out;
17312     }
17313
17314   /* At this point, we're going ahead with the class-specifier, even
17315      if some other problem occurs.  */
17316   cp_parser_commit_to_tentative_parse (parser);
17317   if (virt_specifiers & VIRT_SPEC_OVERRIDE)
17318     {
17319       cp_parser_error (parser,
17320                        "cannot specify %<override%> for a class");
17321       type = error_mark_node;
17322       goto out;
17323     }
17324   /* Issue the error about the overly-qualified name now.  */
17325   if (qualified_p)
17326     {
17327       cp_parser_error (parser,
17328                        "global qualification of class name is invalid");
17329       type = error_mark_node;
17330       goto out;
17331     }
17332   else if (invalid_nested_name_p)
17333     {
17334       cp_parser_error (parser,
17335                        "qualified name does not name a class");
17336       type = error_mark_node;
17337       goto out;
17338     }
17339   else if (nested_name_specifier)
17340     {
17341       tree scope;
17342
17343       /* Reject typedef-names in class heads.  */
17344       if (!DECL_IMPLICIT_TYPEDEF_P (type))
17345         {
17346           error_at (type_start_token->location,
17347                     "invalid class name in declaration of %qD",
17348                     type);
17349           type = NULL_TREE;
17350           goto done;
17351         }
17352
17353       /* Figure out in what scope the declaration is being placed.  */
17354       scope = current_scope ();
17355       /* If that scope does not contain the scope in which the
17356          class was originally declared, the program is invalid.  */
17357       if (scope && !is_ancestor (scope, nested_name_specifier))
17358         {
17359           if (at_namespace_scope_p ())
17360             error_at (type_start_token->location,
17361                       "declaration of %qD in namespace %qD which does not "
17362                       "enclose %qD",
17363                       type, scope, nested_name_specifier);
17364           else
17365             error_at (type_start_token->location,
17366                       "declaration of %qD in %qD which does not enclose %qD",
17367                       type, scope, nested_name_specifier);
17368           type = NULL_TREE;
17369           goto done;
17370         }
17371       /* [dcl.meaning]
17372
17373          A declarator-id shall not be qualified except for the
17374          definition of a ... nested class outside of its class
17375          ... [or] the definition or explicit instantiation of a
17376          class member of a namespace outside of its namespace.  */
17377       if (scope == nested_name_specifier)
17378         {
17379           permerror (nested_name_specifier_token_start->location,
17380                      "extra qualification not allowed");
17381           nested_name_specifier = NULL_TREE;
17382           num_templates = 0;
17383         }
17384     }
17385   /* An explicit-specialization must be preceded by "template <>".  If
17386      it is not, try to recover gracefully.  */
17387   if (at_namespace_scope_p ()
17388       && parser->num_template_parameter_lists == 0
17389       && template_id_p)
17390     {
17391       error_at (type_start_token->location,
17392                 "an explicit specialization must be preceded by %<template <>%>");
17393       invalid_explicit_specialization_p = true;
17394       /* Take the same action that would have been taken by
17395          cp_parser_explicit_specialization.  */
17396       ++parser->num_template_parameter_lists;
17397       begin_specialization ();
17398     }
17399   /* There must be no "return" statements between this point and the
17400      end of this function; set "type "to the correct return value and
17401      use "goto done;" to return.  */
17402   /* Make sure that the right number of template parameters were
17403      present.  */
17404   if (!cp_parser_check_template_parameters (parser, num_templates,
17405                                             type_start_token->location,
17406                                             /*declarator=*/NULL))
17407     {
17408       /* If something went wrong, there is no point in even trying to
17409          process the class-definition.  */
17410       type = NULL_TREE;
17411       goto done;
17412     }
17413
17414   /* Look up the type.  */
17415   if (template_id_p)
17416     {
17417       if (TREE_CODE (id) == TEMPLATE_ID_EXPR
17418           && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
17419               || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
17420         {
17421           error_at (type_start_token->location,
17422                     "function template %qD redeclared as a class template", id);
17423           type = error_mark_node;
17424         }
17425       else
17426         {
17427           type = TREE_TYPE (id);
17428           type = maybe_process_partial_specialization (type);
17429         }
17430       if (nested_name_specifier)
17431         pushed_scope = push_scope (nested_name_specifier);
17432     }
17433   else if (nested_name_specifier)
17434     {
17435       tree class_type;
17436
17437       /* Given:
17438
17439             template <typename T> struct S { struct T };
17440             template <typename T> struct S<T>::T { };
17441
17442          we will get a TYPENAME_TYPE when processing the definition of
17443          `S::T'.  We need to resolve it to the actual type before we
17444          try to define it.  */
17445       if (TREE_CODE (TREE_TYPE (type)) == TYPENAME_TYPE)
17446         {
17447           class_type = resolve_typename_type (TREE_TYPE (type),
17448                                               /*only_current_p=*/false);
17449           if (TREE_CODE (class_type) != TYPENAME_TYPE)
17450             type = TYPE_NAME (class_type);
17451           else
17452             {
17453               cp_parser_error (parser, "could not resolve typename type");
17454               type = error_mark_node;
17455             }
17456         }
17457
17458       if (maybe_process_partial_specialization (TREE_TYPE (type))
17459           == error_mark_node)
17460         {
17461           type = NULL_TREE;
17462           goto done;
17463         }
17464
17465       class_type = current_class_type;
17466       /* Enter the scope indicated by the nested-name-specifier.  */
17467       pushed_scope = push_scope (nested_name_specifier);
17468       /* Get the canonical version of this type.  */
17469       type = TYPE_MAIN_DECL (TREE_TYPE (type));
17470       if (PROCESSING_REAL_TEMPLATE_DECL_P ()
17471           && !CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (type)))
17472         {
17473           type = push_template_decl (type);
17474           if (type == error_mark_node)
17475             {
17476               type = NULL_TREE;
17477               goto done;
17478             }
17479         }
17480
17481       type = TREE_TYPE (type);
17482       *nested_name_specifier_p = true;
17483     }
17484   else      /* The name is not a nested name.  */
17485     {
17486       /* If the class was unnamed, create a dummy name.  */
17487       if (!id)
17488         id = make_anon_name ();
17489       type = xref_tag (class_key, id, /*tag_scope=*/ts_current,
17490                        parser->num_template_parameter_lists);
17491     }
17492
17493   /* Indicate whether this class was declared as a `class' or as a
17494      `struct'.  */
17495   if (TREE_CODE (type) == RECORD_TYPE)
17496     CLASSTYPE_DECLARED_CLASS (type) = (class_key == class_type);
17497   cp_parser_check_class_key (class_key, type);
17498
17499   /* If this type was already complete, and we see another definition,
17500      that's an error.  */
17501   if (type != error_mark_node && COMPLETE_TYPE_P (type))
17502     {
17503       error_at (type_start_token->location, "redefinition of %q#T",
17504                 type);
17505       error_at (type_start_token->location, "previous definition of %q+#T",
17506                 type);
17507       type = NULL_TREE;
17508       goto done;
17509     }
17510   else if (type == error_mark_node)
17511     type = NULL_TREE;
17512
17513   /* We will have entered the scope containing the class; the names of
17514      base classes should be looked up in that context.  For example:
17515
17516        struct A { struct B {}; struct C; };
17517        struct A::C : B {};
17518
17519      is valid.  */
17520
17521   /* Get the list of base-classes, if there is one.  */
17522   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
17523     *bases = cp_parser_base_clause (parser);
17524
17525  done:
17526   /* Leave the scope given by the nested-name-specifier.  We will
17527      enter the class scope itself while processing the members.  */
17528   if (pushed_scope)
17529     pop_scope (pushed_scope);
17530
17531   if (invalid_explicit_specialization_p)
17532     {
17533       end_specialization ();
17534       --parser->num_template_parameter_lists;
17535     }
17536
17537   if (type)
17538     DECL_SOURCE_LOCATION (TYPE_NAME (type)) = type_start_token->location;
17539   *attributes_p = attributes;
17540   if (type && (virt_specifiers & VIRT_SPEC_FINAL))
17541     CLASSTYPE_FINAL (type) = 1;
17542  out:
17543   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
17544   return type;
17545 }
17546
17547 /* Parse a class-key.
17548
17549    class-key:
17550      class
17551      struct
17552      union
17553
17554    Returns the kind of class-key specified, or none_type to indicate
17555    error.  */
17556
17557 static enum tag_types
17558 cp_parser_class_key (cp_parser* parser)
17559 {
17560   cp_token *token;
17561   enum tag_types tag_type;
17562
17563   /* Look for the class-key.  */
17564   token = cp_parser_require (parser, CPP_KEYWORD, RT_CLASS_KEY);
17565   if (!token)
17566     return none_type;
17567
17568   /* Check to see if the TOKEN is a class-key.  */
17569   tag_type = cp_parser_token_is_class_key (token);
17570   if (!tag_type)
17571     cp_parser_error (parser, "expected class-key");
17572   return tag_type;
17573 }
17574
17575 /* Parse an (optional) member-specification.
17576
17577    member-specification:
17578      member-declaration member-specification [opt]
17579      access-specifier : member-specification [opt]  */
17580
17581 static void
17582 cp_parser_member_specification_opt (cp_parser* parser)
17583 {
17584   while (true)
17585     {
17586       cp_token *token;
17587       enum rid keyword;
17588
17589       /* Peek at the next token.  */
17590       token = cp_lexer_peek_token (parser->lexer);
17591       /* If it's a `}', or EOF then we've seen all the members.  */
17592       if (token->type == CPP_CLOSE_BRACE
17593           || token->type == CPP_EOF
17594           || token->type == CPP_PRAGMA_EOL)
17595         break;
17596
17597       /* See if this token is a keyword.  */
17598       keyword = token->keyword;
17599       switch (keyword)
17600         {
17601         case RID_PUBLIC:
17602         case RID_PROTECTED:
17603         case RID_PRIVATE:
17604           /* Consume the access-specifier.  */
17605           cp_lexer_consume_token (parser->lexer);
17606           /* Remember which access-specifier is active.  */
17607           current_access_specifier = token->u.value;
17608           /* Look for the `:'.  */
17609           cp_parser_require (parser, CPP_COLON, RT_COLON);
17610           break;
17611
17612         default:
17613           /* Accept #pragmas at class scope.  */
17614           if (token->type == CPP_PRAGMA)
17615             {
17616               cp_parser_pragma (parser, pragma_external);
17617               break;
17618             }
17619
17620           /* Otherwise, the next construction must be a
17621              member-declaration.  */
17622           cp_parser_member_declaration (parser);
17623         }
17624     }
17625 }
17626
17627 /* Parse a member-declaration.
17628
17629    member-declaration:
17630      decl-specifier-seq [opt] member-declarator-list [opt] ;
17631      function-definition ; [opt]
17632      :: [opt] nested-name-specifier template [opt] unqualified-id ;
17633      using-declaration
17634      template-declaration
17635
17636    member-declarator-list:
17637      member-declarator
17638      member-declarator-list , member-declarator
17639
17640    member-declarator:
17641      declarator pure-specifier [opt]
17642      declarator constant-initializer [opt]
17643      identifier [opt] : constant-expression
17644
17645    GNU Extensions:
17646
17647    member-declaration:
17648      __extension__ member-declaration
17649
17650    member-declarator:
17651      declarator attributes [opt] pure-specifier [opt]
17652      declarator attributes [opt] constant-initializer [opt]
17653      identifier [opt] attributes [opt] : constant-expression  
17654
17655    C++0x Extensions:
17656
17657    member-declaration:
17658      static_assert-declaration  */
17659
17660 static void
17661 cp_parser_member_declaration (cp_parser* parser)
17662 {
17663   cp_decl_specifier_seq decl_specifiers;
17664   tree prefix_attributes;
17665   tree decl;
17666   int declares_class_or_enum;
17667   bool friend_p;
17668   cp_token *token = NULL;
17669   cp_token *decl_spec_token_start = NULL;
17670   cp_token *initializer_token_start = NULL;
17671   int saved_pedantic;
17672   bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
17673
17674   /* Check for the `__extension__' keyword.  */
17675   if (cp_parser_extension_opt (parser, &saved_pedantic))
17676     {
17677       /* Recurse.  */
17678       cp_parser_member_declaration (parser);
17679       /* Restore the old value of the PEDANTIC flag.  */
17680       pedantic = saved_pedantic;
17681
17682       return;
17683     }
17684
17685   /* Check for a template-declaration.  */
17686   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
17687     {
17688       /* An explicit specialization here is an error condition, and we
17689          expect the specialization handler to detect and report this.  */
17690       if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS
17691           && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER)
17692         cp_parser_explicit_specialization (parser);
17693       else
17694         cp_parser_template_declaration (parser, /*member_p=*/true);
17695
17696       return;
17697     }
17698
17699   /* Check for a using-declaration.  */
17700   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_USING))
17701     {
17702       /* Parse the using-declaration.  */
17703       cp_parser_using_declaration (parser,
17704                                    /*access_declaration_p=*/false);
17705       return;
17706     }
17707
17708   /* Check for @defs.  */
17709   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_DEFS))
17710     {
17711       tree ivar, member;
17712       tree ivar_chains = cp_parser_objc_defs_expression (parser);
17713       ivar = ivar_chains;
17714       while (ivar)
17715         {
17716           member = ivar;
17717           ivar = TREE_CHAIN (member);
17718           TREE_CHAIN (member) = NULL_TREE;
17719           finish_member_declaration (member);
17720         }
17721       return;
17722     }
17723
17724   /* If the next token is `static_assert' we have a static assertion.  */
17725   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC_ASSERT))
17726     {
17727       cp_parser_static_assert (parser, /*member_p=*/true);
17728       return;
17729     }
17730
17731   parser->colon_corrects_to_scope_p = false;
17732
17733   if (cp_parser_using_declaration (parser, /*access_declaration=*/true))
17734     goto out;
17735
17736   /* Parse the decl-specifier-seq.  */
17737   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
17738   cp_parser_decl_specifier_seq (parser,
17739                                 CP_PARSER_FLAGS_OPTIONAL,
17740                                 &decl_specifiers,
17741                                 &declares_class_or_enum);
17742   prefix_attributes = decl_specifiers.attributes;
17743   decl_specifiers.attributes = NULL_TREE;
17744   /* Check for an invalid type-name.  */
17745   if (!decl_specifiers.any_type_specifiers_p
17746       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
17747     goto out;
17748   /* If there is no declarator, then the decl-specifier-seq should
17749      specify a type.  */
17750   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
17751     {
17752       /* If there was no decl-specifier-seq, and the next token is a
17753          `;', then we have something like:
17754
17755            struct S { ; };
17756
17757          [class.mem]
17758
17759          Each member-declaration shall declare at least one member
17760          name of the class.  */
17761       if (!decl_specifiers.any_specifiers_p)
17762         {
17763           cp_token *token = cp_lexer_peek_token (parser->lexer);
17764           if (!in_system_header_at (token->location))
17765             pedwarn (token->location, OPT_pedantic, "extra %<;%>");
17766         }
17767       else
17768         {
17769           tree type;
17770
17771           /* See if this declaration is a friend.  */
17772           friend_p = cp_parser_friend_p (&decl_specifiers);
17773           /* If there were decl-specifiers, check to see if there was
17774              a class-declaration.  */
17775           type = check_tag_decl (&decl_specifiers);
17776           /* Nested classes have already been added to the class, but
17777              a `friend' needs to be explicitly registered.  */
17778           if (friend_p)
17779             {
17780               /* If the `friend' keyword was present, the friend must
17781                  be introduced with a class-key.  */
17782                if (!declares_class_or_enum && cxx_dialect < cxx0x)
17783                  pedwarn (decl_spec_token_start->location, OPT_pedantic,
17784                           "in C++03 a class-key must be used "
17785                           "when declaring a friend");
17786                /* In this case:
17787
17788                     template <typename T> struct A {
17789                       friend struct A<T>::B;
17790                     };
17791
17792                   A<T>::B will be represented by a TYPENAME_TYPE, and
17793                   therefore not recognized by check_tag_decl.  */
17794                if (!type)
17795                  {
17796                    type = decl_specifiers.type;
17797                    if (type && TREE_CODE (type) == TYPE_DECL)
17798                      type = TREE_TYPE (type);
17799                  }
17800                if (!type || !TYPE_P (type))
17801                  error_at (decl_spec_token_start->location,
17802                            "friend declaration does not name a class or "
17803                            "function");
17804                else
17805                  make_friend_class (current_class_type, type,
17806                                     /*complain=*/true);
17807             }
17808           /* If there is no TYPE, an error message will already have
17809              been issued.  */
17810           else if (!type || type == error_mark_node)
17811             ;
17812           /* An anonymous aggregate has to be handled specially; such
17813              a declaration really declares a data member (with a
17814              particular type), as opposed to a nested class.  */
17815           else if (ANON_AGGR_TYPE_P (type))
17816             {
17817               /* Remove constructors and such from TYPE, now that we
17818                  know it is an anonymous aggregate.  */
17819               fixup_anonymous_aggr (type);
17820               /* And make the corresponding data member.  */
17821               decl = build_decl (decl_spec_token_start->location,
17822                                  FIELD_DECL, NULL_TREE, type);
17823               /* Add it to the class.  */
17824               finish_member_declaration (decl);
17825             }
17826           else
17827             cp_parser_check_access_in_redeclaration
17828                                               (TYPE_NAME (type),
17829                                                decl_spec_token_start->location);
17830         }
17831     }
17832   else
17833     {
17834       bool assume_semicolon = false;
17835
17836       /* See if these declarations will be friends.  */
17837       friend_p = cp_parser_friend_p (&decl_specifiers);
17838
17839       /* Keep going until we hit the `;' at the end of the
17840          declaration.  */
17841       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
17842         {
17843           tree attributes = NULL_TREE;
17844           tree first_attribute;
17845
17846           /* Peek at the next token.  */
17847           token = cp_lexer_peek_token (parser->lexer);
17848
17849           /* Check for a bitfield declaration.  */
17850           if (token->type == CPP_COLON
17851               || (token->type == CPP_NAME
17852                   && cp_lexer_peek_nth_token (parser->lexer, 2)->type
17853                   == CPP_COLON))
17854             {
17855               tree identifier;
17856               tree width;
17857
17858               /* Get the name of the bitfield.  Note that we cannot just
17859                  check TOKEN here because it may have been invalidated by
17860                  the call to cp_lexer_peek_nth_token above.  */
17861               if (cp_lexer_peek_token (parser->lexer)->type != CPP_COLON)
17862                 identifier = cp_parser_identifier (parser);
17863               else
17864                 identifier = NULL_TREE;
17865
17866               /* Consume the `:' token.  */
17867               cp_lexer_consume_token (parser->lexer);
17868               /* Get the width of the bitfield.  */
17869               width
17870                 = cp_parser_constant_expression (parser,
17871                                                  /*allow_non_constant=*/false,
17872                                                  NULL);
17873
17874               /* Look for attributes that apply to the bitfield.  */
17875               attributes = cp_parser_attributes_opt (parser);
17876               /* Remember which attributes are prefix attributes and
17877                  which are not.  */
17878               first_attribute = attributes;
17879               /* Combine the attributes.  */
17880               attributes = chainon (prefix_attributes, attributes);
17881
17882               /* Create the bitfield declaration.  */
17883               decl = grokbitfield (identifier
17884                                    ? make_id_declarator (NULL_TREE,
17885                                                          identifier,
17886                                                          sfk_none)
17887                                    : NULL,
17888                                    &decl_specifiers,
17889                                    width,
17890                                    attributes);
17891             }
17892           else
17893             {
17894               cp_declarator *declarator;
17895               tree initializer;
17896               tree asm_specification;
17897               int ctor_dtor_or_conv_p;
17898
17899               /* Parse the declarator.  */
17900               declarator
17901                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
17902                                         &ctor_dtor_or_conv_p,
17903                                         /*parenthesized_p=*/NULL,
17904                                         /*member_p=*/true);
17905
17906               /* If something went wrong parsing the declarator, make sure
17907                  that we at least consume some tokens.  */
17908               if (declarator == cp_error_declarator)
17909                 {
17910                   /* Skip to the end of the statement.  */
17911                   cp_parser_skip_to_end_of_statement (parser);
17912                   /* If the next token is not a semicolon, that is
17913                      probably because we just skipped over the body of
17914                      a function.  So, we consume a semicolon if
17915                      present, but do not issue an error message if it
17916                      is not present.  */
17917                   if (cp_lexer_next_token_is (parser->lexer,
17918                                               CPP_SEMICOLON))
17919                     cp_lexer_consume_token (parser->lexer);
17920                   goto out;
17921                 }
17922
17923               if (declares_class_or_enum & 2)
17924                 cp_parser_check_for_definition_in_return_type
17925                                             (declarator, decl_specifiers.type,
17926                                              decl_specifiers.type_location);
17927
17928               /* Look for an asm-specification.  */
17929               asm_specification = cp_parser_asm_specification_opt (parser);
17930               /* Look for attributes that apply to the declaration.  */
17931               attributes = cp_parser_attributes_opt (parser);
17932               /* Remember which attributes are prefix attributes and
17933                  which are not.  */
17934               first_attribute = attributes;
17935               /* Combine the attributes.  */
17936               attributes = chainon (prefix_attributes, attributes);
17937
17938               /* If it's an `=', then we have a constant-initializer or a
17939                  pure-specifier.  It is not correct to parse the
17940                  initializer before registering the member declaration
17941                  since the member declaration should be in scope while
17942                  its initializer is processed.  However, the rest of the
17943                  front end does not yet provide an interface that allows
17944                  us to handle this correctly.  */
17945               if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
17946                 {
17947                   /* In [class.mem]:
17948
17949                      A pure-specifier shall be used only in the declaration of
17950                      a virtual function.
17951
17952                      A member-declarator can contain a constant-initializer
17953                      only if it declares a static member of integral or
17954                      enumeration type.
17955
17956                      Therefore, if the DECLARATOR is for a function, we look
17957                      for a pure-specifier; otherwise, we look for a
17958                      constant-initializer.  When we call `grokfield', it will
17959                      perform more stringent semantics checks.  */
17960                   initializer_token_start = cp_lexer_peek_token (parser->lexer);
17961                   if (function_declarator_p (declarator))
17962                     initializer = cp_parser_pure_specifier (parser);
17963                   else
17964                     /* Parse the initializer.  */
17965                     initializer = cp_parser_constant_initializer (parser);
17966                 }
17967               /* Otherwise, there is no initializer.  */
17968               else
17969                 initializer = NULL_TREE;
17970
17971               /* See if we are probably looking at a function
17972                  definition.  We are certainly not looking at a
17973                  member-declarator.  Calling `grokfield' has
17974                  side-effects, so we must not do it unless we are sure
17975                  that we are looking at a member-declarator.  */
17976               if (cp_parser_token_starts_function_definition_p
17977                   (cp_lexer_peek_token (parser->lexer)))
17978                 {
17979                   /* The grammar does not allow a pure-specifier to be
17980                      used when a member function is defined.  (It is
17981                      possible that this fact is an oversight in the
17982                      standard, since a pure function may be defined
17983                      outside of the class-specifier.  */
17984                   if (initializer)
17985                     error_at (initializer_token_start->location,
17986                               "pure-specifier on function-definition");
17987                   decl = cp_parser_save_member_function_body (parser,
17988                                                               &decl_specifiers,
17989                                                               declarator,
17990                                                               attributes);
17991                   /* If the member was not a friend, declare it here.  */
17992                   if (!friend_p)
17993                     finish_member_declaration (decl);
17994                   /* Peek at the next token.  */
17995                   token = cp_lexer_peek_token (parser->lexer);
17996                   /* If the next token is a semicolon, consume it.  */
17997                   if (token->type == CPP_SEMICOLON)
17998                     cp_lexer_consume_token (parser->lexer);
17999                   goto out;
18000                 }
18001               else
18002                 if (declarator->kind == cdk_function)
18003                   declarator->id_loc = token->location;
18004                 /* Create the declaration.  */
18005                 decl = grokfield (declarator, &decl_specifiers,
18006                                   initializer, /*init_const_expr_p=*/true,
18007                                   asm_specification,
18008                                   attributes);
18009             }
18010
18011           /* Reset PREFIX_ATTRIBUTES.  */
18012           while (attributes && TREE_CHAIN (attributes) != first_attribute)
18013             attributes = TREE_CHAIN (attributes);
18014           if (attributes)
18015             TREE_CHAIN (attributes) = NULL_TREE;
18016
18017           /* If there is any qualification still in effect, clear it
18018              now; we will be starting fresh with the next declarator.  */
18019           parser->scope = NULL_TREE;
18020           parser->qualifying_scope = NULL_TREE;
18021           parser->object_scope = NULL_TREE;
18022           /* If it's a `,', then there are more declarators.  */
18023           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
18024             cp_lexer_consume_token (parser->lexer);
18025           /* If the next token isn't a `;', then we have a parse error.  */
18026           else if (cp_lexer_next_token_is_not (parser->lexer,
18027                                                CPP_SEMICOLON))
18028             {
18029               /* The next token might be a ways away from where the
18030                  actual semicolon is missing.  Find the previous token
18031                  and use that for our error position.  */
18032               cp_token *token = cp_lexer_previous_token (parser->lexer);
18033               error_at (token->location,
18034                         "expected %<;%> at end of member declaration");
18035
18036               /* Assume that the user meant to provide a semicolon.  If
18037                  we were to cp_parser_skip_to_end_of_statement, we might
18038                  skip to a semicolon inside a member function definition
18039                  and issue nonsensical error messages.  */
18040               assume_semicolon = true;
18041             }
18042
18043           if (decl)
18044             {
18045               /* Add DECL to the list of members.  */
18046               if (!friend_p)
18047                 finish_member_declaration (decl);
18048
18049               if (TREE_CODE (decl) == FUNCTION_DECL)
18050                 cp_parser_save_default_args (parser, decl);
18051             }
18052
18053           if (assume_semicolon)
18054             goto out;
18055         }
18056     }
18057
18058   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
18059  out:
18060   parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
18061 }
18062
18063 /* Parse a pure-specifier.
18064
18065    pure-specifier:
18066      = 0
18067
18068    Returns INTEGER_ZERO_NODE if a pure specifier is found.
18069    Otherwise, ERROR_MARK_NODE is returned.  */
18070
18071 static tree
18072 cp_parser_pure_specifier (cp_parser* parser)
18073 {
18074   cp_token *token;
18075
18076   /* Look for the `=' token.  */
18077   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18078     return error_mark_node;
18079   /* Look for the `0' token.  */
18080   token = cp_lexer_peek_token (parser->lexer);
18081
18082   if (token->type == CPP_EOF
18083       || token->type == CPP_PRAGMA_EOL)
18084     return error_mark_node;
18085
18086   cp_lexer_consume_token (parser->lexer);
18087
18088   /* Accept = default or = delete in c++0x mode.  */
18089   if (token->keyword == RID_DEFAULT
18090       || token->keyword == RID_DELETE)
18091     {
18092       maybe_warn_cpp0x (CPP0X_DEFAULTED_DELETED);
18093       return token->u.value;
18094     }
18095
18096   /* c_lex_with_flags marks a single digit '0' with PURE_ZERO.  */
18097   if (token->type != CPP_NUMBER || !(token->flags & PURE_ZERO))
18098     {
18099       cp_parser_error (parser,
18100                        "invalid pure specifier (only %<= 0%> is allowed)");
18101       cp_parser_skip_to_end_of_statement (parser);
18102       return error_mark_node;
18103     }
18104   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
18105     {
18106       error_at (token->location, "templates may not be %<virtual%>");
18107       return error_mark_node;
18108     }
18109
18110   return integer_zero_node;
18111 }
18112
18113 /* Parse a constant-initializer.
18114
18115    constant-initializer:
18116      = constant-expression
18117
18118    Returns a representation of the constant-expression.  */
18119
18120 static tree
18121 cp_parser_constant_initializer (cp_parser* parser)
18122 {
18123   /* Look for the `=' token.  */
18124   if (!cp_parser_require (parser, CPP_EQ, RT_EQ))
18125     return error_mark_node;
18126
18127   /* It is invalid to write:
18128
18129        struct S { static const int i = { 7 }; };
18130
18131      */
18132   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
18133     {
18134       cp_parser_error (parser,
18135                        "a brace-enclosed initializer is not allowed here");
18136       /* Consume the opening brace.  */
18137       cp_lexer_consume_token (parser->lexer);
18138       /* Skip the initializer.  */
18139       cp_parser_skip_to_closing_brace (parser);
18140       /* Look for the trailing `}'.  */
18141       cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
18142
18143       return error_mark_node;
18144     }
18145
18146   return cp_parser_constant_expression (parser,
18147                                         /*allow_non_constant=*/false,
18148                                         NULL);
18149 }
18150
18151 /* Derived classes [gram.class.derived] */
18152
18153 /* Parse a base-clause.
18154
18155    base-clause:
18156      : base-specifier-list
18157
18158    base-specifier-list:
18159      base-specifier ... [opt]
18160      base-specifier-list , base-specifier ... [opt]
18161
18162    Returns a TREE_LIST representing the base-classes, in the order in
18163    which they were declared.  The representation of each node is as
18164    described by cp_parser_base_specifier.
18165
18166    In the case that no bases are specified, this function will return
18167    NULL_TREE, not ERROR_MARK_NODE.  */
18168
18169 static tree
18170 cp_parser_base_clause (cp_parser* parser)
18171 {
18172   tree bases = NULL_TREE;
18173
18174   /* Look for the `:' that begins the list.  */
18175   cp_parser_require (parser, CPP_COLON, RT_COLON);
18176
18177   /* Scan the base-specifier-list.  */
18178   while (true)
18179     {
18180       cp_token *token;
18181       tree base;
18182       bool pack_expansion_p = false;
18183
18184       /* Look for the base-specifier.  */
18185       base = cp_parser_base_specifier (parser);
18186       /* Look for the (optional) ellipsis. */
18187       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18188         {
18189           /* Consume the `...'. */
18190           cp_lexer_consume_token (parser->lexer);
18191
18192           pack_expansion_p = true;
18193         }
18194
18195       /* Add BASE to the front of the list.  */
18196       if (base != error_mark_node)
18197         {
18198           if (pack_expansion_p)
18199             /* Make this a pack expansion type. */
18200             TREE_VALUE (base) = make_pack_expansion (TREE_VALUE (base));
18201           
18202
18203           if (!check_for_bare_parameter_packs (TREE_VALUE (base)))
18204             {
18205               TREE_CHAIN (base) = bases;
18206               bases = base;
18207             }
18208         }
18209       /* Peek at the next token.  */
18210       token = cp_lexer_peek_token (parser->lexer);
18211       /* If it's not a comma, then the list is complete.  */
18212       if (token->type != CPP_COMMA)
18213         break;
18214       /* Consume the `,'.  */
18215       cp_lexer_consume_token (parser->lexer);
18216     }
18217
18218   /* PARSER->SCOPE may still be non-NULL at this point, if the last
18219      base class had a qualified name.  However, the next name that
18220      appears is certainly not qualified.  */
18221   parser->scope = NULL_TREE;
18222   parser->qualifying_scope = NULL_TREE;
18223   parser->object_scope = NULL_TREE;
18224
18225   return nreverse (bases);
18226 }
18227
18228 /* Parse a base-specifier.
18229
18230    base-specifier:
18231      :: [opt] nested-name-specifier [opt] class-name
18232      virtual access-specifier [opt] :: [opt] nested-name-specifier
18233        [opt] class-name
18234      access-specifier virtual [opt] :: [opt] nested-name-specifier
18235        [opt] class-name
18236
18237    Returns a TREE_LIST.  The TREE_PURPOSE will be one of
18238    ACCESS_{DEFAULT,PUBLIC,PROTECTED,PRIVATE}_[VIRTUAL]_NODE to
18239    indicate the specifiers provided.  The TREE_VALUE will be a TYPE
18240    (or the ERROR_MARK_NODE) indicating the type that was specified.  */
18241
18242 static tree
18243 cp_parser_base_specifier (cp_parser* parser)
18244 {
18245   cp_token *token;
18246   bool done = false;
18247   bool virtual_p = false;
18248   bool duplicate_virtual_error_issued_p = false;
18249   bool duplicate_access_error_issued_p = false;
18250   bool class_scope_p, template_p;
18251   tree access = access_default_node;
18252   tree type;
18253
18254   /* Process the optional `virtual' and `access-specifier'.  */
18255   while (!done)
18256     {
18257       /* Peek at the next token.  */
18258       token = cp_lexer_peek_token (parser->lexer);
18259       /* Process `virtual'.  */
18260       switch (token->keyword)
18261         {
18262         case RID_VIRTUAL:
18263           /* If `virtual' appears more than once, issue an error.  */
18264           if (virtual_p && !duplicate_virtual_error_issued_p)
18265             {
18266               cp_parser_error (parser,
18267                                "%<virtual%> specified more than once in base-specified");
18268               duplicate_virtual_error_issued_p = true;
18269             }
18270
18271           virtual_p = true;
18272
18273           /* Consume the `virtual' token.  */
18274           cp_lexer_consume_token (parser->lexer);
18275
18276           break;
18277
18278         case RID_PUBLIC:
18279         case RID_PROTECTED:
18280         case RID_PRIVATE:
18281           /* If more than one access specifier appears, issue an
18282              error.  */
18283           if (access != access_default_node
18284               && !duplicate_access_error_issued_p)
18285             {
18286               cp_parser_error (parser,
18287                                "more than one access specifier in base-specified");
18288               duplicate_access_error_issued_p = true;
18289             }
18290
18291           access = ridpointers[(int) token->keyword];
18292
18293           /* Consume the access-specifier.  */
18294           cp_lexer_consume_token (parser->lexer);
18295
18296           break;
18297
18298         default:
18299           done = true;
18300           break;
18301         }
18302     }
18303   /* It is not uncommon to see programs mechanically, erroneously, use
18304      the 'typename' keyword to denote (dependent) qualified types
18305      as base classes.  */
18306   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
18307     {
18308       token = cp_lexer_peek_token (parser->lexer);
18309       if (!processing_template_decl)
18310         error_at (token->location,
18311                   "keyword %<typename%> not allowed outside of templates");
18312       else
18313         error_at (token->location,
18314                   "keyword %<typename%> not allowed in this context "
18315                   "(the base class is implicitly a type)");
18316       cp_lexer_consume_token (parser->lexer);
18317     }
18318
18319   /* Look for the optional `::' operator.  */
18320   cp_parser_global_scope_opt (parser, /*current_scope_valid_p=*/false);
18321   /* Look for the nested-name-specifier.  The simplest way to
18322      implement:
18323
18324        [temp.res]
18325
18326        The keyword `typename' is not permitted in a base-specifier or
18327        mem-initializer; in these contexts a qualified name that
18328        depends on a template-parameter is implicitly assumed to be a
18329        type name.
18330
18331      is to pretend that we have seen the `typename' keyword at this
18332      point.  */
18333   cp_parser_nested_name_specifier_opt (parser,
18334                                        /*typename_keyword_p=*/true,
18335                                        /*check_dependency_p=*/true,
18336                                        typename_type,
18337                                        /*is_declaration=*/true);
18338   /* If the base class is given by a qualified name, assume that names
18339      we see are type names or templates, as appropriate.  */
18340   class_scope_p = (parser->scope && TYPE_P (parser->scope));
18341   template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
18342
18343   /* Finally, look for the class-name.  */
18344   type = cp_parser_class_name (parser,
18345                                class_scope_p,
18346                                template_p,
18347                                typename_type,
18348                                /*check_dependency_p=*/true,
18349                                /*class_head_p=*/false,
18350                                /*is_declaration=*/true);
18351
18352   if (type == error_mark_node)
18353     return error_mark_node;
18354
18355   return finish_base_specifier (TREE_TYPE (type), access, virtual_p);
18356 }
18357
18358 /* Exception handling [gram.exception] */
18359
18360 /* Parse an (optional) exception-specification.
18361
18362    exception-specification:
18363      throw ( type-id-list [opt] )
18364
18365    Returns a TREE_LIST representing the exception-specification.  The
18366    TREE_VALUE of each node is a type.  */
18367
18368 static tree
18369 cp_parser_exception_specification_opt (cp_parser* parser)
18370 {
18371   cp_token *token;
18372   tree type_id_list;
18373   const char *saved_message;
18374
18375   /* Peek at the next token.  */
18376   token = cp_lexer_peek_token (parser->lexer);
18377
18378   /* Is it a noexcept-specification?  */
18379   if (cp_parser_is_keyword (token, RID_NOEXCEPT))
18380     {
18381       tree expr;
18382       cp_lexer_consume_token (parser->lexer);
18383
18384       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
18385         {
18386           cp_lexer_consume_token (parser->lexer);
18387
18388           /* Types may not be defined in an exception-specification.  */
18389           saved_message = parser->type_definition_forbidden_message;
18390           parser->type_definition_forbidden_message
18391             = G_("types may not be defined in an exception-specification");
18392
18393           expr = cp_parser_constant_expression (parser, false, NULL);
18394
18395           /* Restore the saved message.  */
18396           parser->type_definition_forbidden_message = saved_message;
18397
18398           cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18399         }
18400       else
18401         expr = boolean_true_node;
18402
18403       return build_noexcept_spec (expr, tf_warning_or_error);
18404     }
18405
18406   /* If it's not `throw', then there's no exception-specification.  */
18407   if (!cp_parser_is_keyword (token, RID_THROW))
18408     return NULL_TREE;
18409
18410 #if 0
18411   /* Enable this once a lot of code has transitioned to noexcept?  */
18412   if (cxx_dialect == cxx0x && !in_system_header)
18413     warning (OPT_Wdeprecated, "dynamic exception specifications are "
18414              "deprecated in C++0x; use %<noexcept%> instead");
18415 #endif
18416
18417   /* Consume the `throw'.  */
18418   cp_lexer_consume_token (parser->lexer);
18419
18420   /* Look for the `('.  */
18421   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18422
18423   /* Peek at the next token.  */
18424   token = cp_lexer_peek_token (parser->lexer);
18425   /* If it's not a `)', then there is a type-id-list.  */
18426   if (token->type != CPP_CLOSE_PAREN)
18427     {
18428       /* Types may not be defined in an exception-specification.  */
18429       saved_message = parser->type_definition_forbidden_message;
18430       parser->type_definition_forbidden_message
18431         = G_("types may not be defined in an exception-specification");
18432       /* Parse the type-id-list.  */
18433       type_id_list = cp_parser_type_id_list (parser);
18434       /* Restore the saved message.  */
18435       parser->type_definition_forbidden_message = saved_message;
18436     }
18437   else
18438     type_id_list = empty_except_spec;
18439
18440   /* Look for the `)'.  */
18441   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18442
18443   return type_id_list;
18444 }
18445
18446 /* Parse an (optional) type-id-list.
18447
18448    type-id-list:
18449      type-id ... [opt]
18450      type-id-list , type-id ... [opt]
18451
18452    Returns a TREE_LIST.  The TREE_VALUE of each node is a TYPE,
18453    in the order that the types were presented.  */
18454
18455 static tree
18456 cp_parser_type_id_list (cp_parser* parser)
18457 {
18458   tree types = NULL_TREE;
18459
18460   while (true)
18461     {
18462       cp_token *token;
18463       tree type;
18464
18465       /* Get the next type-id.  */
18466       type = cp_parser_type_id (parser);
18467       /* Parse the optional ellipsis. */
18468       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18469         {
18470           /* Consume the `...'. */
18471           cp_lexer_consume_token (parser->lexer);
18472
18473           /* Turn the type into a pack expansion expression. */
18474           type = make_pack_expansion (type);
18475         }
18476       /* Add it to the list.  */
18477       types = add_exception_specifier (types, type, /*complain=*/1);
18478       /* Peek at the next token.  */
18479       token = cp_lexer_peek_token (parser->lexer);
18480       /* If it is not a `,', we are done.  */
18481       if (token->type != CPP_COMMA)
18482         break;
18483       /* Consume the `,'.  */
18484       cp_lexer_consume_token (parser->lexer);
18485     }
18486
18487   return nreverse (types);
18488 }
18489
18490 /* Parse a try-block.
18491
18492    try-block:
18493      try compound-statement handler-seq  */
18494
18495 static tree
18496 cp_parser_try_block (cp_parser* parser)
18497 {
18498   tree try_block;
18499
18500   cp_parser_require_keyword (parser, RID_TRY, RT_TRY);
18501   try_block = begin_try_block ();
18502   cp_parser_compound_statement (parser, NULL, true, false);
18503   finish_try_block (try_block);
18504   cp_parser_handler_seq (parser);
18505   finish_handler_sequence (try_block);
18506
18507   return try_block;
18508 }
18509
18510 /* Parse a function-try-block.
18511
18512    function-try-block:
18513      try ctor-initializer [opt] function-body handler-seq  */
18514
18515 static bool
18516 cp_parser_function_try_block (cp_parser* parser)
18517 {
18518   tree compound_stmt;
18519   tree try_block;
18520   bool ctor_initializer_p;
18521
18522   /* Look for the `try' keyword.  */
18523   if (!cp_parser_require_keyword (parser, RID_TRY, RT_TRY))
18524     return false;
18525   /* Let the rest of the front end know where we are.  */
18526   try_block = begin_function_try_block (&compound_stmt);
18527   /* Parse the function-body.  */
18528   ctor_initializer_p
18529     = cp_parser_ctor_initializer_opt_and_function_body (parser);
18530   /* We're done with the `try' part.  */
18531   finish_function_try_block (try_block);
18532   /* Parse the handlers.  */
18533   cp_parser_handler_seq (parser);
18534   /* We're done with the handlers.  */
18535   finish_function_handler_sequence (try_block, compound_stmt);
18536
18537   return ctor_initializer_p;
18538 }
18539
18540 /* Parse a handler-seq.
18541
18542    handler-seq:
18543      handler handler-seq [opt]  */
18544
18545 static void
18546 cp_parser_handler_seq (cp_parser* parser)
18547 {
18548   while (true)
18549     {
18550       cp_token *token;
18551
18552       /* Parse the handler.  */
18553       cp_parser_handler (parser);
18554       /* Peek at the next token.  */
18555       token = cp_lexer_peek_token (parser->lexer);
18556       /* If it's not `catch' then there are no more handlers.  */
18557       if (!cp_parser_is_keyword (token, RID_CATCH))
18558         break;
18559     }
18560 }
18561
18562 /* Parse a handler.
18563
18564    handler:
18565      catch ( exception-declaration ) compound-statement  */
18566
18567 static void
18568 cp_parser_handler (cp_parser* parser)
18569 {
18570   tree handler;
18571   tree declaration;
18572
18573   cp_parser_require_keyword (parser, RID_CATCH, RT_CATCH);
18574   handler = begin_handler ();
18575   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18576   declaration = cp_parser_exception_declaration (parser);
18577   finish_handler_parms (declaration, handler);
18578   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18579   cp_parser_compound_statement (parser, NULL, false, false);
18580   finish_handler (handler);
18581 }
18582
18583 /* Parse an exception-declaration.
18584
18585    exception-declaration:
18586      type-specifier-seq declarator
18587      type-specifier-seq abstract-declarator
18588      type-specifier-seq
18589      ...
18590
18591    Returns a VAR_DECL for the declaration, or NULL_TREE if the
18592    ellipsis variant is used.  */
18593
18594 static tree
18595 cp_parser_exception_declaration (cp_parser* parser)
18596 {
18597   cp_decl_specifier_seq type_specifiers;
18598   cp_declarator *declarator;
18599   const char *saved_message;
18600
18601   /* If it's an ellipsis, it's easy to handle.  */
18602   if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
18603     {
18604       /* Consume the `...' token.  */
18605       cp_lexer_consume_token (parser->lexer);
18606       return NULL_TREE;
18607     }
18608
18609   /* Types may not be defined in exception-declarations.  */
18610   saved_message = parser->type_definition_forbidden_message;
18611   parser->type_definition_forbidden_message
18612     = G_("types may not be defined in exception-declarations");
18613
18614   /* Parse the type-specifier-seq.  */
18615   cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
18616                                 /*is_trailing_return=*/false,
18617                                 &type_specifiers);
18618   /* If it's a `)', then there is no declarator.  */
18619   if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
18620     declarator = NULL;
18621   else
18622     declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_EITHER,
18623                                        /*ctor_dtor_or_conv_p=*/NULL,
18624                                        /*parenthesized_p=*/NULL,
18625                                        /*member_p=*/false);
18626
18627   /* Restore the saved message.  */
18628   parser->type_definition_forbidden_message = saved_message;
18629
18630   if (!type_specifiers.any_specifiers_p)
18631     return error_mark_node;
18632
18633   return grokdeclarator (declarator, &type_specifiers, CATCHPARM, 1, NULL);
18634 }
18635
18636 /* Parse a throw-expression.
18637
18638    throw-expression:
18639      throw assignment-expression [opt]
18640
18641    Returns a THROW_EXPR representing the throw-expression.  */
18642
18643 static tree
18644 cp_parser_throw_expression (cp_parser* parser)
18645 {
18646   tree expression;
18647   cp_token* token;
18648
18649   cp_parser_require_keyword (parser, RID_THROW, RT_THROW);
18650   token = cp_lexer_peek_token (parser->lexer);
18651   /* Figure out whether or not there is an assignment-expression
18652      following the "throw" keyword.  */
18653   if (token->type == CPP_COMMA
18654       || token->type == CPP_SEMICOLON
18655       || token->type == CPP_CLOSE_PAREN
18656       || token->type == CPP_CLOSE_SQUARE
18657       || token->type == CPP_CLOSE_BRACE
18658       || token->type == CPP_COLON)
18659     expression = NULL_TREE;
18660   else
18661     expression = cp_parser_assignment_expression (parser,
18662                                                   /*cast_p=*/false, NULL);
18663
18664   return build_throw (expression);
18665 }
18666
18667 /* GNU Extensions */
18668
18669 /* Parse an (optional) asm-specification.
18670
18671    asm-specification:
18672      asm ( string-literal )
18673
18674    If the asm-specification is present, returns a STRING_CST
18675    corresponding to the string-literal.  Otherwise, returns
18676    NULL_TREE.  */
18677
18678 static tree
18679 cp_parser_asm_specification_opt (cp_parser* parser)
18680 {
18681   cp_token *token;
18682   tree asm_specification;
18683
18684   /* Peek at the next token.  */
18685   token = cp_lexer_peek_token (parser->lexer);
18686   /* If the next token isn't the `asm' keyword, then there's no
18687      asm-specification.  */
18688   if (!cp_parser_is_keyword (token, RID_ASM))
18689     return NULL_TREE;
18690
18691   /* Consume the `asm' token.  */
18692   cp_lexer_consume_token (parser->lexer);
18693   /* Look for the `('.  */
18694   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18695
18696   /* Look for the string-literal.  */
18697   asm_specification = cp_parser_string_literal (parser, false, false);
18698
18699   /* Look for the `)'.  */
18700   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18701
18702   return asm_specification;
18703 }
18704
18705 /* Parse an asm-operand-list.
18706
18707    asm-operand-list:
18708      asm-operand
18709      asm-operand-list , asm-operand
18710
18711    asm-operand:
18712      string-literal ( expression )
18713      [ string-literal ] string-literal ( expression )
18714
18715    Returns a TREE_LIST representing the operands.  The TREE_VALUE of
18716    each node is the expression.  The TREE_PURPOSE is itself a
18717    TREE_LIST whose TREE_PURPOSE is a STRING_CST for the bracketed
18718    string-literal (or NULL_TREE if not present) and whose TREE_VALUE
18719    is a STRING_CST for the string literal before the parenthesis. Returns
18720    ERROR_MARK_NODE if any of the operands are invalid.  */
18721
18722 static tree
18723 cp_parser_asm_operand_list (cp_parser* parser)
18724 {
18725   tree asm_operands = NULL_TREE;
18726   bool invalid_operands = false;
18727
18728   while (true)
18729     {
18730       tree string_literal;
18731       tree expression;
18732       tree name;
18733
18734       if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
18735         {
18736           /* Consume the `[' token.  */
18737           cp_lexer_consume_token (parser->lexer);
18738           /* Read the operand name.  */
18739           name = cp_parser_identifier (parser);
18740           if (name != error_mark_node)
18741             name = build_string (IDENTIFIER_LENGTH (name),
18742                                  IDENTIFIER_POINTER (name));
18743           /* Look for the closing `]'.  */
18744           cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
18745         }
18746       else
18747         name = NULL_TREE;
18748       /* Look for the string-literal.  */
18749       string_literal = cp_parser_string_literal (parser, false, false);
18750
18751       /* Look for the `('.  */
18752       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18753       /* Parse the expression.  */
18754       expression = cp_parser_expression (parser, /*cast_p=*/false, NULL);
18755       /* Look for the `)'.  */
18756       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18757
18758       if (name == error_mark_node 
18759           || string_literal == error_mark_node 
18760           || expression == error_mark_node)
18761         invalid_operands = true;
18762
18763       /* Add this operand to the list.  */
18764       asm_operands = tree_cons (build_tree_list (name, string_literal),
18765                                 expression,
18766                                 asm_operands);
18767       /* If the next token is not a `,', there are no more
18768          operands.  */
18769       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18770         break;
18771       /* Consume the `,'.  */
18772       cp_lexer_consume_token (parser->lexer);
18773     }
18774
18775   return invalid_operands ? error_mark_node : nreverse (asm_operands);
18776 }
18777
18778 /* Parse an asm-clobber-list.
18779
18780    asm-clobber-list:
18781      string-literal
18782      asm-clobber-list , string-literal
18783
18784    Returns a TREE_LIST, indicating the clobbers in the order that they
18785    appeared.  The TREE_VALUE of each node is a STRING_CST.  */
18786
18787 static tree
18788 cp_parser_asm_clobber_list (cp_parser* parser)
18789 {
18790   tree clobbers = NULL_TREE;
18791
18792   while (true)
18793     {
18794       tree string_literal;
18795
18796       /* Look for the string literal.  */
18797       string_literal = cp_parser_string_literal (parser, false, false);
18798       /* Add it to the list.  */
18799       clobbers = tree_cons (NULL_TREE, string_literal, clobbers);
18800       /* If the next token is not a `,', then the list is
18801          complete.  */
18802       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18803         break;
18804       /* Consume the `,' token.  */
18805       cp_lexer_consume_token (parser->lexer);
18806     }
18807
18808   return clobbers;
18809 }
18810
18811 /* Parse an asm-label-list.
18812
18813    asm-label-list:
18814      identifier
18815      asm-label-list , identifier
18816
18817    Returns a TREE_LIST, indicating the labels in the order that they
18818    appeared.  The TREE_VALUE of each node is a label.  */
18819
18820 static tree
18821 cp_parser_asm_label_list (cp_parser* parser)
18822 {
18823   tree labels = NULL_TREE;
18824
18825   while (true)
18826     {
18827       tree identifier, label, name;
18828
18829       /* Look for the identifier.  */
18830       identifier = cp_parser_identifier (parser);
18831       if (!error_operand_p (identifier))
18832         {
18833           label = lookup_label (identifier);
18834           if (TREE_CODE (label) == LABEL_DECL)
18835             {
18836               TREE_USED (label) = 1;
18837               check_goto (label);
18838               name = build_string (IDENTIFIER_LENGTH (identifier),
18839                                    IDENTIFIER_POINTER (identifier));
18840               labels = tree_cons (name, label, labels);
18841             }
18842         }
18843       /* If the next token is not a `,', then the list is
18844          complete.  */
18845       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
18846         break;
18847       /* Consume the `,' token.  */
18848       cp_lexer_consume_token (parser->lexer);
18849     }
18850
18851   return nreverse (labels);
18852 }
18853
18854 /* Parse an (optional) series of attributes.
18855
18856    attributes:
18857      attributes attribute
18858
18859    attribute:
18860      __attribute__ (( attribute-list [opt] ))
18861
18862    The return value is as for cp_parser_attribute_list.  */
18863
18864 static tree
18865 cp_parser_attributes_opt (cp_parser* parser)
18866 {
18867   tree attributes = NULL_TREE;
18868
18869   while (true)
18870     {
18871       cp_token *token;
18872       tree attribute_list;
18873
18874       /* Peek at the next token.  */
18875       token = cp_lexer_peek_token (parser->lexer);
18876       /* If it's not `__attribute__', then we're done.  */
18877       if (token->keyword != RID_ATTRIBUTE)
18878         break;
18879
18880       /* Consume the `__attribute__' keyword.  */
18881       cp_lexer_consume_token (parser->lexer);
18882       /* Look for the two `(' tokens.  */
18883       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18884       cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
18885
18886       /* Peek at the next token.  */
18887       token = cp_lexer_peek_token (parser->lexer);
18888       if (token->type != CPP_CLOSE_PAREN)
18889         /* Parse the attribute-list.  */
18890         attribute_list = cp_parser_attribute_list (parser);
18891       else
18892         /* If the next token is a `)', then there is no attribute
18893            list.  */
18894         attribute_list = NULL;
18895
18896       /* Look for the two `)' tokens.  */
18897       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18898       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
18899
18900       /* Add these new attributes to the list.  */
18901       attributes = chainon (attributes, attribute_list);
18902     }
18903
18904   return attributes;
18905 }
18906
18907 /* Parse an attribute-list.
18908
18909    attribute-list:
18910      attribute
18911      attribute-list , attribute
18912
18913    attribute:
18914      identifier
18915      identifier ( identifier )
18916      identifier ( identifier , expression-list )
18917      identifier ( expression-list )
18918
18919    Returns a TREE_LIST, or NULL_TREE on error.  Each node corresponds
18920    to an attribute.  The TREE_PURPOSE of each node is the identifier
18921    indicating which attribute is in use.  The TREE_VALUE represents
18922    the arguments, if any.  */
18923
18924 static tree
18925 cp_parser_attribute_list (cp_parser* parser)
18926 {
18927   tree attribute_list = NULL_TREE;
18928   bool save_translate_strings_p = parser->translate_strings_p;
18929
18930   parser->translate_strings_p = false;
18931   while (true)
18932     {
18933       cp_token *token;
18934       tree identifier;
18935       tree attribute;
18936
18937       /* Look for the identifier.  We also allow keywords here; for
18938          example `__attribute__ ((const))' is legal.  */
18939       token = cp_lexer_peek_token (parser->lexer);
18940       if (token->type == CPP_NAME
18941           || token->type == CPP_KEYWORD)
18942         {
18943           tree arguments = NULL_TREE;
18944
18945           /* Consume the token.  */
18946           token = cp_lexer_consume_token (parser->lexer);
18947
18948           /* Save away the identifier that indicates which attribute
18949              this is.  */
18950           identifier = (token->type == CPP_KEYWORD) 
18951             /* For keywords, use the canonical spelling, not the
18952                parsed identifier.  */
18953             ? ridpointers[(int) token->keyword]
18954             : token->u.value;
18955           
18956           attribute = build_tree_list (identifier, NULL_TREE);
18957
18958           /* Peek at the next token.  */
18959           token = cp_lexer_peek_token (parser->lexer);
18960           /* If it's an `(', then parse the attribute arguments.  */
18961           if (token->type == CPP_OPEN_PAREN)
18962             {
18963               VEC(tree,gc) *vec;
18964               int attr_flag = (attribute_takes_identifier_p (identifier)
18965                                ? id_attr : normal_attr);
18966               vec = cp_parser_parenthesized_expression_list
18967                     (parser, attr_flag, /*cast_p=*/false,
18968                      /*allow_expansion_p=*/false,
18969                      /*non_constant_p=*/NULL);
18970               if (vec == NULL)
18971                 arguments = error_mark_node;
18972               else
18973                 {
18974                   arguments = build_tree_list_vec (vec);
18975                   release_tree_vector (vec);
18976                 }
18977               /* Save the arguments away.  */
18978               TREE_VALUE (attribute) = arguments;
18979             }
18980
18981           if (arguments != error_mark_node)
18982             {
18983               /* Add this attribute to the list.  */
18984               TREE_CHAIN (attribute) = attribute_list;
18985               attribute_list = attribute;
18986             }
18987
18988           token = cp_lexer_peek_token (parser->lexer);
18989         }
18990       /* Now, look for more attributes.  If the next token isn't a
18991          `,', we're done.  */
18992       if (token->type != CPP_COMMA)
18993         break;
18994
18995       /* Consume the comma and keep going.  */
18996       cp_lexer_consume_token (parser->lexer);
18997     }
18998   parser->translate_strings_p = save_translate_strings_p;
18999
19000   /* We built up the list in reverse order.  */
19001   return nreverse (attribute_list);
19002 }
19003
19004 /* Parse an optional `__extension__' keyword.  Returns TRUE if it is
19005    present, and FALSE otherwise.  *SAVED_PEDANTIC is set to the
19006    current value of the PEDANTIC flag, regardless of whether or not
19007    the `__extension__' keyword is present.  The caller is responsible
19008    for restoring the value of the PEDANTIC flag.  */
19009
19010 static bool
19011 cp_parser_extension_opt (cp_parser* parser, int* saved_pedantic)
19012 {
19013   /* Save the old value of the PEDANTIC flag.  */
19014   *saved_pedantic = pedantic;
19015
19016   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_EXTENSION))
19017     {
19018       /* Consume the `__extension__' token.  */
19019       cp_lexer_consume_token (parser->lexer);
19020       /* We're not being pedantic while the `__extension__' keyword is
19021          in effect.  */
19022       pedantic = 0;
19023
19024       return true;
19025     }
19026
19027   return false;
19028 }
19029
19030 /* Parse a label declaration.
19031
19032    label-declaration:
19033      __label__ label-declarator-seq ;
19034
19035    label-declarator-seq:
19036      identifier , label-declarator-seq
19037      identifier  */
19038
19039 static void
19040 cp_parser_label_declaration (cp_parser* parser)
19041 {
19042   /* Look for the `__label__' keyword.  */
19043   cp_parser_require_keyword (parser, RID_LABEL, RT_LABEL);
19044
19045   while (true)
19046     {
19047       tree identifier;
19048
19049       /* Look for an identifier.  */
19050       identifier = cp_parser_identifier (parser);
19051       /* If we failed, stop.  */
19052       if (identifier == error_mark_node)
19053         break;
19054       /* Declare it as a label.  */
19055       finish_label_decl (identifier);
19056       /* If the next token is a `;', stop.  */
19057       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
19058         break;
19059       /* Look for the `,' separating the label declarations.  */
19060       cp_parser_require (parser, CPP_COMMA, RT_COMMA);
19061     }
19062
19063   /* Look for the final `;'.  */
19064   cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
19065 }
19066
19067 /* Support Functions */
19068
19069 /* Looks up NAME in the current scope, as given by PARSER->SCOPE.
19070    NAME should have one of the representations used for an
19071    id-expression.  If NAME is the ERROR_MARK_NODE, the ERROR_MARK_NODE
19072    is returned.  If PARSER->SCOPE is a dependent type, then a
19073    SCOPE_REF is returned.
19074
19075    If NAME is a TEMPLATE_ID_EXPR, then it will be immediately
19076    returned; the name was already resolved when the TEMPLATE_ID_EXPR
19077    was formed.  Abstractly, such entities should not be passed to this
19078    function, because they do not need to be looked up, but it is
19079    simpler to check for this special case here, rather than at the
19080    call-sites.
19081
19082    In cases not explicitly covered above, this function returns a
19083    DECL, OVERLOAD, or baselink representing the result of the lookup.
19084    If there was no entity with the indicated NAME, the ERROR_MARK_NODE
19085    is returned.
19086
19087    If TAG_TYPE is not NONE_TYPE, it indicates an explicit type keyword
19088    (e.g., "struct") that was used.  In that case bindings that do not
19089    refer to types are ignored.
19090
19091    If IS_TEMPLATE is TRUE, bindings that do not refer to templates are
19092    ignored.
19093
19094    If IS_NAMESPACE is TRUE, bindings that do not refer to namespaces
19095    are ignored.
19096
19097    If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
19098    types.
19099
19100    If AMBIGUOUS_DECLS is non-NULL, *AMBIGUOUS_DECLS is set to a
19101    TREE_LIST of candidates if name-lookup results in an ambiguity, and
19102    NULL_TREE otherwise.  */
19103
19104 static tree
19105 cp_parser_lookup_name (cp_parser *parser, tree name,
19106                        enum tag_types tag_type,
19107                        bool is_template,
19108                        bool is_namespace,
19109                        bool check_dependency,
19110                        tree *ambiguous_decls,
19111                        location_t name_location)
19112 {
19113   int flags = 0;
19114   tree decl;
19115   tree object_type = parser->context->object_type;
19116
19117   if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
19118     flags |= LOOKUP_COMPLAIN;
19119
19120   /* Assume that the lookup will be unambiguous.  */
19121   if (ambiguous_decls)
19122     *ambiguous_decls = NULL_TREE;
19123
19124   /* Now that we have looked up the name, the OBJECT_TYPE (if any) is
19125      no longer valid.  Note that if we are parsing tentatively, and
19126      the parse fails, OBJECT_TYPE will be automatically restored.  */
19127   parser->context->object_type = NULL_TREE;
19128
19129   if (name == error_mark_node)
19130     return error_mark_node;
19131
19132   /* A template-id has already been resolved; there is no lookup to
19133      do.  */
19134   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
19135     return name;
19136   if (BASELINK_P (name))
19137     {
19138       gcc_assert (TREE_CODE (BASELINK_FUNCTIONS (name))
19139                   == TEMPLATE_ID_EXPR);
19140       return name;
19141     }
19142
19143   /* A BIT_NOT_EXPR is used to represent a destructor.  By this point,
19144      it should already have been checked to make sure that the name
19145      used matches the type being destroyed.  */
19146   if (TREE_CODE (name) == BIT_NOT_EXPR)
19147     {
19148       tree type;
19149
19150       /* Figure out to which type this destructor applies.  */
19151       if (parser->scope)
19152         type = parser->scope;
19153       else if (object_type)
19154         type = object_type;
19155       else
19156         type = current_class_type;
19157       /* If that's not a class type, there is no destructor.  */
19158       if (!type || !CLASS_TYPE_P (type))
19159         return error_mark_node;
19160       if (CLASSTYPE_LAZY_DESTRUCTOR (type))
19161         lazily_declare_fn (sfk_destructor, type);
19162       if (!CLASSTYPE_DESTRUCTORS (type))
19163           return error_mark_node;
19164       /* If it was a class type, return the destructor.  */
19165       return CLASSTYPE_DESTRUCTORS (type);
19166     }
19167
19168   /* By this point, the NAME should be an ordinary identifier.  If
19169      the id-expression was a qualified name, the qualifying scope is
19170      stored in PARSER->SCOPE at this point.  */
19171   gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
19172
19173   /* Perform the lookup.  */
19174   if (parser->scope)
19175     {
19176       bool dependent_p;
19177
19178       if (parser->scope == error_mark_node)
19179         return error_mark_node;
19180
19181       /* If the SCOPE is dependent, the lookup must be deferred until
19182          the template is instantiated -- unless we are explicitly
19183          looking up names in uninstantiated templates.  Even then, we
19184          cannot look up the name if the scope is not a class type; it
19185          might, for example, be a template type parameter.  */
19186       dependent_p = (TYPE_P (parser->scope)
19187                      && dependent_scope_p (parser->scope));
19188       if ((check_dependency || !CLASS_TYPE_P (parser->scope))
19189           && dependent_p)
19190         /* Defer lookup.  */
19191         decl = error_mark_node;
19192       else
19193         {
19194           tree pushed_scope = NULL_TREE;
19195
19196           /* If PARSER->SCOPE is a dependent type, then it must be a
19197              class type, and we must not be checking dependencies;
19198              otherwise, we would have processed this lookup above.  So
19199              that PARSER->SCOPE is not considered a dependent base by
19200              lookup_member, we must enter the scope here.  */
19201           if (dependent_p)
19202             pushed_scope = push_scope (parser->scope);
19203
19204           /* If the PARSER->SCOPE is a template specialization, it
19205              may be instantiated during name lookup.  In that case,
19206              errors may be issued.  Even if we rollback the current
19207              tentative parse, those errors are valid.  */
19208           decl = lookup_qualified_name (parser->scope, name,
19209                                         tag_type != none_type,
19210                                         /*complain=*/true);
19211
19212           /* 3.4.3.1: In a lookup in which the constructor is an acceptable
19213              lookup result and the nested-name-specifier nominates a class C:
19214                * if the name specified after the nested-name-specifier, when
19215                looked up in C, is the injected-class-name of C (Clause 9), or
19216                * if the name specified after the nested-name-specifier is the
19217                same as the identifier or the simple-template-id's template-
19218                name in the last component of the nested-name-specifier,
19219              the name is instead considered to name the constructor of
19220              class C. [ Note: for example, the constructor is not an
19221              acceptable lookup result in an elaborated-type-specifier so
19222              the constructor would not be used in place of the
19223              injected-class-name. --end note ] Such a constructor name
19224              shall be used only in the declarator-id of a declaration that
19225              names a constructor or in a using-declaration.  */
19226           if (tag_type == none_type
19227               && DECL_SELF_REFERENCE_P (decl)
19228               && same_type_p (DECL_CONTEXT (decl), parser->scope))
19229             decl = lookup_qualified_name (parser->scope, ctor_identifier,
19230                                           tag_type != none_type,
19231                                           /*complain=*/true);
19232
19233           /* If we have a single function from a using decl, pull it out.  */
19234           if (TREE_CODE (decl) == OVERLOAD
19235               && !really_overloaded_fn (decl))
19236             decl = OVL_FUNCTION (decl);
19237
19238           if (pushed_scope)
19239             pop_scope (pushed_scope);
19240         }
19241
19242       /* If the scope is a dependent type and either we deferred lookup or
19243          we did lookup but didn't find the name, rememeber the name.  */
19244       if (decl == error_mark_node && TYPE_P (parser->scope)
19245           && dependent_type_p (parser->scope))
19246         {
19247           if (tag_type)
19248             {
19249               tree type;
19250
19251               /* The resolution to Core Issue 180 says that `struct
19252                  A::B' should be considered a type-name, even if `A'
19253                  is dependent.  */
19254               type = make_typename_type (parser->scope, name, tag_type,
19255                                          /*complain=*/tf_error);
19256               decl = TYPE_NAME (type);
19257             }
19258           else if (is_template
19259                    && (cp_parser_next_token_ends_template_argument_p (parser)
19260                        || cp_lexer_next_token_is (parser->lexer,
19261                                                   CPP_CLOSE_PAREN)))
19262             decl = make_unbound_class_template (parser->scope,
19263                                                 name, NULL_TREE,
19264                                                 /*complain=*/tf_error);
19265           else
19266             decl = build_qualified_name (/*type=*/NULL_TREE,
19267                                          parser->scope, name,
19268                                          is_template);
19269         }
19270       parser->qualifying_scope = parser->scope;
19271       parser->object_scope = NULL_TREE;
19272     }
19273   else if (object_type)
19274     {
19275       tree object_decl = NULL_TREE;
19276       /* Look up the name in the scope of the OBJECT_TYPE, unless the
19277          OBJECT_TYPE is not a class.  */
19278       if (CLASS_TYPE_P (object_type))
19279         /* If the OBJECT_TYPE is a template specialization, it may
19280            be instantiated during name lookup.  In that case, errors
19281            may be issued.  Even if we rollback the current tentative
19282            parse, those errors are valid.  */
19283         object_decl = lookup_member (object_type,
19284                                      name,
19285                                      /*protect=*/0,
19286                                      tag_type != none_type);
19287       /* Look it up in the enclosing context, too.  */
19288       decl = lookup_name_real (name, tag_type != none_type,
19289                                /*nonclass=*/0,
19290                                /*block_p=*/true, is_namespace, flags);
19291       parser->object_scope = object_type;
19292       parser->qualifying_scope = NULL_TREE;
19293       if (object_decl)
19294         decl = object_decl;
19295     }
19296   else
19297     {
19298       decl = lookup_name_real (name, tag_type != none_type,
19299                                /*nonclass=*/0,
19300                                /*block_p=*/true, is_namespace, flags);
19301       parser->qualifying_scope = NULL_TREE;
19302       parser->object_scope = NULL_TREE;
19303     }
19304
19305   /* If the lookup failed, let our caller know.  */
19306   if (!decl || decl == error_mark_node)
19307     return error_mark_node;
19308
19309   /* Pull out the template from an injected-class-name (or multiple).  */
19310   if (is_template)
19311     decl = maybe_get_template_decl_from_type_decl (decl);
19312
19313   /* If it's a TREE_LIST, the result of the lookup was ambiguous.  */
19314   if (TREE_CODE (decl) == TREE_LIST)
19315     {
19316       if (ambiguous_decls)
19317         *ambiguous_decls = decl;
19318       /* The error message we have to print is too complicated for
19319          cp_parser_error, so we incorporate its actions directly.  */
19320       if (!cp_parser_simulate_error (parser))
19321         {
19322           error_at (name_location, "reference to %qD is ambiguous",
19323                     name);
19324           print_candidates (decl);
19325         }
19326       return error_mark_node;
19327     }
19328
19329   gcc_assert (DECL_P (decl)
19330               || TREE_CODE (decl) == OVERLOAD
19331               || TREE_CODE (decl) == SCOPE_REF
19332               || TREE_CODE (decl) == UNBOUND_CLASS_TEMPLATE
19333               || BASELINK_P (decl));
19334
19335   /* If we have resolved the name of a member declaration, check to
19336      see if the declaration is accessible.  When the name resolves to
19337      set of overloaded functions, accessibility is checked when
19338      overload resolution is done.
19339
19340      During an explicit instantiation, access is not checked at all,
19341      as per [temp.explicit].  */
19342   if (DECL_P (decl))
19343     check_accessibility_of_qualified_id (decl, object_type, parser->scope);
19344
19345   return decl;
19346 }
19347
19348 /* Like cp_parser_lookup_name, but for use in the typical case where
19349    CHECK_ACCESS is TRUE, IS_TYPE is FALSE, IS_TEMPLATE is FALSE,
19350    IS_NAMESPACE is FALSE, and CHECK_DEPENDENCY is TRUE.  */
19351
19352 static tree
19353 cp_parser_lookup_name_simple (cp_parser* parser, tree name, location_t location)
19354 {
19355   return cp_parser_lookup_name (parser, name,
19356                                 none_type,
19357                                 /*is_template=*/false,
19358                                 /*is_namespace=*/false,
19359                                 /*check_dependency=*/true,
19360                                 /*ambiguous_decls=*/NULL,
19361                                 location);
19362 }
19363
19364 /* If DECL is a TEMPLATE_DECL that can be treated like a TYPE_DECL in
19365    the current context, return the TYPE_DECL.  If TAG_NAME_P is
19366    true, the DECL indicates the class being defined in a class-head,
19367    or declared in an elaborated-type-specifier.
19368
19369    Otherwise, return DECL.  */
19370
19371 static tree
19372 cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
19373 {
19374   /* If the TEMPLATE_DECL is being declared as part of a class-head,
19375      the translation from TEMPLATE_DECL to TYPE_DECL occurs:
19376
19377        struct A {
19378          template <typename T> struct B;
19379        };
19380
19381        template <typename T> struct A::B {};
19382
19383      Similarly, in an elaborated-type-specifier:
19384
19385        namespace N { struct X{}; }
19386
19387        struct A {
19388          template <typename T> friend struct N::X;
19389        };
19390
19391      However, if the DECL refers to a class type, and we are in
19392      the scope of the class, then the name lookup automatically
19393      finds the TYPE_DECL created by build_self_reference rather
19394      than a TEMPLATE_DECL.  For example, in:
19395
19396        template <class T> struct S {
19397          S s;
19398        };
19399
19400      there is no need to handle such case.  */
19401
19402   if (DECL_CLASS_TEMPLATE_P (decl) && tag_name_p)
19403     return DECL_TEMPLATE_RESULT (decl);
19404
19405   return decl;
19406 }
19407
19408 /* If too many, or too few, template-parameter lists apply to the
19409    declarator, issue an error message.  Returns TRUE if all went well,
19410    and FALSE otherwise.  */
19411
19412 static bool
19413 cp_parser_check_declarator_template_parameters (cp_parser* parser,
19414                                                 cp_declarator *declarator,
19415                                                 location_t declarator_location)
19416 {
19417   unsigned num_templates;
19418
19419   /* We haven't seen any classes that involve template parameters yet.  */
19420   num_templates = 0;
19421
19422   switch (declarator->kind)
19423     {
19424     case cdk_id:
19425       if (declarator->u.id.qualifying_scope)
19426         {
19427           tree scope;
19428
19429           scope = declarator->u.id.qualifying_scope;
19430
19431           while (scope && CLASS_TYPE_P (scope))
19432             {
19433               /* You're supposed to have one `template <...>'
19434                  for every template class, but you don't need one
19435                  for a full specialization.  For example:
19436
19437                  template <class T> struct S{};
19438                  template <> struct S<int> { void f(); };
19439                  void S<int>::f () {}
19440
19441                  is correct; there shouldn't be a `template <>' for
19442                  the definition of `S<int>::f'.  */
19443               if (!CLASSTYPE_TEMPLATE_INFO (scope))
19444                 /* If SCOPE does not have template information of any
19445                    kind, then it is not a template, nor is it nested
19446                    within a template.  */
19447                 break;
19448               if (explicit_class_specialization_p (scope))
19449                 break;
19450               if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (scope)))
19451                 ++num_templates;
19452
19453               scope = TYPE_CONTEXT (scope);
19454             }
19455         }
19456       else if (TREE_CODE (declarator->u.id.unqualified_name)
19457                == TEMPLATE_ID_EXPR)
19458         /* If the DECLARATOR has the form `X<y>' then it uses one
19459            additional level of template parameters.  */
19460         ++num_templates;
19461
19462       return cp_parser_check_template_parameters 
19463         (parser, num_templates, declarator_location, declarator);
19464
19465
19466     case cdk_function:
19467     case cdk_array:
19468     case cdk_pointer:
19469     case cdk_reference:
19470     case cdk_ptrmem:
19471       return (cp_parser_check_declarator_template_parameters
19472               (parser, declarator->declarator, declarator_location));
19473
19474     case cdk_error:
19475       return true;
19476
19477     default:
19478       gcc_unreachable ();
19479     }
19480   return false;
19481 }
19482
19483 /* NUM_TEMPLATES were used in the current declaration.  If that is
19484    invalid, return FALSE and issue an error messages.  Otherwise,
19485    return TRUE.  If DECLARATOR is non-NULL, then we are checking a
19486    declarator and we can print more accurate diagnostics.  */
19487
19488 static bool
19489 cp_parser_check_template_parameters (cp_parser* parser,
19490                                      unsigned num_templates,
19491                                      location_t location,
19492                                      cp_declarator *declarator)
19493 {
19494   /* If there are the same number of template classes and parameter
19495      lists, that's OK.  */
19496   if (parser->num_template_parameter_lists == num_templates)
19497     return true;
19498   /* If there are more, but only one more, then we are referring to a
19499      member template.  That's OK too.  */
19500   if (parser->num_template_parameter_lists == num_templates + 1)
19501     return true;
19502   /* If there are more template classes than parameter lists, we have
19503      something like:
19504
19505        template <class T> void S<T>::R<T>::f ();  */
19506   if (parser->num_template_parameter_lists < num_templates)
19507     {
19508       if (declarator && !current_function_decl)
19509         error_at (location, "specializing member %<%T::%E%> "
19510                   "requires %<template<>%> syntax", 
19511                   declarator->u.id.qualifying_scope,
19512                   declarator->u.id.unqualified_name);
19513       else if (declarator)
19514         error_at (location, "invalid declaration of %<%T::%E%>",
19515                   declarator->u.id.qualifying_scope,
19516                   declarator->u.id.unqualified_name);
19517       else 
19518         error_at (location, "too few template-parameter-lists");
19519       return false;
19520     }
19521   /* Otherwise, there are too many template parameter lists.  We have
19522      something like:
19523
19524      template <class T> template <class U> void S::f();  */
19525   error_at (location, "too many template-parameter-lists");
19526   return false;
19527 }
19528
19529 /* Parse an optional `::' token indicating that the following name is
19530    from the global namespace.  If so, PARSER->SCOPE is set to the
19531    GLOBAL_NAMESPACE. Otherwise, PARSER->SCOPE is set to NULL_TREE,
19532    unless CURRENT_SCOPE_VALID_P is TRUE, in which case it is left alone.
19533    Returns the new value of PARSER->SCOPE, if the `::' token is
19534    present, and NULL_TREE otherwise.  */
19535
19536 static tree
19537 cp_parser_global_scope_opt (cp_parser* parser, bool current_scope_valid_p)
19538 {
19539   cp_token *token;
19540
19541   /* Peek at the next token.  */
19542   token = cp_lexer_peek_token (parser->lexer);
19543   /* If we're looking at a `::' token then we're starting from the
19544      global namespace, not our current location.  */
19545   if (token->type == CPP_SCOPE)
19546     {
19547       /* Consume the `::' token.  */
19548       cp_lexer_consume_token (parser->lexer);
19549       /* Set the SCOPE so that we know where to start the lookup.  */
19550       parser->scope = global_namespace;
19551       parser->qualifying_scope = global_namespace;
19552       parser->object_scope = NULL_TREE;
19553
19554       return parser->scope;
19555     }
19556   else if (!current_scope_valid_p)
19557     {
19558       parser->scope = NULL_TREE;
19559       parser->qualifying_scope = NULL_TREE;
19560       parser->object_scope = NULL_TREE;
19561     }
19562
19563   return NULL_TREE;
19564 }
19565
19566 /* Returns TRUE if the upcoming token sequence is the start of a
19567    constructor declarator.  If FRIEND_P is true, the declarator is
19568    preceded by the `friend' specifier.  */
19569
19570 static bool
19571 cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p)
19572 {
19573   bool constructor_p;
19574   tree nested_name_specifier;
19575   cp_token *next_token;
19576
19577   /* The common case is that this is not a constructor declarator, so
19578      try to avoid doing lots of work if at all possible.  It's not
19579      valid declare a constructor at function scope.  */
19580   if (parser->in_function_body)
19581     return false;
19582   /* And only certain tokens can begin a constructor declarator.  */
19583   next_token = cp_lexer_peek_token (parser->lexer);
19584   if (next_token->type != CPP_NAME
19585       && next_token->type != CPP_SCOPE
19586       && next_token->type != CPP_NESTED_NAME_SPECIFIER
19587       && next_token->type != CPP_TEMPLATE_ID)
19588     return false;
19589
19590   /* Parse tentatively; we are going to roll back all of the tokens
19591      consumed here.  */
19592   cp_parser_parse_tentatively (parser);
19593   /* Assume that we are looking at a constructor declarator.  */
19594   constructor_p = true;
19595
19596   /* Look for the optional `::' operator.  */
19597   cp_parser_global_scope_opt (parser,
19598                               /*current_scope_valid_p=*/false);
19599   /* Look for the nested-name-specifier.  */
19600   nested_name_specifier
19601     = (cp_parser_nested_name_specifier_opt (parser,
19602                                             /*typename_keyword_p=*/false,
19603                                             /*check_dependency_p=*/false,
19604                                             /*type_p=*/false,
19605                                             /*is_declaration=*/false));
19606   /* Outside of a class-specifier, there must be a
19607      nested-name-specifier.  */
19608   if (!nested_name_specifier &&
19609       (!at_class_scope_p () || !TYPE_BEING_DEFINED (current_class_type)
19610        || friend_p))
19611     constructor_p = false;
19612   else if (nested_name_specifier == error_mark_node)
19613     constructor_p = false;
19614
19615   /* If we have a class scope, this is easy; DR 147 says that S::S always
19616      names the constructor, and no other qualified name could.  */
19617   if (constructor_p && nested_name_specifier
19618       && CLASS_TYPE_P (nested_name_specifier))
19619     {
19620       tree id = cp_parser_unqualified_id (parser,
19621                                           /*template_keyword_p=*/false,
19622                                           /*check_dependency_p=*/false,
19623                                           /*declarator_p=*/true,
19624                                           /*optional_p=*/false);
19625       if (is_overloaded_fn (id))
19626         id = DECL_NAME (get_first_fn (id));
19627       if (!constructor_name_p (id, nested_name_specifier))
19628         constructor_p = false;
19629     }
19630   /* If we still think that this might be a constructor-declarator,
19631      look for a class-name.  */
19632   else if (constructor_p)
19633     {
19634       /* If we have:
19635
19636            template <typename T> struct S {
19637              S();
19638            };
19639
19640          we must recognize that the nested `S' names a class.  */
19641       tree type_decl;
19642       type_decl = cp_parser_class_name (parser,
19643                                         /*typename_keyword_p=*/false,
19644                                         /*template_keyword_p=*/false,
19645                                         none_type,
19646                                         /*check_dependency_p=*/false,
19647                                         /*class_head_p=*/false,
19648                                         /*is_declaration=*/false);
19649       /* If there was no class-name, then this is not a constructor.  */
19650       constructor_p = !cp_parser_error_occurred (parser);
19651
19652       /* If we're still considering a constructor, we have to see a `(',
19653          to begin the parameter-declaration-clause, followed by either a
19654          `)', an `...', or a decl-specifier.  We need to check for a
19655          type-specifier to avoid being fooled into thinking that:
19656
19657            S (f) (int);
19658
19659          is a constructor.  (It is actually a function named `f' that
19660          takes one parameter (of type `int') and returns a value of type
19661          `S'.  */
19662       if (constructor_p
19663           && !cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
19664         constructor_p = false;
19665
19666       if (constructor_p
19667           && cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN)
19668           && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS)
19669           /* A parameter declaration begins with a decl-specifier,
19670              which is either the "attribute" keyword, a storage class
19671              specifier, or (usually) a type-specifier.  */
19672           && !cp_lexer_next_token_is_decl_specifier_keyword (parser->lexer))
19673         {
19674           tree type;
19675           tree pushed_scope = NULL_TREE;
19676           unsigned saved_num_template_parameter_lists;
19677
19678           /* Names appearing in the type-specifier should be looked up
19679              in the scope of the class.  */
19680           if (current_class_type)
19681             type = NULL_TREE;
19682           else
19683             {
19684               type = TREE_TYPE (type_decl);
19685               if (TREE_CODE (type) == TYPENAME_TYPE)
19686                 {
19687                   type = resolve_typename_type (type,
19688                                                 /*only_current_p=*/false);
19689                   if (TREE_CODE (type) == TYPENAME_TYPE)
19690                     {
19691                       cp_parser_abort_tentative_parse (parser);
19692                       return false;
19693                     }
19694                 }
19695               pushed_scope = push_scope (type);
19696             }
19697
19698           /* Inside the constructor parameter list, surrounding
19699              template-parameter-lists do not apply.  */
19700           saved_num_template_parameter_lists
19701             = parser->num_template_parameter_lists;
19702           parser->num_template_parameter_lists = 0;
19703
19704           /* Look for the type-specifier.  */
19705           cp_parser_type_specifier (parser,
19706                                     CP_PARSER_FLAGS_NONE,
19707                                     /*decl_specs=*/NULL,
19708                                     /*is_declarator=*/true,
19709                                     /*declares_class_or_enum=*/NULL,
19710                                     /*is_cv_qualifier=*/NULL);
19711
19712           parser->num_template_parameter_lists
19713             = saved_num_template_parameter_lists;
19714
19715           /* Leave the scope of the class.  */
19716           if (pushed_scope)
19717             pop_scope (pushed_scope);
19718
19719           constructor_p = !cp_parser_error_occurred (parser);
19720         }
19721     }
19722
19723   /* We did not really want to consume any tokens.  */
19724   cp_parser_abort_tentative_parse (parser);
19725
19726   return constructor_p;
19727 }
19728
19729 /* Parse the definition of the function given by the DECL_SPECIFIERS,
19730    ATTRIBUTES, and DECLARATOR.  The access checks have been deferred;
19731    they must be performed once we are in the scope of the function.
19732
19733    Returns the function defined.  */
19734
19735 static tree
19736 cp_parser_function_definition_from_specifiers_and_declarator
19737   (cp_parser* parser,
19738    cp_decl_specifier_seq *decl_specifiers,
19739    tree attributes,
19740    const cp_declarator *declarator)
19741 {
19742   tree fn;
19743   bool success_p;
19744
19745   /* Begin the function-definition.  */
19746   success_p = start_function (decl_specifiers, declarator, attributes);
19747
19748   /* The things we're about to see are not directly qualified by any
19749      template headers we've seen thus far.  */
19750   reset_specialization ();
19751
19752   /* If there were names looked up in the decl-specifier-seq that we
19753      did not check, check them now.  We must wait until we are in the
19754      scope of the function to perform the checks, since the function
19755      might be a friend.  */
19756   perform_deferred_access_checks ();
19757
19758   if (!success_p)
19759     {
19760       /* Skip the entire function.  */
19761       cp_parser_skip_to_end_of_block_or_statement (parser);
19762       fn = error_mark_node;
19763     }
19764   else if (DECL_INITIAL (current_function_decl) != error_mark_node)
19765     {
19766       /* Seen already, skip it.  An error message has already been output.  */
19767       cp_parser_skip_to_end_of_block_or_statement (parser);
19768       fn = current_function_decl;
19769       current_function_decl = NULL_TREE;
19770       /* If this is a function from a class, pop the nested class.  */
19771       if (current_class_name)
19772         pop_nested_class ();
19773     }
19774   else
19775     {
19776       timevar_id_t tv;
19777       if (DECL_DECLARED_INLINE_P (current_function_decl))
19778         tv = TV_PARSE_INLINE;
19779       else
19780         tv = TV_PARSE_FUNC;
19781       timevar_push (tv);
19782       fn = cp_parser_function_definition_after_declarator (parser,
19783                                                          /*inline_p=*/false);
19784       timevar_pop (tv);
19785     }
19786
19787   return fn;
19788 }
19789
19790 /* Parse the part of a function-definition that follows the
19791    declarator.  INLINE_P is TRUE iff this function is an inline
19792    function defined within a class-specifier.
19793
19794    Returns the function defined.  */
19795
19796 static tree
19797 cp_parser_function_definition_after_declarator (cp_parser* parser,
19798                                                 bool inline_p)
19799 {
19800   tree fn;
19801   bool ctor_initializer_p = false;
19802   bool saved_in_unbraced_linkage_specification_p;
19803   bool saved_in_function_body;
19804   unsigned saved_num_template_parameter_lists;
19805   cp_token *token;
19806
19807   saved_in_function_body = parser->in_function_body;
19808   parser->in_function_body = true;
19809   /* If the next token is `return', then the code may be trying to
19810      make use of the "named return value" extension that G++ used to
19811      support.  */
19812   token = cp_lexer_peek_token (parser->lexer);
19813   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_RETURN))
19814     {
19815       /* Consume the `return' keyword.  */
19816       cp_lexer_consume_token (parser->lexer);
19817       /* Look for the identifier that indicates what value is to be
19818          returned.  */
19819       cp_parser_identifier (parser);
19820       /* Issue an error message.  */
19821       error_at (token->location,
19822                 "named return values are no longer supported");
19823       /* Skip tokens until we reach the start of the function body.  */
19824       while (true)
19825         {
19826           cp_token *token = cp_lexer_peek_token (parser->lexer);
19827           if (token->type == CPP_OPEN_BRACE
19828               || token->type == CPP_EOF
19829               || token->type == CPP_PRAGMA_EOL)
19830             break;
19831           cp_lexer_consume_token (parser->lexer);
19832         }
19833     }
19834   /* The `extern' in `extern "C" void f () { ... }' does not apply to
19835      anything declared inside `f'.  */
19836   saved_in_unbraced_linkage_specification_p
19837     = parser->in_unbraced_linkage_specification_p;
19838   parser->in_unbraced_linkage_specification_p = false;
19839   /* Inside the function, surrounding template-parameter-lists do not
19840      apply.  */
19841   saved_num_template_parameter_lists
19842     = parser->num_template_parameter_lists;
19843   parser->num_template_parameter_lists = 0;
19844
19845   start_lambda_scope (current_function_decl);
19846
19847   /* If the next token is `try', then we are looking at a
19848      function-try-block.  */
19849   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
19850     ctor_initializer_p = cp_parser_function_try_block (parser);
19851   /* A function-try-block includes the function-body, so we only do
19852      this next part if we're not processing a function-try-block.  */
19853   else
19854     ctor_initializer_p
19855       = cp_parser_ctor_initializer_opt_and_function_body (parser);
19856
19857   finish_lambda_scope ();
19858
19859   /* Finish the function.  */
19860   fn = finish_function ((ctor_initializer_p ? 1 : 0) |
19861                         (inline_p ? 2 : 0));
19862   /* Generate code for it, if necessary.  */
19863   expand_or_defer_fn (fn);
19864   /* Restore the saved values.  */
19865   parser->in_unbraced_linkage_specification_p
19866     = saved_in_unbraced_linkage_specification_p;
19867   parser->num_template_parameter_lists
19868     = saved_num_template_parameter_lists;
19869   parser->in_function_body = saved_in_function_body;
19870
19871   return fn;
19872 }
19873
19874 /* Parse a template-declaration, assuming that the `export' (and
19875    `extern') keywords, if present, has already been scanned.  MEMBER_P
19876    is as for cp_parser_template_declaration.  */
19877
19878 static void
19879 cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
19880 {
19881   tree decl = NULL_TREE;
19882   VEC (deferred_access_check,gc) *checks;
19883   tree parameter_list;
19884   bool friend_p = false;
19885   bool need_lang_pop;
19886   cp_token *token;
19887
19888   /* Look for the `template' keyword.  */
19889   token = cp_lexer_peek_token (parser->lexer);
19890   if (!cp_parser_require_keyword (parser, RID_TEMPLATE, RT_TEMPLATE))
19891     return;
19892
19893   /* And the `<'.  */
19894   if (!cp_parser_require (parser, CPP_LESS, RT_LESS))
19895     return;
19896   if (at_class_scope_p () && current_function_decl)
19897     {
19898       /* 14.5.2.2 [temp.mem]
19899
19900          A local class shall not have member templates.  */
19901       error_at (token->location,
19902                 "invalid declaration of member template in local class");
19903       cp_parser_skip_to_end_of_block_or_statement (parser);
19904       return;
19905     }
19906   /* [temp]
19907
19908      A template ... shall not have C linkage.  */
19909   if (current_lang_name == lang_name_c)
19910     {
19911       error_at (token->location, "template with C linkage");
19912       /* Give it C++ linkage to avoid confusing other parts of the
19913          front end.  */
19914       push_lang_context (lang_name_cplusplus);
19915       need_lang_pop = true;
19916     }
19917   else
19918     need_lang_pop = false;
19919
19920   /* We cannot perform access checks on the template parameter
19921      declarations until we know what is being declared, just as we
19922      cannot check the decl-specifier list.  */
19923   push_deferring_access_checks (dk_deferred);
19924
19925   /* If the next token is `>', then we have an invalid
19926      specialization.  Rather than complain about an invalid template
19927      parameter, issue an error message here.  */
19928   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER))
19929     {
19930       cp_parser_error (parser, "invalid explicit specialization");
19931       begin_specialization ();
19932       parameter_list = NULL_TREE;
19933     }
19934   else
19935     {
19936       /* Parse the template parameters.  */
19937       parameter_list = cp_parser_template_parameter_list (parser);
19938       fixup_template_parms ();
19939     }
19940
19941   /* Get the deferred access checks from the parameter list.  These
19942      will be checked once we know what is being declared, as for a
19943      member template the checks must be performed in the scope of the
19944      class containing the member.  */
19945   checks = get_deferred_access_checks ();
19946
19947   /* Look for the `>'.  */
19948   cp_parser_skip_to_end_of_template_parameter_list (parser);
19949   /* We just processed one more parameter list.  */
19950   ++parser->num_template_parameter_lists;
19951   /* If the next token is `template', there are more template
19952      parameters.  */
19953   if (cp_lexer_next_token_is_keyword (parser->lexer,
19954                                       RID_TEMPLATE))
19955     cp_parser_template_declaration_after_export (parser, member_p);
19956   else
19957     {
19958       /* There are no access checks when parsing a template, as we do not
19959          know if a specialization will be a friend.  */
19960       push_deferring_access_checks (dk_no_check);
19961       token = cp_lexer_peek_token (parser->lexer);
19962       decl = cp_parser_single_declaration (parser,
19963                                            checks,
19964                                            member_p,
19965                                            /*explicit_specialization_p=*/false,
19966                                            &friend_p);
19967       pop_deferring_access_checks ();
19968
19969       /* If this is a member template declaration, let the front
19970          end know.  */
19971       if (member_p && !friend_p && decl)
19972         {
19973           if (TREE_CODE (decl) == TYPE_DECL)
19974             cp_parser_check_access_in_redeclaration (decl, token->location);
19975
19976           decl = finish_member_template_decl (decl);
19977         }
19978       else if (friend_p && decl && TREE_CODE (decl) == TYPE_DECL)
19979         make_friend_class (current_class_type, TREE_TYPE (decl),
19980                            /*complain=*/true);
19981     }
19982   /* We are done with the current parameter list.  */
19983   --parser->num_template_parameter_lists;
19984
19985   pop_deferring_access_checks ();
19986
19987   /* Finish up.  */
19988   finish_template_decl (parameter_list);
19989
19990   /* Register member declarations.  */
19991   if (member_p && !friend_p && decl && !DECL_CLASS_TEMPLATE_P (decl))
19992     finish_member_declaration (decl);
19993   /* For the erroneous case of a template with C linkage, we pushed an
19994      implicit C++ linkage scope; exit that scope now.  */
19995   if (need_lang_pop)
19996     pop_lang_context ();
19997   /* If DECL is a function template, we must return to parse it later.
19998      (Even though there is no definition, there might be default
19999      arguments that need handling.)  */
20000   if (member_p && decl
20001       && (TREE_CODE (decl) == FUNCTION_DECL
20002           || DECL_FUNCTION_TEMPLATE_P (decl)))
20003     VEC_safe_push (tree, gc, unparsed_funs_with_definitions, decl);
20004 }
20005
20006 /* Perform the deferred access checks from a template-parameter-list.
20007    CHECKS is a TREE_LIST of access checks, as returned by
20008    get_deferred_access_checks.  */
20009
20010 static void
20011 cp_parser_perform_template_parameter_access_checks (VEC (deferred_access_check,gc)* checks)
20012 {
20013   ++processing_template_parmlist;
20014   perform_access_checks (checks);
20015   --processing_template_parmlist;
20016 }
20017
20018 /* Parse a `decl-specifier-seq [opt] init-declarator [opt] ;' or
20019    `function-definition' sequence.  MEMBER_P is true, this declaration
20020    appears in a class scope.
20021
20022    Returns the DECL for the declared entity.  If FRIEND_P is non-NULL,
20023    *FRIEND_P is set to TRUE iff the declaration is a friend.  */
20024
20025 static tree
20026 cp_parser_single_declaration (cp_parser* parser,
20027                               VEC (deferred_access_check,gc)* checks,
20028                               bool member_p,
20029                               bool explicit_specialization_p,
20030                               bool* friend_p)
20031 {
20032   int declares_class_or_enum;
20033   tree decl = NULL_TREE;
20034   cp_decl_specifier_seq decl_specifiers;
20035   bool function_definition_p = false;
20036   cp_token *decl_spec_token_start;
20037
20038   /* This function is only used when processing a template
20039      declaration.  */
20040   gcc_assert (innermost_scope_kind () == sk_template_parms
20041               || innermost_scope_kind () == sk_template_spec);
20042
20043   /* Defer access checks until we know what is being declared.  */
20044   push_deferring_access_checks (dk_deferred);
20045
20046   /* Try the `decl-specifier-seq [opt] init-declarator [opt]'
20047      alternative.  */
20048   decl_spec_token_start = cp_lexer_peek_token (parser->lexer);
20049   cp_parser_decl_specifier_seq (parser,
20050                                 CP_PARSER_FLAGS_OPTIONAL,
20051                                 &decl_specifiers,
20052                                 &declares_class_or_enum);
20053   if (friend_p)
20054     *friend_p = cp_parser_friend_p (&decl_specifiers);
20055
20056   /* There are no template typedefs.  */
20057   if (decl_specifiers.specs[(int) ds_typedef])
20058     {
20059       error_at (decl_spec_token_start->location,
20060                 "template declaration of %<typedef%>");
20061       decl = error_mark_node;
20062     }
20063
20064   /* Gather up the access checks that occurred the
20065      decl-specifier-seq.  */
20066   stop_deferring_access_checks ();
20067
20068   /* Check for the declaration of a template class.  */
20069   if (declares_class_or_enum)
20070     {
20071       if (cp_parser_declares_only_class_p (parser))
20072         {
20073           decl = shadow_tag (&decl_specifiers);
20074
20075           /* In this case:
20076
20077                struct C {
20078                  friend template <typename T> struct A<T>::B;
20079                };
20080
20081              A<T>::B will be represented by a TYPENAME_TYPE, and
20082              therefore not recognized by shadow_tag.  */
20083           if (friend_p && *friend_p
20084               && !decl
20085               && decl_specifiers.type
20086               && TYPE_P (decl_specifiers.type))
20087             decl = decl_specifiers.type;
20088
20089           if (decl && decl != error_mark_node)
20090             decl = TYPE_NAME (decl);
20091           else
20092             decl = error_mark_node;
20093
20094           /* Perform access checks for template parameters.  */
20095           cp_parser_perform_template_parameter_access_checks (checks);
20096         }
20097     }
20098
20099   /* Complain about missing 'typename' or other invalid type names.  */
20100   if (!decl_specifiers.any_type_specifiers_p
20101       && cp_parser_parse_and_diagnose_invalid_type_name (parser))
20102     {
20103       /* cp_parser_parse_and_diagnose_invalid_type_name calls
20104          cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
20105          the rest of this declaration.  */
20106       decl = error_mark_node;
20107       goto out;
20108     }
20109
20110   /* If it's not a template class, try for a template function.  If
20111      the next token is a `;', then this declaration does not declare
20112      anything.  But, if there were errors in the decl-specifiers, then
20113      the error might well have come from an attempted class-specifier.
20114      In that case, there's no need to warn about a missing declarator.  */
20115   if (!decl
20116       && (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON)
20117           || decl_specifiers.type != error_mark_node))
20118     {
20119       decl = cp_parser_init_declarator (parser,
20120                                         &decl_specifiers,
20121                                         checks,
20122                                         /*function_definition_allowed_p=*/true,
20123                                         member_p,
20124                                         declares_class_or_enum,
20125                                         &function_definition_p,
20126                                         NULL);
20127
20128     /* 7.1.1-1 [dcl.stc]
20129
20130        A storage-class-specifier shall not be specified in an explicit
20131        specialization...  */
20132     if (decl
20133         && explicit_specialization_p
20134         && decl_specifiers.storage_class != sc_none)
20135       {
20136         error_at (decl_spec_token_start->location,
20137                   "explicit template specialization cannot have a storage class");
20138         decl = error_mark_node;
20139       }
20140     }
20141
20142   /* Look for a trailing `;' after the declaration.  */
20143   if (!function_definition_p
20144       && (decl == error_mark_node
20145           || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
20146     cp_parser_skip_to_end_of_block_or_statement (parser);
20147
20148  out:
20149   pop_deferring_access_checks ();
20150
20151   /* Clear any current qualification; whatever comes next is the start
20152      of something new.  */
20153   parser->scope = NULL_TREE;
20154   parser->qualifying_scope = NULL_TREE;
20155   parser->object_scope = NULL_TREE;
20156
20157   return decl;
20158 }
20159
20160 /* Parse a cast-expression that is not the operand of a unary "&".  */
20161
20162 static tree
20163 cp_parser_simple_cast_expression (cp_parser *parser)
20164 {
20165   return cp_parser_cast_expression (parser, /*address_p=*/false,
20166                                     /*cast_p=*/false, NULL);
20167 }
20168
20169 /* Parse a functional cast to TYPE.  Returns an expression
20170    representing the cast.  */
20171
20172 static tree
20173 cp_parser_functional_cast (cp_parser* parser, tree type)
20174 {
20175   VEC(tree,gc) *vec;
20176   tree expression_list;
20177   tree cast;
20178   bool nonconst_p;
20179
20180   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
20181     {
20182       maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
20183       expression_list = cp_parser_braced_list (parser, &nonconst_p);
20184       CONSTRUCTOR_IS_DIRECT_INIT (expression_list) = 1;
20185       if (TREE_CODE (type) == TYPE_DECL)
20186         type = TREE_TYPE (type);
20187       return finish_compound_literal (type, expression_list,
20188                                       tf_warning_or_error);
20189     }
20190
20191
20192   vec = cp_parser_parenthesized_expression_list (parser, non_attr,
20193                                                  /*cast_p=*/true,
20194                                                  /*allow_expansion_p=*/true,
20195                                                  /*non_constant_p=*/NULL);
20196   if (vec == NULL)
20197     expression_list = error_mark_node;
20198   else
20199     {
20200       expression_list = build_tree_list_vec (vec);
20201       release_tree_vector (vec);
20202     }
20203
20204   cast = build_functional_cast (type, expression_list,
20205                                 tf_warning_or_error);
20206   /* [expr.const]/1: In an integral constant expression "only type
20207      conversions to integral or enumeration type can be used".  */
20208   if (TREE_CODE (type) == TYPE_DECL)
20209     type = TREE_TYPE (type);
20210   if (cast != error_mark_node
20211       && !cast_valid_in_integral_constant_expression_p (type)
20212       && cp_parser_non_integral_constant_expression (parser,
20213                                                      NIC_CONSTRUCTOR))
20214     return error_mark_node;
20215   return cast;
20216 }
20217
20218 /* Save the tokens that make up the body of a member function defined
20219    in a class-specifier.  The DECL_SPECIFIERS and DECLARATOR have
20220    already been parsed.  The ATTRIBUTES are any GNU "__attribute__"
20221    specifiers applied to the declaration.  Returns the FUNCTION_DECL
20222    for the member function.  */
20223
20224 static tree
20225 cp_parser_save_member_function_body (cp_parser* parser,
20226                                      cp_decl_specifier_seq *decl_specifiers,
20227                                      cp_declarator *declarator,
20228                                      tree attributes)
20229 {
20230   cp_token *first;
20231   cp_token *last;
20232   tree fn;
20233
20234   /* Create the FUNCTION_DECL.  */
20235   fn = grokmethod (decl_specifiers, declarator, attributes);
20236   /* If something went badly wrong, bail out now.  */
20237   if (fn == error_mark_node)
20238     {
20239       /* If there's a function-body, skip it.  */
20240       if (cp_parser_token_starts_function_definition_p
20241           (cp_lexer_peek_token (parser->lexer)))
20242         cp_parser_skip_to_end_of_block_or_statement (parser);
20243       return error_mark_node;
20244     }
20245
20246   /* Remember it, if there default args to post process.  */
20247   cp_parser_save_default_args (parser, fn);
20248
20249   /* Save away the tokens that make up the body of the
20250      function.  */
20251   first = parser->lexer->next_token;
20252   /* We can have braced-init-list mem-initializers before the fn body.  */
20253   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
20254     {
20255       cp_lexer_consume_token (parser->lexer);
20256       while (cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_BRACE)
20257              && cp_lexer_next_token_is_not_keyword (parser->lexer, RID_TRY))
20258         {
20259           /* cache_group will stop after an un-nested { } pair, too.  */
20260           if (cp_parser_cache_group (parser, CPP_CLOSE_PAREN, /*depth=*/0))
20261             break;
20262
20263           /* variadic mem-inits have ... after the ')'.  */
20264           if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20265             cp_lexer_consume_token (parser->lexer);
20266         }
20267     }
20268   cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20269   /* Handle function try blocks.  */
20270   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_CATCH))
20271     cp_parser_cache_group (parser, CPP_CLOSE_BRACE, /*depth=*/0);
20272   last = parser->lexer->next_token;
20273
20274   /* Save away the inline definition; we will process it when the
20275      class is complete.  */
20276   DECL_PENDING_INLINE_INFO (fn) = cp_token_cache_new (first, last);
20277   DECL_PENDING_INLINE_P (fn) = 1;
20278
20279   /* We need to know that this was defined in the class, so that
20280      friend templates are handled correctly.  */
20281   DECL_INITIALIZED_IN_CLASS_P (fn) = 1;
20282
20283   /* Add FN to the queue of functions to be parsed later.  */
20284   VEC_safe_push (tree, gc, unparsed_funs_with_definitions, fn);
20285
20286   return fn;
20287 }
20288
20289 /* Parse a template-argument-list, as well as the trailing ">" (but
20290    not the opening ">").  See cp_parser_template_argument_list for the
20291    return value.  */
20292
20293 static tree
20294 cp_parser_enclosed_template_argument_list (cp_parser* parser)
20295 {
20296   tree arguments;
20297   tree saved_scope;
20298   tree saved_qualifying_scope;
20299   tree saved_object_scope;
20300   bool saved_greater_than_is_operator_p;
20301   int saved_unevaluated_operand;
20302   int saved_inhibit_evaluation_warnings;
20303
20304   /* [temp.names]
20305
20306      When parsing a template-id, the first non-nested `>' is taken as
20307      the end of the template-argument-list rather than a greater-than
20308      operator.  */
20309   saved_greater_than_is_operator_p
20310     = parser->greater_than_is_operator_p;
20311   parser->greater_than_is_operator_p = false;
20312   /* Parsing the argument list may modify SCOPE, so we save it
20313      here.  */
20314   saved_scope = parser->scope;
20315   saved_qualifying_scope = parser->qualifying_scope;
20316   saved_object_scope = parser->object_scope;
20317   /* We need to evaluate the template arguments, even though this
20318      template-id may be nested within a "sizeof".  */
20319   saved_unevaluated_operand = cp_unevaluated_operand;
20320   cp_unevaluated_operand = 0;
20321   saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
20322   c_inhibit_evaluation_warnings = 0;
20323   /* Parse the template-argument-list itself.  */
20324   if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)
20325       || cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20326     arguments = NULL_TREE;
20327   else
20328     arguments = cp_parser_template_argument_list (parser);
20329   /* Look for the `>' that ends the template-argument-list. If we find
20330      a '>>' instead, it's probably just a typo.  */
20331   if (cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
20332     {
20333       if (cxx_dialect != cxx98)
20334         {
20335           /* In C++0x, a `>>' in a template argument list or cast
20336              expression is considered to be two separate `>'
20337              tokens. So, change the current token to a `>', but don't
20338              consume it: it will be consumed later when the outer
20339              template argument list (or cast expression) is parsed.
20340              Note that this replacement of `>' for `>>' is necessary
20341              even if we are parsing tentatively: in the tentative
20342              case, after calling
20343              cp_parser_enclosed_template_argument_list we will always
20344              throw away all of the template arguments and the first
20345              closing `>', either because the template argument list
20346              was erroneous or because we are replacing those tokens
20347              with a CPP_TEMPLATE_ID token.  The second `>' (which will
20348              not have been thrown away) is needed either to close an
20349              outer template argument list or to complete a new-style
20350              cast.  */
20351           cp_token *token = cp_lexer_peek_token (parser->lexer);
20352           token->type = CPP_GREATER;
20353         }
20354       else if (!saved_greater_than_is_operator_p)
20355         {
20356           /* If we're in a nested template argument list, the '>>' has
20357             to be a typo for '> >'. We emit the error message, but we
20358             continue parsing and we push a '>' as next token, so that
20359             the argument list will be parsed correctly.  Note that the
20360             global source location is still on the token before the
20361             '>>', so we need to say explicitly where we want it.  */
20362           cp_token *token = cp_lexer_peek_token (parser->lexer);
20363           error_at (token->location, "%<>>%> should be %<> >%> "
20364                     "within a nested template argument list");
20365
20366           token->type = CPP_GREATER;
20367         }
20368       else
20369         {
20370           /* If this is not a nested template argument list, the '>>'
20371             is a typo for '>'. Emit an error message and continue.
20372             Same deal about the token location, but here we can get it
20373             right by consuming the '>>' before issuing the diagnostic.  */
20374           cp_token *token = cp_lexer_consume_token (parser->lexer);
20375           error_at (token->location,
20376                     "spurious %<>>%>, use %<>%> to terminate "
20377                     "a template argument list");
20378         }
20379     }
20380   else
20381     cp_parser_skip_to_end_of_template_parameter_list (parser);
20382   /* The `>' token might be a greater-than operator again now.  */
20383   parser->greater_than_is_operator_p
20384     = saved_greater_than_is_operator_p;
20385   /* Restore the SAVED_SCOPE.  */
20386   parser->scope = saved_scope;
20387   parser->qualifying_scope = saved_qualifying_scope;
20388   parser->object_scope = saved_object_scope;
20389   cp_unevaluated_operand = saved_unevaluated_operand;
20390   c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
20391
20392   return arguments;
20393 }
20394
20395 /* MEMBER_FUNCTION is a member function, or a friend.  If default
20396    arguments, or the body of the function have not yet been parsed,
20397    parse them now.  */
20398
20399 static void
20400 cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
20401 {
20402   timevar_push (TV_PARSE_INMETH);
20403   /* If this member is a template, get the underlying
20404      FUNCTION_DECL.  */
20405   if (DECL_FUNCTION_TEMPLATE_P (member_function))
20406     member_function = DECL_TEMPLATE_RESULT (member_function);
20407
20408   /* There should not be any class definitions in progress at this
20409      point; the bodies of members are only parsed outside of all class
20410      definitions.  */
20411   gcc_assert (parser->num_classes_being_defined == 0);
20412   /* While we're parsing the member functions we might encounter more
20413      classes.  We want to handle them right away, but we don't want
20414      them getting mixed up with functions that are currently in the
20415      queue.  */
20416   push_unparsed_function_queues (parser);
20417
20418   /* Make sure that any template parameters are in scope.  */
20419   maybe_begin_member_template_processing (member_function);
20420
20421   /* If the body of the function has not yet been parsed, parse it
20422      now.  */
20423   if (DECL_PENDING_INLINE_P (member_function))
20424     {
20425       tree function_scope;
20426       cp_token_cache *tokens;
20427
20428       /* The function is no longer pending; we are processing it.  */
20429       tokens = DECL_PENDING_INLINE_INFO (member_function);
20430       DECL_PENDING_INLINE_INFO (member_function) = NULL;
20431       DECL_PENDING_INLINE_P (member_function) = 0;
20432
20433       /* If this is a local class, enter the scope of the containing
20434          function.  */
20435       function_scope = current_function_decl;
20436       if (function_scope)
20437         push_function_context ();
20438
20439       /* Push the body of the function onto the lexer stack.  */
20440       cp_parser_push_lexer_for_tokens (parser, tokens);
20441
20442       /* Let the front end know that we going to be defining this
20443          function.  */
20444       start_preparsed_function (member_function, NULL_TREE,
20445                                 SF_PRE_PARSED | SF_INCLASS_INLINE);
20446
20447       /* Don't do access checking if it is a templated function.  */
20448       if (processing_template_decl)
20449         push_deferring_access_checks (dk_no_check);
20450
20451       /* Now, parse the body of the function.  */
20452       cp_parser_function_definition_after_declarator (parser,
20453                                                       /*inline_p=*/true);
20454
20455       if (processing_template_decl)
20456         pop_deferring_access_checks ();
20457
20458       /* Leave the scope of the containing function.  */
20459       if (function_scope)
20460         pop_function_context ();
20461       cp_parser_pop_lexer (parser);
20462     }
20463
20464   /* Remove any template parameters from the symbol table.  */
20465   maybe_end_member_template_processing ();
20466
20467   /* Restore the queue.  */
20468   pop_unparsed_function_queues (parser);
20469   timevar_pop (TV_PARSE_INMETH);
20470 }
20471
20472 /* If DECL contains any default args, remember it on the unparsed
20473    functions queue.  */
20474
20475 static void
20476 cp_parser_save_default_args (cp_parser* parser, tree decl)
20477 {
20478   tree probe;
20479
20480   for (probe = TYPE_ARG_TYPES (TREE_TYPE (decl));
20481        probe;
20482        probe = TREE_CHAIN (probe))
20483     if (TREE_PURPOSE (probe))
20484       {
20485         cp_default_arg_entry *entry
20486           = VEC_safe_push (cp_default_arg_entry, gc,
20487                            unparsed_funs_with_default_args, NULL);
20488         entry->class_type = current_class_type;
20489         entry->decl = decl;
20490         break;
20491       }
20492 }
20493
20494 /* FN is a FUNCTION_DECL which may contains a parameter with an
20495    unparsed DEFAULT_ARG.  Parse the default args now.  This function
20496    assumes that the current scope is the scope in which the default
20497    argument should be processed.  */
20498
20499 static void
20500 cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
20501 {
20502   bool saved_local_variables_forbidden_p;
20503   tree parm, parmdecl;
20504
20505   /* While we're parsing the default args, we might (due to the
20506      statement expression extension) encounter more classes.  We want
20507      to handle them right away, but we don't want them getting mixed
20508      up with default args that are currently in the queue.  */
20509   push_unparsed_function_queues (parser);
20510
20511   /* Local variable names (and the `this' keyword) may not appear
20512      in a default argument.  */
20513   saved_local_variables_forbidden_p = parser->local_variables_forbidden_p;
20514   parser->local_variables_forbidden_p = true;
20515
20516   push_defarg_context (fn);
20517
20518   for (parm = TYPE_ARG_TYPES (TREE_TYPE (fn)),
20519          parmdecl = DECL_ARGUMENTS (fn);
20520        parm && parm != void_list_node;
20521        parm = TREE_CHAIN (parm),
20522          parmdecl = DECL_CHAIN (parmdecl))
20523     {
20524       cp_token_cache *tokens;
20525       tree default_arg = TREE_PURPOSE (parm);
20526       tree parsed_arg;
20527       VEC(tree,gc) *insts;
20528       tree copy;
20529       unsigned ix;
20530
20531       if (!default_arg)
20532         continue;
20533
20534       if (TREE_CODE (default_arg) != DEFAULT_ARG)
20535         /* This can happen for a friend declaration for a function
20536            already declared with default arguments.  */
20537         continue;
20538
20539        /* Push the saved tokens for the default argument onto the parser's
20540           lexer stack.  */
20541       tokens = DEFARG_TOKENS (default_arg);
20542       cp_parser_push_lexer_for_tokens (parser, tokens);
20543
20544       start_lambda_scope (parmdecl);
20545
20546       /* Parse the assignment-expression.  */
20547       parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL);
20548       if (parsed_arg == error_mark_node)
20549         {
20550           cp_parser_pop_lexer (parser);
20551           continue;
20552         }
20553
20554       if (!processing_template_decl)
20555         parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg);
20556
20557       TREE_PURPOSE (parm) = parsed_arg;
20558
20559       /* Update any instantiations we've already created.  */
20560       for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
20561            VEC_iterate (tree, insts, ix, copy); ix++)
20562         TREE_PURPOSE (copy) = parsed_arg;
20563
20564       finish_lambda_scope ();
20565
20566       /* If the token stream has not been completely used up, then
20567          there was extra junk after the end of the default
20568          argument.  */
20569       if (!cp_lexer_next_token_is (parser->lexer, CPP_EOF))
20570         cp_parser_error (parser, "expected %<,%>");
20571
20572       /* Revert to the main lexer.  */
20573       cp_parser_pop_lexer (parser);
20574     }
20575
20576   pop_defarg_context ();
20577
20578   /* Make sure no default arg is missing.  */
20579   check_default_args (fn);
20580
20581   /* Restore the state of local_variables_forbidden_p.  */
20582   parser->local_variables_forbidden_p = saved_local_variables_forbidden_p;
20583
20584   /* Restore the queue.  */
20585   pop_unparsed_function_queues (parser);
20586 }
20587
20588 /* Parse the operand of `sizeof' (or a similar operator).  Returns
20589    either a TYPE or an expression, depending on the form of the
20590    input.  The KEYWORD indicates which kind of expression we have
20591    encountered.  */
20592
20593 static tree
20594 cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
20595 {
20596   tree expr = NULL_TREE;
20597   const char *saved_message;
20598   char *tmp;
20599   bool saved_integral_constant_expression_p;
20600   bool saved_non_integral_constant_expression_p;
20601   bool pack_expansion_p = false;
20602
20603   /* Types cannot be defined in a `sizeof' expression.  Save away the
20604      old message.  */
20605   saved_message = parser->type_definition_forbidden_message;
20606   /* And create the new one.  */
20607   tmp = concat ("types may not be defined in %<",
20608                 IDENTIFIER_POINTER (ridpointers[keyword]),
20609                 "%> expressions", NULL);
20610   parser->type_definition_forbidden_message = tmp;
20611
20612   /* The restrictions on constant-expressions do not apply inside
20613      sizeof expressions.  */
20614   saved_integral_constant_expression_p
20615     = parser->integral_constant_expression_p;
20616   saved_non_integral_constant_expression_p
20617     = parser->non_integral_constant_expression_p;
20618   parser->integral_constant_expression_p = false;
20619
20620   /* If it's a `...', then we are computing the length of a parameter
20621      pack.  */
20622   if (keyword == RID_SIZEOF
20623       && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
20624     {
20625       /* Consume the `...'.  */
20626       cp_lexer_consume_token (parser->lexer);
20627       maybe_warn_variadic_templates ();
20628
20629       /* Note that this is an expansion.  */
20630       pack_expansion_p = true;
20631     }
20632
20633   /* Do not actually evaluate the expression.  */
20634   ++cp_unevaluated_operand;
20635   ++c_inhibit_evaluation_warnings;
20636   /* If it's a `(', then we might be looking at the type-id
20637      construction.  */
20638   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
20639     {
20640       tree type;
20641       bool saved_in_type_id_in_expr_p;
20642
20643       /* We can't be sure yet whether we're looking at a type-id or an
20644          expression.  */
20645       cp_parser_parse_tentatively (parser);
20646       /* Consume the `('.  */
20647       cp_lexer_consume_token (parser->lexer);
20648       /* Parse the type-id.  */
20649       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
20650       parser->in_type_id_in_expr_p = true;
20651       type = cp_parser_type_id (parser);
20652       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
20653       /* Now, look for the trailing `)'.  */
20654       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
20655       /* If all went well, then we're done.  */
20656       if (cp_parser_parse_definitely (parser))
20657         {
20658           cp_decl_specifier_seq decl_specs;
20659
20660           /* Build a trivial decl-specifier-seq.  */
20661           clear_decl_specs (&decl_specs);
20662           decl_specs.type = type;
20663
20664           /* Call grokdeclarator to figure out what type this is.  */
20665           expr = grokdeclarator (NULL,
20666                                  &decl_specs,
20667                                  TYPENAME,
20668                                  /*initialized=*/0,
20669                                  /*attrlist=*/NULL);
20670         }
20671     }
20672
20673   /* If the type-id production did not work out, then we must be
20674      looking at the unary-expression production.  */
20675   if (!expr)
20676     expr = cp_parser_unary_expression (parser, /*address_p=*/false,
20677                                        /*cast_p=*/false, NULL);
20678
20679   if (pack_expansion_p)
20680     /* Build a pack expansion. */
20681     expr = make_pack_expansion (expr);
20682
20683   /* Go back to evaluating expressions.  */
20684   --cp_unevaluated_operand;
20685   --c_inhibit_evaluation_warnings;
20686
20687   /* Free the message we created.  */
20688   free (tmp);
20689   /* And restore the old one.  */
20690   parser->type_definition_forbidden_message = saved_message;
20691   parser->integral_constant_expression_p
20692     = saved_integral_constant_expression_p;
20693   parser->non_integral_constant_expression_p
20694     = saved_non_integral_constant_expression_p;
20695
20696   return expr;
20697 }
20698
20699 /* If the current declaration has no declarator, return true.  */
20700
20701 static bool
20702 cp_parser_declares_only_class_p (cp_parser *parser)
20703 {
20704   /* If the next token is a `;' or a `,' then there is no
20705      declarator.  */
20706   return (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
20707           || cp_lexer_next_token_is (parser->lexer, CPP_COMMA));
20708 }
20709
20710 /* Update the DECL_SPECS to reflect the storage class indicated by
20711    KEYWORD.  */
20712
20713 static void
20714 cp_parser_set_storage_class (cp_parser *parser,
20715                              cp_decl_specifier_seq *decl_specs,
20716                              enum rid keyword,
20717                              location_t location)
20718 {
20719   cp_storage_class storage_class;
20720
20721   if (parser->in_unbraced_linkage_specification_p)
20722     {
20723       error_at (location, "invalid use of %qD in linkage specification",
20724                 ridpointers[keyword]);
20725       return;
20726     }
20727   else if (decl_specs->storage_class != sc_none)
20728     {
20729       decl_specs->conflicting_specifiers_p = true;
20730       return;
20731     }
20732
20733   if ((keyword == RID_EXTERN || keyword == RID_STATIC)
20734       && decl_specs->specs[(int) ds_thread])
20735     {
20736       error_at (location, "%<__thread%> before %qD", ridpointers[keyword]);
20737       decl_specs->specs[(int) ds_thread] = 0;
20738     }
20739
20740   switch (keyword)
20741     {
20742     case RID_AUTO:
20743       storage_class = sc_auto;
20744       break;
20745     case RID_REGISTER:
20746       storage_class = sc_register;
20747       break;
20748     case RID_STATIC:
20749       storage_class = sc_static;
20750       break;
20751     case RID_EXTERN:
20752       storage_class = sc_extern;
20753       break;
20754     case RID_MUTABLE:
20755       storage_class = sc_mutable;
20756       break;
20757     default:
20758       gcc_unreachable ();
20759     }
20760   decl_specs->storage_class = storage_class;
20761
20762   /* A storage class specifier cannot be applied alongside a typedef 
20763      specifier. If there is a typedef specifier present then set 
20764      conflicting_specifiers_p which will trigger an error later
20765      on in grokdeclarator. */
20766   if (decl_specs->specs[(int)ds_typedef])
20767     decl_specs->conflicting_specifiers_p = true;
20768 }
20769
20770 /* Update the DECL_SPECS to reflect the TYPE_SPEC.  If USER_DEFINED_P
20771    is true, the type is a user-defined type; otherwise it is a
20772    built-in type specified by a keyword.  */
20773
20774 static void
20775 cp_parser_set_decl_spec_type (cp_decl_specifier_seq *decl_specs,
20776                               tree type_spec,
20777                               location_t location,
20778                               bool user_defined_p)
20779 {
20780   decl_specs->any_specifiers_p = true;
20781
20782   /* If the user tries to redeclare bool, char16_t, char32_t, or wchar_t
20783      (with, for example, in "typedef int wchar_t;") we remember that
20784      this is what happened.  In system headers, we ignore these
20785      declarations so that G++ can work with system headers that are not
20786      C++-safe.  */
20787   if (decl_specs->specs[(int) ds_typedef]
20788       && !user_defined_p
20789       && (type_spec == boolean_type_node
20790           || type_spec == char16_type_node
20791           || type_spec == char32_type_node
20792           || type_spec == wchar_type_node)
20793       && (decl_specs->type
20794           || decl_specs->specs[(int) ds_long]
20795           || decl_specs->specs[(int) ds_short]
20796           || decl_specs->specs[(int) ds_unsigned]
20797           || decl_specs->specs[(int) ds_signed]))
20798     {
20799       decl_specs->redefined_builtin_type = type_spec;
20800       if (!decl_specs->type)
20801         {
20802           decl_specs->type = type_spec;
20803           decl_specs->user_defined_type_p = false;
20804           decl_specs->type_location = location;
20805         }
20806     }
20807   else if (decl_specs->type)
20808     decl_specs->multiple_types_p = true;
20809   else
20810     {
20811       decl_specs->type = type_spec;
20812       decl_specs->user_defined_type_p = user_defined_p;
20813       decl_specs->redefined_builtin_type = NULL_TREE;
20814       decl_specs->type_location = location;
20815     }
20816 }
20817
20818 /* DECL_SPECIFIERS is the representation of a decl-specifier-seq.
20819    Returns TRUE iff `friend' appears among the DECL_SPECIFIERS.  */
20820
20821 static bool
20822 cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
20823 {
20824   return decl_specifiers->specs[(int) ds_friend] != 0;
20825 }
20826
20827 /* Issue an error message indicating that TOKEN_DESC was expected.
20828    If KEYWORD is true, it indicated this function is called by
20829    cp_parser_require_keword and the required token can only be
20830    a indicated keyword. */
20831
20832 static void
20833 cp_parser_required_error (cp_parser *parser,
20834                           required_token token_desc,
20835                           bool keyword)
20836 {
20837   switch (token_desc)
20838     {
20839       case RT_NEW:
20840         cp_parser_error (parser, "expected %<new%>");
20841         return;
20842       case RT_DELETE:
20843         cp_parser_error (parser, "expected %<delete%>");
20844         return;
20845       case RT_RETURN:
20846         cp_parser_error (parser, "expected %<return%>");
20847         return;
20848       case RT_WHILE:
20849         cp_parser_error (parser, "expected %<while%>");
20850         return;
20851       case RT_EXTERN:
20852         cp_parser_error (parser, "expected %<extern%>");
20853         return;
20854       case RT_STATIC_ASSERT:
20855         cp_parser_error (parser, "expected %<static_assert%>");
20856         return;
20857       case RT_DECLTYPE:
20858         cp_parser_error (parser, "expected %<decltype%>");
20859         return;
20860       case RT_OPERATOR:
20861         cp_parser_error (parser, "expected %<operator%>");
20862         return;
20863       case RT_CLASS:
20864         cp_parser_error (parser, "expected %<class%>");
20865         return;
20866       case RT_TEMPLATE:
20867         cp_parser_error (parser, "expected %<template%>");
20868         return;
20869       case RT_NAMESPACE:
20870         cp_parser_error (parser, "expected %<namespace%>");
20871         return;
20872       case RT_USING:
20873         cp_parser_error (parser, "expected %<using%>");
20874         return;
20875       case RT_ASM:
20876         cp_parser_error (parser, "expected %<asm%>");
20877         return;
20878       case RT_TRY:
20879         cp_parser_error (parser, "expected %<try%>");
20880         return;
20881       case RT_CATCH:
20882         cp_parser_error (parser, "expected %<catch%>");
20883         return;
20884       case RT_THROW:
20885         cp_parser_error (parser, "expected %<throw%>");
20886         return;
20887       case RT_LABEL:
20888         cp_parser_error (parser, "expected %<__label__%>");
20889         return;
20890       case RT_AT_TRY:
20891         cp_parser_error (parser, "expected %<@try%>");
20892         return;
20893       case RT_AT_SYNCHRONIZED:
20894         cp_parser_error (parser, "expected %<@synchronized%>");
20895         return;
20896       case RT_AT_THROW:
20897         cp_parser_error (parser, "expected %<@throw%>");
20898         return;
20899       default:
20900         break;
20901     }
20902   if (!keyword)
20903     {
20904       switch (token_desc)
20905         {
20906           case RT_SEMICOLON:
20907             cp_parser_error (parser, "expected %<;%>");
20908             return;
20909           case RT_OPEN_PAREN:
20910             cp_parser_error (parser, "expected %<(%>");
20911             return;
20912           case RT_CLOSE_BRACE:
20913             cp_parser_error (parser, "expected %<}%>");
20914             return;
20915           case RT_OPEN_BRACE:
20916             cp_parser_error (parser, "expected %<{%>");
20917             return;
20918           case RT_CLOSE_SQUARE:
20919             cp_parser_error (parser, "expected %<]%>");
20920             return;
20921           case RT_OPEN_SQUARE:
20922             cp_parser_error (parser, "expected %<[%>");
20923             return;
20924           case RT_COMMA:
20925             cp_parser_error (parser, "expected %<,%>");
20926             return;
20927           case RT_SCOPE:
20928             cp_parser_error (parser, "expected %<::%>");
20929             return;
20930           case RT_LESS:
20931             cp_parser_error (parser, "expected %<<%>");
20932             return;
20933           case RT_GREATER:
20934             cp_parser_error (parser, "expected %<>%>");
20935             return;
20936           case RT_EQ:
20937             cp_parser_error (parser, "expected %<=%>");
20938             return;
20939           case RT_ELLIPSIS:
20940             cp_parser_error (parser, "expected %<...%>");
20941             return;
20942           case RT_MULT:
20943             cp_parser_error (parser, "expected %<*%>");
20944             return;
20945           case RT_COMPL:
20946             cp_parser_error (parser, "expected %<~%>");
20947             return;
20948           case RT_COLON:
20949             cp_parser_error (parser, "expected %<:%>");
20950             return;
20951           case RT_COLON_SCOPE:
20952             cp_parser_error (parser, "expected %<:%> or %<::%>");
20953             return;
20954           case RT_CLOSE_PAREN:
20955             cp_parser_error (parser, "expected %<)%>");
20956             return;
20957           case RT_COMMA_CLOSE_PAREN:
20958             cp_parser_error (parser, "expected %<,%> or %<)%>");
20959             return;
20960           case RT_PRAGMA_EOL:
20961             cp_parser_error (parser, "expected end of line");
20962             return;
20963           case RT_NAME:
20964             cp_parser_error (parser, "expected identifier");
20965             return;
20966           case RT_SELECT:
20967             cp_parser_error (parser, "expected selection-statement");
20968             return;
20969           case RT_INTERATION:
20970             cp_parser_error (parser, "expected iteration-statement");
20971             return;
20972           case RT_JUMP:
20973             cp_parser_error (parser, "expected jump-statement");
20974             return;
20975           case RT_CLASS_KEY:
20976             cp_parser_error (parser, "expected class-key");
20977             return;
20978           case RT_CLASS_TYPENAME_TEMPLATE:
20979             cp_parser_error (parser,
20980                  "expected %<class%>, %<typename%>, or %<template%>");
20981             return;
20982           default:
20983             gcc_unreachable ();
20984         }
20985     }
20986   else
20987     gcc_unreachable ();
20988 }
20989
20990
20991
20992 /* If the next token is of the indicated TYPE, consume it.  Otherwise,
20993    issue an error message indicating that TOKEN_DESC was expected.
20994
20995    Returns the token consumed, if the token had the appropriate type.
20996    Otherwise, returns NULL.  */
20997
20998 static cp_token *
20999 cp_parser_require (cp_parser* parser,
21000                    enum cpp_ttype type,
21001                    required_token token_desc)
21002 {
21003   if (cp_lexer_next_token_is (parser->lexer, type))
21004     return cp_lexer_consume_token (parser->lexer);
21005   else
21006     {
21007       /* Output the MESSAGE -- unless we're parsing tentatively.  */
21008       if (!cp_parser_simulate_error (parser))
21009         cp_parser_required_error (parser, token_desc, /*keyword=*/false);
21010       return NULL;
21011     }
21012 }
21013
21014 /* An error message is produced if the next token is not '>'.
21015    All further tokens are skipped until the desired token is
21016    found or '{', '}', ';' or an unbalanced ')' or ']'.  */
21017
21018 static void
21019 cp_parser_skip_to_end_of_template_parameter_list (cp_parser* parser)
21020 {
21021   /* Current level of '< ... >'.  */
21022   unsigned level = 0;
21023   /* Ignore '<' and '>' nested inside '( ... )' or '[ ... ]'.  */
21024   unsigned nesting_depth = 0;
21025
21026   /* Are we ready, yet?  If not, issue error message.  */
21027   if (cp_parser_require (parser, CPP_GREATER, RT_GREATER))
21028     return;
21029
21030   /* Skip tokens until the desired token is found.  */
21031   while (true)
21032     {
21033       /* Peek at the next token.  */
21034       switch (cp_lexer_peek_token (parser->lexer)->type)
21035         {
21036         case CPP_LESS:
21037           if (!nesting_depth)
21038             ++level;
21039           break;
21040
21041         case CPP_RSHIFT:
21042           if (cxx_dialect == cxx98)
21043             /* C++0x views the `>>' operator as two `>' tokens, but
21044                C++98 does not. */
21045             break;
21046           else if (!nesting_depth && level-- == 0)
21047             {
21048               /* We've hit a `>>' where the first `>' closes the
21049                  template argument list, and the second `>' is
21050                  spurious.  Just consume the `>>' and stop; we've
21051                  already produced at least one error.  */
21052               cp_lexer_consume_token (parser->lexer);
21053               return;
21054             }
21055           /* Fall through for C++0x, so we handle the second `>' in
21056              the `>>'.  */
21057
21058         case CPP_GREATER:
21059           if (!nesting_depth && level-- == 0)
21060             {
21061               /* We've reached the token we want, consume it and stop.  */
21062               cp_lexer_consume_token (parser->lexer);
21063               return;
21064             }
21065           break;
21066
21067         case CPP_OPEN_PAREN:
21068         case CPP_OPEN_SQUARE:
21069           ++nesting_depth;
21070           break;
21071
21072         case CPP_CLOSE_PAREN:
21073         case CPP_CLOSE_SQUARE:
21074           if (nesting_depth-- == 0)
21075             return;
21076           break;
21077
21078         case CPP_EOF:
21079         case CPP_PRAGMA_EOL:
21080         case CPP_SEMICOLON:
21081         case CPP_OPEN_BRACE:
21082         case CPP_CLOSE_BRACE:
21083           /* The '>' was probably forgotten, don't look further.  */
21084           return;
21085
21086         default:
21087           break;
21088         }
21089
21090       /* Consume this token.  */
21091       cp_lexer_consume_token (parser->lexer);
21092     }
21093 }
21094
21095 /* If the next token is the indicated keyword, consume it.  Otherwise,
21096    issue an error message indicating that TOKEN_DESC was expected.
21097
21098    Returns the token consumed, if the token had the appropriate type.
21099    Otherwise, returns NULL.  */
21100
21101 static cp_token *
21102 cp_parser_require_keyword (cp_parser* parser,
21103                            enum rid keyword,
21104                            required_token token_desc)
21105 {
21106   cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
21107
21108   if (token && token->keyword != keyword)
21109     {
21110       cp_parser_required_error (parser, token_desc, /*keyword=*/true); 
21111       return NULL;
21112     }
21113
21114   return token;
21115 }
21116
21117 /* Returns TRUE iff TOKEN is a token that can begin the body of a
21118    function-definition.  */
21119
21120 static bool
21121 cp_parser_token_starts_function_definition_p (cp_token* token)
21122 {
21123   return (/* An ordinary function-body begins with an `{'.  */
21124           token->type == CPP_OPEN_BRACE
21125           /* A ctor-initializer begins with a `:'.  */
21126           || token->type == CPP_COLON
21127           /* A function-try-block begins with `try'.  */
21128           || token->keyword == RID_TRY
21129           /* The named return value extension begins with `return'.  */
21130           || token->keyword == RID_RETURN);
21131 }
21132
21133 /* Returns TRUE iff the next token is the ":" or "{" beginning a class
21134    definition.  */
21135
21136 static bool
21137 cp_parser_next_token_starts_class_definition_p (cp_parser *parser)
21138 {
21139   cp_token *token;
21140
21141   token = cp_lexer_peek_token (parser->lexer);
21142   return (token->type == CPP_OPEN_BRACE || token->type == CPP_COLON);
21143 }
21144
21145 /* Returns TRUE iff the next token is the "," or ">" (or `>>', in
21146    C++0x) ending a template-argument.  */
21147
21148 static bool
21149 cp_parser_next_token_ends_template_argument_p (cp_parser *parser)
21150 {
21151   cp_token *token;
21152
21153   token = cp_lexer_peek_token (parser->lexer);
21154   return (token->type == CPP_COMMA 
21155           || token->type == CPP_GREATER
21156           || token->type == CPP_ELLIPSIS
21157           || ((cxx_dialect != cxx98) && token->type == CPP_RSHIFT));
21158 }
21159
21160 /* Returns TRUE iff the n-th token is a "<", or the n-th is a "[" and the
21161    (n+1)-th is a ":" (which is a possible digraph typo for "< ::").  */
21162
21163 static bool
21164 cp_parser_nth_token_starts_template_argument_list_p (cp_parser * parser,
21165                                                      size_t n)
21166 {
21167   cp_token *token;
21168
21169   token = cp_lexer_peek_nth_token (parser->lexer, n);
21170   if (token->type == CPP_LESS)
21171     return true;
21172   /* Check for the sequence `<::' in the original code. It would be lexed as
21173      `[:', where `[' is a digraph, and there is no whitespace before
21174      `:'.  */
21175   if (token->type == CPP_OPEN_SQUARE && token->flags & DIGRAPH)
21176     {
21177       cp_token *token2;
21178       token2 = cp_lexer_peek_nth_token (parser->lexer, n+1);
21179       if (token2->type == CPP_COLON && !(token2->flags & PREV_WHITE))
21180         return true;
21181     }
21182   return false;
21183 }
21184
21185 /* Returns the kind of tag indicated by TOKEN, if it is a class-key,
21186    or none_type otherwise.  */
21187
21188 static enum tag_types
21189 cp_parser_token_is_class_key (cp_token* token)
21190 {
21191   switch (token->keyword)
21192     {
21193     case RID_CLASS:
21194       return class_type;
21195     case RID_STRUCT:
21196       return record_type;
21197     case RID_UNION:
21198       return union_type;
21199
21200     default:
21201       return none_type;
21202     }
21203 }
21204
21205 /* Issue an error message if the CLASS_KEY does not match the TYPE.  */
21206
21207 static void
21208 cp_parser_check_class_key (enum tag_types class_key, tree type)
21209 {
21210   if ((TREE_CODE (type) == UNION_TYPE) != (class_key == union_type))
21211     permerror (input_location, "%qs tag used in naming %q#T",
21212             class_key == union_type ? "union"
21213              : class_key == record_type ? "struct" : "class",
21214              type);
21215 }
21216
21217 /* Issue an error message if DECL is redeclared with different
21218    access than its original declaration [class.access.spec/3].
21219    This applies to nested classes and nested class templates.
21220    [class.mem/1].  */
21221
21222 static void
21223 cp_parser_check_access_in_redeclaration (tree decl, location_t location)
21224 {
21225   if (!decl || !CLASS_TYPE_P (TREE_TYPE (decl)))
21226     return;
21227
21228   if ((TREE_PRIVATE (decl)
21229        != (current_access_specifier == access_private_node))
21230       || (TREE_PROTECTED (decl)
21231           != (current_access_specifier == access_protected_node)))
21232     error_at (location, "%qD redeclared with different access", decl);
21233 }
21234
21235 /* Look for the `template' keyword, as a syntactic disambiguator.
21236    Return TRUE iff it is present, in which case it will be
21237    consumed.  */
21238
21239 static bool
21240 cp_parser_optional_template_keyword (cp_parser *parser)
21241 {
21242   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE))
21243     {
21244       /* The `template' keyword can only be used within templates;
21245          outside templates the parser can always figure out what is a
21246          template and what is not.  */
21247       if (!processing_template_decl)
21248         {
21249           cp_token *token = cp_lexer_peek_token (parser->lexer);
21250           error_at (token->location,
21251                     "%<template%> (as a disambiguator) is only allowed "
21252                     "within templates");
21253           /* If this part of the token stream is rescanned, the same
21254              error message would be generated.  So, we purge the token
21255              from the stream.  */
21256           cp_lexer_purge_token (parser->lexer);
21257           return false;
21258         }
21259       else
21260         {
21261           /* Consume the `template' keyword.  */
21262           cp_lexer_consume_token (parser->lexer);
21263           return true;
21264         }
21265     }
21266
21267   return false;
21268 }
21269
21270 /* The next token is a CPP_NESTED_NAME_SPECIFIER.  Consume the token,
21271    set PARSER->SCOPE, and perform other related actions.  */
21272
21273 static void
21274 cp_parser_pre_parsed_nested_name_specifier (cp_parser *parser)
21275 {
21276   int i;
21277   struct tree_check *check_value;
21278   deferred_access_check *chk;
21279   VEC (deferred_access_check,gc) *checks;
21280
21281   /* Get the stored value.  */
21282   check_value = cp_lexer_consume_token (parser->lexer)->u.tree_check_value;
21283   /* Perform any access checks that were deferred.  */
21284   checks = check_value->checks;
21285   if (checks)
21286     {
21287       FOR_EACH_VEC_ELT (deferred_access_check, checks, i, chk)
21288         perform_or_defer_access_check (chk->binfo,
21289                                        chk->decl,
21290                                        chk->diag_decl);
21291     }
21292   /* Set the scope from the stored value.  */
21293   parser->scope = check_value->value;
21294   parser->qualifying_scope = check_value->qualifying_scope;
21295   parser->object_scope = NULL_TREE;
21296 }
21297
21298 /* Consume tokens up through a non-nested END token.  Returns TRUE if we
21299    encounter the end of a block before what we were looking for.  */
21300
21301 static bool
21302 cp_parser_cache_group (cp_parser *parser,
21303                        enum cpp_ttype end,
21304                        unsigned depth)
21305 {
21306   while (true)
21307     {
21308       cp_token *token = cp_lexer_peek_token (parser->lexer);
21309
21310       /* Abort a parenthesized expression if we encounter a semicolon.  */
21311       if ((end == CPP_CLOSE_PAREN || depth == 0)
21312           && token->type == CPP_SEMICOLON)
21313         return true;
21314       /* If we've reached the end of the file, stop.  */
21315       if (token->type == CPP_EOF
21316           || (end != CPP_PRAGMA_EOL
21317               && token->type == CPP_PRAGMA_EOL))
21318         return true;
21319       if (token->type == CPP_CLOSE_BRACE && depth == 0)
21320         /* We've hit the end of an enclosing block, so there's been some
21321            kind of syntax error.  */
21322         return true;
21323
21324       /* Consume the token.  */
21325       cp_lexer_consume_token (parser->lexer);
21326       /* See if it starts a new group.  */
21327       if (token->type == CPP_OPEN_BRACE)
21328         {
21329           cp_parser_cache_group (parser, CPP_CLOSE_BRACE, depth + 1);
21330           /* In theory this should probably check end == '}', but
21331              cp_parser_save_member_function_body needs it to exit
21332              after either '}' or ')' when called with ')'.  */
21333           if (depth == 0)
21334             return false;
21335         }
21336       else if (token->type == CPP_OPEN_PAREN)
21337         {
21338           cp_parser_cache_group (parser, CPP_CLOSE_PAREN, depth + 1);
21339           if (depth == 0 && end == CPP_CLOSE_PAREN)
21340             return false;
21341         }
21342       else if (token->type == CPP_PRAGMA)
21343         cp_parser_cache_group (parser, CPP_PRAGMA_EOL, depth + 1);
21344       else if (token->type == end)
21345         return false;
21346     }
21347 }
21348
21349 /* Begin parsing tentatively.  We always save tokens while parsing
21350    tentatively so that if the tentative parsing fails we can restore the
21351    tokens.  */
21352
21353 static void
21354 cp_parser_parse_tentatively (cp_parser* parser)
21355 {
21356   /* Enter a new parsing context.  */
21357   parser->context = cp_parser_context_new (parser->context);
21358   /* Begin saving tokens.  */
21359   cp_lexer_save_tokens (parser->lexer);
21360   /* In order to avoid repetitive access control error messages,
21361      access checks are queued up until we are no longer parsing
21362      tentatively.  */
21363   push_deferring_access_checks (dk_deferred);
21364 }
21365
21366 /* Commit to the currently active tentative parse.  */
21367
21368 static void
21369 cp_parser_commit_to_tentative_parse (cp_parser* parser)
21370 {
21371   cp_parser_context *context;
21372   cp_lexer *lexer;
21373
21374   /* Mark all of the levels as committed.  */
21375   lexer = parser->lexer;
21376   for (context = parser->context; context->next; context = context->next)
21377     {
21378       if (context->status == CP_PARSER_STATUS_KIND_COMMITTED)
21379         break;
21380       context->status = CP_PARSER_STATUS_KIND_COMMITTED;
21381       while (!cp_lexer_saving_tokens (lexer))
21382         lexer = lexer->next;
21383       cp_lexer_commit_tokens (lexer);
21384     }
21385 }
21386
21387 /* Abort the currently active tentative parse.  All consumed tokens
21388    will be rolled back, and no diagnostics will be issued.  */
21389
21390 static void
21391 cp_parser_abort_tentative_parse (cp_parser* parser)
21392 {
21393   gcc_assert (parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED
21394               || errorcount > 0);
21395   cp_parser_simulate_error (parser);
21396   /* Now, pretend that we want to see if the construct was
21397      successfully parsed.  */
21398   cp_parser_parse_definitely (parser);
21399 }
21400
21401 /* Stop parsing tentatively.  If a parse error has occurred, restore the
21402    token stream.  Otherwise, commit to the tokens we have consumed.
21403    Returns true if no error occurred; false otherwise.  */
21404
21405 static bool
21406 cp_parser_parse_definitely (cp_parser* parser)
21407 {
21408   bool error_occurred;
21409   cp_parser_context *context;
21410
21411   /* Remember whether or not an error occurred, since we are about to
21412      destroy that information.  */
21413   error_occurred = cp_parser_error_occurred (parser);
21414   /* Remove the topmost context from the stack.  */
21415   context = parser->context;
21416   parser->context = context->next;
21417   /* If no parse errors occurred, commit to the tentative parse.  */
21418   if (!error_occurred)
21419     {
21420       /* Commit to the tokens read tentatively, unless that was
21421          already done.  */
21422       if (context->status != CP_PARSER_STATUS_KIND_COMMITTED)
21423         cp_lexer_commit_tokens (parser->lexer);
21424
21425       pop_to_parent_deferring_access_checks ();
21426     }
21427   /* Otherwise, if errors occurred, roll back our state so that things
21428      are just as they were before we began the tentative parse.  */
21429   else
21430     {
21431       cp_lexer_rollback_tokens (parser->lexer);
21432       pop_deferring_access_checks ();
21433     }
21434   /* Add the context to the front of the free list.  */
21435   context->next = cp_parser_context_free_list;
21436   cp_parser_context_free_list = context;
21437
21438   return !error_occurred;
21439 }
21440
21441 /* Returns true if we are parsing tentatively and are not committed to
21442    this tentative parse.  */
21443
21444 static bool
21445 cp_parser_uncommitted_to_tentative_parse_p (cp_parser* parser)
21446 {
21447   return (cp_parser_parsing_tentatively (parser)
21448           && parser->context->status != CP_PARSER_STATUS_KIND_COMMITTED);
21449 }
21450
21451 /* Returns nonzero iff an error has occurred during the most recent
21452    tentative parse.  */
21453
21454 static bool
21455 cp_parser_error_occurred (cp_parser* parser)
21456 {
21457   return (cp_parser_parsing_tentatively (parser)
21458           && parser->context->status == CP_PARSER_STATUS_KIND_ERROR);
21459 }
21460
21461 /* Returns nonzero if GNU extensions are allowed.  */
21462
21463 static bool
21464 cp_parser_allow_gnu_extensions_p (cp_parser* parser)
21465 {
21466   return parser->allow_gnu_extensions_p;
21467 }
21468 \f
21469 /* Objective-C++ Productions */
21470
21471
21472 /* Parse an Objective-C expression, which feeds into a primary-expression
21473    above.
21474
21475    objc-expression:
21476      objc-message-expression
21477      objc-string-literal
21478      objc-encode-expression
21479      objc-protocol-expression
21480      objc-selector-expression
21481
21482   Returns a tree representation of the expression.  */
21483
21484 static tree
21485 cp_parser_objc_expression (cp_parser* parser)
21486 {
21487   /* Try to figure out what kind of declaration is present.  */
21488   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
21489
21490   switch (kwd->type)
21491     {
21492     case CPP_OPEN_SQUARE:
21493       return cp_parser_objc_message_expression (parser);
21494
21495     case CPP_OBJC_STRING:
21496       kwd = cp_lexer_consume_token (parser->lexer);
21497       return objc_build_string_object (kwd->u.value);
21498
21499     case CPP_KEYWORD:
21500       switch (kwd->keyword)
21501         {
21502         case RID_AT_ENCODE:
21503           return cp_parser_objc_encode_expression (parser);
21504
21505         case RID_AT_PROTOCOL:
21506           return cp_parser_objc_protocol_expression (parser);
21507
21508         case RID_AT_SELECTOR:
21509           return cp_parser_objc_selector_expression (parser);
21510
21511         default:
21512           break;
21513         }
21514     default:
21515       error_at (kwd->location,
21516                 "misplaced %<@%D%> Objective-C++ construct",
21517                 kwd->u.value);
21518       cp_parser_skip_to_end_of_block_or_statement (parser);
21519     }
21520
21521   return error_mark_node;
21522 }
21523
21524 /* Parse an Objective-C message expression.
21525
21526    objc-message-expression:
21527      [ objc-message-receiver objc-message-args ]
21528
21529    Returns a representation of an Objective-C message.  */
21530
21531 static tree
21532 cp_parser_objc_message_expression (cp_parser* parser)
21533 {
21534   tree receiver, messageargs;
21535
21536   cp_lexer_consume_token (parser->lexer);  /* Eat '['.  */
21537   receiver = cp_parser_objc_message_receiver (parser);
21538   messageargs = cp_parser_objc_message_args (parser);
21539   cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);
21540
21541   return objc_build_message_expr (receiver, messageargs);
21542 }
21543
21544 /* Parse an objc-message-receiver.
21545
21546    objc-message-receiver:
21547      expression
21548      simple-type-specifier
21549
21550   Returns a representation of the type or expression.  */
21551
21552 static tree
21553 cp_parser_objc_message_receiver (cp_parser* parser)
21554 {
21555   tree rcv;
21556
21557   /* An Objective-C message receiver may be either (1) a type
21558      or (2) an expression.  */
21559   cp_parser_parse_tentatively (parser);
21560   rcv = cp_parser_expression (parser, false, NULL);
21561
21562   if (cp_parser_parse_definitely (parser))
21563     return rcv;
21564
21565   rcv = cp_parser_simple_type_specifier (parser,
21566                                          /*decl_specs=*/NULL,
21567                                          CP_PARSER_FLAGS_NONE);
21568
21569   return objc_get_class_reference (rcv);
21570 }
21571
21572 /* Parse the arguments and selectors comprising an Objective-C message.
21573
21574    objc-message-args:
21575      objc-selector
21576      objc-selector-args
21577      objc-selector-args , objc-comma-args
21578
21579    objc-selector-args:
21580      objc-selector [opt] : assignment-expression
21581      objc-selector-args objc-selector [opt] : assignment-expression
21582
21583    objc-comma-args:
21584      assignment-expression
21585      objc-comma-args , assignment-expression
21586
21587    Returns a TREE_LIST, with TREE_PURPOSE containing a list of
21588    selector arguments and TREE_VALUE containing a list of comma
21589    arguments.  */
21590
21591 static tree
21592 cp_parser_objc_message_args (cp_parser* parser)
21593 {
21594   tree sel_args = NULL_TREE, addl_args = NULL_TREE;
21595   bool maybe_unary_selector_p = true;
21596   cp_token *token = cp_lexer_peek_token (parser->lexer);
21597
21598   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
21599     {
21600       tree selector = NULL_TREE, arg;
21601
21602       if (token->type != CPP_COLON)
21603         selector = cp_parser_objc_selector (parser);
21604
21605       /* Detect if we have a unary selector.  */
21606       if (maybe_unary_selector_p
21607           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
21608         return build_tree_list (selector, NULL_TREE);
21609
21610       maybe_unary_selector_p = false;
21611       cp_parser_require (parser, CPP_COLON, RT_COLON);
21612       arg = cp_parser_assignment_expression (parser, false, NULL);
21613
21614       sel_args
21615         = chainon (sel_args,
21616                    build_tree_list (selector, arg));
21617
21618       token = cp_lexer_peek_token (parser->lexer);
21619     }
21620
21621   /* Handle non-selector arguments, if any. */
21622   while (token->type == CPP_COMMA)
21623     {
21624       tree arg;
21625
21626       cp_lexer_consume_token (parser->lexer);
21627       arg = cp_parser_assignment_expression (parser, false, NULL);
21628
21629       addl_args
21630         = chainon (addl_args,
21631                    build_tree_list (NULL_TREE, arg));
21632
21633       token = cp_lexer_peek_token (parser->lexer);
21634     }
21635
21636   if (sel_args == NULL_TREE && addl_args == NULL_TREE)
21637     {
21638       cp_parser_error (parser, "objective-c++ message argument(s) are expected");
21639       return build_tree_list (error_mark_node, error_mark_node);
21640     }
21641
21642   return build_tree_list (sel_args, addl_args);
21643 }
21644
21645 /* Parse an Objective-C encode expression.
21646
21647    objc-encode-expression:
21648      @encode objc-typename
21649
21650    Returns an encoded representation of the type argument.  */
21651
21652 static tree
21653 cp_parser_objc_encode_expression (cp_parser* parser)
21654 {
21655   tree type;
21656   cp_token *token;
21657
21658   cp_lexer_consume_token (parser->lexer);  /* Eat '@encode'.  */
21659   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21660   token = cp_lexer_peek_token (parser->lexer);
21661   type = complete_type (cp_parser_type_id (parser));
21662   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21663
21664   if (!type)
21665     {
21666       error_at (token->location, 
21667                 "%<@encode%> must specify a type as an argument");
21668       return error_mark_node;
21669     }
21670
21671   /* This happens if we find @encode(T) (where T is a template
21672      typename or something dependent on a template typename) when
21673      parsing a template.  In that case, we can't compile it
21674      immediately, but we rather create an AT_ENCODE_EXPR which will
21675      need to be instantiated when the template is used.
21676   */
21677   if (dependent_type_p (type))
21678     {
21679       tree value = build_min (AT_ENCODE_EXPR, size_type_node, type);
21680       TREE_READONLY (value) = 1;
21681       return value;
21682     }
21683
21684   return objc_build_encode_expr (type);
21685 }
21686
21687 /* Parse an Objective-C @defs expression.  */
21688
21689 static tree
21690 cp_parser_objc_defs_expression (cp_parser *parser)
21691 {
21692   tree name;
21693
21694   cp_lexer_consume_token (parser->lexer);  /* Eat '@defs'.  */
21695   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21696   name = cp_parser_identifier (parser);
21697   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21698
21699   return objc_get_class_ivars (name);
21700 }
21701
21702 /* Parse an Objective-C protocol expression.
21703
21704   objc-protocol-expression:
21705     @protocol ( identifier )
21706
21707   Returns a representation of the protocol expression.  */
21708
21709 static tree
21710 cp_parser_objc_protocol_expression (cp_parser* parser)
21711 {
21712   tree proto;
21713
21714   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
21715   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21716   proto = cp_parser_identifier (parser);
21717   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21718
21719   return objc_build_protocol_expr (proto);
21720 }
21721
21722 /* Parse an Objective-C selector expression.
21723
21724    objc-selector-expression:
21725      @selector ( objc-method-signature )
21726
21727    objc-method-signature:
21728      objc-selector
21729      objc-selector-seq
21730
21731    objc-selector-seq:
21732      objc-selector :
21733      objc-selector-seq objc-selector :
21734
21735   Returns a representation of the method selector.  */
21736
21737 static tree
21738 cp_parser_objc_selector_expression (cp_parser* parser)
21739 {
21740   tree sel_seq = NULL_TREE;
21741   bool maybe_unary_selector_p = true;
21742   cp_token *token;
21743   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
21744
21745   cp_lexer_consume_token (parser->lexer);  /* Eat '@selector'.  */
21746   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
21747   token = cp_lexer_peek_token (parser->lexer);
21748
21749   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
21750          || token->type == CPP_SCOPE)
21751     {
21752       tree selector = NULL_TREE;
21753
21754       if (token->type != CPP_COLON
21755           || token->type == CPP_SCOPE)
21756         selector = cp_parser_objc_selector (parser);
21757
21758       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
21759           && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
21760         {
21761           /* Detect if we have a unary selector.  */
21762           if (maybe_unary_selector_p)
21763             {
21764               sel_seq = selector;
21765               goto finish_selector;
21766             }
21767           else
21768             {
21769               cp_parser_error (parser, "expected %<:%>");
21770             }
21771         }
21772       maybe_unary_selector_p = false;
21773       token = cp_lexer_consume_token (parser->lexer);
21774
21775       if (token->type == CPP_SCOPE)
21776         {
21777           sel_seq
21778             = chainon (sel_seq,
21779                        build_tree_list (selector, NULL_TREE));
21780           sel_seq
21781             = chainon (sel_seq,
21782                        build_tree_list (NULL_TREE, NULL_TREE));
21783         }
21784       else
21785         sel_seq
21786           = chainon (sel_seq,
21787                      build_tree_list (selector, NULL_TREE));
21788
21789       token = cp_lexer_peek_token (parser->lexer);
21790     }
21791
21792  finish_selector:
21793   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
21794
21795   return objc_build_selector_expr (loc, sel_seq);
21796 }
21797
21798 /* Parse a list of identifiers.
21799
21800    objc-identifier-list:
21801      identifier
21802      objc-identifier-list , identifier
21803
21804    Returns a TREE_LIST of identifier nodes.  */
21805
21806 static tree
21807 cp_parser_objc_identifier_list (cp_parser* parser)
21808 {
21809   tree identifier;
21810   tree list;
21811   cp_token *sep;
21812
21813   identifier = cp_parser_identifier (parser);
21814   if (identifier == error_mark_node)
21815     return error_mark_node;      
21816
21817   list = build_tree_list (NULL_TREE, identifier);
21818   sep = cp_lexer_peek_token (parser->lexer);
21819
21820   while (sep->type == CPP_COMMA)
21821     {
21822       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
21823       identifier = cp_parser_identifier (parser);
21824       if (identifier == error_mark_node)
21825         return list;
21826
21827       list = chainon (list, build_tree_list (NULL_TREE,
21828                                              identifier));
21829       sep = cp_lexer_peek_token (parser->lexer);
21830     }
21831   
21832   return list;
21833 }
21834
21835 /* Parse an Objective-C alias declaration.
21836
21837    objc-alias-declaration:
21838      @compatibility_alias identifier identifier ;
21839
21840    This function registers the alias mapping with the Objective-C front end.
21841    It returns nothing.  */
21842
21843 static void
21844 cp_parser_objc_alias_declaration (cp_parser* parser)
21845 {
21846   tree alias, orig;
21847
21848   cp_lexer_consume_token (parser->lexer);  /* Eat '@compatibility_alias'.  */
21849   alias = cp_parser_identifier (parser);
21850   orig = cp_parser_identifier (parser);
21851   objc_declare_alias (alias, orig);
21852   cp_parser_consume_semicolon_at_end_of_statement (parser);
21853 }
21854
21855 /* Parse an Objective-C class forward-declaration.
21856
21857    objc-class-declaration:
21858      @class objc-identifier-list ;
21859
21860    The function registers the forward declarations with the Objective-C
21861    front end.  It returns nothing.  */
21862
21863 static void
21864 cp_parser_objc_class_declaration (cp_parser* parser)
21865 {
21866   cp_lexer_consume_token (parser->lexer);  /* Eat '@class'.  */
21867   while (true)
21868     {
21869       tree id;
21870       
21871       id = cp_parser_identifier (parser);
21872       if (id == error_mark_node)
21873         break;
21874       
21875       objc_declare_class (id);
21876
21877       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
21878         cp_lexer_consume_token (parser->lexer);
21879       else
21880         break;
21881     }
21882   cp_parser_consume_semicolon_at_end_of_statement (parser);
21883 }
21884
21885 /* Parse a list of Objective-C protocol references.
21886
21887    objc-protocol-refs-opt:
21888      objc-protocol-refs [opt]
21889
21890    objc-protocol-refs:
21891      < objc-identifier-list >
21892
21893    Returns a TREE_LIST of identifiers, if any.  */
21894
21895 static tree
21896 cp_parser_objc_protocol_refs_opt (cp_parser* parser)
21897 {
21898   tree protorefs = NULL_TREE;
21899
21900   if(cp_lexer_next_token_is (parser->lexer, CPP_LESS))
21901     {
21902       cp_lexer_consume_token (parser->lexer);  /* Eat '<'.  */
21903       protorefs = cp_parser_objc_identifier_list (parser);
21904       cp_parser_require (parser, CPP_GREATER, RT_GREATER);
21905     }
21906
21907   return protorefs;
21908 }
21909
21910 /* Parse a Objective-C visibility specification.  */
21911
21912 static void
21913 cp_parser_objc_visibility_spec (cp_parser* parser)
21914 {
21915   cp_token *vis = cp_lexer_peek_token (parser->lexer);
21916
21917   switch (vis->keyword)
21918     {
21919     case RID_AT_PRIVATE:
21920       objc_set_visibility (OBJC_IVAR_VIS_PRIVATE);
21921       break;
21922     case RID_AT_PROTECTED:
21923       objc_set_visibility (OBJC_IVAR_VIS_PROTECTED);
21924       break;
21925     case RID_AT_PUBLIC:
21926       objc_set_visibility (OBJC_IVAR_VIS_PUBLIC);
21927       break;
21928     case RID_AT_PACKAGE:
21929       objc_set_visibility (OBJC_IVAR_VIS_PACKAGE);
21930       break;
21931     default:
21932       return;
21933     }
21934
21935   /* Eat '@private'/'@protected'/'@public'.  */
21936   cp_lexer_consume_token (parser->lexer);
21937 }
21938
21939 /* Parse an Objective-C method type.  Return 'true' if it is a class
21940    (+) method, and 'false' if it is an instance (-) method.  */
21941
21942 static inline bool
21943 cp_parser_objc_method_type (cp_parser* parser)
21944 {
21945   if (cp_lexer_consume_token (parser->lexer)->type == CPP_PLUS)
21946     return true;
21947   else
21948     return false;
21949 }
21950
21951 /* Parse an Objective-C protocol qualifier.  */
21952
21953 static tree
21954 cp_parser_objc_protocol_qualifiers (cp_parser* parser)
21955 {
21956   tree quals = NULL_TREE, node;
21957   cp_token *token = cp_lexer_peek_token (parser->lexer);
21958
21959   node = token->u.value;
21960
21961   while (node && TREE_CODE (node) == IDENTIFIER_NODE
21962          && (node == ridpointers [(int) RID_IN]
21963              || node == ridpointers [(int) RID_OUT]
21964              || node == ridpointers [(int) RID_INOUT]
21965              || node == ridpointers [(int) RID_BYCOPY]
21966              || node == ridpointers [(int) RID_BYREF]
21967              || node == ridpointers [(int) RID_ONEWAY]))
21968     {
21969       quals = tree_cons (NULL_TREE, node, quals);
21970       cp_lexer_consume_token (parser->lexer);
21971       token = cp_lexer_peek_token (parser->lexer);
21972       node = token->u.value;
21973     }
21974
21975   return quals;
21976 }
21977
21978 /* Parse an Objective-C typename.  */
21979
21980 static tree
21981 cp_parser_objc_typename (cp_parser* parser)
21982 {
21983   tree type_name = NULL_TREE;
21984
21985   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
21986     {
21987       tree proto_quals, cp_type = NULL_TREE;
21988
21989       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
21990       proto_quals = cp_parser_objc_protocol_qualifiers (parser);
21991
21992       /* An ObjC type name may consist of just protocol qualifiers, in which
21993          case the type shall default to 'id'.  */
21994       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
21995         {
21996           cp_type = cp_parser_type_id (parser);
21997           
21998           /* If the type could not be parsed, an error has already
21999              been produced.  For error recovery, behave as if it had
22000              not been specified, which will use the default type
22001              'id'.  */
22002           if (cp_type == error_mark_node)
22003             {
22004               cp_type = NULL_TREE;
22005               /* We need to skip to the closing parenthesis as
22006                  cp_parser_type_id() does not seem to do it for
22007                  us.  */
22008               cp_parser_skip_to_closing_parenthesis (parser,
22009                                                      /*recovering=*/true,
22010                                                      /*or_comma=*/false,
22011                                                      /*consume_paren=*/false);
22012             }
22013         }
22014
22015       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22016       type_name = build_tree_list (proto_quals, cp_type);
22017     }
22018
22019   return type_name;
22020 }
22021
22022 /* Check to see if TYPE refers to an Objective-C selector name.  */
22023
22024 static bool
22025 cp_parser_objc_selector_p (enum cpp_ttype type)
22026 {
22027   return (type == CPP_NAME || type == CPP_KEYWORD
22028           || type == CPP_AND_AND || type == CPP_AND_EQ || type == CPP_AND
22029           || type == CPP_OR || type == CPP_COMPL || type == CPP_NOT
22030           || type == CPP_NOT_EQ || type == CPP_OR_OR || type == CPP_OR_EQ
22031           || type == CPP_XOR || type == CPP_XOR_EQ);
22032 }
22033
22034 /* Parse an Objective-C selector.  */
22035
22036 static tree
22037 cp_parser_objc_selector (cp_parser* parser)
22038 {
22039   cp_token *token = cp_lexer_consume_token (parser->lexer);
22040
22041   if (!cp_parser_objc_selector_p (token->type))
22042     {
22043       error_at (token->location, "invalid Objective-C++ selector name");
22044       return error_mark_node;
22045     }
22046
22047   /* C++ operator names are allowed to appear in ObjC selectors.  */
22048   switch (token->type)
22049     {
22050     case CPP_AND_AND: return get_identifier ("and");
22051     case CPP_AND_EQ: return get_identifier ("and_eq");
22052     case CPP_AND: return get_identifier ("bitand");
22053     case CPP_OR: return get_identifier ("bitor");
22054     case CPP_COMPL: return get_identifier ("compl");
22055     case CPP_NOT: return get_identifier ("not");
22056     case CPP_NOT_EQ: return get_identifier ("not_eq");
22057     case CPP_OR_OR: return get_identifier ("or");
22058     case CPP_OR_EQ: return get_identifier ("or_eq");
22059     case CPP_XOR: return get_identifier ("xor");
22060     case CPP_XOR_EQ: return get_identifier ("xor_eq");
22061     default: return token->u.value;
22062     }
22063 }
22064
22065 /* Parse an Objective-C params list.  */
22066
22067 static tree
22068 cp_parser_objc_method_keyword_params (cp_parser* parser, tree* attributes)
22069 {
22070   tree params = NULL_TREE;
22071   bool maybe_unary_selector_p = true;
22072   cp_token *token = cp_lexer_peek_token (parser->lexer);
22073
22074   while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
22075     {
22076       tree selector = NULL_TREE, type_name, identifier;
22077       tree parm_attr = NULL_TREE;
22078
22079       if (token->keyword == RID_ATTRIBUTE)
22080         break;
22081
22082       if (token->type != CPP_COLON)
22083         selector = cp_parser_objc_selector (parser);
22084
22085       /* Detect if we have a unary selector.  */
22086       if (maybe_unary_selector_p
22087           && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
22088         {
22089           params = selector; /* Might be followed by attributes.  */
22090           break;
22091         }
22092
22093       maybe_unary_selector_p = false;
22094       if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
22095         {
22096           /* Something went quite wrong.  There should be a colon
22097              here, but there is not.  Stop parsing parameters.  */
22098           break;
22099         }
22100       type_name = cp_parser_objc_typename (parser);
22101       /* New ObjC allows attributes on parameters too.  */
22102       if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE))
22103         parm_attr = cp_parser_attributes_opt (parser);
22104       identifier = cp_parser_identifier (parser);
22105
22106       params
22107         = chainon (params,
22108                    objc_build_keyword_decl (selector,
22109                                             type_name,
22110                                             identifier,
22111                                             parm_attr));
22112
22113       token = cp_lexer_peek_token (parser->lexer);
22114     }
22115
22116   if (params == NULL_TREE)
22117     {
22118       cp_parser_error (parser, "objective-c++ method declaration is expected");
22119       return error_mark_node;
22120     }
22121
22122   /* We allow tail attributes for the method.  */
22123   if (token->keyword == RID_ATTRIBUTE)
22124     {
22125       *attributes = cp_parser_attributes_opt (parser);
22126       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22127           || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22128         return params;
22129       cp_parser_error (parser, 
22130                        "method attributes must be specified at the end");
22131       return error_mark_node;
22132     }
22133
22134   if (params == NULL_TREE)
22135     {
22136       cp_parser_error (parser, "objective-c++ method declaration is expected");
22137       return error_mark_node;
22138     }
22139   return params;
22140 }
22141
22142 /* Parse the non-keyword Objective-C params.  */
22143
22144 static tree
22145 cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp, 
22146                                        tree* attributes)
22147 {
22148   tree params = make_node (TREE_LIST);
22149   cp_token *token = cp_lexer_peek_token (parser->lexer);
22150   *ellipsisp = false;  /* Initially, assume no ellipsis.  */
22151
22152   while (token->type == CPP_COMMA)
22153     {
22154       cp_parameter_declarator *parmdecl;
22155       tree parm;
22156
22157       cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22158       token = cp_lexer_peek_token (parser->lexer);
22159
22160       if (token->type == CPP_ELLIPSIS)
22161         {
22162           cp_lexer_consume_token (parser->lexer);  /* Eat '...'.  */
22163           *ellipsisp = true;
22164           token = cp_lexer_peek_token (parser->lexer);
22165           break;
22166         }
22167
22168       /* TODO: parse attributes for tail parameters.  */
22169       parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
22170       parm = grokdeclarator (parmdecl->declarator,
22171                              &parmdecl->decl_specifiers,
22172                              PARM, /*initialized=*/0,
22173                              /*attrlist=*/NULL);
22174
22175       chainon (params, build_tree_list (NULL_TREE, parm));
22176       token = cp_lexer_peek_token (parser->lexer);
22177     }
22178
22179   /* We allow tail attributes for the method.  */
22180   if (token->keyword == RID_ATTRIBUTE)
22181     {
22182       if (*attributes == NULL_TREE)
22183         {
22184           *attributes = cp_parser_attributes_opt (parser);
22185           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
22186               || cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
22187             return params;
22188         }
22189       else        
22190         /* We have an error, but parse the attributes, so that we can 
22191            carry on.  */
22192         *attributes = cp_parser_attributes_opt (parser);
22193
22194       cp_parser_error (parser, 
22195                        "method attributes must be specified at the end");
22196       return error_mark_node;
22197     }
22198
22199   return params;
22200 }
22201
22202 /* Parse a linkage specification, a pragma, an extra semicolon or a block.  */
22203
22204 static void
22205 cp_parser_objc_interstitial_code (cp_parser* parser)
22206 {
22207   cp_token *token = cp_lexer_peek_token (parser->lexer);
22208
22209   /* If the next token is `extern' and the following token is a string
22210      literal, then we have a linkage specification.  */
22211   if (token->keyword == RID_EXTERN
22212       && cp_parser_is_string_literal (cp_lexer_peek_nth_token (parser->lexer, 2)))
22213     cp_parser_linkage_specification (parser);
22214   /* Handle #pragma, if any.  */
22215   else if (token->type == CPP_PRAGMA)
22216     cp_parser_pragma (parser, pragma_external);
22217   /* Allow stray semicolons.  */
22218   else if (token->type == CPP_SEMICOLON)
22219     cp_lexer_consume_token (parser->lexer);
22220   /* Mark methods as optional or required, when building protocols.  */
22221   else if (token->keyword == RID_AT_OPTIONAL)
22222     {
22223       cp_lexer_consume_token (parser->lexer);
22224       objc_set_method_opt (true);
22225     }
22226   else if (token->keyword == RID_AT_REQUIRED)
22227     {
22228       cp_lexer_consume_token (parser->lexer);
22229       objc_set_method_opt (false);
22230     }
22231   else if (token->keyword == RID_NAMESPACE)
22232     cp_parser_namespace_definition (parser);
22233   /* Other stray characters must generate errors.  */
22234   else if (token->type == CPP_OPEN_BRACE || token->type == CPP_CLOSE_BRACE)
22235     {
22236       cp_lexer_consume_token (parser->lexer);
22237       error ("stray %qs between Objective-C++ methods",
22238              token->type == CPP_OPEN_BRACE ? "{" : "}");
22239     }
22240   /* Finally, try to parse a block-declaration, or a function-definition.  */
22241   else
22242     cp_parser_block_declaration (parser, /*statement_p=*/false);
22243 }
22244
22245 /* Parse a method signature.  */
22246
22247 static tree
22248 cp_parser_objc_method_signature (cp_parser* parser, tree* attributes)
22249 {
22250   tree rettype, kwdparms, optparms;
22251   bool ellipsis = false;
22252   bool is_class_method;
22253
22254   is_class_method = cp_parser_objc_method_type (parser);
22255   rettype = cp_parser_objc_typename (parser);
22256   *attributes = NULL_TREE;
22257   kwdparms = cp_parser_objc_method_keyword_params (parser, attributes);
22258   if (kwdparms == error_mark_node)
22259     return error_mark_node;
22260   optparms = cp_parser_objc_method_tail_params_opt (parser, &ellipsis, attributes);
22261   if (optparms == error_mark_node)
22262     return error_mark_node;
22263
22264   return objc_build_method_signature (is_class_method, rettype, kwdparms, optparms, ellipsis);
22265 }
22266
22267 static bool
22268 cp_parser_objc_method_maybe_bad_prefix_attributes (cp_parser* parser)
22269 {
22270   tree tattr;  
22271   cp_lexer_save_tokens (parser->lexer);
22272   tattr = cp_parser_attributes_opt (parser);
22273   gcc_assert (tattr) ;
22274   
22275   /* If the attributes are followed by a method introducer, this is not allowed.
22276      Dump the attributes and flag the situation.  */
22277   if (cp_lexer_next_token_is (parser->lexer, CPP_PLUS)
22278       || cp_lexer_next_token_is (parser->lexer, CPP_MINUS))
22279     return true;
22280
22281   /* Otherwise, the attributes introduce some interstitial code, possibly so
22282      rewind to allow that check.  */
22283   cp_lexer_rollback_tokens (parser->lexer);
22284   return false;  
22285 }
22286
22287 /* Parse an Objective-C method prototype list.  */
22288
22289 static void
22290 cp_parser_objc_method_prototype_list (cp_parser* parser)
22291 {
22292   cp_token *token = cp_lexer_peek_token (parser->lexer);
22293
22294   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22295     {
22296       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22297         {
22298           tree attributes, sig;
22299           bool is_class_method;
22300           if (token->type == CPP_PLUS)
22301             is_class_method = true;
22302           else
22303             is_class_method = false;
22304           sig = cp_parser_objc_method_signature (parser, &attributes);
22305           if (sig == error_mark_node)
22306             {
22307               cp_parser_skip_to_end_of_block_or_statement (parser);
22308               token = cp_lexer_peek_token (parser->lexer);
22309               continue;
22310             }
22311           objc_add_method_declaration (is_class_method, sig, attributes);
22312           cp_parser_consume_semicolon_at_end_of_statement (parser);
22313         }
22314       else if (token->keyword == RID_AT_PROPERTY)
22315         cp_parser_objc_at_property_declaration (parser);
22316       else if (token->keyword == RID_ATTRIBUTE 
22317                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22318         warning_at (cp_lexer_peek_token (parser->lexer)->location, 
22319                     OPT_Wattributes, 
22320                     "prefix attributes are ignored for methods");
22321       else
22322         /* Allow for interspersed non-ObjC++ code.  */
22323         cp_parser_objc_interstitial_code (parser);
22324
22325       token = cp_lexer_peek_token (parser->lexer);
22326     }
22327
22328   if (token->type != CPP_EOF)
22329     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22330   else
22331     cp_parser_error (parser, "expected %<@end%>");
22332
22333   objc_finish_interface ();
22334 }
22335
22336 /* Parse an Objective-C method definition list.  */
22337
22338 static void
22339 cp_parser_objc_method_definition_list (cp_parser* parser)
22340 {
22341   cp_token *token = cp_lexer_peek_token (parser->lexer);
22342
22343   while (token->keyword != RID_AT_END && token->type != CPP_EOF)
22344     {
22345       tree meth;
22346
22347       if (token->type == CPP_PLUS || token->type == CPP_MINUS)
22348         {
22349           cp_token *ptk;
22350           tree sig, attribute;
22351           bool is_class_method;
22352           if (token->type == CPP_PLUS)
22353             is_class_method = true;
22354           else
22355             is_class_method = false;
22356           push_deferring_access_checks (dk_deferred);
22357           sig = cp_parser_objc_method_signature (parser, &attribute);
22358           if (sig == error_mark_node)
22359             {
22360               cp_parser_skip_to_end_of_block_or_statement (parser);
22361               token = cp_lexer_peek_token (parser->lexer);
22362               continue;
22363             }
22364           objc_start_method_definition (is_class_method, sig, attribute,
22365                                         NULL_TREE);
22366
22367           /* For historical reasons, we accept an optional semicolon.  */
22368           if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22369             cp_lexer_consume_token (parser->lexer);
22370
22371           ptk = cp_lexer_peek_token (parser->lexer);
22372           if (!(ptk->type == CPP_PLUS || ptk->type == CPP_MINUS 
22373                 || ptk->type == CPP_EOF || ptk->keyword == RID_AT_END))
22374             {
22375               perform_deferred_access_checks ();
22376               stop_deferring_access_checks ();
22377               meth = cp_parser_function_definition_after_declarator (parser,
22378                                                                      false);
22379               pop_deferring_access_checks ();
22380               objc_finish_method_definition (meth);
22381             }
22382         }
22383       /* The following case will be removed once @synthesize is
22384          completely implemented.  */
22385       else if (token->keyword == RID_AT_PROPERTY)
22386         cp_parser_objc_at_property_declaration (parser);
22387       else if (token->keyword == RID_AT_SYNTHESIZE)
22388         cp_parser_objc_at_synthesize_declaration (parser);
22389       else if (token->keyword == RID_AT_DYNAMIC)
22390         cp_parser_objc_at_dynamic_declaration (parser);
22391       else if (token->keyword == RID_ATTRIBUTE 
22392                && cp_parser_objc_method_maybe_bad_prefix_attributes(parser))
22393         warning_at (token->location, OPT_Wattributes,
22394                     "prefix attributes are ignored for methods");
22395       else
22396         /* Allow for interspersed non-ObjC++ code.  */
22397         cp_parser_objc_interstitial_code (parser);
22398
22399       token = cp_lexer_peek_token (parser->lexer);
22400     }
22401
22402   if (token->type != CPP_EOF)
22403     cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22404   else
22405     cp_parser_error (parser, "expected %<@end%>");
22406
22407   objc_finish_implementation ();
22408 }
22409
22410 /* Parse Objective-C ivars.  */
22411
22412 static void
22413 cp_parser_objc_class_ivars (cp_parser* parser)
22414 {
22415   cp_token *token = cp_lexer_peek_token (parser->lexer);
22416
22417   if (token->type != CPP_OPEN_BRACE)
22418     return;     /* No ivars specified.  */
22419
22420   cp_lexer_consume_token (parser->lexer);  /* Eat '{'.  */
22421   token = cp_lexer_peek_token (parser->lexer);
22422
22423   while (token->type != CPP_CLOSE_BRACE 
22424         && token->keyword != RID_AT_END && token->type != CPP_EOF)
22425     {
22426       cp_decl_specifier_seq declspecs;
22427       int decl_class_or_enum_p;
22428       tree prefix_attributes;
22429
22430       cp_parser_objc_visibility_spec (parser);
22431
22432       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
22433         break;
22434
22435       cp_parser_decl_specifier_seq (parser,
22436                                     CP_PARSER_FLAGS_OPTIONAL,
22437                                     &declspecs,
22438                                     &decl_class_or_enum_p);
22439
22440       /* auto, register, static, extern, mutable.  */
22441       if (declspecs.storage_class != sc_none)
22442         {
22443           cp_parser_error (parser, "invalid type for instance variable");         
22444           declspecs.storage_class = sc_none;
22445         }
22446
22447       /* __thread.  */
22448       if (declspecs.specs[(int) ds_thread])
22449         {
22450           cp_parser_error (parser, "invalid type for instance variable");
22451           declspecs.specs[(int) ds_thread] = 0;
22452         }
22453       
22454       /* typedef.  */
22455       if (declspecs.specs[(int) ds_typedef])
22456         {
22457           cp_parser_error (parser, "invalid type for instance variable");
22458           declspecs.specs[(int) ds_typedef] = 0;
22459         }
22460
22461       prefix_attributes = declspecs.attributes;
22462       declspecs.attributes = NULL_TREE;
22463
22464       /* Keep going until we hit the `;' at the end of the
22465          declaration.  */
22466       while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22467         {
22468           tree width = NULL_TREE, attributes, first_attribute, decl;
22469           cp_declarator *declarator = NULL;
22470           int ctor_dtor_or_conv_p;
22471
22472           /* Check for a (possibly unnamed) bitfield declaration.  */
22473           token = cp_lexer_peek_token (parser->lexer);
22474           if (token->type == CPP_COLON)
22475             goto eat_colon;
22476
22477           if (token->type == CPP_NAME
22478               && (cp_lexer_peek_nth_token (parser->lexer, 2)->type
22479                   == CPP_COLON))
22480             {
22481               /* Get the name of the bitfield.  */
22482               declarator = make_id_declarator (NULL_TREE,
22483                                                cp_parser_identifier (parser),
22484                                                sfk_none);
22485
22486              eat_colon:
22487               cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22488               /* Get the width of the bitfield.  */
22489               width
22490                 = cp_parser_constant_expression (parser,
22491                                                  /*allow_non_constant=*/false,
22492                                                  NULL);
22493             }
22494           else
22495             {
22496               /* Parse the declarator.  */
22497               declarator
22498                 = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
22499                                         &ctor_dtor_or_conv_p,
22500                                         /*parenthesized_p=*/NULL,
22501                                         /*member_p=*/false);
22502             }
22503
22504           /* Look for attributes that apply to the ivar.  */
22505           attributes = cp_parser_attributes_opt (parser);
22506           /* Remember which attributes are prefix attributes and
22507              which are not.  */
22508           first_attribute = attributes;
22509           /* Combine the attributes.  */
22510           attributes = chainon (prefix_attributes, attributes);
22511
22512           if (width)
22513               /* Create the bitfield declaration.  */
22514               decl = grokbitfield (declarator, &declspecs,
22515                                    width,
22516                                    attributes);
22517           else
22518             decl = grokfield (declarator, &declspecs,
22519                               NULL_TREE, /*init_const_expr_p=*/false,
22520                               NULL_TREE, attributes);
22521
22522           /* Add the instance variable.  */
22523           if (decl != error_mark_node && decl != NULL_TREE)
22524             objc_add_instance_variable (decl);
22525
22526           /* Reset PREFIX_ATTRIBUTES.  */
22527           while (attributes && TREE_CHAIN (attributes) != first_attribute)
22528             attributes = TREE_CHAIN (attributes);
22529           if (attributes)
22530             TREE_CHAIN (attributes) = NULL_TREE;
22531
22532           token = cp_lexer_peek_token (parser->lexer);
22533
22534           if (token->type == CPP_COMMA)
22535             {
22536               cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
22537               continue;
22538             }
22539           break;
22540         }
22541
22542       cp_parser_consume_semicolon_at_end_of_statement (parser);
22543       token = cp_lexer_peek_token (parser->lexer);
22544     }
22545
22546   if (token->keyword == RID_AT_END)
22547     cp_parser_error (parser, "expected %<}%>");
22548
22549   /* Do not consume the RID_AT_END, so it will be read again as terminating
22550      the @interface of @implementation.  */ 
22551   if (token->keyword != RID_AT_END && token->type != CPP_EOF)
22552     cp_lexer_consume_token (parser->lexer);  /* Eat '}'.  */
22553     
22554   /* For historical reasons, we accept an optional semicolon.  */
22555   if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
22556     cp_lexer_consume_token (parser->lexer);
22557 }
22558
22559 /* Parse an Objective-C protocol declaration.  */
22560
22561 static void
22562 cp_parser_objc_protocol_declaration (cp_parser* parser, tree attributes)
22563 {
22564   tree proto, protorefs;
22565   cp_token *tok;
22566
22567   cp_lexer_consume_token (parser->lexer);  /* Eat '@protocol'.  */
22568   if (cp_lexer_next_token_is_not (parser->lexer, CPP_NAME))
22569     {
22570       tok = cp_lexer_peek_token (parser->lexer);
22571       error_at (tok->location, "identifier expected after %<@protocol%>");
22572       cp_parser_consume_semicolon_at_end_of_statement (parser);
22573       return;
22574     }
22575
22576   /* See if we have a forward declaration or a definition.  */
22577   tok = cp_lexer_peek_nth_token (parser->lexer, 2);
22578
22579   /* Try a forward declaration first.  */
22580   if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
22581     {
22582       while (true)
22583         {
22584           tree id;
22585           
22586           id = cp_parser_identifier (parser);
22587           if (id == error_mark_node)
22588             break;
22589           
22590           objc_declare_protocol (id, attributes);
22591           
22592           if(cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
22593             cp_lexer_consume_token (parser->lexer);
22594           else
22595             break;
22596         }
22597       cp_parser_consume_semicolon_at_end_of_statement (parser);
22598     }
22599
22600   /* Ok, we got a full-fledged definition (or at least should).  */
22601   else
22602     {
22603       proto = cp_parser_identifier (parser);
22604       protorefs = cp_parser_objc_protocol_refs_opt (parser);
22605       objc_start_protocol (proto, protorefs, attributes);
22606       cp_parser_objc_method_prototype_list (parser);
22607     }
22608 }
22609
22610 /* Parse an Objective-C superclass or category.  */
22611
22612 static void
22613 cp_parser_objc_superclass_or_category (cp_parser *parser, 
22614                                        bool iface_p,
22615                                        tree *super,
22616                                        tree *categ, bool *is_class_extension)
22617 {
22618   cp_token *next = cp_lexer_peek_token (parser->lexer);
22619
22620   *super = *categ = NULL_TREE;
22621   *is_class_extension = false;
22622   if (next->type == CPP_COLON)
22623     {
22624       cp_lexer_consume_token (parser->lexer);  /* Eat ':'.  */
22625       *super = cp_parser_identifier (parser);
22626     }
22627   else if (next->type == CPP_OPEN_PAREN)
22628     {
22629       cp_lexer_consume_token (parser->lexer);  /* Eat '('.  */
22630
22631       /* If there is no category name, and this is an @interface, we
22632          have a class extension.  */
22633       if (iface_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22634         {
22635           *categ = NULL_TREE;
22636           *is_class_extension = true;
22637         }
22638       else
22639         *categ = cp_parser_identifier (parser);
22640
22641       cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22642     }
22643 }
22644
22645 /* Parse an Objective-C class interface.  */
22646
22647 static void
22648 cp_parser_objc_class_interface (cp_parser* parser, tree attributes)
22649 {
22650   tree name, super, categ, protos;
22651   bool is_class_extension;
22652
22653   cp_lexer_consume_token (parser->lexer);  /* Eat '@interface'.  */
22654   name = cp_parser_identifier (parser);
22655   if (name == error_mark_node)
22656     {
22657       /* It's hard to recover because even if valid @interface stuff
22658          is to follow, we can't compile it (or validate it) if we
22659          don't even know which class it refers to.  Let's assume this
22660          was a stray '@interface' token in the stream and skip it.
22661       */
22662       return;
22663     }
22664   cp_parser_objc_superclass_or_category (parser, true, &super, &categ,
22665                                          &is_class_extension);
22666   protos = cp_parser_objc_protocol_refs_opt (parser);
22667
22668   /* We have either a class or a category on our hands.  */
22669   if (categ || is_class_extension)
22670     objc_start_category_interface (name, categ, protos, attributes);
22671   else
22672     {
22673       objc_start_class_interface (name, super, protos, attributes);
22674       /* Handle instance variable declarations, if any.  */
22675       cp_parser_objc_class_ivars (parser);
22676       objc_continue_interface ();
22677     }
22678
22679   cp_parser_objc_method_prototype_list (parser);
22680 }
22681
22682 /* Parse an Objective-C class implementation.  */
22683
22684 static void
22685 cp_parser_objc_class_implementation (cp_parser* parser)
22686 {
22687   tree name, super, categ;
22688   bool is_class_extension;
22689
22690   cp_lexer_consume_token (parser->lexer);  /* Eat '@implementation'.  */
22691   name = cp_parser_identifier (parser);
22692   if (name == error_mark_node)
22693     {
22694       /* It's hard to recover because even if valid @implementation
22695          stuff is to follow, we can't compile it (or validate it) if
22696          we don't even know which class it refers to.  Let's assume
22697          this was a stray '@implementation' token in the stream and
22698          skip it.
22699       */
22700       return;
22701     }
22702   cp_parser_objc_superclass_or_category (parser, false, &super, &categ,
22703                                          &is_class_extension);
22704
22705   /* We have either a class or a category on our hands.  */
22706   if (categ)
22707     objc_start_category_implementation (name, categ);
22708   else
22709     {
22710       objc_start_class_implementation (name, super);
22711       /* Handle instance variable declarations, if any.  */
22712       cp_parser_objc_class_ivars (parser);
22713       objc_continue_implementation ();
22714     }
22715
22716   cp_parser_objc_method_definition_list (parser);
22717 }
22718
22719 /* Consume the @end token and finish off the implementation.  */
22720
22721 static void
22722 cp_parser_objc_end_implementation (cp_parser* parser)
22723 {
22724   cp_lexer_consume_token (parser->lexer);  /* Eat '@end'.  */
22725   objc_finish_implementation ();
22726 }
22727
22728 /* Parse an Objective-C declaration.  */
22729
22730 static void
22731 cp_parser_objc_declaration (cp_parser* parser, tree attributes)
22732 {
22733   /* Try to figure out what kind of declaration is present.  */
22734   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22735
22736   if (attributes)
22737     switch (kwd->keyword)
22738       {
22739         case RID_AT_ALIAS:
22740         case RID_AT_CLASS:
22741         case RID_AT_END:
22742           error_at (kwd->location, "attributes may not be specified before"
22743                     " the %<@%D%> Objective-C++ keyword",
22744                     kwd->u.value);
22745           attributes = NULL;
22746           break;
22747         case RID_AT_IMPLEMENTATION:
22748           warning_at (kwd->location, OPT_Wattributes,
22749                       "prefix attributes are ignored before %<@%D%>",
22750                       kwd->u.value);
22751           attributes = NULL;
22752         default:
22753           break;
22754       }
22755
22756   switch (kwd->keyword)
22757     {
22758     case RID_AT_ALIAS:
22759       cp_parser_objc_alias_declaration (parser);
22760       break;
22761     case RID_AT_CLASS:
22762       cp_parser_objc_class_declaration (parser);
22763       break;
22764     case RID_AT_PROTOCOL:
22765       cp_parser_objc_protocol_declaration (parser, attributes);
22766       break;
22767     case RID_AT_INTERFACE:
22768       cp_parser_objc_class_interface (parser, attributes);
22769       break;
22770     case RID_AT_IMPLEMENTATION:
22771       cp_parser_objc_class_implementation (parser);
22772       break;
22773     case RID_AT_END:
22774       cp_parser_objc_end_implementation (parser);
22775       break;
22776     default:
22777       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
22778                 kwd->u.value);
22779       cp_parser_skip_to_end_of_block_or_statement (parser);
22780     }
22781 }
22782
22783 /* Parse an Objective-C try-catch-finally statement.
22784
22785    objc-try-catch-finally-stmt:
22786      @try compound-statement objc-catch-clause-seq [opt]
22787        objc-finally-clause [opt]
22788
22789    objc-catch-clause-seq:
22790      objc-catch-clause objc-catch-clause-seq [opt]
22791
22792    objc-catch-clause:
22793      @catch ( objc-exception-declaration ) compound-statement
22794
22795    objc-finally-clause:
22796      @finally compound-statement
22797
22798    objc-exception-declaration:
22799      parameter-declaration
22800      '...'
22801
22802    where '...' is to be interpreted literally, that is, it means CPP_ELLIPSIS.
22803
22804    Returns NULL_TREE.
22805
22806    PS: This function is identical to c_parser_objc_try_catch_finally_statement
22807    for C.  Keep them in sync.  */   
22808
22809 static tree
22810 cp_parser_objc_try_catch_finally_statement (cp_parser *parser)
22811 {
22812   location_t location;
22813   tree stmt;
22814
22815   cp_parser_require_keyword (parser, RID_AT_TRY, RT_AT_TRY);
22816   location = cp_lexer_peek_token (parser->lexer)->location;
22817   objc_maybe_warn_exceptions (location);
22818   /* NB: The @try block needs to be wrapped in its own STATEMENT_LIST
22819      node, lest it get absorbed into the surrounding block.  */
22820   stmt = push_stmt_list ();
22821   cp_parser_compound_statement (parser, NULL, false, false);
22822   objc_begin_try_stmt (location, pop_stmt_list (stmt));
22823
22824   while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
22825     {
22826       cp_parameter_declarator *parm;
22827       tree parameter_declaration = error_mark_node;
22828       bool seen_open_paren = false;
22829
22830       cp_lexer_consume_token (parser->lexer);
22831       if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
22832         seen_open_paren = true;
22833       if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
22834         {
22835           /* We have "@catch (...)" (where the '...' are literally
22836              what is in the code).  Skip the '...'.
22837              parameter_declaration is set to NULL_TREE, and
22838              objc_being_catch_clauses() knows that that means
22839              '...'.  */
22840           cp_lexer_consume_token (parser->lexer);
22841           parameter_declaration = NULL_TREE;
22842         }
22843       else
22844         {
22845           /* We have "@catch (NSException *exception)" or something
22846              like that.  Parse the parameter declaration.  */
22847           parm = cp_parser_parameter_declaration (parser, false, NULL);
22848           if (parm == NULL)
22849             parameter_declaration = error_mark_node;
22850           else
22851             parameter_declaration = grokdeclarator (parm->declarator,
22852                                                     &parm->decl_specifiers,
22853                                                     PARM, /*initialized=*/0,
22854                                                     /*attrlist=*/NULL);
22855         }
22856       if (seen_open_paren)
22857         cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22858       else
22859         {
22860           /* If there was no open parenthesis, we are recovering from
22861              an error, and we are trying to figure out what mistake
22862              the user has made.  */
22863
22864           /* If there is an immediate closing parenthesis, the user
22865              probably forgot the opening one (ie, they typed "@catch
22866              NSException *e)".  Parse the closing parenthesis and keep
22867              going.  */
22868           if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
22869             cp_lexer_consume_token (parser->lexer);
22870           
22871           /* If these is no immediate closing parenthesis, the user
22872              probably doesn't know that parenthesis are required at
22873              all (ie, they typed "@catch NSException *e").  So, just
22874              forget about the closing parenthesis and keep going.  */
22875         }
22876       objc_begin_catch_clause (parameter_declaration);
22877       cp_parser_compound_statement (parser, NULL, false, false);
22878       objc_finish_catch_clause ();
22879     }
22880   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_FINALLY))
22881     {
22882       cp_lexer_consume_token (parser->lexer);
22883       location = cp_lexer_peek_token (parser->lexer)->location;
22884       /* NB: The @finally block needs to be wrapped in its own STATEMENT_LIST
22885          node, lest it get absorbed into the surrounding block.  */
22886       stmt = push_stmt_list ();
22887       cp_parser_compound_statement (parser, NULL, false, false);
22888       objc_build_finally_clause (location, pop_stmt_list (stmt));
22889     }
22890
22891   return objc_finish_try_stmt ();
22892 }
22893
22894 /* Parse an Objective-C synchronized statement.
22895
22896    objc-synchronized-stmt:
22897      @synchronized ( expression ) compound-statement
22898
22899    Returns NULL_TREE.  */
22900
22901 static tree
22902 cp_parser_objc_synchronized_statement (cp_parser *parser)
22903 {
22904   location_t location;
22905   tree lock, stmt;
22906
22907   cp_parser_require_keyword (parser, RID_AT_SYNCHRONIZED, RT_AT_SYNCHRONIZED);
22908
22909   location = cp_lexer_peek_token (parser->lexer)->location;
22910   objc_maybe_warn_exceptions (location);
22911   cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
22912   lock = cp_parser_expression (parser, false, NULL);
22913   cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
22914
22915   /* NB: The @synchronized block needs to be wrapped in its own STATEMENT_LIST
22916      node, lest it get absorbed into the surrounding block.  */
22917   stmt = push_stmt_list ();
22918   cp_parser_compound_statement (parser, NULL, false, false);
22919
22920   return objc_build_synchronized (location, lock, pop_stmt_list (stmt));
22921 }
22922
22923 /* Parse an Objective-C throw statement.
22924
22925    objc-throw-stmt:
22926      @throw assignment-expression [opt] ;
22927
22928    Returns a constructed '@throw' statement.  */
22929
22930 static tree
22931 cp_parser_objc_throw_statement (cp_parser *parser)
22932 {
22933   tree expr = NULL_TREE;
22934   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
22935
22936   cp_parser_require_keyword (parser, RID_AT_THROW, RT_AT_THROW);
22937
22938   if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
22939     expr = cp_parser_expression (parser, /*cast_p=*/false, NULL);
22940
22941   cp_parser_consume_semicolon_at_end_of_statement (parser);
22942
22943   return objc_build_throw_stmt (loc, expr);
22944 }
22945
22946 /* Parse an Objective-C statement.  */
22947
22948 static tree
22949 cp_parser_objc_statement (cp_parser * parser)
22950 {
22951   /* Try to figure out what kind of declaration is present.  */
22952   cp_token *kwd = cp_lexer_peek_token (parser->lexer);
22953
22954   switch (kwd->keyword)
22955     {
22956     case RID_AT_TRY:
22957       return cp_parser_objc_try_catch_finally_statement (parser);
22958     case RID_AT_SYNCHRONIZED:
22959       return cp_parser_objc_synchronized_statement (parser);
22960     case RID_AT_THROW:
22961       return cp_parser_objc_throw_statement (parser);
22962     default:
22963       error_at (kwd->location, "misplaced %<@%D%> Objective-C++ construct",
22964                kwd->u.value);
22965       cp_parser_skip_to_end_of_block_or_statement (parser);
22966     }
22967
22968   return error_mark_node;
22969 }
22970
22971 /* If we are compiling ObjC++ and we see an __attribute__ we neeed to 
22972    look ahead to see if an objc keyword follows the attributes.  This
22973    is to detect the use of prefix attributes on ObjC @interface and 
22974    @protocol.  */
22975
22976 static bool
22977 cp_parser_objc_valid_prefix_attributes (cp_parser* parser, tree *attrib)
22978 {
22979   cp_lexer_save_tokens (parser->lexer);
22980   *attrib = cp_parser_attributes_opt (parser);
22981   gcc_assert (*attrib);
22982   if (OBJC_IS_AT_KEYWORD (cp_lexer_peek_token (parser->lexer)->keyword))
22983     {
22984       cp_lexer_commit_tokens (parser->lexer);
22985       return true;
22986     }
22987   cp_lexer_rollback_tokens (parser->lexer);
22988   return false;  
22989 }
22990
22991 /* This routine is a minimal replacement for
22992    c_parser_struct_declaration () used when parsing the list of
22993    types/names or ObjC++ properties.  For example, when parsing the
22994    code
22995
22996    @property (readonly) int a, b, c;
22997
22998    this function is responsible for parsing "int a, int b, int c" and
22999    returning the declarations as CHAIN of DECLs.
23000
23001    TODO: Share this code with cp_parser_objc_class_ivars.  It's very
23002    similar parsing.  */
23003 static tree
23004 cp_parser_objc_struct_declaration (cp_parser *parser)
23005 {
23006   tree decls = NULL_TREE;
23007   cp_decl_specifier_seq declspecs;
23008   int decl_class_or_enum_p;
23009   tree prefix_attributes;
23010
23011   cp_parser_decl_specifier_seq (parser,
23012                                 CP_PARSER_FLAGS_NONE,
23013                                 &declspecs,
23014                                 &decl_class_or_enum_p);
23015
23016   if (declspecs.type == error_mark_node)
23017     return error_mark_node;
23018
23019   /* auto, register, static, extern, mutable.  */
23020   if (declspecs.storage_class != sc_none)
23021     {
23022       cp_parser_error (parser, "invalid type for property");
23023       declspecs.storage_class = sc_none;
23024     }
23025   
23026   /* __thread.  */
23027   if (declspecs.specs[(int) ds_thread])
23028     {
23029       cp_parser_error (parser, "invalid type for property");
23030       declspecs.specs[(int) ds_thread] = 0;
23031     }
23032   
23033   /* typedef.  */
23034   if (declspecs.specs[(int) ds_typedef])
23035     {
23036       cp_parser_error (parser, "invalid type for property");
23037       declspecs.specs[(int) ds_typedef] = 0;
23038     }
23039
23040   prefix_attributes = declspecs.attributes;
23041   declspecs.attributes = NULL_TREE;
23042
23043   /* Keep going until we hit the `;' at the end of the declaration. */
23044   while (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
23045     {
23046       tree attributes, first_attribute, decl;
23047       cp_declarator *declarator;
23048       cp_token *token;
23049
23050       /* Parse the declarator.  */
23051       declarator = cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
23052                                          NULL, NULL, false);
23053
23054       /* Look for attributes that apply to the ivar.  */
23055       attributes = cp_parser_attributes_opt (parser);
23056       /* Remember which attributes are prefix attributes and
23057          which are not.  */
23058       first_attribute = attributes;
23059       /* Combine the attributes.  */
23060       attributes = chainon (prefix_attributes, attributes);
23061       
23062       decl = grokfield (declarator, &declspecs,
23063                         NULL_TREE, /*init_const_expr_p=*/false,
23064                         NULL_TREE, attributes);
23065
23066       if (decl == error_mark_node || decl == NULL_TREE)
23067         return error_mark_node;
23068       
23069       /* Reset PREFIX_ATTRIBUTES.  */
23070       while (attributes && TREE_CHAIN (attributes) != first_attribute)
23071         attributes = TREE_CHAIN (attributes);
23072       if (attributes)
23073         TREE_CHAIN (attributes) = NULL_TREE;
23074
23075       DECL_CHAIN (decl) = decls;
23076       decls = decl;
23077
23078       token = cp_lexer_peek_token (parser->lexer);
23079       if (token->type == CPP_COMMA)
23080         {
23081           cp_lexer_consume_token (parser->lexer);  /* Eat ','.  */
23082           continue;
23083         }
23084       else
23085         break;
23086     }
23087   return decls;
23088 }
23089
23090 /* Parse an Objective-C @property declaration.  The syntax is:
23091
23092    objc-property-declaration:
23093      '@property' objc-property-attributes[opt] struct-declaration ;
23094
23095    objc-property-attributes:
23096     '(' objc-property-attribute-list ')'
23097
23098    objc-property-attribute-list:
23099      objc-property-attribute
23100      objc-property-attribute-list, objc-property-attribute
23101
23102    objc-property-attribute
23103      'getter' = identifier
23104      'setter' = identifier
23105      'readonly'
23106      'readwrite'
23107      'assign'
23108      'retain'
23109      'copy'
23110      'nonatomic'
23111
23112   For example:
23113     @property NSString *name;
23114     @property (readonly) id object;
23115     @property (retain, nonatomic, getter=getTheName) id name;
23116     @property int a, b, c;
23117
23118    PS: This function is identical to
23119    c_parser_objc_at_property_declaration for C.  Keep them in sync.  */
23120 static void 
23121 cp_parser_objc_at_property_declaration (cp_parser *parser)
23122 {
23123   /* The following variables hold the attributes of the properties as
23124      parsed.  They are 'false' or 'NULL_TREE' if the attribute was not
23125      seen.  When we see an attribute, we set them to 'true' (if they
23126      are boolean properties) or to the identifier (if they have an
23127      argument, ie, for getter and setter).  Note that here we only
23128      parse the list of attributes, check the syntax and accumulate the
23129      attributes that we find.  objc_add_property_declaration() will
23130      then process the information.  */
23131   bool property_assign = false;
23132   bool property_copy = false;
23133   tree property_getter_ident = NULL_TREE;
23134   bool property_nonatomic = false;
23135   bool property_readonly = false;
23136   bool property_readwrite = false;
23137   bool property_retain = false;
23138   tree property_setter_ident = NULL_TREE;
23139
23140   /* 'properties' is the list of properties that we read.  Usually a
23141      single one, but maybe more (eg, in "@property int a, b, c;" there
23142      are three).  */
23143   tree properties;
23144   location_t loc;
23145
23146   loc = cp_lexer_peek_token (parser->lexer)->location;
23147
23148   cp_lexer_consume_token (parser->lexer);  /* Eat '@property'.  */
23149
23150   /* Parse the optional attribute list...  */
23151   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
23152     {
23153       /* Eat the '('.  */
23154       cp_lexer_consume_token (parser->lexer);
23155
23156       while (true)
23157         {
23158           bool syntax_error = false;
23159           cp_token *token = cp_lexer_peek_token (parser->lexer);
23160           enum rid keyword;
23161
23162           if (token->type != CPP_NAME)
23163             {
23164               cp_parser_error (parser, "expected identifier");
23165               break;
23166             }
23167           keyword = C_RID_CODE (token->u.value);
23168           cp_lexer_consume_token (parser->lexer);
23169           switch (keyword)
23170             {
23171             case RID_ASSIGN:    property_assign = true;    break;
23172             case RID_COPY:      property_copy = true;      break;
23173             case RID_NONATOMIC: property_nonatomic = true; break;
23174             case RID_READONLY:  property_readonly = true;  break;
23175             case RID_READWRITE: property_readwrite = true; break;
23176             case RID_RETAIN:    property_retain = true;    break;
23177
23178             case RID_GETTER:
23179             case RID_SETTER:
23180               if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
23181                 {
23182                   if (keyword == RID_GETTER)
23183                     cp_parser_error (parser,
23184                                      "missing %<=%> (after %<getter%> attribute)");
23185                   else
23186                     cp_parser_error (parser,
23187                                      "missing %<=%> (after %<setter%> attribute)");
23188                   syntax_error = true;
23189                   break;
23190                 }
23191               cp_lexer_consume_token (parser->lexer); /* eat the = */
23192               if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser->lexer)->type))
23193                 {
23194                   cp_parser_error (parser, "expected identifier");
23195                   syntax_error = true;
23196                   break;
23197                 }
23198               if (keyword == RID_SETTER)
23199                 {
23200                   if (property_setter_ident != NULL_TREE)
23201                     {
23202                       cp_parser_error (parser, "the %<setter%> attribute may only be specified once");
23203                       cp_lexer_consume_token (parser->lexer);
23204                     }
23205                   else
23206                     property_setter_ident = cp_parser_objc_selector (parser);
23207                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
23208                     cp_parser_error (parser, "setter name must terminate with %<:%>");
23209                   else
23210                     cp_lexer_consume_token (parser->lexer);
23211                 }
23212               else
23213                 {
23214                   if (property_getter_ident != NULL_TREE)
23215                     {
23216                       cp_parser_error (parser, "the %<getter%> attribute may only be specified once");
23217                       cp_lexer_consume_token (parser->lexer);
23218                     }
23219                   else
23220                     property_getter_ident = cp_parser_objc_selector (parser);
23221                 }
23222               break;
23223             default:
23224               cp_parser_error (parser, "unknown property attribute");
23225               syntax_error = true;
23226               break;
23227             }
23228
23229           if (syntax_error)
23230             break;
23231
23232           if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23233             cp_lexer_consume_token (parser->lexer);
23234           else
23235             break;
23236         }
23237
23238       /* FIXME: "@property (setter, assign);" will generate a spurious
23239          "error: expected â€˜)’ before â€˜,’ token".  This is because
23240          cp_parser_require, unlike the C counterpart, will produce an
23241          error even if we are in error recovery.  */
23242       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23243         {
23244           cp_parser_skip_to_closing_parenthesis (parser,
23245                                                  /*recovering=*/true,
23246                                                  /*or_comma=*/false,
23247                                                  /*consume_paren=*/true);
23248         }
23249     }
23250
23251   /* ... and the property declaration(s).  */
23252   properties = cp_parser_objc_struct_declaration (parser);
23253
23254   if (properties == error_mark_node)
23255     {
23256       cp_parser_skip_to_end_of_statement (parser);
23257       /* If the next token is now a `;', consume it.  */
23258       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
23259         cp_lexer_consume_token (parser->lexer);
23260       return;
23261     }
23262
23263   if (properties == NULL_TREE)
23264     cp_parser_error (parser, "expected identifier");
23265   else
23266     {
23267       /* Comma-separated properties are chained together in
23268          reverse order; add them one by one.  */
23269       properties = nreverse (properties);
23270       
23271       for (; properties; properties = TREE_CHAIN (properties))
23272         objc_add_property_declaration (loc, copy_node (properties),
23273                                        property_readonly, property_readwrite,
23274                                        property_assign, property_retain,
23275                                        property_copy, property_nonatomic,
23276                                        property_getter_ident, property_setter_ident);
23277     }
23278   
23279   cp_parser_consume_semicolon_at_end_of_statement (parser);
23280 }
23281
23282 /* Parse an Objective-C++ @synthesize declaration.  The syntax is:
23283
23284    objc-synthesize-declaration:
23285      @synthesize objc-synthesize-identifier-list ;
23286
23287    objc-synthesize-identifier-list:
23288      objc-synthesize-identifier
23289      objc-synthesize-identifier-list, objc-synthesize-identifier
23290
23291    objc-synthesize-identifier
23292      identifier
23293      identifier = identifier
23294
23295   For example:
23296     @synthesize MyProperty;
23297     @synthesize OneProperty, AnotherProperty=MyIvar, YetAnotherProperty;
23298
23299   PS: This function is identical to c_parser_objc_at_synthesize_declaration
23300   for C.  Keep them in sync.
23301 */
23302 static void 
23303 cp_parser_objc_at_synthesize_declaration (cp_parser *parser)
23304 {
23305   tree list = NULL_TREE;
23306   location_t loc;
23307   loc = cp_lexer_peek_token (parser->lexer)->location;
23308
23309   cp_lexer_consume_token (parser->lexer);  /* Eat '@synthesize'.  */
23310   while (true)
23311     {
23312       tree property, ivar;
23313       property = cp_parser_identifier (parser);
23314       if (property == error_mark_node)
23315         {
23316           cp_parser_consume_semicolon_at_end_of_statement (parser);
23317           return;
23318         }
23319       if (cp_lexer_next_token_is (parser->lexer, CPP_EQ))
23320         {
23321           cp_lexer_consume_token (parser->lexer);
23322           ivar = cp_parser_identifier (parser);
23323           if (ivar == error_mark_node)
23324             {
23325               cp_parser_consume_semicolon_at_end_of_statement (parser);
23326               return;
23327             }
23328         }
23329       else
23330         ivar = NULL_TREE;
23331       list = chainon (list, build_tree_list (ivar, property));
23332       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23333         cp_lexer_consume_token (parser->lexer);
23334       else
23335         break;
23336     }
23337   cp_parser_consume_semicolon_at_end_of_statement (parser);
23338   objc_add_synthesize_declaration (loc, list);
23339 }
23340
23341 /* Parse an Objective-C++ @dynamic declaration.  The syntax is:
23342
23343    objc-dynamic-declaration:
23344      @dynamic identifier-list ;
23345
23346    For example:
23347      @dynamic MyProperty;
23348      @dynamic MyProperty, AnotherProperty;
23349
23350   PS: This function is identical to c_parser_objc_at_dynamic_declaration
23351   for C.  Keep them in sync.
23352 */
23353 static void 
23354 cp_parser_objc_at_dynamic_declaration (cp_parser *parser)
23355 {
23356   tree list = NULL_TREE;
23357   location_t loc;
23358   loc = cp_lexer_peek_token (parser->lexer)->location;
23359
23360   cp_lexer_consume_token (parser->lexer);  /* Eat '@dynamic'.  */
23361   while (true)
23362     {
23363       tree property;
23364       property = cp_parser_identifier (parser);
23365       if (property == error_mark_node)
23366         {
23367           cp_parser_consume_semicolon_at_end_of_statement (parser);
23368           return;
23369         }
23370       list = chainon (list, build_tree_list (NULL, property));
23371       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23372         cp_lexer_consume_token (parser->lexer);
23373       else
23374         break;
23375     }
23376   cp_parser_consume_semicolon_at_end_of_statement (parser);
23377   objc_add_dynamic_declaration (loc, list);
23378 }
23379
23380 \f
23381 /* OpenMP 2.5 parsing routines.  */
23382
23383 /* Returns name of the next clause.
23384    If the clause is not recognized PRAGMA_OMP_CLAUSE_NONE is returned and
23385    the token is not consumed.  Otherwise appropriate pragma_omp_clause is
23386    returned and the token is consumed.  */
23387
23388 static pragma_omp_clause
23389 cp_parser_omp_clause_name (cp_parser *parser)
23390 {
23391   pragma_omp_clause result = PRAGMA_OMP_CLAUSE_NONE;
23392
23393   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_IF))
23394     result = PRAGMA_OMP_CLAUSE_IF;
23395   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_DEFAULT))
23396     result = PRAGMA_OMP_CLAUSE_DEFAULT;
23397   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_PRIVATE))
23398     result = PRAGMA_OMP_CLAUSE_PRIVATE;
23399   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23400     {
23401       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23402       const char *p = IDENTIFIER_POINTER (id);
23403
23404       switch (p[0])
23405         {
23406         case 'c':
23407           if (!strcmp ("collapse", p))
23408             result = PRAGMA_OMP_CLAUSE_COLLAPSE;
23409           else if (!strcmp ("copyin", p))
23410             result = PRAGMA_OMP_CLAUSE_COPYIN;
23411           else if (!strcmp ("copyprivate", p))
23412             result = PRAGMA_OMP_CLAUSE_COPYPRIVATE;
23413           break;
23414         case 'f':
23415           if (!strcmp ("firstprivate", p))
23416             result = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE;
23417           break;
23418         case 'l':
23419           if (!strcmp ("lastprivate", p))
23420             result = PRAGMA_OMP_CLAUSE_LASTPRIVATE;
23421           break;
23422         case 'n':
23423           if (!strcmp ("nowait", p))
23424             result = PRAGMA_OMP_CLAUSE_NOWAIT;
23425           else if (!strcmp ("num_threads", p))
23426             result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
23427           break;
23428         case 'o':
23429           if (!strcmp ("ordered", p))
23430             result = PRAGMA_OMP_CLAUSE_ORDERED;
23431           break;
23432         case 'r':
23433           if (!strcmp ("reduction", p))
23434             result = PRAGMA_OMP_CLAUSE_REDUCTION;
23435           break;
23436         case 's':
23437           if (!strcmp ("schedule", p))
23438             result = PRAGMA_OMP_CLAUSE_SCHEDULE;
23439           else if (!strcmp ("shared", p))
23440             result = PRAGMA_OMP_CLAUSE_SHARED;
23441           break;
23442         case 'u':
23443           if (!strcmp ("untied", p))
23444             result = PRAGMA_OMP_CLAUSE_UNTIED;
23445           break;
23446         }
23447     }
23448
23449   if (result != PRAGMA_OMP_CLAUSE_NONE)
23450     cp_lexer_consume_token (parser->lexer);
23451
23452   return result;
23453 }
23454
23455 /* Validate that a clause of the given type does not already exist.  */
23456
23457 static void
23458 check_no_duplicate_clause (tree clauses, enum omp_clause_code code,
23459                            const char *name, location_t location)
23460 {
23461   tree c;
23462
23463   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
23464     if (OMP_CLAUSE_CODE (c) == code)
23465       {
23466         error_at (location, "too many %qs clauses", name);
23467         break;
23468       }
23469 }
23470
23471 /* OpenMP 2.5:
23472    variable-list:
23473      identifier
23474      variable-list , identifier
23475
23476    In addition, we match a closing parenthesis.  An opening parenthesis
23477    will have been consumed by the caller.
23478
23479    If KIND is nonzero, create the appropriate node and install the decl
23480    in OMP_CLAUSE_DECL and add the node to the head of the list.
23481
23482    If KIND is zero, create a TREE_LIST with the decl in TREE_PURPOSE;
23483    return the list created.  */
23484
23485 static tree
23486 cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
23487                                 tree list)
23488 {
23489   cp_token *token;
23490   while (1)
23491     {
23492       tree name, decl;
23493
23494       token = cp_lexer_peek_token (parser->lexer);
23495       name = cp_parser_id_expression (parser, /*template_p=*/false,
23496                                       /*check_dependency_p=*/true,
23497                                       /*template_p=*/NULL,
23498                                       /*declarator_p=*/false,
23499                                       /*optional_p=*/false);
23500       if (name == error_mark_node)
23501         goto skip_comma;
23502
23503       decl = cp_parser_lookup_name_simple (parser, name, token->location);
23504       if (decl == error_mark_node)
23505         cp_parser_name_lookup_error (parser, name, decl, NLE_NULL,
23506                                      token->location);
23507       else if (kind != 0)
23508         {
23509           tree u = build_omp_clause (token->location, kind);
23510           OMP_CLAUSE_DECL (u) = decl;
23511           OMP_CLAUSE_CHAIN (u) = list;
23512           list = u;
23513         }
23514       else
23515         list = tree_cons (decl, NULL_TREE, list);
23516
23517     get_comma:
23518       if (cp_lexer_next_token_is_not (parser->lexer, CPP_COMMA))
23519         break;
23520       cp_lexer_consume_token (parser->lexer);
23521     }
23522
23523   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23524     {
23525       int ending;
23526
23527       /* Try to resync to an unnested comma.  Copied from
23528          cp_parser_parenthesized_expression_list.  */
23529     skip_comma:
23530       ending = cp_parser_skip_to_closing_parenthesis (parser,
23531                                                       /*recovering=*/true,
23532                                                       /*or_comma=*/true,
23533                                                       /*consume_paren=*/true);
23534       if (ending < 0)
23535         goto get_comma;
23536     }
23537
23538   return list;
23539 }
23540
23541 /* Similarly, but expect leading and trailing parenthesis.  This is a very
23542    common case for omp clauses.  */
23543
23544 static tree
23545 cp_parser_omp_var_list (cp_parser *parser, enum omp_clause_code kind, tree list)
23546 {
23547   if (cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23548     return cp_parser_omp_var_list_no_open (parser, kind, list);
23549   return list;
23550 }
23551
23552 /* OpenMP 3.0:
23553    collapse ( constant-expression ) */
23554
23555 static tree
23556 cp_parser_omp_clause_collapse (cp_parser *parser, tree list, location_t location)
23557 {
23558   tree c, num;
23559   location_t loc;
23560   HOST_WIDE_INT n;
23561
23562   loc = cp_lexer_peek_token (parser->lexer)->location;
23563   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23564     return list;
23565
23566   num = cp_parser_constant_expression (parser, false, NULL);
23567
23568   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23569     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23570                                            /*or_comma=*/false,
23571                                            /*consume_paren=*/true);
23572
23573   if (num == error_mark_node)
23574     return list;
23575   num = fold_non_dependent_expr (num);
23576   if (!INTEGRAL_TYPE_P (TREE_TYPE (num))
23577       || !host_integerp (num, 0)
23578       || (n = tree_low_cst (num, 0)) <= 0
23579       || (int) n != n)
23580     {
23581       error_at (loc, "collapse argument needs positive constant integer expression");
23582       return list;
23583     }
23584
23585   check_no_duplicate_clause (list, OMP_CLAUSE_COLLAPSE, "collapse", location);
23586   c = build_omp_clause (loc, OMP_CLAUSE_COLLAPSE);
23587   OMP_CLAUSE_CHAIN (c) = list;
23588   OMP_CLAUSE_COLLAPSE_EXPR (c) = num;
23589
23590   return c;
23591 }
23592
23593 /* OpenMP 2.5:
23594    default ( shared | none ) */
23595
23596 static tree
23597 cp_parser_omp_clause_default (cp_parser *parser, tree list, location_t location)
23598 {
23599   enum omp_clause_default_kind kind = OMP_CLAUSE_DEFAULT_UNSPECIFIED;
23600   tree c;
23601
23602   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23603     return list;
23604   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23605     {
23606       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23607       const char *p = IDENTIFIER_POINTER (id);
23608
23609       switch (p[0])
23610         {
23611         case 'n':
23612           if (strcmp ("none", p) != 0)
23613             goto invalid_kind;
23614           kind = OMP_CLAUSE_DEFAULT_NONE;
23615           break;
23616
23617         case 's':
23618           if (strcmp ("shared", p) != 0)
23619             goto invalid_kind;
23620           kind = OMP_CLAUSE_DEFAULT_SHARED;
23621           break;
23622
23623         default:
23624           goto invalid_kind;
23625         }
23626
23627       cp_lexer_consume_token (parser->lexer);
23628     }
23629   else
23630     {
23631     invalid_kind:
23632       cp_parser_error (parser, "expected %<none%> or %<shared%>");
23633     }
23634
23635   if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23636     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23637                                            /*or_comma=*/false,
23638                                            /*consume_paren=*/true);
23639
23640   if (kind == OMP_CLAUSE_DEFAULT_UNSPECIFIED)
23641     return list;
23642
23643   check_no_duplicate_clause (list, OMP_CLAUSE_DEFAULT, "default", location);
23644   c = build_omp_clause (location, OMP_CLAUSE_DEFAULT);
23645   OMP_CLAUSE_CHAIN (c) = list;
23646   OMP_CLAUSE_DEFAULT_KIND (c) = kind;
23647
23648   return c;
23649 }
23650
23651 /* OpenMP 2.5:
23652    if ( expression ) */
23653
23654 static tree
23655 cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
23656 {
23657   tree t, c;
23658
23659   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23660     return list;
23661
23662   t = cp_parser_condition (parser);
23663
23664   if (t == error_mark_node
23665       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23666     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23667                                            /*or_comma=*/false,
23668                                            /*consume_paren=*/true);
23669
23670   check_no_duplicate_clause (list, OMP_CLAUSE_IF, "if", location);
23671
23672   c = build_omp_clause (location, OMP_CLAUSE_IF);
23673   OMP_CLAUSE_IF_EXPR (c) = t;
23674   OMP_CLAUSE_CHAIN (c) = list;
23675
23676   return c;
23677 }
23678
23679 /* OpenMP 2.5:
23680    nowait */
23681
23682 static tree
23683 cp_parser_omp_clause_nowait (cp_parser *parser ATTRIBUTE_UNUSED,
23684                              tree list, location_t location)
23685 {
23686   tree c;
23687
23688   check_no_duplicate_clause (list, OMP_CLAUSE_NOWAIT, "nowait", location);
23689
23690   c = build_omp_clause (location, OMP_CLAUSE_NOWAIT);
23691   OMP_CLAUSE_CHAIN (c) = list;
23692   return c;
23693 }
23694
23695 /* OpenMP 2.5:
23696    num_threads ( expression ) */
23697
23698 static tree
23699 cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
23700                                   location_t location)
23701 {
23702   tree t, c;
23703
23704   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23705     return list;
23706
23707   t = cp_parser_expression (parser, false, NULL);
23708
23709   if (t == error_mark_node
23710       || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23711     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23712                                            /*or_comma=*/false,
23713                                            /*consume_paren=*/true);
23714
23715   check_no_duplicate_clause (list, OMP_CLAUSE_NUM_THREADS,
23716                              "num_threads", location);
23717
23718   c = build_omp_clause (location, OMP_CLAUSE_NUM_THREADS);
23719   OMP_CLAUSE_NUM_THREADS_EXPR (c) = t;
23720   OMP_CLAUSE_CHAIN (c) = list;
23721
23722   return c;
23723 }
23724
23725 /* OpenMP 2.5:
23726    ordered */
23727
23728 static tree
23729 cp_parser_omp_clause_ordered (cp_parser *parser ATTRIBUTE_UNUSED,
23730                               tree list, location_t location)
23731 {
23732   tree c;
23733
23734   check_no_duplicate_clause (list, OMP_CLAUSE_ORDERED,
23735                              "ordered", location);
23736
23737   c = build_omp_clause (location, OMP_CLAUSE_ORDERED);
23738   OMP_CLAUSE_CHAIN (c) = list;
23739   return c;
23740 }
23741
23742 /* OpenMP 2.5:
23743    reduction ( reduction-operator : variable-list )
23744
23745    reduction-operator:
23746      One of: + * - & ^ | && || */
23747
23748 static tree
23749 cp_parser_omp_clause_reduction (cp_parser *parser, tree list)
23750 {
23751   enum tree_code code;
23752   tree nlist, c;
23753
23754   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23755     return list;
23756
23757   switch (cp_lexer_peek_token (parser->lexer)->type)
23758     {
23759     case CPP_PLUS:
23760       code = PLUS_EXPR;
23761       break;
23762     case CPP_MULT:
23763       code = MULT_EXPR;
23764       break;
23765     case CPP_MINUS:
23766       code = MINUS_EXPR;
23767       break;
23768     case CPP_AND:
23769       code = BIT_AND_EXPR;
23770       break;
23771     case CPP_XOR:
23772       code = BIT_XOR_EXPR;
23773       break;
23774     case CPP_OR:
23775       code = BIT_IOR_EXPR;
23776       break;
23777     case CPP_AND_AND:
23778       code = TRUTH_ANDIF_EXPR;
23779       break;
23780     case CPP_OR_OR:
23781       code = TRUTH_ORIF_EXPR;
23782       break;
23783     default:
23784       cp_parser_error (parser, "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, "
23785                                "%<|%>, %<&&%>, or %<||%>");
23786     resync_fail:
23787       cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23788                                              /*or_comma=*/false,
23789                                              /*consume_paren=*/true);
23790       return list;
23791     }
23792   cp_lexer_consume_token (parser->lexer);
23793
23794   if (!cp_parser_require (parser, CPP_COLON, RT_COLON))
23795     goto resync_fail;
23796
23797   nlist = cp_parser_omp_var_list_no_open (parser, OMP_CLAUSE_REDUCTION, list);
23798   for (c = nlist; c != list; c = OMP_CLAUSE_CHAIN (c))
23799     OMP_CLAUSE_REDUCTION_CODE (c) = code;
23800
23801   return nlist;
23802 }
23803
23804 /* OpenMP 2.5:
23805    schedule ( schedule-kind )
23806    schedule ( schedule-kind , expression )
23807
23808    schedule-kind:
23809      static | dynamic | guided | runtime | auto  */
23810
23811 static tree
23812 cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location)
23813 {
23814   tree c, t;
23815
23816   if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
23817     return list;
23818
23819   c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE);
23820
23821   if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
23822     {
23823       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
23824       const char *p = IDENTIFIER_POINTER (id);
23825
23826       switch (p[0])
23827         {
23828         case 'd':
23829           if (strcmp ("dynamic", p) != 0)
23830             goto invalid_kind;
23831           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_DYNAMIC;
23832           break;
23833
23834         case 'g':
23835           if (strcmp ("guided", p) != 0)
23836             goto invalid_kind;
23837           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_GUIDED;
23838           break;
23839
23840         case 'r':
23841           if (strcmp ("runtime", p) != 0)
23842             goto invalid_kind;
23843           OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_RUNTIME;
23844           break;
23845
23846         default:
23847           goto invalid_kind;
23848         }
23849     }
23850   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_STATIC))
23851     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_STATIC;
23852   else if (cp_lexer_next_token_is_keyword (parser->lexer, RID_AUTO))
23853     OMP_CLAUSE_SCHEDULE_KIND (c) = OMP_CLAUSE_SCHEDULE_AUTO;
23854   else
23855     goto invalid_kind;
23856   cp_lexer_consume_token (parser->lexer);
23857
23858   if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23859     {
23860       cp_token *token;
23861       cp_lexer_consume_token (parser->lexer);
23862
23863       token = cp_lexer_peek_token (parser->lexer);
23864       t = cp_parser_assignment_expression (parser, false, NULL);
23865
23866       if (t == error_mark_node)
23867         goto resync_fail;
23868       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_RUNTIME)
23869         error_at (token->location, "schedule %<runtime%> does not take "
23870                   "a %<chunk_size%> parameter");
23871       else if (OMP_CLAUSE_SCHEDULE_KIND (c) == OMP_CLAUSE_SCHEDULE_AUTO)
23872         error_at (token->location, "schedule %<auto%> does not take "
23873                   "a %<chunk_size%> parameter");
23874       else
23875         OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
23876
23877       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
23878         goto resync_fail;
23879     }
23880   else if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_COMMA_CLOSE_PAREN))
23881     goto resync_fail;
23882
23883   check_no_duplicate_clause (list, OMP_CLAUSE_SCHEDULE, "schedule", location);
23884   OMP_CLAUSE_CHAIN (c) = list;
23885   return c;
23886
23887  invalid_kind:
23888   cp_parser_error (parser, "invalid schedule kind");
23889  resync_fail:
23890   cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
23891                                          /*or_comma=*/false,
23892                                          /*consume_paren=*/true);
23893   return list;
23894 }
23895
23896 /* OpenMP 3.0:
23897    untied */
23898
23899 static tree
23900 cp_parser_omp_clause_untied (cp_parser *parser ATTRIBUTE_UNUSED,
23901                              tree list, location_t location)
23902 {
23903   tree c;
23904
23905   check_no_duplicate_clause (list, OMP_CLAUSE_UNTIED, "untied", location);
23906
23907   c = build_omp_clause (location, OMP_CLAUSE_UNTIED);
23908   OMP_CLAUSE_CHAIN (c) = list;
23909   return c;
23910 }
23911
23912 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
23913    is a bitmask in MASK.  Return the list of clauses found; the result
23914    of clause default goes in *pdefault.  */
23915
23916 static tree
23917 cp_parser_omp_all_clauses (cp_parser *parser, unsigned int mask,
23918                            const char *where, cp_token *pragma_tok)
23919 {
23920   tree clauses = NULL;
23921   bool first = true;
23922   cp_token *token = NULL;
23923
23924   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
23925     {
23926       pragma_omp_clause c_kind;
23927       const char *c_name;
23928       tree prev = clauses;
23929
23930       if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
23931         cp_lexer_consume_token (parser->lexer);
23932
23933       token = cp_lexer_peek_token (parser->lexer);
23934       c_kind = cp_parser_omp_clause_name (parser);
23935       first = false;
23936
23937       switch (c_kind)
23938         {
23939         case PRAGMA_OMP_CLAUSE_COLLAPSE:
23940           clauses = cp_parser_omp_clause_collapse (parser, clauses,
23941                                                    token->location);
23942           c_name = "collapse";
23943           break;
23944         case PRAGMA_OMP_CLAUSE_COPYIN:
23945           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYIN, clauses);
23946           c_name = "copyin";
23947           break;
23948         case PRAGMA_OMP_CLAUSE_COPYPRIVATE:
23949           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_COPYPRIVATE,
23950                                             clauses);
23951           c_name = "copyprivate";
23952           break;
23953         case PRAGMA_OMP_CLAUSE_DEFAULT:
23954           clauses = cp_parser_omp_clause_default (parser, clauses,
23955                                                   token->location);
23956           c_name = "default";
23957           break;
23958         case PRAGMA_OMP_CLAUSE_FIRSTPRIVATE:
23959           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_FIRSTPRIVATE,
23960                                             clauses);
23961           c_name = "firstprivate";
23962           break;
23963         case PRAGMA_OMP_CLAUSE_IF:
23964           clauses = cp_parser_omp_clause_if (parser, clauses, token->location);
23965           c_name = "if";
23966           break;
23967         case PRAGMA_OMP_CLAUSE_LASTPRIVATE:
23968           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_LASTPRIVATE,
23969                                             clauses);
23970           c_name = "lastprivate";
23971           break;
23972         case PRAGMA_OMP_CLAUSE_NOWAIT:
23973           clauses = cp_parser_omp_clause_nowait (parser, clauses, token->location);
23974           c_name = "nowait";
23975           break;
23976         case PRAGMA_OMP_CLAUSE_NUM_THREADS:
23977           clauses = cp_parser_omp_clause_num_threads (parser, clauses,
23978                                                       token->location);
23979           c_name = "num_threads";
23980           break;
23981         case PRAGMA_OMP_CLAUSE_ORDERED:
23982           clauses = cp_parser_omp_clause_ordered (parser, clauses,
23983                                                   token->location);
23984           c_name = "ordered";
23985           break;
23986         case PRAGMA_OMP_CLAUSE_PRIVATE:
23987           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_PRIVATE,
23988                                             clauses);
23989           c_name = "private";
23990           break;
23991         case PRAGMA_OMP_CLAUSE_REDUCTION:
23992           clauses = cp_parser_omp_clause_reduction (parser, clauses);
23993           c_name = "reduction";
23994           break;
23995         case PRAGMA_OMP_CLAUSE_SCHEDULE:
23996           clauses = cp_parser_omp_clause_schedule (parser, clauses,
23997                                                    token->location);
23998           c_name = "schedule";
23999           break;
24000         case PRAGMA_OMP_CLAUSE_SHARED:
24001           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_SHARED,
24002                                             clauses);
24003           c_name = "shared";
24004           break;
24005         case PRAGMA_OMP_CLAUSE_UNTIED:
24006           clauses = cp_parser_omp_clause_untied (parser, clauses,
24007                                                  token->location);
24008           c_name = "nowait";
24009           break;
24010         default:
24011           cp_parser_error (parser, "expected %<#pragma omp%> clause");
24012           goto saw_error;
24013         }
24014
24015       if (((mask >> c_kind) & 1) == 0)
24016         {
24017           /* Remove the invalid clause(s) from the list to avoid
24018              confusing the rest of the compiler.  */
24019           clauses = prev;
24020           error_at (token->location, "%qs is not valid for %qs", c_name, where);
24021         }
24022     }
24023  saw_error:
24024   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
24025   return finish_omp_clauses (clauses);
24026 }
24027
24028 /* OpenMP 2.5:
24029    structured-block:
24030      statement
24031
24032    In practice, we're also interested in adding the statement to an
24033    outer node.  So it is convenient if we work around the fact that
24034    cp_parser_statement calls add_stmt.  */
24035
24036 static unsigned
24037 cp_parser_begin_omp_structured_block (cp_parser *parser)
24038 {
24039   unsigned save = parser->in_statement;
24040
24041   /* Only move the values to IN_OMP_BLOCK if they weren't false.
24042      This preserves the "not within loop or switch" style error messages
24043      for nonsense cases like
24044         void foo() {
24045         #pragma omp single
24046           break;
24047         }
24048   */
24049   if (parser->in_statement)
24050     parser->in_statement = IN_OMP_BLOCK;
24051
24052   return save;
24053 }
24054
24055 static void
24056 cp_parser_end_omp_structured_block (cp_parser *parser, unsigned save)
24057 {
24058   parser->in_statement = save;
24059 }
24060
24061 static tree
24062 cp_parser_omp_structured_block (cp_parser *parser)
24063 {
24064   tree stmt = begin_omp_structured_block ();
24065   unsigned int save = cp_parser_begin_omp_structured_block (parser);
24066
24067   cp_parser_statement (parser, NULL_TREE, false, NULL);
24068
24069   cp_parser_end_omp_structured_block (parser, save);
24070   return finish_omp_structured_block (stmt);
24071 }
24072
24073 /* OpenMP 2.5:
24074    # pragma omp atomic new-line
24075      expression-stmt
24076
24077    expression-stmt:
24078      x binop= expr | x++ | ++x | x-- | --x
24079    binop:
24080      +, *, -, /, &, ^, |, <<, >>
24081
24082   where x is an lvalue expression with scalar type.  */
24083
24084 static void
24085 cp_parser_omp_atomic (cp_parser *parser, cp_token *pragma_tok)
24086 {
24087   tree lhs, rhs;
24088   enum tree_code code;
24089
24090   cp_parser_require_pragma_eol (parser, pragma_tok);
24091
24092   lhs = cp_parser_unary_expression (parser, /*address_p=*/false,
24093                                     /*cast_p=*/false, NULL);
24094   switch (TREE_CODE (lhs))
24095     {
24096     case ERROR_MARK:
24097       goto saw_error;
24098
24099     case PREINCREMENT_EXPR:
24100     case POSTINCREMENT_EXPR:
24101       lhs = TREE_OPERAND (lhs, 0);
24102       code = PLUS_EXPR;
24103       rhs = integer_one_node;
24104       break;
24105
24106     case PREDECREMENT_EXPR:
24107     case POSTDECREMENT_EXPR:
24108       lhs = TREE_OPERAND (lhs, 0);
24109       code = MINUS_EXPR;
24110       rhs = integer_one_node;
24111       break;
24112
24113     case COMPOUND_EXPR:
24114       if (TREE_CODE (TREE_OPERAND (lhs, 0)) == SAVE_EXPR
24115          && TREE_CODE (TREE_OPERAND (lhs, 1)) == COMPOUND_EXPR
24116          && TREE_CODE (TREE_OPERAND (TREE_OPERAND (lhs, 1), 0)) == MODIFY_EXPR
24117          && TREE_OPERAND (TREE_OPERAND (lhs, 1), 1) == TREE_OPERAND (lhs, 0)
24118          && TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND
24119                                              (TREE_OPERAND (lhs, 1), 0), 0)))
24120             == BOOLEAN_TYPE)
24121        /* Undo effects of boolean_increment for post {in,de}crement.  */
24122        lhs = TREE_OPERAND (TREE_OPERAND (lhs, 1), 0);
24123       /* FALLTHRU */
24124     case MODIFY_EXPR:
24125       if (TREE_CODE (lhs) == MODIFY_EXPR
24126          && TREE_CODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) == BOOLEAN_TYPE)
24127        {
24128          /* Undo effects of boolean_increment.  */
24129          if (integer_onep (TREE_OPERAND (lhs, 1)))
24130            {
24131              /* This is pre or post increment.  */
24132              rhs = TREE_OPERAND (lhs, 1);
24133              lhs = TREE_OPERAND (lhs, 0);
24134              code = NOP_EXPR;
24135              break;
24136            }
24137        }
24138       /* FALLTHRU */
24139     default:
24140       switch (cp_lexer_peek_token (parser->lexer)->type)
24141         {
24142         case CPP_MULT_EQ:
24143           code = MULT_EXPR;
24144           break;
24145         case CPP_DIV_EQ:
24146           code = TRUNC_DIV_EXPR;
24147           break;
24148         case CPP_PLUS_EQ:
24149           code = PLUS_EXPR;
24150           break;
24151         case CPP_MINUS_EQ:
24152           code = MINUS_EXPR;
24153           break;
24154         case CPP_LSHIFT_EQ:
24155           code = LSHIFT_EXPR;
24156           break;
24157         case CPP_RSHIFT_EQ:
24158           code = RSHIFT_EXPR;
24159           break;
24160         case CPP_AND_EQ:
24161           code = BIT_AND_EXPR;
24162           break;
24163         case CPP_OR_EQ:
24164           code = BIT_IOR_EXPR;
24165           break;
24166         case CPP_XOR_EQ:
24167           code = BIT_XOR_EXPR;
24168           break;
24169         default:
24170           cp_parser_error (parser,
24171                            "invalid operator for %<#pragma omp atomic%>");
24172           goto saw_error;
24173         }
24174       cp_lexer_consume_token (parser->lexer);
24175
24176       rhs = cp_parser_expression (parser, false, NULL);
24177       if (rhs == error_mark_node)
24178         goto saw_error;
24179       break;
24180     }
24181   finish_omp_atomic (code, lhs, rhs);
24182   cp_parser_consume_semicolon_at_end_of_statement (parser);
24183   return;
24184
24185  saw_error:
24186   cp_parser_skip_to_end_of_block_or_statement (parser);
24187 }
24188
24189
24190 /* OpenMP 2.5:
24191    # pragma omp barrier new-line  */
24192
24193 static void
24194 cp_parser_omp_barrier (cp_parser *parser, cp_token *pragma_tok)
24195 {
24196   cp_parser_require_pragma_eol (parser, pragma_tok);
24197   finish_omp_barrier ();
24198 }
24199
24200 /* OpenMP 2.5:
24201    # pragma omp critical [(name)] new-line
24202      structured-block  */
24203
24204 static tree
24205 cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok)
24206 {
24207   tree stmt, name = NULL;
24208
24209   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24210     {
24211       cp_lexer_consume_token (parser->lexer);
24212
24213       name = cp_parser_identifier (parser);
24214
24215       if (name == error_mark_node
24216           || !cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24217         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24218                                                /*or_comma=*/false,
24219                                                /*consume_paren=*/true);
24220       if (name == error_mark_node)
24221         name = NULL;
24222     }
24223   cp_parser_require_pragma_eol (parser, pragma_tok);
24224
24225   stmt = cp_parser_omp_structured_block (parser);
24226   return c_finish_omp_critical (input_location, stmt, name);
24227 }
24228
24229 /* OpenMP 2.5:
24230    # pragma omp flush flush-vars[opt] new-line
24231
24232    flush-vars:
24233      ( variable-list ) */
24234
24235 static void
24236 cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
24237 {
24238   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
24239     (void) cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
24240   cp_parser_require_pragma_eol (parser, pragma_tok);
24241
24242   finish_omp_flush ();
24243 }
24244
24245 /* Helper function, to parse omp for increment expression.  */
24246
24247 static tree
24248 cp_parser_omp_for_cond (cp_parser *parser, tree decl)
24249 {
24250   tree cond = cp_parser_binary_expression (parser, false, true,
24251                                            PREC_NOT_OPERATOR, NULL);
24252   if (cond == error_mark_node
24253       || cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24254     {
24255       cp_parser_skip_to_end_of_statement (parser);
24256       return error_mark_node;
24257     }
24258
24259   switch (TREE_CODE (cond))
24260     {
24261     case GT_EXPR:
24262     case GE_EXPR:
24263     case LT_EXPR:
24264     case LE_EXPR:
24265       break;
24266     default:
24267       return error_mark_node;
24268     }
24269
24270   /* If decl is an iterator, preserve LHS and RHS of the relational
24271      expr until finish_omp_for.  */
24272   if (decl
24273       && (type_dependent_expression_p (decl)
24274           || CLASS_TYPE_P (TREE_TYPE (decl))))
24275     return cond;
24276
24277   return build_x_binary_op (TREE_CODE (cond),
24278                             TREE_OPERAND (cond, 0), ERROR_MARK,
24279                             TREE_OPERAND (cond, 1), ERROR_MARK,
24280                             /*overload=*/NULL, tf_warning_or_error);
24281 }
24282
24283 /* Helper function, to parse omp for increment expression.  */
24284
24285 static tree
24286 cp_parser_omp_for_incr (cp_parser *parser, tree decl)
24287 {
24288   cp_token *token = cp_lexer_peek_token (parser->lexer);
24289   enum tree_code op;
24290   tree lhs, rhs;
24291   cp_id_kind idk;
24292   bool decl_first;
24293
24294   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24295     {
24296       op = (token->type == CPP_PLUS_PLUS
24297             ? PREINCREMENT_EXPR : PREDECREMENT_EXPR);
24298       cp_lexer_consume_token (parser->lexer);
24299       lhs = cp_parser_cast_expression (parser, false, false, NULL);
24300       if (lhs != decl)
24301         return error_mark_node;
24302       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24303     }
24304
24305   lhs = cp_parser_primary_expression (parser, false, false, false, &idk);
24306   if (lhs != decl)
24307     return error_mark_node;
24308
24309   token = cp_lexer_peek_token (parser->lexer);
24310   if (token->type == CPP_PLUS_PLUS || token->type == CPP_MINUS_MINUS)
24311     {
24312       op = (token->type == CPP_PLUS_PLUS
24313             ? POSTINCREMENT_EXPR : POSTDECREMENT_EXPR);
24314       cp_lexer_consume_token (parser->lexer);
24315       return build2 (op, TREE_TYPE (decl), decl, NULL_TREE);
24316     }
24317
24318   op = cp_parser_assignment_operator_opt (parser);
24319   if (op == ERROR_MARK)
24320     return error_mark_node;
24321
24322   if (op != NOP_EXPR)
24323     {
24324       rhs = cp_parser_assignment_expression (parser, false, NULL);
24325       rhs = build2 (op, TREE_TYPE (decl), decl, rhs);
24326       return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24327     }
24328
24329   lhs = cp_parser_binary_expression (parser, false, false,
24330                                      PREC_ADDITIVE_EXPRESSION, NULL);
24331   token = cp_lexer_peek_token (parser->lexer);
24332   decl_first = lhs == decl;
24333   if (decl_first)
24334     lhs = NULL_TREE;
24335   if (token->type != CPP_PLUS
24336       && token->type != CPP_MINUS)
24337     return error_mark_node;
24338
24339   do
24340     {
24341       op = token->type == CPP_PLUS ? PLUS_EXPR : MINUS_EXPR;
24342       cp_lexer_consume_token (parser->lexer);
24343       rhs = cp_parser_binary_expression (parser, false, false,
24344                                          PREC_ADDITIVE_EXPRESSION, NULL);
24345       token = cp_lexer_peek_token (parser->lexer);
24346       if (token->type == CPP_PLUS || token->type == CPP_MINUS || decl_first)
24347         {
24348           if (lhs == NULL_TREE)
24349             {
24350               if (op == PLUS_EXPR)
24351                 lhs = rhs;
24352               else
24353                 lhs = build_x_unary_op (NEGATE_EXPR, rhs, tf_warning_or_error);
24354             }
24355           else
24356             lhs = build_x_binary_op (op, lhs, ERROR_MARK, rhs, ERROR_MARK,
24357                                      NULL, tf_warning_or_error);
24358         }
24359     }
24360   while (token->type == CPP_PLUS || token->type == CPP_MINUS);
24361
24362   if (!decl_first)
24363     {
24364       if (rhs != decl || op == MINUS_EXPR)
24365         return error_mark_node;
24366       rhs = build2 (op, TREE_TYPE (decl), lhs, decl);
24367     }
24368   else
24369     rhs = build2 (PLUS_EXPR, TREE_TYPE (decl), decl, lhs);
24370
24371   return build2 (MODIFY_EXPR, TREE_TYPE (decl), decl, rhs);
24372 }
24373
24374 /* Parse the restricted form of the for statement allowed by OpenMP.  */
24375
24376 static tree
24377 cp_parser_omp_for_loop (cp_parser *parser, tree clauses, tree *par_clauses)
24378 {
24379   tree init, cond, incr, body, decl, pre_body = NULL_TREE, ret;
24380   tree real_decl, initv, condv, incrv, declv;
24381   tree this_pre_body, cl;
24382   location_t loc_first;
24383   bool collapse_err = false;
24384   int i, collapse = 1, nbraces = 0;
24385   VEC(tree,gc) *for_block = make_tree_vector ();
24386
24387   for (cl = clauses; cl; cl = OMP_CLAUSE_CHAIN (cl))
24388     if (OMP_CLAUSE_CODE (cl) == OMP_CLAUSE_COLLAPSE)
24389       collapse = tree_low_cst (OMP_CLAUSE_COLLAPSE_EXPR (cl), 0);
24390
24391   gcc_assert (collapse >= 1);
24392
24393   declv = make_tree_vec (collapse);
24394   initv = make_tree_vec (collapse);
24395   condv = make_tree_vec (collapse);
24396   incrv = make_tree_vec (collapse);
24397
24398   loc_first = cp_lexer_peek_token (parser->lexer)->location;
24399
24400   for (i = 0; i < collapse; i++)
24401     {
24402       int bracecount = 0;
24403       bool add_private_clause = false;
24404       location_t loc;
24405
24406       if (!cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24407         {
24408           cp_parser_error (parser, "for statement expected");
24409           return NULL;
24410         }
24411       loc = cp_lexer_consume_token (parser->lexer)->location;
24412
24413       if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))
24414         return NULL;
24415
24416       init = decl = real_decl = NULL;
24417       this_pre_body = push_stmt_list ();
24418       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24419         {
24420           /* See 2.5.1 (in OpenMP 3.0, similar wording is in 2.5 standard too):
24421
24422              init-expr:
24423                        var = lb
24424                        integer-type var = lb
24425                        random-access-iterator-type var = lb
24426                        pointer-type var = lb
24427           */
24428           cp_decl_specifier_seq type_specifiers;
24429
24430           /* First, try to parse as an initialized declaration.  See
24431              cp_parser_condition, from whence the bulk of this is copied.  */
24432
24433           cp_parser_parse_tentatively (parser);
24434           cp_parser_type_specifier_seq (parser, /*is_declaration=*/true,
24435                                         /*is_trailing_return=*/false,
24436                                         &type_specifiers);
24437           if (cp_parser_parse_definitely (parser))
24438             {
24439               /* If parsing a type specifier seq succeeded, then this
24440                  MUST be a initialized declaration.  */
24441               tree asm_specification, attributes;
24442               cp_declarator *declarator;
24443
24444               declarator = cp_parser_declarator (parser,
24445                                                  CP_PARSER_DECLARATOR_NAMED,
24446                                                  /*ctor_dtor_or_conv_p=*/NULL,
24447                                                  /*parenthesized_p=*/NULL,
24448                                                  /*member_p=*/false);
24449               attributes = cp_parser_attributes_opt (parser);
24450               asm_specification = cp_parser_asm_specification_opt (parser);
24451
24452               if (declarator == cp_error_declarator) 
24453                 cp_parser_skip_to_end_of_statement (parser);
24454
24455               else 
24456                 {
24457                   tree pushed_scope, auto_node;
24458
24459                   decl = start_decl (declarator, &type_specifiers,
24460                                      SD_INITIALIZED, attributes,
24461                                      /*prefix_attributes=*/NULL_TREE,
24462                                      &pushed_scope);
24463
24464                   auto_node = type_uses_auto (TREE_TYPE (decl));
24465                   if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
24466                     {
24467                       if (cp_lexer_next_token_is (parser->lexer, 
24468                                                   CPP_OPEN_PAREN))
24469                         error ("parenthesized initialization is not allowed in "
24470                                "OpenMP %<for%> loop");
24471                       else
24472                         /* Trigger an error.  */
24473                         cp_parser_require (parser, CPP_EQ, RT_EQ);
24474
24475                       init = error_mark_node;
24476                       cp_parser_skip_to_end_of_statement (parser);
24477                     }
24478                   else if (CLASS_TYPE_P (TREE_TYPE (decl))
24479                            || type_dependent_expression_p (decl)
24480                            || auto_node)
24481                     {
24482                       bool is_direct_init, is_non_constant_init;
24483
24484                       init = cp_parser_initializer (parser,
24485                                                     &is_direct_init,
24486                                                     &is_non_constant_init);
24487
24488                       if (auto_node && describable_type (init))
24489                         {
24490                           TREE_TYPE (decl)
24491                             = do_auto_deduction (TREE_TYPE (decl), init,
24492                                                  auto_node);
24493
24494                           if (!CLASS_TYPE_P (TREE_TYPE (decl))
24495                               && !type_dependent_expression_p (decl))
24496                             goto non_class;
24497                         }
24498                       
24499                       cp_finish_decl (decl, init, !is_non_constant_init,
24500                                       asm_specification,
24501                                       LOOKUP_ONLYCONVERTING);
24502                       if (CLASS_TYPE_P (TREE_TYPE (decl)))
24503                         {
24504                           VEC_safe_push (tree, gc, for_block, this_pre_body);
24505                           init = NULL_TREE;
24506                         }
24507                       else
24508                         init = pop_stmt_list (this_pre_body);
24509                       this_pre_body = NULL_TREE;
24510                     }
24511                   else
24512                     {
24513                       /* Consume '='.  */
24514                       cp_lexer_consume_token (parser->lexer);
24515                       init = cp_parser_assignment_expression (parser, false, NULL);
24516
24517                     non_class:
24518                       if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
24519                         init = error_mark_node;
24520                       else
24521                         cp_finish_decl (decl, NULL_TREE,
24522                                         /*init_const_expr_p=*/false,
24523                                         asm_specification,
24524                                         LOOKUP_ONLYCONVERTING);
24525                     }
24526
24527                   if (pushed_scope)
24528                     pop_scope (pushed_scope);
24529                 }
24530             }
24531           else 
24532             {
24533               cp_id_kind idk;
24534               /* If parsing a type specifier sequence failed, then
24535                  this MUST be a simple expression.  */
24536               cp_parser_parse_tentatively (parser);
24537               decl = cp_parser_primary_expression (parser, false, false,
24538                                                    false, &idk);
24539               if (!cp_parser_error_occurred (parser)
24540                   && decl
24541                   && DECL_P (decl)
24542                   && CLASS_TYPE_P (TREE_TYPE (decl)))
24543                 {
24544                   tree rhs;
24545
24546                   cp_parser_parse_definitely (parser);
24547                   cp_parser_require (parser, CPP_EQ, RT_EQ);
24548                   rhs = cp_parser_assignment_expression (parser, false, NULL);
24549                   finish_expr_stmt (build_x_modify_expr (decl, NOP_EXPR,
24550                                                          rhs,
24551                                                          tf_warning_or_error));
24552                   add_private_clause = true;
24553                 }
24554               else
24555                 {
24556                   decl = NULL;
24557                   cp_parser_abort_tentative_parse (parser);
24558                   init = cp_parser_expression (parser, false, NULL);
24559                   if (init)
24560                     {
24561                       if (TREE_CODE (init) == MODIFY_EXPR
24562                           || TREE_CODE (init) == MODOP_EXPR)
24563                         real_decl = TREE_OPERAND (init, 0);
24564                     }
24565                 }
24566             }
24567         }
24568       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
24569       if (this_pre_body)
24570         {
24571           this_pre_body = pop_stmt_list (this_pre_body);
24572           if (pre_body)
24573             {
24574               tree t = pre_body;
24575               pre_body = push_stmt_list ();
24576               add_stmt (t);
24577               add_stmt (this_pre_body);
24578               pre_body = pop_stmt_list (pre_body);
24579             }
24580           else
24581             pre_body = this_pre_body;
24582         }
24583
24584       if (decl)
24585         real_decl = decl;
24586       if (par_clauses != NULL && real_decl != NULL_TREE)
24587         {
24588           tree *c;
24589           for (c = par_clauses; *c ; )
24590             if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_FIRSTPRIVATE
24591                 && OMP_CLAUSE_DECL (*c) == real_decl)
24592               {
24593                 error_at (loc, "iteration variable %qD"
24594                           " should not be firstprivate", real_decl);
24595                 *c = OMP_CLAUSE_CHAIN (*c);
24596               }
24597             else if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_LASTPRIVATE
24598                      && OMP_CLAUSE_DECL (*c) == real_decl)
24599               {
24600                 /* Add lastprivate (decl) clause to OMP_FOR_CLAUSES,
24601                    change it to shared (decl) in OMP_PARALLEL_CLAUSES.  */
24602                 tree l = build_omp_clause (loc, OMP_CLAUSE_LASTPRIVATE);
24603                 OMP_CLAUSE_DECL (l) = real_decl;
24604                 OMP_CLAUSE_CHAIN (l) = clauses;
24605                 CP_OMP_CLAUSE_INFO (l) = CP_OMP_CLAUSE_INFO (*c);
24606                 clauses = l;
24607                 OMP_CLAUSE_SET_CODE (*c, OMP_CLAUSE_SHARED);
24608                 CP_OMP_CLAUSE_INFO (*c) = NULL;
24609                 add_private_clause = false;
24610               }
24611             else
24612               {
24613                 if (OMP_CLAUSE_CODE (*c) == OMP_CLAUSE_PRIVATE
24614                     && OMP_CLAUSE_DECL (*c) == real_decl)
24615                   add_private_clause = false;
24616                 c = &OMP_CLAUSE_CHAIN (*c);
24617               }
24618         }
24619
24620       if (add_private_clause)
24621         {
24622           tree c;
24623           for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
24624             {
24625               if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
24626                    || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
24627                   && OMP_CLAUSE_DECL (c) == decl)
24628                 break;
24629               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
24630                        && OMP_CLAUSE_DECL (c) == decl)
24631                 error_at (loc, "iteration variable %qD "
24632                           "should not be firstprivate",
24633                           decl);
24634               else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
24635                        && OMP_CLAUSE_DECL (c) == decl)
24636                 error_at (loc, "iteration variable %qD should not be reduction",
24637                           decl);
24638             }
24639           if (c == NULL)
24640             {
24641               c = build_omp_clause (loc, OMP_CLAUSE_PRIVATE);
24642               OMP_CLAUSE_DECL (c) = decl;
24643               c = finish_omp_clauses (c);
24644               if (c)
24645                 {
24646                   OMP_CLAUSE_CHAIN (c) = clauses;
24647                   clauses = c;
24648                 }
24649             }
24650         }
24651
24652       cond = NULL;
24653       if (cp_lexer_next_token_is_not (parser->lexer, CPP_SEMICOLON))
24654         cond = cp_parser_omp_for_cond (parser, decl);
24655       cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON);
24656
24657       incr = NULL;
24658       if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
24659         {
24660           /* If decl is an iterator, preserve the operator on decl
24661              until finish_omp_for.  */
24662           if (decl
24663               && ((type_dependent_expression_p (decl)
24664                    && !POINTER_TYPE_P (TREE_TYPE (decl)))
24665                   || CLASS_TYPE_P (TREE_TYPE (decl))))
24666             incr = cp_parser_omp_for_incr (parser, decl);
24667           else
24668             incr = cp_parser_expression (parser, false, NULL);
24669         }
24670
24671       if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
24672         cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
24673                                                /*or_comma=*/false,
24674                                                /*consume_paren=*/true);
24675
24676       TREE_VEC_ELT (declv, i) = decl;
24677       TREE_VEC_ELT (initv, i) = init;
24678       TREE_VEC_ELT (condv, i) = cond;
24679       TREE_VEC_ELT (incrv, i) = incr;
24680
24681       if (i == collapse - 1)
24682         break;
24683
24684       /* FIXME: OpenMP 3.0 draft isn't very clear on what exactly is allowed
24685          in between the collapsed for loops to be still considered perfectly
24686          nested.  Hopefully the final version clarifies this.
24687          For now handle (multiple) {'s and empty statements.  */
24688       cp_parser_parse_tentatively (parser);
24689       do
24690         {
24691           if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24692             break;
24693           else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
24694             {
24695               cp_lexer_consume_token (parser->lexer);
24696               bracecount++;
24697             }
24698           else if (bracecount
24699                    && cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
24700             cp_lexer_consume_token (parser->lexer);
24701           else
24702             {
24703               loc = cp_lexer_peek_token (parser->lexer)->location;
24704               error_at (loc, "not enough collapsed for loops");
24705               collapse_err = true;
24706               cp_parser_abort_tentative_parse (parser);
24707               declv = NULL_TREE;
24708               break;
24709             }
24710         }
24711       while (1);
24712
24713       if (declv)
24714         {
24715           cp_parser_parse_definitely (parser);
24716           nbraces += bracecount;
24717         }
24718     }
24719
24720   /* Note that we saved the original contents of this flag when we entered
24721      the structured block, and so we don't need to re-save it here.  */
24722   parser->in_statement = IN_OMP_FOR;
24723
24724   /* Note that the grammar doesn't call for a structured block here,
24725      though the loop as a whole is a structured block.  */
24726   body = push_stmt_list ();
24727   cp_parser_statement (parser, NULL_TREE, false, NULL);
24728   body = pop_stmt_list (body);
24729
24730   if (declv == NULL_TREE)
24731     ret = NULL_TREE;
24732   else
24733     ret = finish_omp_for (loc_first, declv, initv, condv, incrv, body,
24734                           pre_body, clauses);
24735
24736   while (nbraces)
24737     {
24738       if (cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_BRACE))
24739         {
24740           cp_lexer_consume_token (parser->lexer);
24741           nbraces--;
24742         }
24743       else if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
24744         cp_lexer_consume_token (parser->lexer);
24745       else
24746         {
24747           if (!collapse_err)
24748             {
24749               error_at (cp_lexer_peek_token (parser->lexer)->location,
24750                         "collapsed loops not perfectly nested");
24751             }
24752           collapse_err = true;
24753           cp_parser_statement_seq_opt (parser, NULL);
24754           if (cp_lexer_next_token_is (parser->lexer, CPP_EOF))
24755             break;
24756         }
24757     }
24758
24759   while (!VEC_empty (tree, for_block))
24760     add_stmt (pop_stmt_list (VEC_pop (tree, for_block)));
24761   release_tree_vector (for_block);
24762
24763   return ret;
24764 }
24765
24766 /* OpenMP 2.5:
24767    #pragma omp for for-clause[optseq] new-line
24768      for-loop  */
24769
24770 #define OMP_FOR_CLAUSE_MASK                             \
24771         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24772         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24773         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
24774         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24775         | (1u << PRAGMA_OMP_CLAUSE_ORDERED)             \
24776         | (1u << PRAGMA_OMP_CLAUSE_SCHEDULE)            \
24777         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT)              \
24778         | (1u << PRAGMA_OMP_CLAUSE_COLLAPSE))
24779
24780 static tree
24781 cp_parser_omp_for (cp_parser *parser, cp_token *pragma_tok)
24782 {
24783   tree clauses, sb, ret;
24784   unsigned int save;
24785
24786   clauses = cp_parser_omp_all_clauses (parser, OMP_FOR_CLAUSE_MASK,
24787                                        "#pragma omp for", pragma_tok);
24788
24789   sb = begin_omp_structured_block ();
24790   save = cp_parser_begin_omp_structured_block (parser);
24791
24792   ret = cp_parser_omp_for_loop (parser, clauses, NULL);
24793
24794   cp_parser_end_omp_structured_block (parser, save);
24795   add_stmt (finish_omp_structured_block (sb));
24796
24797   return ret;
24798 }
24799
24800 /* OpenMP 2.5:
24801    # pragma omp master new-line
24802      structured-block  */
24803
24804 static tree
24805 cp_parser_omp_master (cp_parser *parser, cp_token *pragma_tok)
24806 {
24807   cp_parser_require_pragma_eol (parser, pragma_tok);
24808   return c_finish_omp_master (input_location,
24809                               cp_parser_omp_structured_block (parser));
24810 }
24811
24812 /* OpenMP 2.5:
24813    # pragma omp ordered new-line
24814      structured-block  */
24815
24816 static tree
24817 cp_parser_omp_ordered (cp_parser *parser, cp_token *pragma_tok)
24818 {
24819   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
24820   cp_parser_require_pragma_eol (parser, pragma_tok);
24821   return c_finish_omp_ordered (loc, cp_parser_omp_structured_block (parser));
24822 }
24823
24824 /* OpenMP 2.5:
24825
24826    section-scope:
24827      { section-sequence }
24828
24829    section-sequence:
24830      section-directive[opt] structured-block
24831      section-sequence section-directive structured-block  */
24832
24833 static tree
24834 cp_parser_omp_sections_scope (cp_parser *parser)
24835 {
24836   tree stmt, substmt;
24837   bool error_suppress = false;
24838   cp_token *tok;
24839
24840   if (!cp_parser_require (parser, CPP_OPEN_BRACE, RT_OPEN_BRACE))
24841     return NULL_TREE;
24842
24843   stmt = push_stmt_list ();
24844
24845   if (cp_lexer_peek_token (parser->lexer)->pragma_kind != PRAGMA_OMP_SECTION)
24846     {
24847       unsigned save;
24848
24849       substmt = begin_omp_structured_block ();
24850       save = cp_parser_begin_omp_structured_block (parser);
24851
24852       while (1)
24853         {
24854           cp_parser_statement (parser, NULL_TREE, false, NULL);
24855
24856           tok = cp_lexer_peek_token (parser->lexer);
24857           if (tok->pragma_kind == PRAGMA_OMP_SECTION)
24858             break;
24859           if (tok->type == CPP_CLOSE_BRACE)
24860             break;
24861           if (tok->type == CPP_EOF)
24862             break;
24863         }
24864
24865       cp_parser_end_omp_structured_block (parser, save);
24866       substmt = finish_omp_structured_block (substmt);
24867       substmt = build1 (OMP_SECTION, void_type_node, substmt);
24868       add_stmt (substmt);
24869     }
24870
24871   while (1)
24872     {
24873       tok = cp_lexer_peek_token (parser->lexer);
24874       if (tok->type == CPP_CLOSE_BRACE)
24875         break;
24876       if (tok->type == CPP_EOF)
24877         break;
24878
24879       if (tok->pragma_kind == PRAGMA_OMP_SECTION)
24880         {
24881           cp_lexer_consume_token (parser->lexer);
24882           cp_parser_require_pragma_eol (parser, tok);
24883           error_suppress = false;
24884         }
24885       else if (!error_suppress)
24886         {
24887           cp_parser_error (parser, "expected %<#pragma omp section%> or %<}%>");
24888           error_suppress = true;
24889         }
24890
24891       substmt = cp_parser_omp_structured_block (parser);
24892       substmt = build1 (OMP_SECTION, void_type_node, substmt);
24893       add_stmt (substmt);
24894     }
24895   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
24896
24897   substmt = pop_stmt_list (stmt);
24898
24899   stmt = make_node (OMP_SECTIONS);
24900   TREE_TYPE (stmt) = void_type_node;
24901   OMP_SECTIONS_BODY (stmt) = substmt;
24902
24903   add_stmt (stmt);
24904   return stmt;
24905 }
24906
24907 /* OpenMP 2.5:
24908    # pragma omp sections sections-clause[optseq] newline
24909      sections-scope  */
24910
24911 #define OMP_SECTIONS_CLAUSE_MASK                        \
24912         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24913         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24914         | (1u << PRAGMA_OMP_CLAUSE_LASTPRIVATE)         \
24915         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24916         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
24917
24918 static tree
24919 cp_parser_omp_sections (cp_parser *parser, cp_token *pragma_tok)
24920 {
24921   tree clauses, ret;
24922
24923   clauses = cp_parser_omp_all_clauses (parser, OMP_SECTIONS_CLAUSE_MASK,
24924                                        "#pragma omp sections", pragma_tok);
24925
24926   ret = cp_parser_omp_sections_scope (parser);
24927   if (ret)
24928     OMP_SECTIONS_CLAUSES (ret) = clauses;
24929
24930   return ret;
24931 }
24932
24933 /* OpenMP 2.5:
24934    # pragma parallel parallel-clause new-line
24935    # pragma parallel for parallel-for-clause new-line
24936    # pragma parallel sections parallel-sections-clause new-line  */
24937
24938 #define OMP_PARALLEL_CLAUSE_MASK                        \
24939         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
24940         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
24941         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
24942         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
24943         | (1u << PRAGMA_OMP_CLAUSE_SHARED)              \
24944         | (1u << PRAGMA_OMP_CLAUSE_COPYIN)              \
24945         | (1u << PRAGMA_OMP_CLAUSE_REDUCTION)           \
24946         | (1u << PRAGMA_OMP_CLAUSE_NUM_THREADS))
24947
24948 static tree
24949 cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok)
24950 {
24951   enum pragma_kind p_kind = PRAGMA_OMP_PARALLEL;
24952   const char *p_name = "#pragma omp parallel";
24953   tree stmt, clauses, par_clause, ws_clause, block;
24954   unsigned int mask = OMP_PARALLEL_CLAUSE_MASK;
24955   unsigned int save;
24956   location_t loc = cp_lexer_peek_token (parser->lexer)->location;
24957
24958   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_FOR))
24959     {
24960       cp_lexer_consume_token (parser->lexer);
24961       p_kind = PRAGMA_OMP_PARALLEL_FOR;
24962       p_name = "#pragma omp parallel for";
24963       mask |= OMP_FOR_CLAUSE_MASK;
24964       mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
24965     }
24966   else if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
24967     {
24968       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
24969       const char *p = IDENTIFIER_POINTER (id);
24970       if (strcmp (p, "sections") == 0)
24971         {
24972           cp_lexer_consume_token (parser->lexer);
24973           p_kind = PRAGMA_OMP_PARALLEL_SECTIONS;
24974           p_name = "#pragma omp parallel sections";
24975           mask |= OMP_SECTIONS_CLAUSE_MASK;
24976           mask &= ~(1u << PRAGMA_OMP_CLAUSE_NOWAIT);
24977         }
24978     }
24979
24980   clauses = cp_parser_omp_all_clauses (parser, mask, p_name, pragma_tok);
24981   block = begin_omp_parallel ();
24982   save = cp_parser_begin_omp_structured_block (parser);
24983
24984   switch (p_kind)
24985     {
24986     case PRAGMA_OMP_PARALLEL:
24987       cp_parser_statement (parser, NULL_TREE, false, NULL);
24988       par_clause = clauses;
24989       break;
24990
24991     case PRAGMA_OMP_PARALLEL_FOR:
24992       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
24993       cp_parser_omp_for_loop (parser, ws_clause, &par_clause);
24994       break;
24995
24996     case PRAGMA_OMP_PARALLEL_SECTIONS:
24997       c_split_parallel_clauses (loc, clauses, &par_clause, &ws_clause);
24998       stmt = cp_parser_omp_sections_scope (parser);
24999       if (stmt)
25000         OMP_SECTIONS_CLAUSES (stmt) = ws_clause;
25001       break;
25002
25003     default:
25004       gcc_unreachable ();
25005     }
25006
25007   cp_parser_end_omp_structured_block (parser, save);
25008   stmt = finish_omp_parallel (par_clause, block);
25009   if (p_kind != PRAGMA_OMP_PARALLEL)
25010     OMP_PARALLEL_COMBINED (stmt) = 1;
25011   return stmt;
25012 }
25013
25014 /* OpenMP 2.5:
25015    # pragma omp single single-clause[optseq] new-line
25016      structured-block  */
25017
25018 #define OMP_SINGLE_CLAUSE_MASK                          \
25019         ( (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25020         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25021         | (1u << PRAGMA_OMP_CLAUSE_COPYPRIVATE)         \
25022         | (1u << PRAGMA_OMP_CLAUSE_NOWAIT))
25023
25024 static tree
25025 cp_parser_omp_single (cp_parser *parser, cp_token *pragma_tok)
25026 {
25027   tree stmt = make_node (OMP_SINGLE);
25028   TREE_TYPE (stmt) = void_type_node;
25029
25030   OMP_SINGLE_CLAUSES (stmt)
25031     = cp_parser_omp_all_clauses (parser, OMP_SINGLE_CLAUSE_MASK,
25032                                  "#pragma omp single", pragma_tok);
25033   OMP_SINGLE_BODY (stmt) = cp_parser_omp_structured_block (parser);
25034
25035   return add_stmt (stmt);
25036 }
25037
25038 /* OpenMP 3.0:
25039    # pragma omp task task-clause[optseq] new-line
25040      structured-block  */
25041
25042 #define OMP_TASK_CLAUSE_MASK                            \
25043         ( (1u << PRAGMA_OMP_CLAUSE_IF)                  \
25044         | (1u << PRAGMA_OMP_CLAUSE_UNTIED)              \
25045         | (1u << PRAGMA_OMP_CLAUSE_DEFAULT)             \
25046         | (1u << PRAGMA_OMP_CLAUSE_PRIVATE)             \
25047         | (1u << PRAGMA_OMP_CLAUSE_FIRSTPRIVATE)        \
25048         | (1u << PRAGMA_OMP_CLAUSE_SHARED))
25049
25050 static tree
25051 cp_parser_omp_task (cp_parser *parser, cp_token *pragma_tok)
25052 {
25053   tree clauses, block;
25054   unsigned int save;
25055
25056   clauses = cp_parser_omp_all_clauses (parser, OMP_TASK_CLAUSE_MASK,
25057                                        "#pragma omp task", pragma_tok);
25058   block = begin_omp_task ();
25059   save = cp_parser_begin_omp_structured_block (parser);
25060   cp_parser_statement (parser, NULL_TREE, false, NULL);
25061   cp_parser_end_omp_structured_block (parser, save);
25062   return finish_omp_task (clauses, block);
25063 }
25064
25065 /* OpenMP 3.0:
25066    # pragma omp taskwait new-line  */
25067
25068 static void
25069 cp_parser_omp_taskwait (cp_parser *parser, cp_token *pragma_tok)
25070 {
25071   cp_parser_require_pragma_eol (parser, pragma_tok);
25072   finish_omp_taskwait ();
25073 }
25074
25075 /* OpenMP 2.5:
25076    # pragma omp threadprivate (variable-list) */
25077
25078 static void
25079 cp_parser_omp_threadprivate (cp_parser *parser, cp_token *pragma_tok)
25080 {
25081   tree vars;
25082
25083   vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
25084   cp_parser_require_pragma_eol (parser, pragma_tok);
25085
25086   finish_omp_threadprivate (vars);
25087 }
25088
25089 /* Main entry point to OpenMP statement pragmas.  */
25090
25091 static void
25092 cp_parser_omp_construct (cp_parser *parser, cp_token *pragma_tok)
25093 {
25094   tree stmt;
25095
25096   switch (pragma_tok->pragma_kind)
25097     {
25098     case PRAGMA_OMP_ATOMIC:
25099       cp_parser_omp_atomic (parser, pragma_tok);
25100       return;
25101     case PRAGMA_OMP_CRITICAL:
25102       stmt = cp_parser_omp_critical (parser, pragma_tok);
25103       break;
25104     case PRAGMA_OMP_FOR:
25105       stmt = cp_parser_omp_for (parser, pragma_tok);
25106       break;
25107     case PRAGMA_OMP_MASTER:
25108       stmt = cp_parser_omp_master (parser, pragma_tok);
25109       break;
25110     case PRAGMA_OMP_ORDERED:
25111       stmt = cp_parser_omp_ordered (parser, pragma_tok);
25112       break;
25113     case PRAGMA_OMP_PARALLEL:
25114       stmt = cp_parser_omp_parallel (parser, pragma_tok);
25115       break;
25116     case PRAGMA_OMP_SECTIONS:
25117       stmt = cp_parser_omp_sections (parser, pragma_tok);
25118       break;
25119     case PRAGMA_OMP_SINGLE:
25120       stmt = cp_parser_omp_single (parser, pragma_tok);
25121       break;
25122     case PRAGMA_OMP_TASK:
25123       stmt = cp_parser_omp_task (parser, pragma_tok);
25124       break;
25125     default:
25126       gcc_unreachable ();
25127     }
25128
25129   if (stmt)
25130     SET_EXPR_LOCATION (stmt, pragma_tok->location);
25131 }
25132 \f
25133 /* The parser.  */
25134
25135 static GTY (()) cp_parser *the_parser;
25136
25137 \f
25138 /* Special handling for the first token or line in the file.  The first
25139    thing in the file might be #pragma GCC pch_preprocess, which loads a
25140    PCH file, which is a GC collection point.  So we need to handle this
25141    first pragma without benefit of an existing lexer structure.
25142
25143    Always returns one token to the caller in *FIRST_TOKEN.  This is
25144    either the true first token of the file, or the first token after
25145    the initial pragma.  */
25146
25147 static void
25148 cp_parser_initial_pragma (cp_token *first_token)
25149 {
25150   tree name = NULL;
25151
25152   cp_lexer_get_preprocessor_token (NULL, first_token);
25153   if (first_token->pragma_kind != PRAGMA_GCC_PCH_PREPROCESS)
25154     return;
25155
25156   cp_lexer_get_preprocessor_token (NULL, first_token);
25157   if (first_token->type == CPP_STRING)
25158     {
25159       name = first_token->u.value;
25160
25161       cp_lexer_get_preprocessor_token (NULL, first_token);
25162       if (first_token->type != CPP_PRAGMA_EOL)
25163         error_at (first_token->location,
25164                   "junk at end of %<#pragma GCC pch_preprocess%>");
25165     }
25166   else
25167     error_at (first_token->location, "expected string literal");
25168
25169   /* Skip to the end of the pragma.  */
25170   while (first_token->type != CPP_PRAGMA_EOL && first_token->type != CPP_EOF)
25171     cp_lexer_get_preprocessor_token (NULL, first_token);
25172
25173   /* Now actually load the PCH file.  */
25174   if (name)
25175     c_common_pch_pragma (parse_in, TREE_STRING_POINTER (name));
25176
25177   /* Read one more token to return to our caller.  We have to do this
25178      after reading the PCH file in, since its pointers have to be
25179      live.  */
25180   cp_lexer_get_preprocessor_token (NULL, first_token);
25181 }
25182
25183 /* Normal parsing of a pragma token.  Here we can (and must) use the
25184    regular lexer.  */
25185
25186 static bool
25187 cp_parser_pragma (cp_parser *parser, enum pragma_context context)
25188 {
25189   cp_token *pragma_tok;
25190   unsigned int id;
25191
25192   pragma_tok = cp_lexer_consume_token (parser->lexer);
25193   gcc_assert (pragma_tok->type == CPP_PRAGMA);
25194   parser->lexer->in_pragma = true;
25195
25196   id = pragma_tok->pragma_kind;
25197   switch (id)
25198     {
25199     case PRAGMA_GCC_PCH_PREPROCESS:
25200       error_at (pragma_tok->location,
25201                 "%<#pragma GCC pch_preprocess%> must be first");
25202       break;
25203
25204     case PRAGMA_OMP_BARRIER:
25205       switch (context)
25206         {
25207         case pragma_compound:
25208           cp_parser_omp_barrier (parser, pragma_tok);
25209           return false;
25210         case pragma_stmt:
25211           error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
25212                     "used in compound statements");
25213           break;
25214         default:
25215           goto bad_stmt;
25216         }
25217       break;
25218
25219     case PRAGMA_OMP_FLUSH:
25220       switch (context)
25221         {
25222         case pragma_compound:
25223           cp_parser_omp_flush (parser, pragma_tok);
25224           return false;
25225         case pragma_stmt:
25226           error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
25227                     "used in compound statements");
25228           break;
25229         default:
25230           goto bad_stmt;
25231         }
25232       break;
25233
25234     case PRAGMA_OMP_TASKWAIT:
25235       switch (context)
25236         {
25237         case pragma_compound:
25238           cp_parser_omp_taskwait (parser, pragma_tok);
25239           return false;
25240         case pragma_stmt:
25241           error_at (pragma_tok->location,
25242                     "%<#pragma omp taskwait%> may only be "
25243                     "used in compound statements");
25244           break;
25245         default:
25246           goto bad_stmt;
25247         }
25248       break;
25249
25250     case PRAGMA_OMP_THREADPRIVATE:
25251       cp_parser_omp_threadprivate (parser, pragma_tok);
25252       return false;
25253
25254     case PRAGMA_OMP_ATOMIC:
25255     case PRAGMA_OMP_CRITICAL:
25256     case PRAGMA_OMP_FOR:
25257     case PRAGMA_OMP_MASTER:
25258     case PRAGMA_OMP_ORDERED:
25259     case PRAGMA_OMP_PARALLEL:
25260     case PRAGMA_OMP_SECTIONS:
25261     case PRAGMA_OMP_SINGLE:
25262     case PRAGMA_OMP_TASK:
25263       if (context == pragma_external)
25264         goto bad_stmt;
25265       cp_parser_omp_construct (parser, pragma_tok);
25266       return true;
25267
25268     case PRAGMA_OMP_SECTION:
25269       error_at (pragma_tok->location, 
25270                 "%<#pragma omp section%> may only be used in "
25271                 "%<#pragma omp sections%> construct");
25272       break;
25273
25274     default:
25275       gcc_assert (id >= PRAGMA_FIRST_EXTERNAL);
25276       c_invoke_pragma_handler (id);
25277       break;
25278
25279     bad_stmt:
25280       cp_parser_error (parser, "expected declaration specifiers");
25281       break;
25282     }
25283
25284   cp_parser_skip_to_pragma_eol (parser, pragma_tok);
25285   return false;
25286 }
25287
25288 /* The interface the pragma parsers have to the lexer.  */
25289
25290 enum cpp_ttype
25291 pragma_lex (tree *value)
25292 {
25293   cp_token *tok;
25294   enum cpp_ttype ret;
25295
25296   tok = cp_lexer_peek_token (the_parser->lexer);
25297
25298   ret = tok->type;
25299   *value = tok->u.value;
25300
25301   if (ret == CPP_PRAGMA_EOL || ret == CPP_EOF)
25302     ret = CPP_EOF;
25303   else if (ret == CPP_STRING)
25304     *value = cp_parser_string_literal (the_parser, false, false);
25305   else
25306     {
25307       cp_lexer_consume_token (the_parser->lexer);
25308       if (ret == CPP_KEYWORD)
25309         ret = CPP_NAME;
25310     }
25311
25312   return ret;
25313 }
25314
25315 \f
25316 /* External interface.  */
25317
25318 /* Parse one entire translation unit.  */
25319
25320 void
25321 c_parse_file (void)
25322 {
25323   static bool already_called = false;
25324
25325   if (already_called)
25326     {
25327       sorry ("inter-module optimizations not implemented for C++");
25328       return;
25329     }
25330   already_called = true;
25331
25332   the_parser = cp_parser_new ();
25333   push_deferring_access_checks (flag_access_control
25334                                 ? dk_no_deferred : dk_no_check);
25335   cp_parser_translation_unit (the_parser);
25336   the_parser = NULL;
25337 }
25338
25339 #include "gt-cp-parser.h"