From c138ee6de212e444155b5facfdd140a670e03df7 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Fri, 25 Nov 2011 01:00:44 +0000 Subject: re PR c++/51227 ([c++0x] ICE with invalid parameter in lambda expression) /cp 2011-11-24 Paolo Carlini PR c++/51227 * pt.c (instantiate_class_template_1): If lambda_function (type) is NULL_TREE do not instantiate_decl. /testsuite 2011-11-24 Paolo Carlini PR c++/51227 * g++.dg/cpp0x/lambda/lambda-ice5.C: New. From-SVN: r181707 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 18 ++++++++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C | 12 ++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 83a5508..0772ee9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2011-11-24 Paolo Carlini + PR c++/51227 + * pt.c (instantiate_class_template_1): If lambda_function (type) + is NULL_TREE do not instantiate_decl. + +2011-11-24 Paolo Carlini + PR c++/51290 * class.c (build_base_path): For the null pointer check use nullptr_node instead of integer_zero_node. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f817b6f..4725080 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9103,14 +9103,20 @@ instantiate_class_template_1 (tree type) if (CLASSTYPE_LAMBDA_EXPR (type)) { - tree lambda = CLASSTYPE_LAMBDA_EXPR (type); - if (LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda)) + tree decl = lambda_function (type); + if (decl) { - apply_lambda_return_type (lambda, void_type_node); - LAMBDA_EXPR_RETURN_TYPE (lambda) = NULL_TREE; + tree lambda = CLASSTYPE_LAMBDA_EXPR (type); + if (LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda)) + { + apply_lambda_return_type (lambda, void_type_node); + LAMBDA_EXPR_RETURN_TYPE (lambda) = NULL_TREE; + } + instantiate_decl (decl, false, false); + maybe_add_lambda_conv_op (type); } - instantiate_decl (lambda_function (type), false, false); - maybe_add_lambda_conv_op (type); + else + gcc_assert (errorcount); } /* Set the file and line number information to whatever is given for diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e162c0b..229e6d8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-24 Paolo Carlini + + PR c++/51227 + * g++.dg/cpp0x/lambda/lambda-ice5.C: New. + 2011-11-24 H.J. Lu PR target/51134 diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C new file mode 100644 index 0000000..305db81 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C @@ -0,0 +1,12 @@ +// PR c++/51227 +// { dg-options "-std=c++0x" } + +template int foo() +{ + [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" } +} + +void bar() +{ + foo<0>(); +} -- cgit v1.1