Fix ICE caused by swallowing a token in c_parser_consume_token
authorKerem Kat <keremkat@gmail.com>
Thu, 16 Jan 2020 23:42:11 +0000 (23:42 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 16 Jan 2020 23:42:11 +0000 (23:42 +0000)
This patch fixes ICE on invalid code, specifically files that have
conflict-marker-like signs before EOF.

PR c/92833
gcc/c/
* c-parser.c (c_parser_consume_token): Fix peeked token stack pop
to support 4 available tokens.

gcc/testsuite/
* c-c++-common/pr92833-1.c, c-c++-common/pr92833-2.c,
c-c++-common/pr92833-3.c, c-c++-common/pr92833-4.c: New tests.

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr92833-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/pr92833-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/pr92833-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/pr92833-4.c [new file with mode: 0644]

index b702b39..c638756 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-16  Kerem Kat  <keremkat@gmail.com>
+
+       PR c/92833
+       * c-parser.c (c_parser_consume_token): Fix peeked token stack pop
+       to support 4 available tokens.
+
 2020-01-15  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/93072
index bf9e3e0..6164017 100644 (file)
@@ -846,7 +846,11 @@ c_parser_consume_token (c_parser *parser)
     {
       parser->tokens[0] = parser->tokens[1];
       if (parser->tokens_avail >= 3)
-       parser->tokens[1] = parser->tokens[2];
+        {
+          parser->tokens[1] = parser->tokens[2];
+          if (parser->tokens_avail >= 4)
+            parser->tokens[2] = parser->tokens[3];
+        }
     }
   parser->tokens_avail--;
 }
index 2af4d34..b2bb021 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-16  Kerem Kat  <keremkat@gmail.com>
+
+       PR c/92833
+       * c-c++-common/pr92833-1.c, c-c++-common/pr92833-2.c,
+       c-c++-common/pr92833-3.c, c-c++-common/pr92833-4.c: New tests.
+
 2020-01-16  Stam Markianos-Wright  <stam.markianos-wright@arm.com>
 
        * g++.target/arm/bfloat_cpp_typecheck.C: New test.
diff --git a/gcc/testsuite/c-c++-common/pr92833-1.c b/gcc/testsuite/c-c++-common/pr92833-1.c
new file mode 100644 (file)
index 0000000..ab164aa
--- /dev/null
@@ -0,0 +1,4 @@
+/* Six marker characters at EOF, causes conflict marker detector to peek 4
+   tokens. */
+
+/* { dg-error "expected" } */ <<<<<<
\ No newline at end of file
diff --git a/gcc/testsuite/c-c++-common/pr92833-2.c b/gcc/testsuite/c-c++-common/pr92833-2.c
new file mode 100644 (file)
index 0000000..8347f35
--- /dev/null
@@ -0,0 +1,4 @@
+/* Six marker characters at EOF, causes conflict marker detector to peek 4
+   tokens. */
+
+/* { dg-error "expected" } */ ======
\ No newline at end of file
diff --git a/gcc/testsuite/c-c++-common/pr92833-3.c b/gcc/testsuite/c-c++-common/pr92833-3.c
new file mode 100644 (file)
index 0000000..fe4f6d4
--- /dev/null
@@ -0,0 +1,4 @@
+/* Six marker characters at EOF, causes conflict marker detector to peek 4
+   tokens. */
+
+/* { dg-error "expected" } */ >>>>>>
\ No newline at end of file
diff --git a/gcc/testsuite/c-c++-common/pr92833-4.c b/gcc/testsuite/c-c++-common/pr92833-4.c
new file mode 100644 (file)
index 0000000..b591ea9
--- /dev/null
@@ -0,0 +1,7 @@
+/* Six marker characters at EOF, causes conflict marker detector to peek 4
+   tokens. */
+
+/* { dg-message "expected" "expected" { target *-*-* } .3 } */
+>>
+>>
+>>
\ No newline at end of file