From d74214f3dcb0ca329038a7cf78e0c0e60490510f Mon Sep 17 00:00:00 2001 From: dmalcolm Date: Wed, 6 Jan 2016 20:13:19 +0000 Subject: [PATCH] C: fix reported range of invalid unary dereference. gcc/c/ChangeLog: * c-parser.c (c_parser_unary_expression): For dereferences, build a combined location before calling build_indirect_ref, so that error reports cover the full range, manually updating the c_expr src_range. gcc/testsuite/ChangeLog: * gcc.dg/bad-dereference.c: New test case. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@232110 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/c/ChangeLog | 7 +++++++ gcc/c/c-parser.c | 20 ++++++++++++-------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/bad-dereference.c | 24 ++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/bad-dereference.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 379f002..f8bac2d 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2016-01-06 David Malcolm + + * c-parser.c (c_parser_unary_expression): For dereferences, build + a combined location before calling build_indirect_ref, so that + error reports cover the full range, manually updating the c_expr + src_range. + 2016-01-06 Marek Polacek PR sanitizer/69099 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index be44449..a0e0052 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -6759,14 +6759,18 @@ c_parser_unary_expression (c_parser *parser) mark_exp_read (op.value); return parser_build_unary_op (op_loc, ADDR_EXPR, op); case CPP_MULT: - c_parser_consume_token (parser); - exp_loc = c_parser_peek_token (parser)->location; - op = c_parser_cast_expression (parser, NULL); - finish = op.get_finish (); - op = convert_lvalue_to_rvalue (exp_loc, op, true, true); - ret.value = build_indirect_ref (op_loc, op.value, RO_UNARY_STAR); - set_c_expr_source_range (&ret, op_loc, finish); - return ret; + { + c_parser_consume_token (parser); + exp_loc = c_parser_peek_token (parser)->location; + op = c_parser_cast_expression (parser, NULL); + finish = op.get_finish (); + op = convert_lvalue_to_rvalue (exp_loc, op, true, true); + location_t combined_loc = make_location (op_loc, op_loc, finish); + ret.value = build_indirect_ref (combined_loc, op.value, RO_UNARY_STAR); + ret.src_range.m_start = op_loc; + ret.src_range.m_finish = finish; + return ret; + } case CPP_PLUS: if (!c_dialect_objc () && !in_system_header_at (input_location)) warning_at (op_loc, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad95315..e3a742a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-01-06 David Malcolm + + * gcc.dg/bad-dereference.c: New test case. + 2015-01-06 Bill Schmidt * gcc.target/powerpc/p9-lxvx-stxvx-3.c: New test. diff --git a/gcc/testsuite/gcc.dg/bad-dereference.c b/gcc/testsuite/gcc.dg/bad-dereference.c new file mode 100644 index 0000000..5f8188d --- /dev/null +++ b/gcc/testsuite/gcc.dg/bad-dereference.c @@ -0,0 +1,24 @@ +/* { dg-options "-fdiagnostics-show-caret" } */ + +struct foo +{ + int x; +}; + +int test_1 (struct foo some_f) +{ + return *some_f.x; /* { dg-error "invalid type argument of unary ... .have .int.." } */ +/* { dg-begin-multiline-output "" } + return *some_f.x; + ^~~~~~~~~ + { dg-end-multiline-output "" } */ +} + +int test_2 (struct foo some_f) +{ + return *some_f; /* { dg-error "invalid type argument of unary ... .have .struct foo.." } */ +/* { dg-begin-multiline-output "" } + return *some_f; + ^~~~~~~ + { dg-end-multiline-output "" } */ +} -- 2.7.4