diff options
author | Mark Mitchell <mark@codesourcery.com> | 1999-08-15 16:59:17 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-08-15 16:59:17 +0000 |
commit | e0942dcd7e556187ad91a0485ae2d82097611bfe (patch) | |
tree | 5a7240ff2fa93e3279b5069ef486e71dd65b258b | |
parent | 66e064294ff397b5d38089610eb94a6fb564eb4c (diff) | |
download | gcc-e0942dcd7e556187ad91a0485ae2d82097611bfe.zip gcc-e0942dcd7e556187ad91a0485ae2d82097611bfe.tar.gz gcc-e0942dcd7e556187ad91a0485ae2d82097611bfe.tar.bz2 |
pt.c (check_default_tmpl_args): Don't check in local scopes.
* pt.c (check_default_tmpl_args): Don't check in local scopes.
(tsubst_decl): Make sure the declaration is on a saveable
obstack. Clear DECL_DEAD_FOR_LOCAL when making a copy of a local
variable.
(tsubst_expr): Adjust now that DECL_STMTs really contain DECLs.
From-SVN: r28715
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 42 |
2 files changed, 41 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b5ce289..f80f374 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +1999-08-15 Mark Mitchell <mark@codesourcery.com> + + * pt.c (check_default_tmpl_args): Don't check in local scopes. + (tsubst_decl): Make sure the declaration is on a saveable + obstack. Clear DECL_DEAD_FOR_LOCAL when making a copy of a local + variable. + (tsubst_expr): Adjust now that DECL_STMTs really contain DECLs. + 1999-08-14 Jason Merrill <jason@yorick.cygnus.com> Speed up Koenig lookup. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e00afbd..f81975f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2247,6 +2247,12 @@ check_default_tmpl_args (decl, parms, is_primary, is_partial) in the template-parameter-list of the definition of a member of a class template. */ + if (TREE_CODE (DECL_REAL_CONTEXT (decl)) == FUNCTION_DECL) + /* You can't have a function template declaration in a local + scope, nor you can you define a member of a class template in a + local scope. */ + return; + if (current_class_type && !TYPE_BEING_DEFINED (current_class_type) && DECL_LANG_SPECIFIC (decl) @@ -6035,7 +6041,13 @@ tsubst_decl (t, args, type, in_decl) break; } + /* This declaration is going to have to be around for a while, + so me make sure it is on a saveable obstack. */ + push_obstacks_nochange (); + saveable_allocation (); r = copy_node (t); + pop_obstacks (); + TREE_TYPE (r) = type; c_apply_type_quals_to_decl (CP_TYPE_QUALS (type), r); DECL_CONTEXT (r) = ctx; @@ -6048,10 +6060,16 @@ tsubst_decl (t, args, type, in_decl) copy_lang_decl (r); DECL_CLASS_CONTEXT (r) = DECL_CONTEXT (r); + /* Even if the original location is out of scope, the newly + substituted one is not. */ + if (TREE_CODE (r) == VAR_DECL) + DECL_DEAD_FOR_LOCAL (r) = 0; + /* A static data member declaration is always marked external when it is declared in-class, even if an initializer is present. We mimic the non-template processing here. */ - DECL_EXTERNAL (r) = 1; + if (ctx) + DECL_EXTERNAL (r) = 1; DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE); SET_DECL_IMPLICIT_INSTANTIATION (r); @@ -7231,19 +7249,25 @@ tsubst_expr (t, args, complain, in_decl) case DECL_STMT: { int i = suspend_momentary (); - tree dcl, init; + tree decl; + tree init; lineno = STMT_LINENO (t); emit_line_note (input_filename, lineno); - dcl = start_decl - (tsubst (TREE_OPERAND (t, 0), args, complain, in_decl), - tsubst (TREE_OPERAND (t, 1), args, complain, in_decl), - TREE_OPERAND (t, 2) != 0, NULL_TREE, NULL_TREE); - init = tsubst_expr (TREE_OPERAND (t, 2), args, complain, in_decl); + decl = DECL_STMT_DECL (t); + init = DECL_INITIAL (decl); + decl = tsubst (decl, args, complain, in_decl); + init = tsubst_expr (init, args, complain, in_decl); + DECL_INITIAL (decl) = init; + maybe_push_decl (decl); + if (TREE_CODE (decl) == VAR_DECL) + DECL_TEMPLATE_INSTANTIATED (decl) = 1; + maybe_push_decl (decl); + start_decl_1 (decl); cp_finish_decl - (dcl, init, NULL_TREE, 1, /*init ? LOOKUP_ONLYCONVERTING :*/ 0); + (decl, init, NULL_TREE, 0, /*init ? LOOKUP_ONLYCONVERTING :*/ 0); resume_momentary (i); - return dcl; + return decl; } case FOR_STMT: |