init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and TYPE_SIZE_UNIT of full_type.
authorRichard Henderson <rth@redhat.com>
Wed, 30 Jun 2004 19:53:14 +0000 (12:53 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 30 Jun 2004 19:53:14 +0000 (12:53 -0700)
        * init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and
        TYPE_SIZE_UNIT of full_type.

From-SVN: r83927

gcc/cp/ChangeLog
gcc/cp/init.c

index 8ff420081debed31c8c19910d2da2803ec9da906..1c138dae2b2c8cf6659bb9d4b8a2e7dcad4776e1 100644 (file)
@@ -1,3 +1,8 @@
+2004-06-30  Richard Henderson  <rth@redhat.com>
+
+       * init.c (build_new_1): Fill in TYPE_DOMAIN, TYPE_SIZE and
+       TYPE_SIZE_UNIT of full_type.
+
 2004-06-30  Per Bothner  <per@bothner.com>
 
        Conditionally compile support for --enable-mapped_location.
index 4e02b9d2baeb4de89432183c42fdee134c838cdd..1be01180426cb1305a39339cb0fcc25b9a9c7314 100644 (file)
@@ -1815,10 +1815,20 @@ build_new_1 (tree exp)
 
   if (nelts)
     {
+      tree index;
+
       has_array = 1;
       outer_nelts = nelts;
-      /* Use an incomplete array type to avoid VLA headaches.  */
+
+      /* ??? The middle-end will error on us for building a VLA outside a 
+        function context.  Methinks that's not it's purvey.  So we'll do
+        our own VLA layout later.  */
+
       full_type = build_cplus_array_type (type, NULL_TREE);
+
+      index = convert (sizetype, nelts);
+      index = size_binop (MINUS_EXPR, index, size_one_node);
+      TYPE_DOMAIN (full_type) = build_index_type (index);
     }
   else
     full_type = type;
@@ -1857,7 +1867,20 @@ build_new_1 (tree exp)
 
   size = size_in_bytes (true_type);
   if (has_array)
-    size = size_binop (MULT_EXPR, size, convert (sizetype, nelts));
+    {
+      tree n, bitsize;
+
+      /* Do our own VLA layout.  Setting TYPE_SIZE/_UNIT is necessary in
+        order for the <INIT_EXPR <*foo> <CONSTRUCTOR ...>> to be valid.  */
+
+      n = convert (sizetype, nelts);
+      size = size_binop (MULT_EXPR, size, n);
+      TYPE_SIZE_UNIT (full_type) = size;
+
+      n = convert (bitsizetype, nelts);
+      bitsize = size_binop (MULT_EXPR, TYPE_SIZE (true_type), n);
+      TYPE_SIZE (full_type) = bitsize;
+    }
 
   /* Allocate the object.  */
   if (! placement && TYPE_FOR_JAVA (true_type))