diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 379f00219f4..f8bac2d4e4b 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 be44449cd4d..a0e0052156c 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 ad953153de7..e3a742a2783 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 00000000000..5f8188dbccd --- /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 "" } */ +}