OSDN Git Service

* g++.dg/abi/vague1.C: Use xfail, rather than embedded Tcl code.
[pf3gnuchains/gcc-fork.git] / gcc / c-parse.in
index 72fbb68..477ae62 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, 2002 Free Software Foundation, Inc.
+   1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -138,6 +138,7 @@ do {                                                                        \
 
 /* String constants in raw form.
    yylval is a STRING_CST node.  */
+
 %token STRING
 
 /* "...", used for functions with variable arglists.  */
@@ -260,10 +261,10 @@ end ifobjc
 static int stmt_count;
 static int compstmt_count;
 
-/* Input file and line number of the end of the body of last simple_if;
+/* Input location 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;
+static location_t if_stmt_locus;
+
 
 /* List of types and structure classes of the current declaration.  */
 static GTY(()) tree current_declspecs;
@@ -433,12 +434,12 @@ fndef:
                                        all_prefix_attributes))
                    YYERROR1;
                }
-         old_style_parm_decls
-               { store_parm_decls (); }
-         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);
+         old_style_parm_decls  save_filename save_lineno
+               { DECL_SOURCE_FILE (current_function_decl) = $6;
+                 DECL_SOURCE_LINE (current_function_decl) = $7;
+                 store_parm_decls (); }
+        compstmt_or_error
+               { finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | declspecs_ts setspecs declarator error
                { POP_DECLSPEC_STACK; }
@@ -447,12 +448,12 @@ fndef:
                                        all_prefix_attributes))
                    YYERROR1;
                }
-         old_style_parm_decls
-               { store_parm_decls (); }
-         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);
+         old_style_parm_decls save_filename save_lineno
+               { DECL_SOURCE_FILE (current_function_decl) = $6;
+                 DECL_SOURCE_LINE (current_function_decl) = $7;
+                 store_parm_decls (); }
+         compstmt_or_error
+               { finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | declspecs_nots setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
@@ -461,12 +462,12 @@ fndef:
                                        all_prefix_attributes))
                    YYERROR1;
                }
-         old_style_parm_decls
-               { store_parm_decls (); }
-         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);
+         old_style_parm_decls save_filename save_lineno
+               { DECL_SOURCE_FILE (current_function_decl) = $5;
+                 DECL_SOURCE_LINE (current_function_decl) = $6;
+                 store_parm_decls (); }
+         compstmt_or_error
+               { finish_function (0, 1);
                  POP_DECLSPEC_STACK; }
        | setspecs notype_declarator error
                { POP_DECLSPEC_STACK; }
@@ -1592,18 +1593,19 @@ nested_function:
                    }
                  parsing_iso_function_signature = false; /* Don't warn about nested functions.  */
                }
-          old_style_parm_decls
-               { store_parm_decls (); }
+          old_style_parm_decls save_filename save_lineno
+               { tree decl = current_function_decl;
+                 DECL_SOURCE_FILE (decl) = $4;
+                 DECL_SOURCE_LINE (decl) = $5;
+                 store_parm_decls (); }
 /* This used to use compstmt_or_error.
    That caused a bug with input `f(g) int g {}',
    where the use of YYERROR1 above caused an error
    which then was handled by compstmt_or_error.
    There followed a repeated execution of that same rule,
    which called YYERROR1 again, and so on.  */
-         save_filename save_lineno compstmt
+         compstmt
                { tree decl = current_function_decl;
-                 DECL_SOURCE_FILE (decl) = $5;
-                 DECL_SOURCE_LINE (decl) = $6;
                  finish_function (1, 1);
                  pop_function_context ();
                  add_decl_stmt (decl); }
@@ -1623,18 +1625,19 @@ notype_nested_function:
                    }
                  parsing_iso_function_signature = false; /* Don't warn about nested functions.  */
                }
-         old_style_parm_decls
-               { store_parm_decls (); }
+         old_style_parm_decls save_filename save_lineno
+               { tree decl = current_function_decl;
+                 DECL_SOURCE_FILE (decl) = $4;
+                 DECL_SOURCE_LINE (decl) = $5;
+                 store_parm_decls (); }
 /* This used to use compstmt_or_error.
    That caused a bug with input `f(g) int g {}',
    where the use of YYERROR1 above caused an error
    which then was handled by compstmt_or_error.
    There followed a repeated execution of that same rule,
    which called YYERROR1 again, and so on.  */
