diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2011-11-25 01:00:44 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2011-11-25 01:00:44 +0000 |
commit | c138ee6de212e444155b5facfdd140a670e03df7 (patch) | |
tree | ca8fbd7bbf72f37891d711c7451a5d77f08cf681 | |
parent | 28a4bba20273ff215734d6fffe98c70b4b038daa (diff) | |
download | gcc-c138ee6de212e444155b5facfdd140a670e03df7.zip gcc-c138ee6de212e444155b5facfdd140a670e03df7.tar.gz gcc-c138ee6de212e444155b5facfdd140a670e03df7.tar.bz2 |
re PR c++/51227 ([c++0x] ICE with invalid parameter in lambda expression)
/cp
2011-11-24 Paolo Carlini <paolo.carlini@oracle.com>
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 <paolo.carlini@oracle.com>
PR c++/51227
* g++.dg/cpp0x/lambda/lambda-ice5.C: New.
From-SVN: r181707
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C | 12 |
4 files changed, 35 insertions, 6 deletions
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 <paolo.carlini@oracle.com> + 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 <paolo.carlini@oracle.com> + 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 <paolo.carlini@oracle.com> + + PR c++/51227 + * g++.dg/cpp0x/lambda/lambda-ice5.C: New. + 2011-11-24 H.J. Lu <hongjiu.lu@intel.com> 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> int foo() +{ + [] (void i) { return 0; } (0); // { dg-error "incomplete|invalid|no match" } +} + +void bar() +{ + foo<0>(); +} |