diff options
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/c-decl.c | 12 | ||||
-rw-r--r-- | gcc/c-parser.c | 3 | ||||
-rw-r--r-- | gcc/c-tree.h | 4 | ||||
-rw-r--r-- | gcc/c-typeck.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr8927-1.c | 13 |
7 files changed, 42 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d4309b59503..46f4c118758 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-03-02 Joseph S. Myers <joseph@codesourcery.com> + + PR c/8927 + * c-tree.h (undeclared_variable, build_external_ref): Add extra + argument. + * c-decl.c (undeclared_variable): Take location as argument. + * c-typeck.c (build_external_ref): Likewise. + * c-parser.c (c_parser_postfix_expression): Pass location of + identifier to build_external_ref. + 2005-03-01 David Edelsohn <edelsohn@gnu.org> * config/rs6000/rs6000.md (cceq splitter): Use operand mode, not diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 690d3b3bc80..5cad16ee69f 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -2312,26 +2312,26 @@ implicitly_declare (tree functionid) ID, including a reference to a builtin outside of function-call context. Establish a binding of the identifier to error_mark_node in an appropriate scope, which will suppress further errors for the - same identifier. */ + same identifier. The error message should be given location LOC. */ void -undeclared_variable (tree id) +undeclared_variable (tree id, location_t loc) { static bool already = false; struct c_scope *scope; if (current_function_decl == 0) { - error ("%qE undeclared here (not in a function)", id); + error ("%H%qE undeclared here (not in a function)", &loc, id); scope = current_scope; } else { - error ("%qE undeclared (first use in this function)", id); + error ("%H%qE undeclared (first use in this function)", &loc, id); if (!already) { - error ("(Each undeclared identifier is reported only once"); - error ("for each function it appears in.)"); + error ("%H(Each undeclared identifier is reported only once", &loc); + error ("%Hfor each function it appears in.)", &loc); already = true; } diff --git a/gcc/c-parser.c b/gcc/c-parser.c index de6999a0add..e08f436b46e 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -4803,10 +4803,11 @@ c_parser_postfix_expression (c_parser *parser) } { tree id = c_parser_peek_token (parser)->value; + location_t loc = c_parser_peek_token (parser)->location; c_parser_consume_token (parser); expr.value = build_external_ref (id, (c_parser_peek_token (parser)->type - == CPP_OPEN_PAREN)); + == CPP_OPEN_PAREN), loc); expr.original_code = ERROR_MARK; } break; diff --git a/gcc/c-tree.h b/gcc/c-tree.h index d16d6a6892d..18b2634c1b7 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -379,7 +379,7 @@ extern void check_for_loop_decls (void); extern void mark_forward_parm_decls (void); extern int complete_array_type (tree, tree, int); extern void declare_parm_level (void); -extern void undeclared_variable (tree); +extern void undeclared_variable (tree, location_t); extern tree declare_label (tree); extern tree define_label (location_t, tree); extern void finish_decl (tree, tree, tree); @@ -463,7 +463,7 @@ extern tree composite_type (tree, tree); extern tree build_component_ref (tree, tree); extern tree build_indirect_ref (tree, const char *); extern tree build_array_ref (tree, tree); -extern tree build_external_ref (tree, int); +extern tree build_external_ref (tree, int, location_t); extern void pop_maybe_used (bool); extern struct c_expr c_expr_sizeof_expr (struct c_expr); extern struct c_expr c_expr_sizeof_type (struct c_type_name *); diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 3a38d22923b..ea1c81c7435 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -1787,9 +1787,10 @@ build_array_ref (tree array, tree index) } /* Build an external reference to identifier ID. FUN indicates - whether this will be used for a function call. */ + whether this will be used for a function call. LOC is the source + location of the identifier. */ tree -build_external_ref (tree id, int fun) +build_external_ref (tree id, int fun, location_t loc) { tree ref; tree decl = lookup_name (id); @@ -1809,7 +1810,7 @@ build_external_ref (tree id, int fun) return error_mark_node; else { - undeclared_variable (id); + undeclared_variable (id, loc); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5e3ceaa2078..d72534301c6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-03-02 Joseph S. Myers <joseph@codesourcery.com> + + PR c/8927 + * gcc.dg/pr8927-1.c: New test. + 2005-03-01 Nathan Sidwell <nathan@codesourcery.com> PR c++/20232 diff --git a/gcc/testsuite/gcc.dg/pr8927-1.c b/gcc/testsuite/gcc.dg/pr8927-1.c new file mode 100644 index 00000000000..218e71706ac --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr8927-1.c @@ -0,0 +1,13 @@ +/* Bug 8927: undeclared identifiers should give an error on the line + of that identifier, not on the line of the next token. */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +foo(void) +{ + bar /* { dg-error "undeclared|for each function" } */ + + + ; +} |