From 963d5758117f80dd060942bc405609c22f13860f Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 17 Sep 1999 18:15:21 +0000 Subject: [PATCH] decl.c (warn_extern_redeclared_static): Don't get confused by static member functions. * decl.c (warn_extern_redeclared_static): Don't get confused by static member functions. (duplicate_decls): Merge DECL_THIS_STATIC. * decl.c (expand_static_init): Make sure assignments to local statics actually occur. From-SVN: r29477 --- gcc/cp/ChangeLog | 9 +++++++++ gcc/cp/decl.c | 16 +++++++++++++--- gcc/testsuite/g++.old-deja/g++.other/linkage5.C | 6 ++++++ gcc/testsuite/g++.old-deja/g++.other/static7.C | 9 +++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/linkage5.C create mode 100644 gcc/testsuite/g++.old-deja/g++.other/static7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 88b123c..ae81e8a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +1999-09-17 Mark Mitchell + + * decl.c (warn_extern_redeclared_static): Don't get confused by + static member functions. + (duplicate_decls): Merge DECL_THIS_STATIC. + + * decl.c (expand_static_init): Make sure assignments to local + statics actually occur. + 1999-09-17 Nathan Sidwell * call.c (perform_implicit_conversion): Deal with error_mark_node. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 7047f34..d2e41d5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2939,6 +2939,12 @@ warn_extern_redeclared_static (newdecl, olddecl) if (TREE_CODE (newdecl) == TYPE_DECL) return; + + /* Don't get confused by static member functions; that's a different + use of `static'. */ + if (TREE_CODE (newdecl) == FUNCTION_DECL + && DECL_STATIC_FUNCTION_P (newdecl)) + return; /* If the old declaration was `static', or the new one isn't, then then everything is OK. */ @@ -3284,6 +3290,7 @@ duplicate_decls (newdecl, olddecl) DECL_ABSTRACT_VIRTUAL_P (newdecl) |= DECL_ABSTRACT_VIRTUAL_P (olddecl); DECL_VIRTUAL_P (newdecl) |= DECL_VIRTUAL_P (olddecl); DECL_NEEDS_FINAL_OVERRIDER_P (newdecl) |= DECL_NEEDS_FINAL_OVERRIDER_P (olddecl); + DECL_THIS_STATIC (newdecl) |= DECL_THIS_STATIC (olddecl); new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE; /* Optionally warn about more than one declaration for the same @@ -7987,9 +7994,12 @@ expand_static_init (decl, init) || (init && TREE_CODE (init) == TREE_LIST)) assignment = build_aggr_init (decl, init, 0); else if (init) - /* The initialization we're doing here is just a bitwise - copy. */ - assignment = build (INIT_EXPR, TREE_TYPE (decl), decl, init); + { + /* The initialization we're doing here is just a bitwise + copy. */ + assignment = build (INIT_EXPR, TREE_TYPE (decl), decl, init); + TREE_SIDE_EFFECTS (assignment) = 1; + } else assignment = NULL_TREE; diff --git a/gcc/testsuite/g++.old-deja/g++.other/linkage5.C b/gcc/testsuite/g++.old-deja/g++.other/linkage5.C new file mode 100644 index 0000000..4bbcf23 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/linkage5.C @@ -0,0 +1,6 @@ +// Build don't link: +// Origin: Jason Merrill + +static int f (); +int f (); +static int f (); diff --git a/gcc/testsuite/g++.old-deja/g++.other/static7.C b/gcc/testsuite/g++.old-deja/g++.other/static7.C new file mode 100644 index 0000000..d710e4f --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/static7.C @@ -0,0 +1,9 @@ +// Origin: Jason Merrill + +int j = 42; + +int main () +{ + static int i = j; + return (i != 42); +} -- 2.7.4