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

Reply via email to