diff mbox

[GIMPLE,FE] Fix SSA name parsing

Message ID alpine.LSU.2.11.1610271202540.5294@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Oct. 27, 2016, 10:03 a.m. UTC
The following handles parsing SSA names where it belongs so that
p_1(D)->a also works.

Tested on x86_64-unknown-linux-gnu, applied.

Richard.

2016-10-27  Richard Biener  <rguenther@suse.de>

	c/
	* gimple-parser.c (c_parser_gimple_unary_expression): Move
	SSA name handling ...
	(c_parser_gimple_postfix_expression): ... here.

	* gcc.dg/gimplefe-16.c: New testcase.
diff mbox

Patch

diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index bcfb677..931a61f 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -575,11 +575,6 @@  static c_expr
 c_parser_gimple_unary_expression (c_parser *parser)
 {
   struct c_expr ret, op;
-  if (c_parser_peek_token (parser)->type == CPP_NAME
-      && TREE_CODE (c_parser_peek_token (parser)->value) == IDENTIFIER_NODE
-      && ! lookup_name (c_parser_peek_token (parser)->value))
-    return c_parser_parse_ssa_names (parser);
-
   location_t op_loc = c_parser_peek_token (parser)->location;
   location_t finish;
   ret.original_code = ERROR_MARK;
@@ -761,12 +756,17 @@  c_parser_gimple_postfix_expression (c_parser *parser)
       if (c_parser_peek_token (parser)->id_kind == C_ID_ID)
 	{
 	  tree id = c_parser_peek_token (parser)->value;
-	  c_parser_consume_token (parser);
-	  expr.value = build_external_ref (loc, id,
-					   (c_parser_peek_token (parser)->type
-					    == CPP_OPEN_PAREN),
-					   &expr.original_type);
-	  set_c_expr_source_range (&expr, tok_range);
+	  if (! lookup_name (id))
+	    expr = c_parser_parse_ssa_names (parser);
+	  else
+	    {
+	      c_parser_consume_token (parser);
+	      expr.value
+		= build_external_ref (loc, id,
+				      (c_parser_peek_token (parser)->type
+				       == CPP_OPEN_PAREN), &expr.original_type);
+	      set_c_expr_source_range (&expr, tok_range);
+	    }
 	  break;
 	}
       else
diff --git a/gcc/testsuite/gcc.dg/gimplefe-16.c b/gcc/testsuite/gcc.dg/gimplefe-16.c
new file mode 100644
index 0000000..2949249
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-16.c
@@ -0,0 +1,18 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple" } */
+
+struct Y { int b[2]; };
+struct X { int a; struct Y y; };
+struct X x;
+
+int __GIMPLE ()
+foo (struct X *p, _Complex int q)
+{
+  int b;
+  b_1 = __real q;
+  p_4(D)->a = b_1;
+  x.y.b[b_1] = b_1;
+  b_2 = p->y.b[1];
+  b_3 = x.a;
+  return b_3;
+}