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  <rguent...@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 --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;
+}

Reply via email to