-         save_filename save_lineno compstmt
+         compstmt
                { tree decl = current_function_decl;
-                 DECL_SOURCE_FILE (decl) = $5;
-                 DECL_SOURCE_LINE (decl) = $6;
                  finish_function (1, 1);
                  pop_function_context ();
                  add_decl_stmt (decl); }
@@ -1758,18 +1761,20 @@ structsp_attr:
                  /* Start scope of tag before parsing components.  */
                }
          component_decl_list '}' maybe_attribute
-               { $$ = finish_struct ($<ttype>4, $5, chainon ($1, $7)); }
+               { $$ = finish_struct ($<ttype>4, nreverse ($5),
+                                     chainon ($1, $7)); }
        | struct_head '{' component_decl_list '}' maybe_attribute
                { $$ = finish_struct (start_struct (RECORD_TYPE, NULL_TREE),
-                                     $3, chainon ($1, $5));
+                                     nreverse ($3), chainon ($1, $5));
                }
        | union_head identifier '{'
                { $$ = start_struct (UNION_TYPE, $2); }
          component_decl_list '}' maybe_attribute
-               { $$ = finish_struct ($<ttype>4, $5, chainon ($1, $7)); }
+               { $$ = finish_struct ($<ttype>4, nreverse ($5),
+                                     chainon ($1, $7)); }
        | union_head '{' component_decl_list '}' maybe_attribute
                { $$ = finish_struct (start_struct (UNION_TYPE, NULL_TREE),
-                                     $3, chainon ($1, $5));
+                                     nreverse ($3), chainon ($1, $5));
                }
        | enum_head identifier '{'
                { $$ = start_enum ($2); }
@@ -1808,18 +1813,30 @@ maybecomma_warn:
                    pedwarn ("comma at end of enumerator list"); }
        ;
 
+/* We chain the components in reverse order.  They are put in forward
+   order in structsp_attr.
+
+   Note that component_declarator returns single decls, so components
+   and components_notype can use TREE_CHAIN directly, wheras components
+   and components_notype return lists (of comma separated decls), so
+   component_decl_list and component_decl_list2 must use chainon.
+
+   The theory behind all this is that there will be more semicolon
+   separated fields than comma separated fields, and so we'll be
+   minimizing the number of node traversals required by chainon.  */
+
 component_decl_list:
          component_decl_list2
                { $$ = $1; }
        | component_decl_list2 component_decl
-               { $$ = chainon ($1, $2);
+               { $$ = chainon ($2, $1);
                  pedwarn ("no semicolon at end of struct or union"); }
        ;
 
 component_decl_list2:  /* empty */
                { $$ = NULL_TREE; }
        | component_decl_list2 component_decl ';'
-               { $$ = chainon ($1, $2); }
+               { $$ = chainon ($2, $1); }
        | component_decl_list2 ';'
                { if (pedantic)
                    pedwarn ("extra semicolon in struct or union specified"); }
@@ -1830,7 +1847,7 @@ ifobjc
                  tree interface = lookup_interface ($3);
 
                  if (interface)
-                   $$ = get_class_ivars (interface);
+                   $$ = nreverse (get_class_ivars (interface));
                  else
                    {
                      error ("cannot find interface declaration for `%s'",
@@ -1873,13 +1890,13 @@ component_decl:
 components:
          component_declarator
        | components ',' maybe_resetattrs component_declarator
-               { $$ = chainon ($1, $4); }
+               { TREE_CHAIN ($4) = $1; $$ = $4; }
        ;
 
 components_notype:
          component_notype_declarator
        | components_notype ',' maybe_resetattrs component_notype_declarator
-               { $$ = chainon ($1, $4); }
+               { TREE_CHAIN ($4) = $1; $$ = $4; }
        ;
 
 component_declarator:
@@ -1909,9 +1926,7 @@ component_notype_declarator:
        ;
 
 /* We chain the enumerators in reverse order.
-   They are put in forward order where enumlist is used.
-   (The order used to be significant, but no longer is so.
-   However, we still maintain the order, just to be clean.)  */
+   They are put in forward order in structsp_attr.  */
 
 enumlist:
          enumerator
@@ -1919,7 +1934,7 @@ enumlist:
                { if ($1 == error_mark_node)
                    $$ = $1;
                  else
-                   $$ = chainon ($3, $1); }
+                   TREE_CHAIN ($3) = $1, $$ = $3; }
        | error
                { $$ = error_mark_node; }
        ;
@@ -2214,8 +2229,8 @@ if_prefix:
                { c_expand_start_cond (c_common_truthvalue_conversion ($4),
                                       compstmt_count,$<ttype>2);
                  $<itype>$ = stmt_count;
-                 if_stmt_file = $<filename>-2;
-                 if_stmt_line = $<lineno>-1; }
+                 if_stmt_locus.file = $<filename>-2;
+                 if_stmt_locus.line = $<lineno>-1; }
         ;
 
 /* This is a subroutine of stmt.
@@ -2250,7 +2265,7 @@ save_filename:
 save_lineno:
                { if (yychar == YYEMPTY)
                    yychar = YYLEX;
-                 $$ = lineno; }
+                 $$ = input_line; }
        ;
 
 lineno_labeled_stmt:
@@ -2304,8 +2319,8 @@ select_or_iter_stmt:
                     else statement.  Increment stmt_count so we don't
                     give a second error if this is a nested `if'.  */
                  if (extra_warnings && stmt_count++ == $<itype>1)
-                   warning_with_file_and_line (if_stmt_file, if_stmt_line,
-                                               "empty body in an if-statement"); }
+                   warning ("%Hempty body in an if-statement",
+                             &if_stmt_locus); }
 /* Make sure c_expand_end_cond is run once
    for each call to c_expand_start_cond.
    Otherwise a crash is likely.  */
