From 53c6377cf66330535722ef7c760f8193480994b9 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 8 Mar 2013 15:55:18 +0000 Subject: [PATCH] PR c++/56567 * semantics.c (apply_deduced_return_type): Don't allow returning std::initializer_list. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196548 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/semantics.c | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C | 11 +++++++++++ 3 files changed, 23 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 49e0f51bdec..14647610e4f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-03-08 Jason Merrill + + PR c++/56567 + * semantics.c (apply_deduced_return_type): Don't allow returning + std::initializer_list. + 2013-03-06 Paolo Carlini PR c++/56534 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index ab3d16ea3b8..d605de9631f 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -9061,6 +9061,12 @@ 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/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C new file mode 100644 index 00000000000..029287bd148 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-initlist3.C @@ -0,0 +1,11 @@ +// PR c++/56567 +// { dg-require-effective-target c++11 } + +#include + +int main() +{ + []{ return { 1, 2 }; }(); // { dg-error "initializer_list" } +} + +// { dg-prune-output "return-statement with a value" } -- 2.11.4.GIT