From a5061eed103e5e87e8416ac9e181423a8853ce0f Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sun, 7 Oct 2012 23:06:16 +0000 Subject: [PATCH] re PR c++/51422 ([c++0x] ICE with invalid lambda expression) /cp 2012-10-07 Paolo Carlini 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 PR c++/51422 * g++.dg/cpp0x/lambda/lambda-ice8.C: New. From-SVN: r192187 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 10 +++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C | 10 ++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 458b76231ef..0113fa4a451 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-10-07 Paolo Carlini + + PR c++/51422 + * semantics.c (is_normal_capture_proxy): Return true for + error_mark_node as DECL_VALUE_EXPR. + 2012-10-05 Jakub Jelinek * cp-tree.h (SIZEOF_EXPR_TYPE_P): Define. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 17ac36f67b9..7174927094c 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 32576db57bc..a1c4a3272f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-10-07 Paolo Carlini + + PR c++/51422 + * g++.dg/cpp0x/lambda/lambda-ice8.C: New. + 2012-10-07 Richard Sandiford Sandra Loosemore diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C new file mode 100644 index 00000000000..00078d53b7b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice8.C @@ -0,0 +1,10 @@ +// PR c++/51422 +// { dg-do compile { target c++11 } } + +template struct A {}; + +void foo() +{ + [i] { A(); }; // { dg-error "not declared|invalid" } + [i] { A(); }; // { dg-error "invalid" } +}