From 8dd3f57a9eb02313b4d87ba14c26f5d004d61833 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 13 Aug 1999 20:49:57 +0000 Subject: [PATCH] Fix incorrect commit on previous change. From-SVN: r28706 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/pt.c | 102 +++++++++++++++++++---------------------------- 2 files changed, 46 insertions(+), 61 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3653b79b895..37829332b35 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -6,6 +6,11 @@ tree.c (init_cplus_unsave): New. (cplus_unsave_expr_now): New. +1999-08-13 Mark Mitchell + + * pt.c (tsubst): Back out 1999-08-06 patch. Use fold and + decl_constant_value to simplify array bounds. + 1999-08-11 Jason Merrill * lang-options.h: Add -fms-extensions. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 37a7b689c0e..6e491e10aec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2216,12 +2216,6 @@ 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) @@ -5063,22 +5057,9 @@ instantiate_class_template (type) } } - /* Create the typedef that indicates provides a way of referencing a - class name within the scope of that class. */ - build_self_reference (); - /* Don't replace enum constants here. */ for (t = TYPE_FIELDS (pattern); t; t = TREE_CHAIN (t)) - /* If this is the implicit self-reference typedef, skip it, as we - have handled it above. Note that the usual tsubst machinery - doesn't work here, since the resulting declaration must have a - different name than the one it was given originally. */ - if (TREE_CODE (t) == TYPE_DECL - && TREE_TYPE (t) == pattern - && DECL_NAME (t) == constructor_name (t) - && DECL_ARTIFICIAL (t)) - continue; - else if (TREE_CODE (t) != CONST_DECL) + if (TREE_CODE (t) != CONST_DECL) { tree r; @@ -5897,24 +5878,18 @@ tsubst_decl (t, args, type, in_decl) break; case VAR_DECL: - case TYPE_DECL: { tree argvec; tree gen_tmpl; tree spec; tree tmpl; - tree ctx; - - if (!DECL_LANG_SPECIFIC (t) || !DECL_TEMPLATE_INFO (t)) - return t; - - if (TYPE_P (DECL_CONTEXT (t))) - ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, - /*complain=*/1, - in_decl, /*entering_scope=*/1); - else - /* Subsequent calls to pushdecl will fill this in. */ - ctx = NULL_TREE; + tree ctx = tsubst_aggr_type (DECL_CONTEXT (t), args, + /*complain=*/1, + in_decl, /*entering_scope=*/1); + + /* Nobody should be tsubst'ing into non-template variables. */ + my_friendly_assert (DECL_LANG_SPECIFIC (t) + && DECL_TEMPLATE_INFO (t) != NULL_TREE, 0); /* Check to see if we already have this specialization. */ tmpl = DECL_TI_TEMPLATE (t); @@ -5928,13 +5903,7 @@ 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; @@ -5947,16 +5916,10 @@ 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. */ - if (ctx) - DECL_EXTERNAL (r) = 1; + DECL_EXTERNAL (r) = 1; DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE); SET_DECL_IMPLICIT_INSTANTIATION (r); @@ -5968,6 +5931,18 @@ tsubst_decl (t, args, type, in_decl) } break; + case TYPE_DECL: + if (t == TYPE_NAME (TREE_TYPE (t))) + r = TYPE_NAME (type); + else + { + r = copy_node (t); + TREE_TYPE (r) = type; + DECL_CONTEXT (r) = current_class_type; + TREE_CHAIN (r) = NULL_TREE; + } + break; + default: my_friendly_abort (0); } @@ -6043,7 +6018,7 @@ tsubst_function_type (t, args, complain, in_decl) tree arg_types; tree fntype; - /* The TYPE_CONEXT is not used for function/method types. */ + /* The TYPE_CONTEXT is not used for function/method types. */ my_friendly_assert (TYPE_CONTEXT (t) == NULL_TREE, 0); /* Substitue the return type. */ @@ -6210,6 +6185,11 @@ tsubst (t, args, complain, in_decl) if (max == error_mark_node) return error_mark_node; + /* See if we can reduce this expression to something simpler. */ + max = maybe_fold_nontype_arg (max); + if (!processing_template_decl && TREE_READONLY_DECL_P (max)) + max = decl_constant_value (max); + if (processing_template_decl /* When providing explicit arguments to a template function, but leaving some arguments for subsequent @@ -6217,8 +6197,11 @@ tsubst (t, args, complain, in_decl) not PROCESSING_TEMPLATE_DECL. */ || TREE_CODE (max) != INTEGER_CST) { - return build_index_type (build_min - (MINUS_EXPR, sizetype, max, integer_one_node)); + tree itype = make_node (INTEGER_TYPE); + TYPE_MIN_VALUE (itype) = size_zero_node; + TYPE_MAX_VALUE (itype) = build_min (MINUS_EXPR, sizetype, max, + integer_one_node); + return itype; } if (integer_zerop (omax)) @@ -7124,22 +7107,19 @@ tsubst_expr (t, args, complain, in_decl) case DECL_STMT: { int i = suspend_momentary (); - tree decl, init; + tree dcl, init; lineno = STMT_LINENO (t); emit_line_note (input_filename, lineno); - 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; - start_decl_1 (decl); - cp_finish_decl (decl, init, NULL_TREE, 0, 0); + 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); + cp_finish_decl + (dcl, init, NULL_TREE, 1, /*init ? LOOKUP_ONLYCONVERTING :*/ 0); resume_momentary (i); - return decl; + return dcl; } case FOR_STMT: -- 2.30.2