From: Mark Mitchell Date: Fri, 16 Oct 1998 14:06:24 +0000 (+0000) Subject: decl.c (expand_static_init): Build cleanups before entering the anonymous function... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7cfac5953a129fe78668db20cdf2533125349dea;p=gcc.git decl.c (expand_static_init): Build cleanups before entering the anonymous function used to do them to avoid... * decl.c (expand_static_init): Build cleanups before entering the anonymous function used to do them to avoid access-checking confusion. * decl.c (grokfndecl): Add back call to cplus_decl_attributes accidentally removed by previous change, and make DECL_RTL here. * class.c (add_method): Don't make DECL_RTL here. From-SVN: r23138 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4fa45af5663..0569dd3232a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,13 @@ 1998-10-16 Mark Mitchell + * decl.c (expand_static_init): Build cleanups before entering the + anonymous function used to do them to avoid access-checking + confusion. + + * decl.c (grokfndecl): Add back call to cplus_decl_attributes + accidentally removed by previous change, and make DECL_RTL here. + * class.c (add_method): Don't make DECL_RTL here. + * pt.c (for_each_template_parm): Don't examine uninstantiated default arguments. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 2bc8f375e55..68f65f66803 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1270,9 +1270,6 @@ add_method (type, fields, method) } } - /* Create RTL for the METHOD. */ - make_decl_rtl (method, NULL_PTR, 1); - /* Actually insert the new method. */ TREE_VEC_ELT (method_vec, i) = build_overload (method, TREE_VEC_ELT (method_vec, i)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index f296fa2bbb4..80ee017bf50 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7814,8 +7814,13 @@ expand_static_init (decl, init) pop_obstacks (); } + /* Call build_cleanup before we enter the anonymous function + so that any access checks will be done relative to the + current scope, rather than the scope of the anonymous + function. */ + fcall = build_cleanup (decl); cleanup = start_anon_func (); - expand_expr_stmt (build_cleanup (decl)); + expand_expr_stmt (fcall); end_anon_func (); mark_addressable (cleanup); cleanup = build_unary_op (ADDR_EXPR, cleanup, 0); @@ -8235,6 +8240,11 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, if (ctype == NULL_TREE || check) return decl; + if (attrlist) + cplus_decl_attributes (decl, TREE_PURPOSE (attrlist), + TREE_VALUE (attrlist)); + make_decl_rtl (decl, NULL_PTR, 1); + if (virtualp) { DECL_VIRTUAL_P (decl) = 1; diff --git a/gcc/testsuite/g++.old-deja/g++.other/static3.C b/gcc/testsuite/g++.old-deja/g++.other/static3.C new file mode 100644 index 00000000000..b75771e76e2 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/static3.C @@ -0,0 +1,14 @@ +// Build don't link: + +class S +{ + ~S(); +public: + friend void f(); +}; + + +S::~S() +{ + static S s; +}