aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAdam Butcher <adam@jessamine.co.uk>2014-01-06 18:22:29 +0000
committerAdam Butcher <abutcher@gcc.gnu.org>2014-01-06 18:22:29 +0000
commit81fdaa176d937936a21bb3e42eb482f042f42b77 (patch)
tree8ccd2712fdeea89cfce91a2c01b9f055518c94ec /gcc
parent2c8c627389238b024de53401676139ffc6010b4e (diff)
downloadgcc-81fdaa176d937936a21bb3e42eb482f042f42b77.zip
gcc-81fdaa176d937936a21bb3e42eb482f042f42b77.tar.gz
gcc-81fdaa176d937936a21bb3e42eb482f042f42b77.tar.bz2
re PR c++/59636 ([c++1y] ICE with missing template parameter in lambda)
Fix PR c++/59636 PR c++/59636 * cp/parser.c (cp_parser_template_parameter): Early out with error_mark_node if parameter declaration was not parsed. * g++.dg/cpp1y/pr59636.C: New testcase. From-SVN: r206369
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c12
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/pr59636.C7
4 files changed, 19 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3bc68fc..3322897 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -4,6 +4,10 @@
* cp/lambda.c (maybe_add_lambda_conv_op): Handle marking conversion
function as unimplemented for generic lambdas with varargs.
+ PR c++/59636
+ * cp/parser.c (cp_parser_template_parameter): Early out with
+ error_mark_node if parameter declaration was not parsed.
+
2014-01-03 Marc Glisse <marc.glisse@inria.fr>
PR c++/58950
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index c99c1fc..4d97026 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -12977,20 +12977,21 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
= cp_parser_parameter_declaration (parser, /*template_parm_p=*/true,
/*parenthesized_p=*/NULL);
+ if (!parameter_declarator)
+ return error_mark_node;
+
/* If the parameter declaration is marked as a parameter pack, set
*IS_PARAMETER_PACK to notify the caller. Also, unmark the
declarator's PACK_EXPANSION_P, otherwise we'll get errors from
grokdeclarator. */
- if (parameter_declarator
- && parameter_declarator->declarator
+ if (parameter_declarator->declarator
&& parameter_declarator->declarator->parameter_pack_p)
{
*is_parameter_pack = true;
parameter_declarator->declarator->parameter_pack_p = false;
}
- if (parameter_declarator
- && parameter_declarator->default_argument)
+ if (parameter_declarator->default_argument)
{
/* Can happen in some cases of erroneous input (c++/34892). */
if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
@@ -13014,8 +13015,7 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type,
/* We might end up with a pack expansion as the type of the non-type
template parameter, in which case this is a non-type template
parameter pack. */
- else if (parameter_declarator
- && parameter_declarator->decl_specifiers.type
+ else if (parameter_declarator->decl_specifiers.type
&& PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type))
{
*is_parameter_pack = true;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f0c4804..a56b69d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,7 +1,9 @@
2014-01-06 Adam Butcher <adam@jessamine.co.uk>
PR c++/59635
+ PR c++/59636
* g++.dg/cpp1y/pr59635.C: New testcase.
+ * g++.dg/cpp1y/pr59636.C: New testcase.
2014-01-06 Martin Jambor <mjambor@suse.cz>
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr59636.C b/gcc/testsuite/g++.dg/cpp1y/pr59636.C
new file mode 100644
index 0000000..f2ca5b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/pr59636.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+// { dg-options "-std=c++1y" }
+
+// PR c++/59636
+
+auto f = []() { return []<>() {}; }; // { dg-error "expected identifier" }
+