This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Handle EOF in c_parser_parse_rtl_body
- From: David Malcolm <dmalcolm at redhat dot com>
- To: Joseph Myers <joseph at codesourcery dot com>
- Cc: Richard Biener <richard dot guenther at gmail dot com>, Jan Hubicka <hubicka at ucw dot cz>, GCC Patches <gcc-patches at gcc dot gnu dot org>, David Malcolm <dmalcolm at redhat dot com>
- Date: Fri, 18 Nov 2016 18:18:49 -0500
- Subject: [PATCH] Handle EOF in c_parser_parse_rtl_body
- Authentication-results: sourceware.org; auth=none
- References: <alpine.DEB.2.20.1611182212270.15277@digraph.polyomino.org.uk>
On Fri, 2016-11-18 at 22:13 +0000, Joseph Myers wrote:
> On Fri, 18 Nov 2016, David Malcolm wrote:
>
> > + /* Consume all tokens, up to the closing brace, handling
> > + matching pairs of braces in the rtl dump. */
> > + int num_open_braces = 1;
> > + while (1)
> > + {
> > + switch (c_parser_peek_token (parser)->type)
> > + {
> > + case CPP_OPEN_BRACE:
> > + num_open_braces++;
> > + break;
> > + case CPP_CLOSE_BRACE:
> > + if (--num_open_braces == 0)
> > + goto found_closing_brace;
> > + break;
> > + default:
> > + break;
> > + }
> > + c_parser_consume_token (parser);
> > + }
>
> What if you have an EOF without the close brace being found? I'd
> expect
> you to hit the
>
> gcc_assert (parser->tokens[0].type != CPP_EOF);
>
> in c_parser_consume_token.
Oops; thanks. Here's a patch on top of v5 that (I hope) addresses that.
gcc/c/ChangeLog:
* c-parser.c (c_parser_parse_rtl_body): Handle CPP_EOF.
gcc/testsuite/ChangeLog:
* gcc.dg/rtl/truncated-rtl-file.c: New test case.
---
gcc/c/c-parser.c | 4 ++++
gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c | 2 ++
2 files changed, 6 insertions(+)
create mode 100644 gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index d645d29..fef882a 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -18326,6 +18326,10 @@ c_parser_parse_rtl_body (c_parser *parser, char *start_with_pass)
if (--num_open_braces == 0)
goto found_closing_brace;
break;
+ case CPP_EOF:
+ error_at (start_loc, "no closing brace");
+ free (start_with_pass);
+ return;
default:
break;
}
diff --git a/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c b/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
new file mode 100644
index 0000000..4dd8214
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/rtl/truncated-rtl-file.c
@@ -0,0 +1,2 @@
+void __RTL test (void)
+{ /* { dg-error "no closing brace" } */
--
1.8.5.3