diff mbox

[4/5,GIMPLE,FE] PR testsuite/80580. Handle invalid __MEM

Message ID 4254ece8-870a-0015-01c6-e99ffa3d5d5b@gmail.com
State New
Headers show

Commit Message

Mikhail Maltsev May 1, 2017, 6:08 p.m. UTC
This patch deals with invalid __MEM construct. Before we start building an
expression for __MEM, we must check that parsing succeeded and that the __MEM
operand is a pointer.

Comments

Richard Biener May 2, 2017, 2:21 p.m. UTC | #1
On Mon, May 1, 2017 at 8:08 PM, Mikhail Maltsev <maltsevm@gmail.com> wrote:
> This patch deals with invalid __MEM construct. Before we start building an
> expression for __MEM, we must check that parsing succeeded and that the __MEM
> operand is a pointer.

Ok.

Thanks,
Richard.

> --
> Regards,
>    Mikhail Maltsev
>
>
> gcc/c/ChangeLog:
>
> 2017-05-01  Mikhail Maltsev  <maltsevm@gmail.com>
>
>         * gimple-parser.c (c_parser_gimple_postfix_expression): Handle
>         invalid __MEM.
>
> gcc/testsuite/ChangeLog:
>
> 2017-05-01  Mikhail Maltsev  <maltsevm@gmail.com>
>
>         * gcc.dg/gimplefe-error-9.c: New test.
>
>
>
diff mbox

Patch

diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index 5249e8a..f3af840 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -804,6 +804,16 @@  c_parser_gimple_postfix_expression (c_parser *parser)
 			}
 		    }
 		  ptr = c_parser_gimple_unary_expression (parser);
+		  if (ptr.value == error_mark_node
+		      || ! POINTER_TYPE_P (TREE_TYPE (ptr.value)))
+		    {
+		      if (ptr.value != error_mark_node)
+			error_at (ptr.get_start (),
+				  "invalid type of %<__MEM%> operand");
+		      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
+						 "expected %<)%>");
+		      return expr;
+		    }
 		  if (! alias_type)
 		    alias_type = TREE_TYPE (ptr.value);
 		  /* Optional constant offset.  */
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-9.c b/gcc/testsuite/gcc.dg/gimplefe-error-9.c
new file mode 100644
index 0000000..2bdb398
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-error-9.c
@@ -0,0 +1,7 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+__GIMPLE() void a()
+{
+  __MEM() = 0; /* { dg-error "expected .<." } */
+}