re PR c++/51422 ([c++0x] ICE with invalid lambda expression)

/cp
2012-10-07  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/51422
	* semantics.c (is_normal_capture_proxy): Return true for
	error_mark_node as DECL_VALUE_EXPR.

/testsuite
2012-10-07  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/51422
	* g++.dg/cpp0x/lambda/lambda-ice8.C: New.

From-SVN: r192187
This commit is contained in:
Paolo Carlini 2012-10-07 23:06:16 +00:00 committed by Paolo Carlini
parent 40c5ed5b5a
commit a5061eed10
4 changed files with 26 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2012-10-07 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51422
* semantics.c (is_normal_capture_proxy): Return true for
error_mark_node as DECL_VALUE_EXPR.
2012-10-05 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h (SIZEOF_EXPR_TYPE_P): Define.

View File

@ -3,8 +3,7 @@
building RTL. These routines are used both during actual parsing
and during the instantiation of template functions.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
Copyright (C) 1998-2012 Free Software Foundation, Inc.
Written by Mark Mitchell (mmitchell@usa.net) based on code found
formerly in parse.y and pt.c.
@ -9005,14 +9004,15 @@ is_capture_proxy (tree decl)
bool
is_normal_capture_proxy (tree decl)
{
tree val;
if (!is_capture_proxy (decl))
/* It's not a capture proxy. */
return false;
/* It is a capture proxy, is it a normal capture? */
val = DECL_VALUE_EXPR (decl);
tree val = DECL_VALUE_EXPR (decl);
if (val == error_mark_node)
return true;
gcc_assert (TREE_CODE (val) == COMPONENT_REF);
val = TREE_OPERAND (val, 1);
return DECL_NORMAL_CAPTURE_P (val);

View File

@ -1,3 +1,8 @@
2012-10-07 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51422
* g++.dg/cpp0x/lambda/lambda-ice8.C: New.
2012-10-07 Richard Sandiford <rdsandiford@googlemail.com>
Sandra Loosemore <sandra@codesourcery.com>

View File

@ -0,0 +1,10 @@
// PR c++/51422
// { dg-do compile { target c++11 } }
template<typename> struct A {};
void foo()
{
[i] { A<decltype(i)>(); }; // { dg-error "not declared|invalid" }
[i] { A<decltype(i)>(); }; // { dg-error "invalid" }
}