aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-01-06 20:13:19 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-01-06 20:13:19 +0000
commit7443cf13054da143f0ec0ae12786c8853cfe31e4 (patch)
treedbe7927ebc9954a5c99d1f6d0a4d18f340e3a3d8
parent329289313c67f0ce8db19746e5c6d2601e853b3b (diff)
downloadgcc-7443cf13054da143f0ec0ae12786c8853cfe31e4.zip
gcc-7443cf13054da143f0ec0ae12786c8853cfe31e4.tar.gz
gcc-7443cf13054da143f0ec0ae12786c8853cfe31e4.tar.bz2
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. From-SVN: r232110
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-parser.c20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/bad-dereference.c24
4 files changed, 47 insertions, 8 deletions
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 <dmalcolm@redhat.com>
+
+ * 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 <polacek@redhat.com>
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 <dmalcolm@redhat.com>
+
+ * gcc.dg/bad-dereference.c: New test case.
+
2015-01-06 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* 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 "" } */
+}