X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-parse.in;h=477ae629fe70a8d9ffdb5e3bf64a405f36965aed;hb=d19bc3a3c77d3458c5ac967d3a6fe47125762b98;hp=72fbb68ebba4774614503f7d557c98951c8bc21a;hpb=8ce9c71903bb88fb3577351a4bdb92bb10def811;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-parse.in b/gcc/c-parse.in index 72fbb68ebba..477ae629fe7 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -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 ($4, $5, chainon ($1, $7)); } + { $$ = finish_struct ($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 ($4, $5, chainon ($1, $7)); } + { $$ = finish_struct ($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,$2); $$ = stmt_count; - if_stmt_file = $-2; - if_stmt_line = $-1; } + if_stmt_locus.file = $-2; + if_stmt_locus.line = $-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++ == $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