OSDN Git Service

* gcc.c-torture/compile/20021120-1.c: New test.
[pf3gnuchains/gcc-fork.git] / gcc / c-parse.in
index 679d42d..eab176a 100644 (file)
@@ -1,6 +1,6 @@
 /* YACC parser for C syntax and for Objective C.  -*-c-*-
    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+   1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -29,7 +29,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    written by AT&T, but I have never seen it.  */
 
 ifobjc
-%expect 31 /* shift/reduce conflicts, and 1 reduce/reduce conflict.  */
+%expect 32 /* shift/reduce conflicts, and 1 reduce/reduce conflict.  */
 end ifobjc
 ifc
 %expect 10 /* shift/reduce conflicts, and no reduce/reduce conflicts.  */
@@ -43,14 +43,13 @@ end ifc
 #include "cpplib.h"
 #include "intl.h"
 #include "timevar.h"
-#include "c-lex.h"             /* Gets YYDEBUG macro.  */
+#include "c-pragma.h"          /* For YYDEBUG definition, and parse_in.  */
 #include "c-tree.h"
-#include "c-pragma.h"
 #include "flags.h"
 #include "output.h"
 #include "toplev.h"
 #include "ggc.h"
-  
+
 #ifdef MULTIBYTE_CHARS
 #include <locale.h>
 #endif
@@ -256,28 +255,28 @@ ifobjc
 end ifobjc
 \f
 %{
-/* Number of statements (loosely speaking) and compound statements 
+/* Number of statements (loosely speaking) and compound statements
    seen so far.  */
 static int stmt_count;
 static int compstmt_count;
-  
+
 /* Input file and line number of the end of the body of last simple_if;
    used by the stmt-rule immediately after simple_if returns.  */
 static const char *if_stmt_file;
 static int if_stmt_line;
 
 /* List of types and structure classes of the current declaration.  */
-static tree current_declspecs = NULL_TREE;
-static tree prefix_attributes = NULL_TREE;
+static GTY(()) tree current_declspecs;
+static GTY(()) tree prefix_attributes;
 
 /* List of all the attributes applying to the identifier currently being
    declared; includes prefix_attributes and possibly some more attributes
    just after a comma.  */
-static tree all_prefix_attributes = NULL_TREE;
+static GTY(()) tree all_prefix_attributes;
 
 /* Stack of saved values of current_declspecs, prefix_attributes and
    all_prefix_attributes.  */
-static tree declspec_stack;
+static GTY(()) tree declspec_stack;
 
 /* PUSH_DECLSPEC_STACK is called from setspecs; POP_DECLSPEC_STACK
    should be called from the productions making use of setspecs.  */
@@ -299,17 +298,19 @@ static tree declspec_stack;
 
 /* For __extension__, save/restore the warning flags which are
    controlled by __extension__.  */
-#define SAVE_WARN_FLAGS()                      \
+#define SAVE_EXT_FLAGS()                       \
        size_int (pedantic                      \
                  | (warn_pointer_arith << 1)   \
-                 | (warn_traditional << 2))
+                 | (warn_traditional << 2)     \
+                 | (flag_iso << 3))
 
-#define RESTORE_WARN_FLAGS(tval)               \
+#define RESTORE_EXT_FLAGS(tval)                        \
   do {                                         \
     int val = tree_low_cst (tval, 0);          \
     pedantic = val & 1;                                \
     warn_pointer_arith = (val >> 1) & 1;       \
     warn_traditional = (val >> 2) & 1;         \
+    flag_iso = (val >> 3) & 1;                 \
   } while (0)
 
 ifobjc
@@ -319,8 +320,8 @@ static enum tree_code objc_inherit_code;
 static int objc_pq_context = 0, objc_public_flag = 0;
 
 /* The following flag is needed to contextualize ObjC lexical analysis.
-   In some cases (e.g., 'int NSObject;'), it is undesirable to bind 
-   an identifier to an ObjC class, even if a class with that name 
+   In some cases (e.g., 'int NSObject;'), it is undesirable to bind
+   an identifier to an ObjC class, even if a class with that name
    exists.  */
 static int objc_need_raw_identifier;
 #define OBJC_NEED_RAW_IDENTIFIER(VAL)  objc_need_raw_identifier = VAL
