re PR c++/51227 ([c++0x] ICE with invalid parameter in lambda expression)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 25 Nov 2011 01:00:44 +0000 (01:00 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 25 Nov 2011 01:00:44 +0000 (01:00 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice5.C [new file with mode: 0644]

index 83a5508c16968e32c540acafdc680d579ed09149..0772ee9715c83231791dbce1dff510fabdad13f0 100644 (file)
@@ -1,3 +1,9 @@
+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
index f817b6ffab6859133b9563dd5d3874a581b0c061..472508075776e109d0636e4c100fddd7edded127 100644 (file)
@@ -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
index e162c0b04398d3852b058300895aa429e9000532..229e6d8a86d5e1aa1fdfad8983af0ffc8e49574b 100644 (file)
@@ -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 (file)
index 0000000..305db81
--- /dev/null
@@ -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>();
+}