OSDN Git Service

* decl2.c (generate_ctor_or_dtor_function): Tolerate a
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 Mar 2003 19:30:41 +0000 (19:30 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 28 Mar 2003 19:30:41 +0000 (19:30 +0000)
non-existant ssdf_decls array.
(finish_file): Call generator_ctor_or_dtor_function when there are
static constructors or destructors and no other static
initializations.

* g++.dg/init/attrib1.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/attrib1.C [new file with mode: 0644]

index 888d4dc..7a86f1d 100644 (file)
@@ -1,3 +1,11 @@
+2003-03-28  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl2.c (generate_ctor_or_dtor_function): Tolerate a
+       non-existant ssdf_decls array.
+       (finish_file): Call generator_ctor_or_dtor_function when there are
+       static constructors or destructors and no other static
+       initializations.
+
 2003-03-28  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/10047
index 77b9636..88545d4 100644 (file)
@@ -2494,15 +2494,16 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority)
 
   /* Call the static storage duration function with appropriate
      arguments.  */
-  for (i = 0; i < ssdf_decls->elements_used; ++i) 
-    {
-      arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), 
-                            NULL_TREE);
-      arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
-                            arguments);
-      finish_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
-                                            arguments));
-    }
+  if (ssdf_decls)
+    for (i = 0; i < ssdf_decls->elements_used; ++i) 
+      {
+       arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), 
+                              NULL_TREE);
+       arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
+                              arguments);
+       finish_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
+                                              arguments));
+      }
 
   /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in
      calls to any functions marked with attributes indicating that
@@ -2510,7 +2511,7 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority)
   if (priority == DEFAULT_INIT_PRIORITY)
     {
       tree fns;
-      
+
       for (fns = constructor_p ? static_ctors : static_dtors; 
           fns;
           fns = TREE_CHAIN (fns))
@@ -2838,6 +2839,15 @@ finish_file ()
     splay_tree_foreach (priority_info_map, 
                        generate_ctor_and_dtor_functions_for_priority,
                        /*data=*/0);
+  else
+    {
+      if (static_ctors)
+       generate_ctor_or_dtor_function (/*constructor_p=*/true,
+                                       DEFAULT_INIT_PRIORITY);
+      if (static_dtors)
+       generate_ctor_or_dtor_function (/*constructor_p=*/false,
+                                       DEFAULT_INIT_PRIORITY);
+    }
 
   /* We're done with the splay-tree now.  */
   if (priority_info_map)
index 5818881..66a35ad 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-28  Mark Mitchell  <mark@codesourcery.com>
+
+       * g++.dg/init/attrib1.C: New test.
+
 2003-03-28  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.dg/ultrasp8.c: New test.
diff --git a/gcc/testsuite/g++.dg/init/attrib1.C b/gcc/testsuite/g++.dg/init/attrib1.C
new file mode 100644 (file)
index 0000000..839e4ce
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do run }
+
+void f() __attribute((__constructor__));
+int i;
+void f() { i = 1; }
+
+int main(int, char **)
+{
+  return 1-i;
+}