aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-05-19 18:10:30 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-05-19 18:10:30 +0000
commit5e9a538594761b93843b4285c06bcd871fa0335f (patch)
tree400ffed166e4c228ca8195177c6d22df759aff75
parent1478c897bff210b8ea875f5aa58da68ee6264c45 (diff)
downloadgcc-5e9a538594761b93843b4285c06bcd871fa0335f.zip
gcc-5e9a538594761b93843b4285c06bcd871fa0335f.tar.gz
gcc-5e9a538594761b93843b4285c06bcd871fa0335f.tar.bz2
PR c++/71184: Fix NULL dereference in cp_parser_operator
The source-range handling for the array form of operator new/delete erroneously assumed that the "]" was present, leading to a dereference of NULL when it's absent. Fix it thusly. gcc/cp/ChangeLog: PR c++/71184 * parser.c (cp_parser_operator): For array new/delete, check that cp_parser_require returned a non-NULL token before dereferencing it. gcc/testsuite/ChangeLog: PR c++/71184 * g++.dg/pr71184.C: New test case. From-SVN: r236483
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr71184.C1
4 files changed, 16 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 66c04a6..70dbcb3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2016-05-19 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/71184
+ * parser.c (cp_parser_operator): For array new/delete, check that
+ cp_parser_require returned a non-NULL token before dereferencing
+ it.
+
2016-05-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
* decl.c (finish_enum_value_list): Use the specified mode.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 3abba12..076e7f3 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -13791,8 +13791,9 @@ cp_parser_operator (cp_parser* parser)
/* Consume the `[' token. */
cp_lexer_consume_token (parser->lexer);
/* Look for the `]' token. */
- end_loc = cp_parser_require (parser, CPP_CLOSE_SQUARE,
- RT_CLOSE_SQUARE)->location;
+ if (cp_token *close_token
+ = cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE))
+ end_loc = close_token->location;
id = ansi_opname (op == NEW_EXPR
? VEC_NEW_EXPR : VEC_DELETE_EXPR);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f543d18..1630598 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-19 David Malcolm <dmalcolm@redhat.com>
+
+ PR c++/71184
+ * g++.dg/pr71184.C: New test case.
+
2016-05-19 Kelvin Nilsen <kelvin@gcc.gnu.org>
* gcc.target/powerpc/darn-0.c: New test.
diff --git a/gcc/testsuite/g++.dg/pr71184.C b/gcc/testsuite/g++.dg/pr71184.C
new file mode 100644
index 0000000..452303e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr71184.C
@@ -0,0 +1 @@
+operator new[ // { dg-error "expected type-specifier before 'new'" }