@@ -330,6 +331,8 @@ ifc
 #define OBJC_NEED_RAW_IDENTIFIER(VAL)  /* nothing */
 end ifc
 
+static bool parsing_iso_function_signature;
+
 /* Tell yyparse how to print a token's value, if yydebug is set.  */
 
 #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
@@ -342,16 +345,11 @@ static inline int _yylex  PARAMS ((void));
 static int  yylex        PARAMS ((void));
 static void init_reswords PARAMS ((void));
 
-/* Add GC roots for variables local to this file.  */
+  /* Initialisation routine for this file.  */
 void
 c_parse_init ()
 {
   init_reswords ();
-
-  ggc_add_tree_root (&declspec_stack, 1);
-  ggc_add_tree_root (&current_declspecs, 1);
-  ggc_add_tree_root (&prefix_attributes, 1);
-  ggc_add_tree_root (&all_prefix_attributes, 1);
 }
 
 %}
@@ -386,6 +384,11 @@ extdefs:
        ;
 
 extdef:
+       extdef_1
+       { parsing_iso_function_signature = false; } /* Reset after any external definition.  */
+       ;
+
+extdef_1:
        fndef
        | datadef
 ifobjc
@@ -400,7 +403,7 @@ end ifobjc
                  else
                    error ("argument of `asm' is not a constant string"); }
        | extension extdef
-               { RESTORE_WARN_FLAGS ($1); }
+               { RESTORE_EXT_FLAGS ($1); }
        ;
 
 datadef:
@@ -408,7 +411,7 @@ datadef:
                { if (pedantic)
                    error ("ISO C forbids data definition with no type or storage class");
                  else
-                   warning ("data definition has no type or storage class"); 
+                   warning ("data definition has no type or storage class");
 
                  POP_DECLSPEC_STACK; }
         | declspecs_nots setspecs notype_initdecls ';'
