aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2011-11-25 01:00:44 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2011-11-25 01:00:44 +0000
commitc138ee6de212e444155b5facfdd140a670e03df7 (patch)
treeca8fbd7bbf72f37891d711c7451a5d77f08cf681
parent28a4bba20273ff215734d6fffe98c70b4b038daa (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/pt.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C12
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>();
+}