diff options
author | Jason Merrill <jason@redhat.com> | 2010-04-12 15:58:49 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-04-12 15:58:49 -0400 |
commit | e62e4922443057bdf5c547d67ff5881f0c3af9ca (patch) | |
tree | 950d8e23a8ad00c6b2da9b384baf36cd361bbe48 /gcc | |
parent | d68504839c134133fb96bfcfee4ef55ad95f4fa6 (diff) | |
download | gcc-e62e4922443057bdf5c547d67ff5881f0c3af9ca.zip gcc-e62e4922443057bdf5c547d67ff5881f0c3af9ca.tar.gz gcc-e62e4922443057bdf5c547d67ff5881f0c3af9ca.tar.bz2 |
re PR c++/43641 ([C++0x] internal compiler error: tree check: expected call_expr, have target_expr in maybe_add_lambda_conv_op)
PR c++/43641
* semantics.c (maybe_add_lambda_conv_op): Use build_call_a and tweak
return value directly.
From-SVN: r158241
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C | 13 |
4 files changed, 25 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00aa53e..0bb6cbb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2010-04-12 Jason Merrill <jason@redhat.com> + PR c++/43641 + * semantics.c (maybe_add_lambda_conv_op): Use build_call_a and tweak + return value directly. + * call.c (type_decays_to): Call cv_unqualified for non-class type. 2010-04-12 Fabien Chene <fabien.chene@gmail.com> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 66d152d..ea01eb3 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5968,9 +5968,12 @@ maybe_add_lambda_conv_op (tree type) VEC_quick_push (tree, argvec, arg); for (arg = DECL_ARGUMENTS (statfn); arg; arg = TREE_CHAIN (arg)) VEC_safe_push (tree, gc, argvec, arg); - call = build_cxx_call (callop, VEC_length (tree, argvec), - VEC_address (tree, argvec)); + call = build_call_a (callop, VEC_length (tree, argvec), + VEC_address (tree, argvec)); CALL_FROM_THUNK_P (call) = 1; + if (MAYBE_CLASS_TYPE_P (TREE_TYPE (call))) + call = build_cplus_new (TREE_TYPE (call), call); + call = convert_from_reference (call); finish_return_stmt (call); finish_compound_stmt (compound_stmt); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b73eaa8..03bfcc0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-04-12 Jason Merrill <jason@redhat.com> + PR c++/43641 + * g++.dg/cpp0x/lambda/lambda-conv4.C: New. + * g++.dg/cpp0x/lambda/lambda-deduce2.C: New. 2010-04-12 Fabien Chene <fabien.chene@gmail.com> diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C new file mode 100644 index 0000000..6584d28 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv4.C @@ -0,0 +1,13 @@ +// PR c++/43641 +// { dg-options "-std=c++0x" } + +struct B +{ + int i; +}; + +void func() +{ + [](const B& b) -> const int& { return b.i; }; + [](const B& b) { return b; }; +} |