OSDN Git Service

PR c++/50736
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Oct 2011 18:59:41 +0000 (18:59 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Oct 2011 18:59:41 +0000 (18:59 +0000)
* parser.c (cp_parser_lambda_introducer): Check for more
invalid captures.

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

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

index 453dce1..ed7d832 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50736
+       * parser.c (cp_parser_lambda_introducer): Check for more
+       invalid captures.
+
 2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/44524
index ea0c4dc..bf362f2 100644 (file)
@@ -7630,6 +7630,31 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
                  /*ambiguous_decls=*/NULL,
                  capture_token->location);
 
+         if (capture_init_expr == error_mark_node)
+           {
+             unqualified_name_lookup_error (capture_id);
+             continue;
+           }
+         else if (DECL_P (capture_init_expr)
+                  && (TREE_CODE (capture_init_expr) != VAR_DECL
+                      && TREE_CODE (capture_init_expr) != PARM_DECL))
+           {
+             error_at (capture_token->location,
+                       "capture of non-variable %qD ",
+                       capture_init_expr);
+             inform (0, "%q+#D declared here", capture_init_expr);
+             continue;
+           }
+         if (TREE_CODE (capture_init_expr) == VAR_DECL
+             && decl_storage_duration (capture_init_expr) != dk_auto)
+           {
+             pedwarn (capture_token->location, 0, "capture of variable "
+                      "%qD with non-automatic storage duration",
+                      capture_init_expr);
+             inform (0, "%q+#D declared here", capture_init_expr);
+             continue;
+           }
+
          capture_init_expr
             = finish_id_expression
                 (capture_id,
@@ -7647,10 +7672,6 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
                  capture_token->location);
        }
 
-      if (TREE_CODE (capture_init_expr) == IDENTIFIER_NODE)
-       capture_init_expr
-         = unqualified_name_lookup_error (capture_init_expr);
-
       if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) != CPLD_NONE
          && !explicit_init_p)
        {
index 3a6edad..3a3cef9 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/50736
+       * g++.dg/cpp0x/lambda/lambda-capture-neg.C: New.
+
 2011-10-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/44524
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-capture-neg.C
new file mode 100644 (file)
index 0000000..82cc984
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/50736
+// { dg-options "-std=c++0x -pedantic-errors" }
+
+int i;
+void f();
+typedef int T;
+
+int main()
+{
+  [i]{};                       // { dg-error "non-automatic" }
+  [f]{};                       // { dg-error "non-variable" }
+  [T]{};                       // { dg-error "non-variable" }
+}
+
+struct A { };