OSDN Git Service

/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Oct 2012 23:06:16 +0000 (23:06 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Oct 2012 23:06:16 +0000 (23:06 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192187 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 458b762..0113fa4 100644 (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.
index 17ac36f..7174927 100644 (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);
index 32576db..a1c4a32 100644 (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>
 
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 (file)
index 0000000..00078d5
--- /dev/null
@@ -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" }
+}