diff options
Diffstat (limited to 'gcc/cp/decl.c')
| -rw-r--r-- | gcc/cp/decl.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f077566..ee7e481 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4763,6 +4763,7 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) tree cleanup; const char *asmspec = NULL; int was_readonly = 0; + bool var_definition_p = false; if (decl == error_mark_node) return; @@ -4904,6 +4905,11 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) /* Remember that the initialization for this variable has taken place. */ DECL_INITIALIZED_P (decl) = 1; + /* This declaration is the definition of this variable, + unless we are initializing a static data member within + the class specifier. */ + if (!DECL_EXTERNAL (decl)) + var_definition_p = true; /* The variable is being defined, so determine its visibility. */ determine_visibility (decl); @@ -4969,10 +4975,18 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags) else if (!TREE_STATIC (decl)) initialize_local_var (decl, init); } - - if (TREE_STATIC (decl)) - expand_static_init (decl, init); - } + + /* If a variable is defined, and then a subsequent + definintion with external linkage is encountered, we will + get here twice for the same variable. We want to avoid + calling expand_static_init more than once. For variables + that are not static data members, we can call + expand_static_init only when we actually process the + initializer. It is not legal to redeclare a static data + member, so this issue does not arise in that case. */ + if (var_definition_p && TREE_STATIC (decl)) + expand_static_init (decl, init); + } } /* If a CLEANUP_STMT was created to destroy a temporary bound to a |
