OSDN Git Service

PR c++/47453
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Aug 2011 19:15:25 +0000 (19:15 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Aug 2011 19:15:25 +0000 (19:15 +0000)
* typeck.c (build_x_compound_expr_from_list): Also complain
about ({...}).

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177480 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist13.C
gcc/testsuite/g++.dg/cpp0x/initlist50.C
gcc/testsuite/g++.dg/cpp0x/initlist56.C [new file with mode: 0644]

index 46eee7e..ea66fa1 100644 (file)
@@ -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.
 
index f53deb9..a1f6761 100644 (file)
@@ -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)
index 6ba6183..dfa765f 100644 (file)
@@ -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.
 
index 9ed6c74..bc5ee2c 100644 (file)
@@ -4,5 +4,5 @@
 
 #include <complex>
 
-__complex__ int i ({0});
-std::complex<int> i2 ({0});
+__complex__ int i {0};
+std::complex<int> i2 {0};
index ef4e72c..5cb23e2 100644 (file)
@@ -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 (file)
index 0000000..862b41b
--- /dev/null
@@ -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});