This bug happens when the LHS of operator '->' is either missing, i.e.: (->a) = 0;
or it is not a pointer: int b; b_2->c = 0; LHS should be validated. -- Regards, Mikhail Maltsev gcc/testsuite/ChangeLog: 2017-05-01 Mikhail Maltsev <malts...@gmail.com> * gcc.dg/gimplefe-error-6.c: New test. * gcc.dg/gimplefe-error-7.c: New test. gcc/c/ChangeLog: 2017-05-01 Mikhail Maltsev <malts...@gmail.com> * gimple-parser.c (c_parser_gimple_postfix_expression_after_primary): Check LHS of operator '->'
From 8fc6470a428f312bad1dd32d526b51d44d34e16e Mon Sep 17 00:00:00 2001 From: Mikhail Maltsev <malts...@gmail.com> Date: Fri, 24 Feb 2017 18:26:03 +0300 Subject: [PATCH 2/5] GIMPLEFE: handle invalid types of "->" operands --- gcc/c/gimple-parser.c | 9 +++++++++ gcc/testsuite/gcc.dg/gimplefe-error-6.c | 8 ++++++++ gcc/testsuite/gcc.dg/gimplefe-error-7.c | 7 +++++++ 3 files changed, 24 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/gimplefe-error-6.c create mode 100644 gcc/testsuite/gcc.dg/gimplefe-error-7.c diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c index a99b502..2e11567 100644 --- a/gcc/c/gimple-parser.c +++ b/gcc/c/gimple-parser.c @@ -1052,6 +1052,15 @@ c_parser_gimple_postfix_expression_after_primary (c_parser *parser, start = expr.get_start (); finish = c_parser_peek_token (parser)->get_finish (); c_parser_consume_token (parser); + if (!TREE_TYPE (expr.value) + || !POINTER_TYPE_P (TREE_TYPE (expr.value))) + { + error_at (op_loc, "invalid dereference"); + expr.set_error (); + expr.original_code = ERROR_MARK; + expr.original_type = NULL; + return expr; + } expr.value = build_component_ref (op_loc, build_simple_mem_ref_loc (op_loc, expr.value), diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-6.c b/gcc/testsuite/gcc.dg/gimplefe-error-6.c new file mode 100644 index 0000000..83ea19e --- /dev/null +++ b/gcc/testsuite/gcc.dg/gimplefe-error-6.c @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple" } */ + +__GIMPLE() void a() +{ + int b; + b_2->c = 0; /* { dg-error "dereference" } */ +} diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-7.c b/gcc/testsuite/gcc.dg/gimplefe-error-7.c new file mode 100644 index 0000000..ac5c1ad --- /dev/null +++ b/gcc/testsuite/gcc.dg/gimplefe-error-7.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-fgimple" } */ + +__GIMPLE() void b() +{ + (->a) = 0; /* { dg-error "expected|dereference" } */ +} -- 2.1.4