error.c (dump_aggr_type): Fix lambda detection.
authorJason Merrill <jason@redhat.com>
Mon, 22 Apr 2013 20:33:01 +0000 (16:33 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 22 Apr 2013 20:33:01 +0000 (16:33 -0400)
* error.c (dump_aggr_type): Fix lambda detection.
(dump_simple_decl): Pretty-print capture field.

From-SVN: r198159

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

index 57c2fc3f5713eed7c8dbb33fbd28d19f8b4ec116..c91f3ec68d9b5ca803c4ef6aa59c05975e439352 100644 (file)
@@ -1,5 +1,8 @@
 2013-04-22  Jason Merrill  <jason@redhat.com>
 
+       * error.c (dump_aggr_type): Fix lambda detection.
+       (dump_simple_decl): Pretty-print capture field.
+
        N3323
        * cvt.c (build_expr_type_conversion): Two conversions that return
        the same type aren't necessarily ambiguous.
index 6bac7ec88ee8d6a650463b5bc8e2d57dfc671a9d..32063429611208c87813c114f3f707e0c2a72875 100644 (file)
@@ -656,7 +656,7 @@ dump_aggr_type (tree t, int flags)
       else
        pp_printf (pp_base (cxx_pp), M_("<anonymous %s>"), variety);
     }
-  else if (LAMBDA_TYPE_P (name))
+  else if (LAMBDA_TYPE_P (t))
     {
       /* A lambda's "type" is essentially its signature.  */
       pp_string (cxx_pp, M_("<lambda"));
@@ -933,7 +933,16 @@ dump_simple_decl (tree t, tree type, int flags)
       && TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (t)))
     pp_string (cxx_pp, "...");
   if (DECL_NAME (t))
-    dump_decl (DECL_NAME (t), flags);
+    {
+      if (DECL_CLASS_SCOPE_P (t) && LAMBDA_TYPE_P (DECL_CONTEXT (t)))
+       {
+         pp_character (cxx_pp, '<');
+         pp_string (cxx_pp, IDENTIFIER_POINTER (DECL_NAME (t)) + 2);
+         pp_string (cxx_pp, " capture>");
+       }
+      else
+       dump_decl (DECL_NAME (t), flags);
+    }
   else
     pp_string (cxx_pp, M_("<anonymous>"));
   if (flags & TFF_DECL_SPECIFIERS)
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-diag1.C
new file mode 100644 (file)
index 0000000..dc1043b
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-require-effective-target c++11 }
+
+int main()
+{
+  int x;
+  auto f = [x]{ };
+  f.__x.foo;                   // { dg-error "<lambda\\(\\)>::<x capture>" }
+}