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; +}