aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>1999-08-15 16:59:17 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-08-15 16:59:17 +0000
commite0942dcd7e556187ad91a0485ae2d82097611bfe (patch)
tree5a7240ff2fa93e3279b5069ef486e71dd65b258b /gcc
parent66e064294ff397b5d38089610eb94a6fb564eb4c (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/pt.c42
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: