aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-04-22 14:52:50 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-04-22 14:52:50 -0400
commit08afbd3bcaa0c6ca8ec54fddaf80dac5b97a659c (patch)
tree5c5c54821e8fdec5437ed999a53426ad9fb29dca /gcc
parentc10f41938a02e0763092f8e67226ca736bc1390d (diff)
downloadgcc-08afbd3bcaa0c6ca8ec54fddaf80dac5b97a659c.zip
gcc-08afbd3bcaa0c6ca8ec54fddaf80dac5b97a659c.tar.gz
gcc-08afbd3bcaa0c6ca8ec54fddaf80dac5b97a659c.tar.bz2
Core 1612
Core 1612 * semantics.c (finish_id_expression): Reject capture of anonymous union member. From-SVN: r198153
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/semantics.c6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C18
3 files changed, 28 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0dada14..b8c4727 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2013-04-22 Jason Merrill <jason@redhat.com>
+ Core 1612
+ * semantics.c (finish_id_expression): Reject capture of anonymous
+ union member.
+
Core 1609
* decl2.c (check_default_args): Check for pack expansion.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 2784d79..391dc1e 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -3105,6 +3105,12 @@ finish_id_expression (tree id_expression,
= decl_function_context (containing_function);
}
+ if (lambda_expr && TREE_CODE (decl) == VAR_DECL
+ && DECL_ANON_UNION_VAR_P (decl))
+ {
+ error ("cannot capture member %qD of anonymous union", decl);
+ return error_mark_node;
+ }
if (context == containing_function)
{
decl = add_default_capture (lambda_stack,
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C
new file mode 100644
index 0000000..482193e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C
@@ -0,0 +1,18 @@
+// DR 1612
+// { dg-require-effective-target c++11 }
+
+int main() {
+ static int result;
+ struct A { int x; };
+ struct B { int y; };
+ union {
+ A a; B b;
+ };
+ a.x = 1;
+ [=]() mutable {
+ a.x = 2; // { dg-error "anonymous union" }
+ result = b.y; // { dg-error "anonymous union" }
+ }();
+ if (result == 1) return 0;
+ throw 0;
+}