@@ -2455,10 +2470,10 @@ label:    CASE expr_no_commas ':'
 
 maybe_type_qual:
        /* empty */
-               { emit_line_note (input_filename, lineno);
+               { emit_line_note (input_filename, input_line);
                  $$ = NULL_TREE; }
        | TYPE_QUAL
-               { emit_line_note (input_filename, lineno); }
+               { emit_line_note (input_filename, input_line); }
        ;
 
 xexpr:
@@ -3312,8 +3327,6 @@ static const struct resword reswords[] =
   { "__asm__",         RID_ASM,        0 },
   { "__attribute",     RID_ATTRIBUTE,  0 },
   { "__attribute__",   RID_ATTRIBUTE,  0 },
-  { "__bounded",       RID_BOUNDED,    0 },
-  { "__bounded__",     RID_BOUNDED,    0 },
   { "__builtin_choose_expr", RID_CHOOSE_EXPR, 0 },
   { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, 0 },
   { "__builtin_va_arg",        RID_VA_ARG,     0 },
@@ -3343,8 +3356,6 @@ static const struct resword reswords[] =
   { "__thread",                RID_THREAD,     0 },
   { "__typeof",                RID_TYPEOF,     0 },
   { "__typeof__",      RID_TYPEOF,     0 },
-  { "__unbounded",     RID_UNBOUNDED,  0 },
-  { "__unbounded__",   RID_UNBOUNDED,  0 },
   { "__volatile",      RID_VOLATILE,   0 },
   { "__volatile__",    RID_VOLATILE,   0 },
   { "asm",             RID_ASM,        D_EXT },
@@ -3433,8 +3444,6 @@ static const short rid_to_yy[RID_MAX] =
   /* RID_RESTRICT */   TYPE_QUAL,
 
   /* C extensions */
-  /* RID_BOUNDED */    TYPE_QUAL,
-  /* RID_UNBOUNDED */  TYPE_QUAL,
   /* RID_COMPLEX */    TYPESPEC,
   /* RID_THREAD */     SCSPEC,
 
@@ -3690,11 +3699,11 @@ ifc
       static int last_lineno = 0;
       static const char *last_input_filename = 0;
       if (warn_traditional && !in_system_header
-         && (lineno != last_lineno || !last_input_filename ||
+         && (input_line != last_lineno || !last_input_filename ||
              strcmp (last_input_filename, input_filename)))
        {
          warning ("traditional C rejects string concatenation");
-         last_lineno = lineno;
+         last_lineno = input_line;
          last_input_filename = input_filename;
        }
 end ifc