diff options
author | Jason Merrill <jason@redhat.com> | 2013-03-11 12:22:16 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-03-11 12:22:16 -0400 |
commit | 2aa953d015925abcd909e22ec48507660efe30aa (patch) | |
tree | 332df0e3a9078669a945c39ac9b4b3946236dab3 /gcc | |
parent | a036a589fa67d491e1698e79531872c6fcf1fd44 (diff) | |
download | gcc-2aa953d015925abcd909e22ec48507660efe30aa.zip gcc-2aa953d015925abcd909e22ec48507660efe30aa.tar.gz gcc-2aa953d015925abcd909e22ec48507660efe30aa.tar.bz2 |
re PR c++/56567 (ICE with lambda return type deduction and braced-init-list)
PR c++/56567
* typeck.c (check_return_expr): Disallow returning init list here.
* semantics.c (apply_deduced_return_type): Not here.
From-SVN: r196600
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C | 2 |
4 files changed, 12 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f09fa0a..c728c50 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-03-11 Jason Merrill <jason@redhat.com> + + PR c++/56567 + * typeck.c (check_return_expr): Disallow returning init list here. + * semantics.c (apply_deduced_return_type): Not here. + 2013-03-08 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51412 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 233765a..e909b98 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9061,12 +9061,6 @@ apply_deduced_return_type (tree fco, tree return_type) if (return_type == error_mark_node) return; - if (is_std_init_list (return_type)) - { - error ("returning %qT", return_type); - return_type = void_type_node; - } - if (LAMBDA_FUNCTION_P (fco)) { tree lambda = CLASSTYPE_LAMBDA_EXPR (current_class_type); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 58295d7..58ebcc0 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -8136,6 +8136,11 @@ check_return_expr (tree retval, bool *no_warning) "deduced to %<void%>"); type = error_mark_node; } + else if (retval && BRACE_ENCLOSED_INITIALIZER_P (retval)) + { + error ("returning initializer list"); + type = error_mark_node; + } else { if (!retval) diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C index 029287b..f7b82ef 100644 --- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C @@ -5,7 +5,7 @@ int main() { - []{ return { 1, 2 }; }(); // { dg-error "initializer_list" } + []{ return { 1, 2 }; }(); // { dg-error "initializer.list" } } // { dg-prune-output "return-statement with a value" } |