decl.c (start_function): Set x_dont_save_pending_sizes rather than calling get_pendin...
authorMark Mitchell <mark@codesourcery.com>
Sun, 26 Sep 1999 18:16:47 +0000 (18:16 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 26 Sep 1999 18:16:47 +0000 (18:16 +0000)
* decl.c (start_function): Set x_dont_save_pending_sizes rather
than calling get_pending_sizes.
* init.c (build_new): Don't save and restore
immediate_size_expand; instead, assert that it has the expected
value already.

From-SVN: r29669

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/init.c
gcc/testsuite/g++.old-deja/g++.other/crash12.C [new file with mode: 0644]

index 6e3e16e..0b30ff3 100644 (file)
@@ -1,3 +1,11 @@
+1999-09-26  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl.c (start_function): Set x_dont_save_pending_sizes rather
+       than calling get_pending_sizes.
+       * init.c (build_new): Don't save and restore
+       immediate_size_expand; instead, assert that it has the expected
+       value already.
+
 1999-09-26  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * lex.c (compiler_error): Add missing call to va_end().
index d5da38f..3da610d 100644 (file)
@@ -12915,7 +12915,7 @@ start_function (declspecs, declarator, attrs, flags)
      We haven't necessarily assigned RTL to all variables yet, so it's
      not safe to try to expand expressions involving them.  */
   immediate_size_expand = 0;
-  get_pending_sizes ();
+  current_function->x_dont_save_pending_sizes_p = 1;
 
   /* Let the user know we're compiling this function.  */
   if (processing_template_decl || !building_stmt_tree ())
index 19d8c74..d420ff5 100644 (file)
@@ -1909,14 +1909,10 @@ build_new (placement, decl, init, use_global_new)
     {
       tree absdcl = TREE_VALUE (decl);
       tree last_absdcl = NULL_TREE;
-      int old_immediate_size_expand = 0;
 
       if (current_function_decl
          && DECL_CONSTRUCTOR_P (current_function_decl))
-       {
-         old_immediate_size_expand = immediate_size_expand;
-         immediate_size_expand = 0;
-       }
+       my_friendly_assert (immediate_size_expand == 0, 19990926);
 
       nelts = integer_one_node;
 
@@ -1980,17 +1976,7 @@ build_new (placement, decl, init, use_global_new)
 
       type = groktypename (decl);
       if (! type || type == error_mark_node)
-       {
-         immediate_size_expand = old_immediate_size_expand;
-         return error_mark_node;
-       }
-
-      if (current_function_decl
-         && DECL_CONSTRUCTOR_P (current_function_decl))
-       {
-         pending_sizes = get_pending_sizes ();
-         immediate_size_expand = old_immediate_size_expand;
-       }
+       return error_mark_node;
     }
   else if (TREE_CODE (decl) == IDENTIFIER_NODE)
     {
diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash12.C b/gcc/testsuite/g++.old-deja/g++.other/crash12.C
new file mode 100644 (file)
index 0000000..ad81131
--- /dev/null
@@ -0,0 +1,17 @@
+// Build don't link:
+// Origin: Alfred Minarik <a8601248@unet.univie.ac.at>
+// Special g++ Options:
+
+template<typename T>
+struct S
+{
+  void f() {}
+};
+int main()
+{
+  S<int> s;
+  int len = 50;
+  char array[len];
+  s.f();
+}