From 9ed9e79a15695d6093ef045fccfd30fc835f7229 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 1 Oct 1999 04:45:10 +0000 Subject: [PATCH] decl.c (initialize_local_var): Handle static variables here. * 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. From-SVN: r29749 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 30 +++++++++++++++++++++--------- gcc/cp/semantics.c | 12 +++++++----- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4b40f84..a97890d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 1999-09-30 Mark Mitchell + * 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 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 49d80dc..00043d6 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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' diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8300f6f..9505535 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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); } -- 2.7.4