📄 300-pr17976.patch
字号:
From: Mark Mitchell <mark@codesourcery.com>Sender: gcc-patches-owner@gcc.gnu.orgTo: gcc-patches@gcc.gnu.orgSubject: C++ PATCH: PR 17976Date: Thu, 14 Oct 2004 21:24:41 -0700This was a case where we generated multiple destructor calls for thesame global variable, in the (probably rare) situation that an"extern" declaration followed the definition.Tested on i686-pc-linux-gnu, applied on the mainline and on the 3.4branch.--Mark MitchellCodeSourcery, LLCmark@codesourcery.com# DP: 2004-10-14 Mark Mitchell <mark@codesourcery.com># DP: # DP: PR c++/17976# DP: * decl.c (cp_finish_decl): Do not call expand_static_init more# DP: than once for a single variable.# DP: # DP: 2004-10-14 Mark Mitchell <mark@codesourcery.com># DP: # DP: PR c++/17976# DP: * g++.dg/init/dtor3.C: New test.Index: testsuite/g++.dg/init/dtor3.C===================================================================RCS file: testsuite/g++.dg/init/dtor3.Cdiff -N testsuite/g++.dg/init/dtor3.C*** /dev/null 1 Jan 1970 00:00:00 -0000--- gcc/gcc/testsuite/g++.dg/init/dtor3.C 15 Oct 2004 04:02:22 -0000****************** 0 ****--- 1,21 ----+ // PR c++/17976+ // { dg-do run }+ + extern "C" void abort();+ struct A+ {+ static int i;+ A(){}+ ~A(){i++;if(i>1)abort();}+ };+ + int A::i = 0;+ + A a;+ extern A a;+ + int main()+ {+ return 0;+ }+ ===================================================================RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,vretrieving revision 1.1174.2.26retrieving revision 1.1174.2.27diff -u -r1.1174.2.26 -r1.1174.2.27--- gcc/gcc/cp/decl.c 2004/10/10 21:54:59 1.1174.2.26+++ gcc/gcc/cp/decl.c 2004/10/15 04:23:46 1.1174.2.27@@ -4778,6 +4778,7 @@ tree cleanup; const char *asmspec = NULL; int was_readonly = 0;+ bool var_definition_p = false; if (decl == error_mark_node) return;@@ -4930,6 +4931,11 @@ /* 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; } /* If the variable has an array type, lay out the type, even if there is no initializer. It is valid to index through the@@ -5004,8 +5010,16 @@ 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); } finish_end0:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -