diff options
author | Jason Merrill <jason@redhat.com> | 2013-04-22 14:52:50 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-04-22 14:52:50 -0400 |
commit | 08afbd3bcaa0c6ca8ec54fddaf80dac5b97a659c (patch) | |
tree | 5c5c54821e8fdec5437ed999a53426ad9fb29dca | |
parent | c10f41938a02e0763092f8e67226ca736bc1390d (diff) | |
download | gcc-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
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-anon1.C | 18 |
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; +} |