[GIMPLE,FE] Fix ICE's with default ssa-name parsing in c_parser_gimple_postfix_expression

Message ID CAAgBjM=m2RWdVN3vH89GND8yL7OFJC2E=AHe2eYJ3pbv2nmLXg@mail.gmail.com
State New
Headers show

Commit Message

Prathamesh Kulkarni Feb. 17, 2017, 1:08 p.m.
Hi,
For the following test-case:

int __GIMPLE () foo (int a)
{
  return t0_1(D);
}

The compiler emits the undeclared diagnostic and then ICE's in
c_parser_gimple_postfix_expression because we don't check if
c_parser_parse_ssa_name returned error_mark_node.
ICE: https://gist.github.com/anonymous/45a01338d80faf4f21330bc9ee97ca5f

For this test-case:
int __GIMPLE() foo(int a)
{
  int _1;
  return _1(D);
}

c_parser_gimple_postfix_expression calls set_ssa_default_def which
crashes with segfault
because SSA_VAR_P(_1) is NULL and set_ssa_default_def expects it to be non-null.
ICE: https://gist.github.com/anonymous/1df5a4e8a59eca289e214bbaf07a461a

The patch rejects the above test-case with:
foo.c: In function ‘foo’:
foo.c:4:10: error: anonymous SSA name cannot have default definition
   return _1(D);

OK to commit after bootstrap+test ?

Thanks,
Prathamesh

Comments

Richard Biener Feb. 17, 2017, 1:31 p.m. | #1
On Fri, 17 Feb 2017, Prathamesh Kulkarni wrote:

> Hi,

> For the following test-case:

> 

> int __GIMPLE () foo (int a)

> {

>   return t0_1(D);

> }

> 

> The compiler emits the undeclared diagnostic and then ICE's in

> c_parser_gimple_postfix_expression because we don't check if

> c_parser_parse_ssa_name returned error_mark_node.

> ICE: https://gist.github.com/anonymous/45a01338d80faf4f21330bc9ee97ca5f

> 

> For this test-case:

> int __GIMPLE() foo(int a)

> {

>   int _1;

>   return _1(D);

> }

> 

> c_parser_gimple_postfix_expression calls set_ssa_default_def which

> crashes with segfault

> because SSA_VAR_P(_1) is NULL and set_ssa_default_def expects it to be non-null.

> ICE: https://gist.github.com/anonymous/1df5a4e8a59eca289e214bbaf07a461a

> 

> The patch rejects the above test-case with:

> foo.c: In function ‘foo’:

> foo.c:4:10: error: anonymous SSA name cannot have default definition

>    return _1(D);

> 

> OK to commit after bootstrap+test ?


Ok.

Thanks,
Richard.

Patch hide | download patch | download mbox

diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index d959877..e1535a3 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -864,6 +864,8 @@  c_parser_gimple_postfix_expression (c_parser *parser)
 	      c_parser_consume_token (parser);
 	      expr.value = c_parser_parse_ssa_name (parser, id, NULL_TREE,
 						    version, ver_offset);
+	      if (expr.value == error_mark_node)
+		return expr;
 	      set_c_expr_source_range (&expr, tok_range);
 	      /* For default definition SSA names.  */
 	      if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
@@ -878,6 +880,13 @@  c_parser_gimple_postfix_expression (c_parser *parser)
 		  c_parser_consume_token (parser);
 		  if (! SSA_NAME_IS_DEFAULT_DEF (expr.value))
 		    {
+		      if (!SSA_NAME_VAR (expr.value))
+			{
+			  error_at (loc, "anonymous SSA name cannot have"
+				    " default definition");
+			  expr.value = error_mark_node;
+			  return expr;
+			}
 		      set_ssa_default_def (cfun, SSA_NAME_VAR (expr.value),
 					   expr.value);
 		      SSA_NAME_DEF_STMT (expr.value) = gimple_build_nop ();