aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-08-05 15:15:25 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-08-05 15:15:25 -0400
commitd3de8016a5f79800aa5f04f8ef8faf7a4874c23c (patch)
treed1fa48e7dea3e1964b28499d0acaf10eb15e755c
parent9127e99420ca8f238f15c06fe7f9089e38ed862d (diff)
downloadgcc-d3de8016a5f79800aa5f04f8ef8faf7a4874c23c.zip
gcc-d3de8016a5f79800aa5f04f8ef8faf7a4874c23c.tar.gz
gcc-d3de8016a5f79800aa5f04f8ef8faf7a4874c23c.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/typeck.c10
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist13.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist50.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist56.C37
6 files changed, 57 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 46eee7e..ea66fa1d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2011-08-05 Jason Merrill <jason@redhat.com>
+ 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 f53deb9..a1f6761 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 6ba6183..dfa765f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2011-08-05 Jason Merrill <jason@redhat.com>
+ 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 9ed6c74..bc5ee2c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/initlist13.C
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist13.C
@@ -4,5 +4,5 @@
#include <complex>
-__complex__ int i ({0});
-std::complex<int> i2 ({0});
+__complex__ int i {0};
+std::complex<int> i2 {0};
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist50.C b/gcc/testsuite/g++.dg/cpp0x/initlist50.C
index ef4e72c..5cb23e2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/initlist50.C
+++ b/gcc/testsuite/g++.dg/cpp0x/initlist50.C
@@ -8,7 +8,7 @@ struct A2 {
template <class T> 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 0000000..862b41b
--- /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 <initializer_list>
+
+struct B {
+ template<typename ...T>
+ B(std::initializer_list<int>, 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});