From bc70af526c6b2243c68242d0aa6a48da9da4003d Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 11 Sep 2006 00:40:15 +0000 Subject: [PATCH] re PR c++/28991 (Static constructor emitted instead of initialized variable) PR c++/28991 * cp-objcp-common.c (cxx_staticp): New function. * cp-objcp-common.h (LANG_HOOOKS_STATICP): Use it. * cp-tree.h (cxx_staticp): New function. PR c++/289991 * g++.dg/init/static3.C: New test. From-SVN: r116838 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/cp-objcp-common.c | 15 +++++++++++++++ gcc/cp/cp-objcp-common.h | 2 ++ gcc/cp/cp-tree.h | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/static3.C | 26 ++++++++++++++++++++++++++ 6 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/static3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f565f4c8ac0..bcb6dc8fe61 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-09-10 Mark Mitchell + + PR c++/28991 + * cp-objcp-common.c (cxx_staticp): New function. + * cp-objcp-common.h (LANG_HOOOKS_STATICP): Use it. + * cp-tree.h (cxx_staticp): New function. + 2006-09-09 Jason Merrill PR c++/28996 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index cb8369cb53b..f40be969695 100644 --- a/gcc/cp/cp-objcp-common.c +++ b/gcc/cp/cp-objcp-common.c @@ -185,6 +185,21 @@ cxx_types_compatible_p (tree x, tree y) return 0; } +tree +cxx_staticp (tree arg) +{ + switch (TREE_CODE (arg)) + { + case BASELINK: + return staticp (BASELINK_FUNCTIONS (arg)); + + default: + break; + } + + return NULL_TREE; +} + /* Stubs to keep c-opts.c happy. */ void push_file_scope (void) diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h index 65eb6aedfa3..f420d93b191 100644 --- a/gcc/cp/cp-objcp-common.h +++ b/gcc/cp/cp-objcp-common.h @@ -59,6 +59,8 @@ extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t, #define LANG_HOOKS_EXPAND_DECL c_expand_decl #undef LANG_HOOKS_PARSE_FILE #define LANG_HOOKS_PARSE_FILE c_common_parse_file +#undef LANG_HOOKS_STATICP +#define LANG_HOOKS_STATICP cxx_staticp #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index f8644877027..8f88976e787 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4519,6 +4519,7 @@ extern bool cp_var_mod_type_p (tree, tree); extern void cxx_initialize_diagnostics (struct diagnostic_context *); extern int cxx_types_compatible_p (tree, tree); extern void init_shadowed_var_for_decl (void); +extern tree cxx_staticp (tree); /* in cp-gimplify.c */ extern int cp_gimplify_expr (tree *, tree *, tree *); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ebddaa604a0..55c511ee075 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-09-10 Mark Mitchell + + PR c++/28991 + * g++.dg/init/static3.C: New test. + 2006-09-10 Andrew Pinski PR testsuite/29007 diff --git a/gcc/testsuite/g++.dg/init/static3.C b/gcc/testsuite/g++.dg/init/static3.C new file mode 100644 index 00000000000..a8e62169f30 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/static3.C @@ -0,0 +1,26 @@ +// { dg-do run } + +struct T +{ + static void (*handler)(); + static void func() {}; +}; + +bool fail; + +struct S { + S() { + if (T::handler != T::func) + fail = true; + } +}; + +static S s; + +void (*T::handler)() = func; + +int main() +{ + if (fail) + return 1; +} -- 2.30.2