OSDN Git Service

* decl.c (initialize_local_var): Handle static variables here.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Oct 1999 04:45:10 +0000 (04:45 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Oct 1999 04:45:10 +0000 (04:45 +0000)
(cp_finish_decl): Tweak handling of function-scope static
variables.
* semantics.c (expand_stmt): Handle DECL_STMTs for static
variables.

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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/semantics.c

index 4b40f84..a97890d 100644 (file)
@@ -1,5 +1,11 @@
 1999-09-30  Mark Mitchell  <mark@codesourcery.com>
 
+       * decl.c (initialize_local_var): Handle static variables here.
+       (cp_finish_decl): Tweak handling of function-scope static
+       variables.
+       * semantics.c (expand_stmt): Handle DECL_STMTs for static
+       variables.
+
        * method.c (emit_thunk): Don't crash when -fsyntax-only.
 
        * cp-tree.h (lang_decl_flags): Add global_ctor_p and
index 49d80dc..00043d6 100644 (file)
@@ -7470,9 +7470,11 @@ initialize_local_var (decl, init, flags)
      tree init;
      int flags;
 {
-  tree type;
+  tree type = TREE_TYPE (decl);
 
-  type = complete_type (TREE_TYPE (decl));
+  /* If the type is bogus, don't bother initializing the variable.  */
+  if (type == error_mark_node)
+    return;
 
   if (DECL_SIZE (decl) == NULL_TREE && !TREE_STATIC (decl))
     {
@@ -7481,6 +7483,16 @@ initialize_local_var (decl, init, flags)
       TREE_ADDRESSABLE (decl) = TREE_USED (decl);
     }
 
+  /* Local statics are handled differently from ordinary automatic
+     variables.  */
+  if (TREE_STATIC (decl))
+    {
+      if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE
+         || TYPE_NEEDS_DESTRUCTOR (type))
+       expand_static_init (decl, init);
+      return;
+    }
+
   if (DECL_SIZE (decl) && type != error_mark_node)
     {
       int already_used;
@@ -7776,13 +7788,6 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
          if (init)
            DECL_INITIAL (decl) = init;
        }
-      else if (TREE_STATIC (decl) && type != error_mark_node)
-       {
-         /* Cleanups for static variables are handled by `finish_file'.  */
-         if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE
-             || TYPE_NEEDS_DESTRUCTOR (type))
-           expand_static_init (decl, init);
-       }
       else if (TREE_CODE (CP_DECL_CONTEXT (decl)) == FUNCTION_DECL)
        {
          /* This is a local declaration.  */
@@ -7808,6 +7813,13 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
              destroy_local_var (decl);
            }
        }
+      else if (TREE_STATIC (decl) && type != error_mark_node)
+       {
+         /* Cleanups for static variables are handled by `finish_file'.  */
+         if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE
+             || TYPE_NEEDS_DESTRUCTOR (type))
+           expand_static_init (decl, init);
+       }
     finish_end0:
 
       /* Undo call to `pushclass' that was done in `start_decl'
index 8300f6f..9505535 100644 (file)
@@ -2274,11 +2274,9 @@ expand_stmt (t)
            /* If this is a declaration for an automatic local
               variable, initialize it.  Note that we might also see a
               declaration for a namespace-scope object (declared with
-              `extern') or an object with static storage duration
-              (declared with `static').  We don't have to handle the
-              initialization of those objects here; the former can
-              never be a definition (only a declaration), and the
-              latter is handled in finish_file.  */
+              `extern').  We don't have to handle the initialization
+              of those objects here; they can only be declarations,
+              rather than definitions.  */
            if (TREE_CODE (decl) == VAR_DECL 
                && !TREE_STATIC (decl)
                && !DECL_EXTERNAL (decl))
@@ -2290,6 +2288,10 @@ expand_stmt (t)
                  expand_anon_union_decl (decl, NULL_TREE, 
                                          DECL_ANON_UNION_ELEMS (decl));
              }
+           else if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
+             rest_of_decl_compilation 
+               (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
+                /*top_level=*/0, /*at_end=*/0);
 
            resume_momentary (i);
          }