From d3de8016a5f79800aa5f04f8ef8faf7a4874c23c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 5 Aug 2011 15:15:25 -0400 Subject: [PATCH] re PR c++/47453 ([DR 1214] Various non-conforming behaviors with braced-init-list initialization) PR c++/47453 * typeck.c (build_x_compound_expr_from_list): Also complain about ({...}). From-SVN: r177480 --- gcc/cp/ChangeLog | 4 +++ gcc/cp/typeck.c | 10 +++++++ gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/g++.dg/cpp0x/initlist13.C | 4 +-- gcc/testsuite/g++.dg/cpp0x/initlist50.C | 2 +- gcc/testsuite/g++.dg/cpp0x/initlist56.C | 37 +++++++++++++++++++++++++ 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist56.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 46eee7e8dbd..ea66fa1dbce 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-08-05 Jason Merrill + PR c++/47453 + * typeck.c (build_x_compound_expr_from_list): Also complain + about ({...}). + PR c++/49812 * typeck.c (cp_build_unary_op) [POSTINCREMENT_EXPR]: Strip cv-quals. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index f53deb985a6..a1f67613adc 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5470,6 +5470,16 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp, { tree expr = TREE_VALUE (list); + if (BRACE_ENCLOSED_INITIALIZER_P (expr) + && !CONSTRUCTOR_IS_DIRECT_INIT (expr)) + { + if (complain & tf_error) + pedwarn (EXPR_LOC_OR_HERE (expr), 0, "list-initializer for " + "non-class type must not be parenthesized"); + else + return error_mark_node; + } + if (TREE_CHAIN (list)) { if (complain & tf_error) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ba618327be..dfa765f7050 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-08-05 Jason Merrill + PR c++/47453 + * g++.dg/cpp0x/initlist56.C: New. + PR c++/49812 * g++.dg/overload/rvalue2.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist13.C b/gcc/testsuite/g++.dg/cpp0x/initlist13.C index 9ed6c74419f..bc5ee2c3aec 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist13.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist13.C @@ -4,5 +4,5 @@ #include -__complex__ int i ({0}); -std::complex i2 ({0}); +__complex__ int i {0}; +std::complex i2 {0}; diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc/testsuite/g++.dg/cpp0x/initlist50.C index ef4e72c7cfa..5cb23e2db3e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist50.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist50.C @@ -8,7 +8,7 @@ struct A2 { template struct B { T ar[1]; - B(T t):ar({t}) {} + B(T t):ar{t} {} }; int main(){ diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist56.C b/gcc/testsuite/g++.dg/cpp0x/initlist56.C new file mode 100644 index 00000000000..862b41bb3c8 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist56.C @@ -0,0 +1,37 @@ +// PR c++/47453 +// { dg-options "-std=c++0x -pedantic-errors" } + +// invalid +int a({0}); // { dg-error "" } + +// invalid +int const &b({0}); // { dg-error "" } + +// invalid +struct A1 { int a[2]; A1(); }; +A1::A1():a({1, 2}) { } // { dg-error "" } + +struct A { explicit A(int, int); A(int, long); }; + +// invalid +A c({1, 2}); // { dg-error "" } + +// valid (by copy constructor). +A d({1, 2L}); + +// valid +A e{1, 2}; + +#include + +struct B { + template + B(std::initializer_list, T ...); +}; + +// invalid (the first phase only considers init-list ctors) +// (for the second phase, no constructor is viable) +B f{1, 2, 3}; // { dg-error "" } + +// valid (T deduced to <>). +B g({1, 2, 3}); -- 2.30.2