@@ -435,7 +438,7 @@ fndef:
          save_filename save_lineno compstmt_or_error
                { DECL_SOURCE_FILE (current_function_decl) = $7;
                  DECL_SOURCE_LINE (current_function_decl) = $8;
-                 finish_function (0, 1); 
+                 finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | declspecs_ts setspecs declarator error
                { POP_DECLSPEC_STACK; }
@@ -449,7 +452,7 @@ fndef:
          save_filename save_lineno compstmt_or_error
                { DECL_SOURCE_FILE (current_function_decl) = $7;
                  DECL_SOURCE_LINE (current_function_decl) = $8;
-                 finish_function (0, 1); 
+                 finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | declspecs_nots setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
@@ -463,7 +466,7 @@ fndef:
          save_filename save_lineno compstmt_or_error
                { DECL_SOURCE_FILE (current_function_decl) = $6;
                  DECL_SOURCE_LINE (current_function_decl) = $7;
-                 finish_function (0, 1); 
+                 finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
@@ -523,28 +526,13 @@ unary_expr:
        /* __extension__ turns off -pedantic for following primary.  */
        | extension cast_expr     %prec UNARY
                { $$ = $2;
-                 RESTORE_WARN_FLAGS ($1); }
+                 RESTORE_EXT_FLAGS ($1); }
        | unop cast_expr  %prec UNARY
                { $$ = build_unary_op ($1, $2, 0);
                  overflow_warning ($$); }
        /* Refer to the address of a label as a pointer.  */
        | ANDAND identifier
                { $$ = finish_label_address_expr ($2); }
-/* This seems to be impossible on some machines, so let's turn it off.
-   You can use __builtin_next_arg to find the anonymous stack args.
-       | '&' ELLIPSIS
-               { tree types = TYPE_ARG_TYPES (TREE_TYPE (current_function_decl));
-                 $$ = error_mark_node;
-                 if (TREE_VALUE (tree_last (types)) == void_type_node)
-                   error ("`&...' used in function with fixed number of arguments");
-                 else
-                   {
-                     if (pedantic)
-                       pedwarn ("ISO C forbids `&...'");
-                     $$ = tree_last (DECL_ARGUMENTS (current_function_decl));
-                     $$ = build_unary_op (ADDR_EXPR, $$, 0);
-                   } }
-*/
        | sizeof unary_expr  %prec UNARY
                { skip_evaluation--;
                  if (TREE_CODE ($2) == COMPONENT_REF
@@ -574,6 +562,10 @@ alignof:
        ALIGNOF { skip_evaluation++; }
        ;
 
+typeof:
+       TYPEOF { skip_evaluation++; }
+       ;
+
 cast_expr:
        unary_expr
        | '(' typename ')' cast_expr  %prec UNARY
@@ -671,7 +663,7 @@ primary:
                { $$ = fix_string_type ($$); }
        | VAR_FUNC_NAME
                { $$ = fname_decl (C_RID_CODE ($$), $$); }
-       | '(' typename ')' '{' 
+       | '(' typename ')' '{'
                { start_init (NULL_TREE, NULL, 0);
                  $2 = groktypename ($2);
                  really_start_incremental_init ($2); }
@@ -791,13 +783,21 @@ objc_string:
 end ifobjc
 
 old_style_parm_decls:
+       old_style_parm_decls_1
+       {
+         parsing_iso_function_signature = false; /* Reset after decls.  */
+       }
+       ;
+
+old_style_parm_decls_1:
        /* empty */
+       {
+         if (warn_traditional && !in_system_header
+             && parsing_iso_function_signature)
+           warning ("traditional C rejects ISO C style function definitions");
+         parsing_iso_function_signature = false; /* Reset after warning.  */
+       }
        | datadecls
-       | datadecls ELLIPSIS
-               /* ... is used here to indicate a varargs function.  */
-               { c_mark_varargs ();
-                 if (pedantic)
-                   pedwarn ("ISO C does not permit use of `varargs.h'"); }
        ;
 
 /* The following are analogous to lineno_decl, decls and decl
@@ -871,7 +871,7 @@ decl:
        | declspecs ';'
                { shadow_tag ($1); }
        | extension decl
-               { RESTORE_WARN_FLAGS ($1); }
+               { RESTORE_EXT_FLAGS ($1); }
        ;
 
 /* A list of declaration specifiers.  These are:
@@ -1398,10 +1398,10 @@ ifobjc
         | non_empty_protocolrefs
                 { $$ = get_object_reference ($1); }
 end ifobjc
-       | TYPEOF '(' expr ')'
-               { $$ = TREE_TYPE ($3); }
-       | TYPEOF '(' typename ')'
-               { $$ = groktypename ($3); }
+       | typeof '(' expr ')'
+               { skip_evaluation--; $$ = TREE_TYPE ($3); }
+       | typeof '(' typename ')'
+               { skip_evaluation--; $$ = groktypename ($3); }
        ;
 
 /* typespec_nonreserved_attr does not exist.  */
@@ -1435,7 +1435,7 @@ initdcl:
        | declarator maybeasm maybe_attribute
                { tree d = start_decl ($1, current_declspecs, 0,
                                       chainon ($3, all_prefix_attributes));
-                 finish_decl (d, NULL_TREE, $2); 
+                 finish_decl (d, NULL_TREE, $2);
                 }
        ;
 
@@ -1461,7 +1461,7 @@ maybe_attribute:
        | attributes
                { $$ = $1; }
        ;
+
 attributes:
       attribute
                { $$ = $1; }
@@ -1480,7 +1480,7 @@ attribute_list:
        | attribute_list ',' attrib
                { $$ = chainon ($1, $3); }
        ;
+
 attrib:
     /* empty */
                { $$ = NULL_TREE; }
@@ -1548,6 +1548,7 @@ initelt:
                  if (pedantic)
                    pedwarn ("obsolete use of designated initializer with `:'"); }
          initval
+               {}
        | initval
        ;
 
@@ -1569,17 +1570,12 @@ designator_list:
 designator:
          '.' identifier
                { set_init_label ($2); }
-       /* These are for labeled elements.  The syntax for an array element
-          initializer conflicts with the syntax for an Objective-C message,
-          so don't include these productions in the Objective-C grammar.  */
-ifc
        | '[' expr_no_commas ELLIPSIS expr_no_commas ']'
                { set_init_index ($2, $4);
                  if (pedantic)
                    pedwarn ("ISO C forbids specifying range of elements to initialize"); }
        | '[' expr_no_commas ']'
                { set_init_index ($2, NULL_TREE); }
-end ifc
        ;
 \f
 nested_function:
@@ -1594,6 +1590,7 @@ nested_function:
                      pop_function_context ();
                      YYERROR1;
                    }
+                 parsing_iso_function_signature = false; /* Don't warn about nested functions.  */
                }
           old_style_parm_decls
                { store_parm_decls (); }
@@ -1608,7 +1605,7 @@ nested_function:
                  DECL_SOURCE_FILE (decl) = $5;
                  DECL_SOURCE_LINE (decl) = $6;
                  finish_function (1, 1);
-                 pop_function_context (); 
+                 pop_function_context ();
                  add_decl_stmt (decl); }
        ;
 
