aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-10-01 04:45:10 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-10-01 04:45:10 +0000
commit9ed9e79a15695d6093ef045fccfd30fc835f7229 (patch)
treed977a55aacc9f28c0bdd807f9def83e5a15d4ef3 /gcc
parent3b62f224004def4c1dc72fe6096067f47e0e32d9 (diff)
downloadgcc-9ed9e79a15695d6093ef045fccfd30fc835f7229.zip
gcc-9ed9e79a15695d6093ef045fccfd30fc835f7229.tar.gz
gcc-9ed9e79a15695d6093ef045fccfd30fc835f7229.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c30
-rw-r--r--gcc/cp/semantics.c12
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 <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
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);
}