diff options
author | Mark Mitchell <mark@codesourcery.com> | 2006-09-11 00:40:15 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2006-09-11 00:40:15 +0000 |
commit | bc70af526c6b2243c68242d0aa6a48da9da4003d (patch) | |
tree | 638e093b62285063b24863274ca086abe9301c4b | |
parent | d35763beeab40ff256e819535bc6cc8eda90e6ce (diff) | |
download | gcc-bc70af526c6b2243c68242d0aa6a48da9da4003d.zip gcc-bc70af526c6b2243c68242d0aa6a48da9da4003d.tar.gz gcc-bc70af526c6b2243c68242d0aa6a48da9da4003d.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-objcp-common.c | 15 | ||||
-rw-r--r-- | gcc/cp/cp-objcp-common.h | 2 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/static3.C | 26 |
6 files changed, 56 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f565f4c..bcb6dc8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2006-09-10 Mark Mitchell <mark@codesourcery.com> + + 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 <jason@redhat.com> PR c++/28996 diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c index cb8369c..f40be96 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 65eb6ae..f420d93 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 f864487..8f88976 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 ebddaa6..55c511e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-09-10 Mark Mitchell <mark@codesourcery.com> + + PR c++/28991 + * g++.dg/init/static3.C: New test. + 2006-09-10 Andrew Pinski <pinskia@physics.uc.edu> 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 0000000..a8e6216 --- /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; +} |