@@ -1624,6 +1621,7 @@ notype_nested_function:
                      pop_function_context ();
                      YYERROR1;
                    }
+                 parsing_iso_function_signature = false; /* Don't warn about nested functions.  */
                }
          old_style_parm_decls
                { store_parm_decls (); }
@@ -1638,7 +1636,7 @@ notype_nested_function:
                  DECL_SOURCE_FILE (decl) = $5;
                  DECL_SOURCE_LINE (decl) = $6;
                  finish_function (1, 1);
-                 pop_function_context (); 
+                 pop_function_context ();
                  add_decl_stmt (decl); }
        ;
 
@@ -1759,7 +1757,7 @@ structsp_attr:
                { $$ = start_struct (RECORD_TYPE, $2);
                  /* Start scope of tag before parsing components.  */
                }
-         component_decl_list '}' maybe_attribute 
+         component_decl_list '}' maybe_attribute
                { $$ = finish_struct ($<ttype>4, $5, chainon ($1, $7)); }
        | struct_head '{' component_decl_list '}' maybe_attribute
                { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
@@ -1849,8 +1847,8 @@ component_decl:
                  POP_DECLSPEC_STACK; }
        | declspecs_nosc_ts setspecs save_filename save_lineno
                {
-                 /* Support for unnamed structs or unions as members of 
-                    structs or unions (which is [a] useful and [b] supports 
+                 /* Support for unnamed structs or unions as members of
+                    structs or unions (which is [a] useful and [b] supports
                     MS P-SDK).  */
                  if (pedantic)
                    pedwarn ("ISO C doesn't support unnamed structs/unions");
@@ -1869,7 +1867,7 @@ component_decl:
                { $$ = NULL_TREE; }
        | extension component_decl
                { $$ = $2;
-                 RESTORE_WARN_FLAGS ($1); }
+                 RESTORE_EXT_FLAGS ($1); }
        ;
 
 components:
@@ -2106,8 +2104,8 @@ c99_block_end: /* empty */
                 { if (flag_isoc99)
                    {
                      tree scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
-                     $$ = poplevel (kept_level_p (), 0, 0); 
-                     SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt)) 
+                     $$ = poplevel (kept_level_p (), 0, 0);
+                     SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt))
                        = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt))
                        = $$;
                    }
