diff mbox

[1/5,GIMPLE,FE] PR testsuite/80580. Handle missing labels in goto statements

Message ID 9e3b3ee6-0c67-f974-c38e-7f9f25249914@gmail.com
State New
Headers show

Commit Message

Mikhail Maltsev May 1, 2017, 6:04 p.m. UTC
The first problem happens because we don't check for missing labels when parsing
'goto' statements. I.e.:

__GIMPLE() void fn1() {
  if (1)
    goto
}

The fix is pretty obvious: just add a check.
My question is: which functions should I use to produce diagnostics? The
surrounding code uses 'c_parser_error', but this function does not handle
locations very well (in fact, it uses input_location).
diff mbox

Patch

diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index 0d6384b..a99b502 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -1315,6 +1315,11 @@  c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq)
       loc = c_parser_peek_token (parser)->location;
       c_parser_consume_token (parser);
       label = c_parser_peek_token (parser)->value;
+      if (! label)
+	{
+	  c_parser_error (parser, "expected label");
+	  return;
+	}
       t_label = lookup_label_for_goto (loc, label);
       c_parser_consume_token (parser);
       if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
@@ -1339,6 +1344,11 @@  c_parser_gimple_if_stmt (c_parser *parser, gimple_seq *seq)
       loc = c_parser_peek_token (parser)->location;
       c_parser_consume_token (parser);
       label = c_parser_peek_token (parser)->value;
+      if (! label)
+	{
+	  c_parser_error (parser, "expected label");
+	  return;
+	}
       f_label = lookup_label_for_goto (loc, label);
       c_parser_consume_token (parser);
       if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-4.c b/gcc/testsuite/gcc.dg/gimplefe-error-4.c
new file mode 100644
index 0000000..c61539c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-error-4.c
@@ -0,0 +1,7 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+__GIMPLE() void fn1() {
+  if (1)
+    goto
+} /* { dg-error "expected label" } */
diff --git a/gcc/testsuite/gcc.dg/gimplefe-error-5.c b/gcc/testsuite/gcc.dg/gimplefe-error-5.c
new file mode 100644
index 0000000..7398861
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-error-5.c
@@ -0,0 +1,9 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fgimple" } */
+
+__GIMPLE() void fn1() {
+  if (1)
+    goto lbl;
+  else
+    goto
+} /* { dg-error "expected label" } */