re PR c++/44045 (initialization of array of shared_ptr's with initializer list causes...
authorJason Merrill <jason@redhat.com>
Mon, 10 May 2010 18:37:56 +0000 (14:37 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 10 May 2010 18:37:56 +0000 (14:37 -0400)
PR c++/44045
* typeck.c (cp_build_modify_expr): Complain about assignment to
array from init list.

From-SVN: r159243

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist26.C
gcc/testsuite/g++.dg/cpp0x/initlist28.C
gcc/testsuite/g++.dg/cpp0x/initlist33.C [new file with mode: 0644]

index c62f817e53a947bfd496bbd669be64bbb0091819..beedb80edd91dd726339a4e78ecc61528078d6cc 100644 (file)
@@ -1,3 +1,9 @@
+2010-05-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/44045
+       * typeck.c (cp_build_modify_expr): Complain about assignment to
+       array from init list.
+
 2010-05-10  Fabien ChĂȘne  <fabien.chene@gmail.com>
 
        PR c++/43719
index 61d5f224cabb480efb212794b28083787cc01dcb..5c8fd82688c3c128cc454f07e8df9684a4d17ed6 100644 (file)
@@ -6634,6 +6634,12 @@ cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
 
       if (BRACE_ENCLOSED_INITIALIZER_P (newrhs))
        {
+         if (modifycode != INIT_EXPR)
+           {
+             if (complain & tf_error)
+               error ("assigning to an array from an initializer list");
+             return error_mark_node;
+           }
          if (check_array_initializer (lhs, lhstype, newrhs))
            return error_mark_node;
          newrhs = digest_init (lhstype, newrhs);
index 7f76632a802af4d1e709806b647f915fe1529a08..9f0a4b1d67057afcf19b6cfa594faec4767f63c0 100644 (file)
@@ -1,3 +1,10 @@
+2010-05-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/44045
+       * g++.dg/cpp0x/initlist33.C: New.
+       * g++.dg/cpp0x/initlist26.C: Adjust.
+       * g++.dg/cpp0x/initlist28.C: Adjust.
+
 2010-05-10  Fabien ChĂȘne  <fabien.chene@gmail.com>
 
        PR c++/43719
index 645e74f70dcabf802fac7cc79db1602b0b615084..bb28bdbd9b3ccbf55d52679fba51a2d3c0bbd686 100644 (file)
@@ -6,5 +6,5 @@ void
 foo (int i)
 {
   int a[i];
-  a = { }; // { dg-error "may not be initialized" }
+  a = { }; // { dg-error "assign" }
 }
index 3b959a03a533184f3d4c6a1c48839d8882c11e7b..d1df7cb00440442a4ea39bd0adc1c0628475afb0 100644 (file)
@@ -4,5 +4,5 @@
 void foo()
 {
   int a[1];
-  throw a = {}; // { dg-error "invalid use of non-lvalue array" }
+  throw a = {}; // { dg-error "assign" }
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist33.C b/gcc/testsuite/g++.dg/cpp0x/initlist33.C
new file mode 100644 (file)
index 0000000..b1c0ba0
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/44045
+// { dg-options "-std=c++0x" }
+
+struct base
+{
+   virtual ~base() { }
+};
+
+int main()
+{
+ base ptr_array[1];
+ ptr_array = { base() };       // { dg-error "assign" }
+}