@@ -2156,8 +2154,8 @@ compstmt_start: '{' { compstmt_count++;
 compstmt_nostart: '}'
                { $$ = convert (void_type_node, integer_zero_node); }
        | pushlevel maybe_label_decls compstmt_contents_nonempty '}' poplevel
-               { $$ = poplevel (kept_level_p (), 1, 0); 
-                 SCOPE_STMT_BLOCK (TREE_PURPOSE ($5)) 
+               { $$ = poplevel (kept_level_p (), 1, 0);
+                 SCOPE_STMT_BLOCK (TREE_PURPOSE ($5))
                    = SCOPE_STMT_BLOCK (TREE_VALUE ($5))
                    = $$; }
        ;
@@ -2186,7 +2184,7 @@ compstmt_primary_start:
         ;
 
 compstmt: compstmt_start compstmt_nostart
-               { RECHAIN_STMTS ($1, COMPOUND_BODY ($1)); 
+               { RECHAIN_STMTS ($1, COMPOUND_BODY ($1));
                  last_expr_type = NULL_TREE;
                   $$ = $1; }
        ;
@@ -2213,7 +2211,7 @@ if_prefix:
           IF
                 { $<ttype>$ = c_begin_if_stmt (); }
             '(' expr ')'
-               { c_expand_start_cond (c_common_truthvalue_conversion ($4), 
+               { c_expand_start_cond (c_common_truthvalue_conversion ($4),
                                       compstmt_count,$<ttype>2);
                  $<itype>$ = stmt_count;
                  if_stmt_file = $<filename>-2;
@@ -2227,7 +2225,7 @@ do_stmt_start:
          DO
                { stmt_count++;
                  compstmt_count++;
-                 $<ttype>$ 
+                 $<ttype>$
                    = add_stmt (build_stmt (DO_STMT, NULL_TREE,
                                            NULL_TREE));
                  /* In the event that a parse error prevents
@@ -2322,7 +2320,7 @@ select_or_iter_stmt:
          we later pass to c_finish_while_stmt_cond to fill
          in the condition and other tidbits.  */
        | WHILE
-                { stmt_count++; 
+                { stmt_count++;
                  $<ttype>$ = c_begin_while_stmt (); }
          '(' expr ')'
                 { $4 = c_common_truthvalue_conversion ($4);
@@ -2339,12 +2337,12 @@ select_or_iter_stmt:
        | FOR
                { $<ttype>$ = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE,
                                          NULL_TREE, NULL_TREE);
-                 add_stmt ($<ttype>$); } 
+                 add_stmt ($<ttype>$); }
          '(' for_init_stmt
                { stmt_count++;
                  RECHAIN_STMTS ($<ttype>2, FOR_INIT_STMT ($<ttype>2)); }
          xexpr ';'
-                { if ($6) 
+                { if ($6)
                    FOR_COND ($<ttype>2)
                      = c_common_truthvalue_conversion ($6); }
          xexpr ')'
@@ -2360,7 +2358,7 @@ select_or_iter_stmt:
 
 for_init_stmt:
          xexpr ';'
-               { add_stmt (build_stmt (EXPR_STMT, $1)); } 
+               { add_stmt (build_stmt (EXPR_STMT, $1)); }
        | decl
                { check_for_loop_decls (); }
        ;
@@ -2548,7 +2546,9 @@ parmlist_2:  /* empty */
                  error ("ISO C requires a named argument before `...'");
                }
        | parms
-               { $$ = get_parm_info (1); }
+               { $$ = get_parm_info (1);
+                 parsing_iso_function_signature = true;
+               }
        | parms ',' ELLIPSIS
                { $$ = get_parm_info (0); }
        ;
@@ -2571,7 +2571,7 @@ parm:
        | declspecs_ts setspecs notype_declarator maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
                                                         $3),
-                                       chainon ($4, all_prefix_attributes)); 
+                                       chainon ($4, all_prefix_attributes));
                  POP_DECLSPEC_STACK; }
        | declspecs_ts setspecs absdcl_maybe_attribute
                { $$ = $3;
@@ -2598,7 +2598,7 @@ firstparm:
        | declspecs_ts_nosa setspecs_fp notype_declarator maybe_attribute
                { $$ = build_tree_list (build_tree_list (current_declspecs,
                                                         $3),
-                                       chainon ($4, all_prefix_attributes)); 
+                                       chainon ($4, all_prefix_attributes));
                  POP_DECLSPEC_STACK; }
        | declspecs_ts_nosa setspecs_fp absdcl_maybe_attribute
                { $$ = $3;
@@ -2670,10 +2670,11 @@ identifiers_or_typenames:
 
 extension:
        EXTENSION
-               { $$ = SAVE_WARN_FLAGS();
+               { $$ = SAVE_EXT_FLAGS();
                  pedantic = 0;
                  warn_pointer_arith = 0;
-                 warn_traditional = 0; }
+                 warn_traditional = 0;
+                 flag_iso = 0; }
        ;
 \f
 ifobjc
@@ -2711,12 +2712,14 @@ classdecl:
                {
                  objc_declare_class ($2);
                }
+       ;
 
 aliasdecl:
          ALIAS identifier identifier ';'
                {
                  objc_declare_alias ($2, $3);
                }
+       ;
 
 classdef:
          INTERFACE identifier protocolrefs '{'
@@ -3223,14 +3226,8 @@ receiver:
        ;
 
 objcmessageexpr:
-         '['
-               { objc_receiver_context = 1; }
-         receiver
-               { objc_receiver_context = 0; }
-         messageargs ']'
-               {
-                 $$ = build_tree_list ($3, $5);
-               }
+         '[' receiver messageargs ']'
+               { $$ = build_tree_list ($2, $3); }
        ;
 
 selectorarg:
@@ -3343,6 +3340,7 @@ static const struct resword reswords[] =
   { "__restrict__",    RID_RESTRICT,   0 },
   { "__signed",                RID_SIGNED,     0 },
   { "__signed__",      RID_SIGNED,     0 },
+  { "__thread",                RID_THREAD,     0 },
   { "__typeof",                RID_TYPEOF,     0 },
   { "__typeof__",      RID_TYPEOF,     0 },
   { "__unbounded",     RID_UNBOUNDED,  0 },
@@ -3438,6 +3436,7 @@ static const short rid_to_yy[RID_MAX] =
   /* RID_BOUNDED */    TYPE_QUAL,
   /* RID_UNBOUNDED */  TYPE_QUAL,
   /* RID_COMPLEX */    TYPESPEC,
+  /* RID_THREAD */     SCSPEC,
 
   /* C++ */
   /* RID_FRIEND */     0,
@@ -3453,7 +3452,7 @@ static const short rid_to_yy[RID_MAX] =
   /* RID_BYCOPY */     TYPE_QUAL,
   /* RID_BYREF */      TYPE_QUAL,
   /* RID_ONEWAY */     TYPE_QUAL,
-  
+
   /* C */
   /* RID_INT */                TYPESPEC,
   /* RID_CHAR */       TYPESPEC,
@@ -3527,19 +3526,6 @@ static const short rid_to_yy[RID_MAX] =
   /* RID_REINTCAST */  0,
   /* RID_STATCAST */   0,
 
-  /* alternate spellings */
-  /* RID_AND */                0,
-  /* RID_AND_EQ */     0,
-  /* RID_NOT */                0,
-  /* RID_NOT_EQ */     0,
-  /* RID_OR */         0,
-  /* RID_OR_EQ */      0,
-  /* RID_XOR */                0,
-  /* RID_XOR_EQ */     0,
-  /* RID_BITAND */     0,
-  /* RID_BITOR */      0,
-  /* RID_COMPL */      0,
-  
   /* Objective C */
   /* RID_ID */                 OBJECTNAME,
   /* RID_AT_ENCODE */          ENCODE,
@@ -3564,7 +3550,7 @@ init_reswords ()
   int mask = (flag_isoc99 ? 0 : D_C89)
              | (flag_no_asm ? (flag_isoc99 ? D_EXT : D_EXT|D_EXT89) : 0);
 
-  if (c_language != clk_objective_c)
+  if (!flag_objc)
      mask |= D_OBJC;
 
   /* It is not necessary to register ridpointers as a GC root, because
@@ -3619,12 +3605,12 @@ static int
 yylexname ()
 {
   tree decl;
-  
+
 ifobjc
   int objc_force_identifier = objc_need_raw_identifier;
   OBJC_NEED_RAW_IDENTIFIER (0);
 end ifobjc
-  
+
   if (C_IS_RESERVED_WORD (yylval.ttype))
     {
       enum rid rid_code = C_RID_CODE (yylval.ttype);
@@ -3649,13 +3635,13 @@ end ifobjc
            /* __FUNCTION__ and __PRETTY_FUNCTION__ get converted
               to string constants.  */
            const char *name = fname_string (rid_code);
-         
+
            yylval.ttype = build_string (strlen (name) + 1, name);
            C_ARTIFICIAL_STRING_P (yylval.ttype) = 1;
            last_token = CPP_STRING;  /* so yyerror won't choke */
            return STRING;
          }
-      
+
        /* Return the canonical spelling for this keyword.  */
        yylval.ttype = ridpointers[(int) rid_code];
        return yycode;
@@ -3674,8 +3660,8 @@ ifobjc
       tree objc_interface_decl = is_class_name (yylval.ttype);
       /* ObjC class names are in the same namespace as variables and
         typedefs, and hence are shadowed by local declarations.  */
-      if (objc_interface_decl 
-         && (global_bindings_p () 
+      if (objc_interface_decl
+         && (global_bindings_p ()
              || (!objc_force_identifier && !decl)))
        {
          yylval.ttype = objc_interface_decl;
@@ -3729,8 +3715,6 @@ end ifc
             || (next_type == CPP_NAME && yylexname () == STRING));
 
       yylval.ttype = combine_strings (strings);
-
-      VARRAY_FREE (strings);
     }
   else
     yylval.ttype = orig;
@@ -3822,7 +3806,7 @@ _yylex ()
     case CPP_STRING:
     case CPP_WSTRING:
       return yylexstring ();
-      
+
       /* This token is Objective-C specific.  It gives the next token
         special significance.  */
     case CPP_ATSIGN:
@@ -3888,7 +3872,7 @@ yyprint (file, yychar, yyl)
   tree t = yyl.ttype;
 
   fprintf (file, " [%s]", NAME(last_token));
-  
+
   switch (yychar)
     {
     case IDENTIFIER:
@@ -3931,27 +3915,6 @@ yyprint (file, yychar, yyl)
 /* This is not the ideal place to put these, but we have to get them out
    of c-lex.c because cp/lex.c has its own versions.  */
 
-/* Return something to represent absolute declarators containing a *.
-   TARGET is the absolute declarator that the * contains.
-   TYPE_QUALS_ATTRS is a list of modifiers such as const or volatile
-   to apply to the pointer type, represented as identifiers, possible mixed
-   with attributes.
-
-   We return an INDIRECT_REF whose "contents" are TARGET (inside a TREE_LIST,
-   if attributes are present) and whose type is the modifier list.  */
-
-tree
-make_pointer_declarator (type_quals_attrs, target)
-     tree type_quals_attrs, target;
-{
-  tree quals, attrs;
-  tree itarget = target;
-  split_specs_attrs (type_quals_attrs, &quals, &attrs);
-  if (attrs != NULL_TREE)
-    itarget = tree_cons (attrs, target, NULL_TREE);
-  return build1 (INDIRECT_REF, quals, itarget);
-}
-
 /* Free malloced parser stacks if necessary.  */
 
 void
@@ -3963,3 +3926,5 @@ free_parser_stacks ()
       free (malloced_yyvs);
     }
 }
+
+#include "gt-c-parse.h"