pt.c 205 KB
Newer Older
mrs's avatar
mrs committed
1
/* Handle parameterized types (templates) for GNU C++.
law's avatar
law committed
2
   Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
mrs's avatar
mrs committed
3
   Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
mrs's avatar
mrs committed
4
   Rewritten by Jason Merrill (jason@cygnus.com).
mrs's avatar
mrs committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

This file is part of GNU CC.

GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING.  If not, write to
kenner's avatar
kenner committed
20 21
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */
mrs's avatar
mrs committed
22 23

/* Known bugs or deficiencies include:
mrs's avatar
mrs committed
24 25 26

     all methods must be provided in header files; can't use a source
     file that contains only the method templates and "just win".  */
mrs's avatar
mrs committed
27 28

#include "config.h"
29
#include "system.h"
mrs's avatar
mrs committed
30 31 32 33 34 35 36
#include "obstack.h"

#include "tree.h"
#include "flags.h"
#include "cp-tree.h"
#include "decl.h"
#include "parse.h"
mrs's avatar
mrs committed
37
#include "lex.h"
mrs's avatar
mrs committed
38
#include "output.h"
mrs's avatar
mrs committed
39
#include "defaults.h"
40
#include "except.h"
41
#include "toplev.h"
42

43 44 45 46
/* The type of functions taking a tree, and some additional data, and
   returning an int.  */
typedef int (*tree_fn_t) PROTO((tree, void*));

mrs's avatar
mrs committed
47 48 49 50 51 52
extern struct obstack permanent_obstack;

extern int lineno;
extern char *input_filename;
struct pending_inline *pending_template_expansions;

mrs's avatar
mrs committed
53 54
tree current_template_parms;
HOST_WIDE_INT processing_template_decl;
mrs's avatar
mrs committed
55

mrs's avatar
mrs committed
56 57 58
tree pending_templates;
static tree *template_tail = &pending_templates;

mrs's avatar
mrs committed
59 60 61
tree maybe_templates;
static tree *maybe_template_tail = &maybe_templates;

mrs's avatar
mrs committed
62
int minimal_parse_mode;
63

64
int processing_specialization;
65
int processing_explicit_instantiation;
66
int processing_template_parmlist;
67 68
static int template_header_count;

69 70
static tree saved_trees;

mrs's avatar
mrs committed
71 72 73
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free

74 75 76 77 78 79
#define UNIFY_ALLOW_NONE 0
#define UNIFY_ALLOW_MORE_CV_QUAL 1
#define UNIFY_ALLOW_LESS_CV_QUAL 2
#define UNIFY_ALLOW_DERIVED 4

static int unify PROTO((tree, tree, tree, tree, int, int*));
80 81 82
static void add_pending_template PROTO((tree));
static int push_tinst_level PROTO((tree));
static tree classtype_mangled_name PROTO((tree));
83
static char *mangle_class_name_for_template PROTO((char *, tree, tree, tree));
84 85
static tree tsubst_expr_values PROTO((tree, tree));
static int list_eq PROTO((tree, tree));
86
static tree get_class_bindings PROTO((tree, tree, tree, tree));
87
static tree coerce_template_parms PROTO((tree, tree, tree, int, int));
88
static tree tsubst_enum	PROTO((tree, tree, tree *));
89
static tree add_to_template_args PROTO((tree, tree));
90 91
static void maybe_adjust_types_for_deduction PROTO((unification_kind_t, tree*,
						    tree*)); 
92
static int  type_unification_real PROTO((tree, tree, tree, tree,
93
					 int, unification_kind_t, int, int*));
94
static tree complete_template_args PROTO((tree, tree, int));
95
static void note_template_header PROTO((int));
96
static tree maybe_fold_nontype_arg PROTO((tree));
97
static tree convert_nontype_argument PROTO((tree, tree));
98
static tree get_bindings_overload PROTO((tree, tree, tree));
99
static int for_each_template_parm PROTO((tree, tree_fn_t, void*));
law's avatar
8  
law committed
100
static tree build_template_parm_index PROTO((int, int, int, tree, tree));
101 102 103 104 105 106 107 108 109 110
static tree original_template PROTO((tree));
static int inline_needs_template_parms PROTO((tree));
static void push_inline_template_parms_recursive PROTO((tree, int));
static tree retrieve_specialization PROTO((tree, tree));
static void register_specialization PROTO((tree, tree, tree));
static void print_candidates PROTO((tree));
static tree reduce_template_parm_level PROTO((tree, tree, int));
static tree build_template_decl PROTO((tree, tree));
static int mark_template_parm PROTO((tree, void *));
static tree tsubst_friend_function PROTO((tree, tree));
111
static tree tsubst_friend_class PROTO((tree, tree));
112
static tree get_bindings_real PROTO((tree, tree, tree, int));
mmitchel's avatar
mmitchel committed
113
static int template_decl_level PROTO((tree));
114
static tree maybe_get_template_decl_from_type_decl PROTO((tree));
115 116 117
static int check_cv_quals_for_unify PROTO((int, tree, tree));
static tree tsubst_template_arg_vector PROTO((tree, tree));
static void regenerate_decl_from_template PROTO((tree, tree));
118
static int is_member_template_class PROTO((tree));
119

120 121 122 123 124 125 126 127
/* Nonzero if ARGVEC contains multiple levels of template arguments.  */
#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) 		\
  (NODE != NULL_TREE 					\
   && TREE_CODE (NODE) == TREE_VEC 			\
   && TREE_VEC_LENGTH (NODE) > 0 			\
   && TREE_VEC_ELT (NODE, 0) != NULL_TREE               \
   && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)

128 129 130 131 132 133 134 135 136 137 138
/* Do any processing required when DECL (a member template declaration
   using TEMPLATE_PARAMETERS as its innermost parameter list) is
   finished.  Returns the TEMPLATE_DECL corresponding to DECL, unless
   it is a specialization, in which case the DECL itself is returned.  */

tree
finish_member_template_decl (template_parameters, decl)
  tree template_parameters;
  tree decl;
{
  if (template_parameters)
139
    end_template_decl ();
140
  else
141
    end_specialization ();
142

143 144 145 146
  if (decl == NULL_TREE || decl == void_type_node)
    return NULL_TREE;
  else if (TREE_CODE (decl) == TREE_LIST)
    {
jason's avatar
comment  
jason committed
147
      /* Assume that the class is the only declspec.  */
148
      decl = TREE_VALUE (decl);
149 150
      if (IS_AGGR_TYPE (decl) && CLASSTYPE_TEMPLATE_INFO (decl)
	  && ! CLASSTYPE_TEMPLATE_SPECIALIZATION (decl))
151 152 153 154 155
	{
	  tree tmpl = CLASSTYPE_TI_TEMPLATE (decl);
	  check_member_template (tmpl);
	  return tmpl;
	}
156
      return NULL_TREE;
157
    }
158
  else if (DECL_TEMPLATE_INFO (decl))
159
    {
160 161 162 163 164 165 166 167 168 169 170
      if (!DECL_TEMPLATE_SPECIALIZATION (decl))
	{
	  check_member_template (DECL_TI_TEMPLATE (decl));
	  return DECL_TI_TEMPLATE (decl);
	}
      else
	return decl;
    } 
  else
    cp_error ("invalid member template declaration `%D'", decl);
	
171

172
  return error_mark_node;
jason's avatar
jason committed
173
}
174

jason's avatar
jason committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
/* Returns the template nesting level of the indicated class TYPE.
   
   For example, in:
     template <class T>
     struct A
     {
       template <class U>
       struct B {};
     };

   A<T>::B<U> has depth two, while A<T> has depth one.  Also,
   both A<T>::B<int> and A<int>::B<U> have depth one.  */

int 
template_class_depth (type)
     tree type;
{
192
  int depth;
jason's avatar
jason committed
193

jason's avatar
jason committed
194 195 196
  for (depth = 0; 
       type && TREE_CODE (type) != FUNCTION_DECL 
	 && TREE_CODE (type) != NAMESPACE_DECL;
197 198 199 200 201
       type = TYPE_CONTEXT (type))
    if (CLASSTYPE_TEMPLATE_INFO (type)
	&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type))
	&& uses_template_parms (CLASSTYPE_TI_ARGS (type)))
      ++depth;
jason's avatar
jason committed
202 203

  return depth;
204
}
205

206 207
/* Return the original template for this decl, disregarding any
   specializations.  */
208

209 210
static tree
original_template (decl)
211
     tree decl;
212
{
213 214 215 216
  while (DECL_TEMPLATE_INFO (decl))
    decl = DECL_TI_TEMPLATE (decl);
  return decl;
}
217

218 219 220 221 222 223 224 225 226
/* Returns 1 if processing DECL as part of do_pending_inlines
   needs us to push template parms.  */

static int
inline_needs_template_parms (decl)
     tree decl;
{
  if (! DECL_TEMPLATE_INFO (decl))
    return 0;
jason's avatar
jason committed
227

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
  return (list_length (DECL_TEMPLATE_PARMS (original_template (decl)))
	  > (processing_template_decl + DECL_TEMPLATE_SPECIALIZATION (decl)));
}

/* Subroutine of maybe_begin_member_template_processing.
   Push the template parms in PARMS, starting from LEVELS steps into the
   chain, and ending at the beginning, since template parms are listed
   innermost first.  */

static void
push_inline_template_parms_recursive (parmlist, levels)
     tree parmlist;
     int levels;
{
  tree parms = TREE_VALUE (parmlist);
  int i;

  if (levels > 1)
    push_inline_template_parms_recursive (TREE_CHAIN (parmlist), levels - 1);
247

248
  ++processing_template_decl;
249
  current_template_parms
250 251
    = tree_cons (build_int_2 (0, processing_template_decl),
		 parms, current_template_parms);
252 253
  TEMPLATE_PARMS_FOR_INLINE (current_template_parms) = 1;

254
  pushlevel (0);
255 256
  for (i = 0; i < TREE_VEC_LENGTH (parms); ++i) 
    {
257 258
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
      my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (parm)) == 'd', 0);
259

260 261
      switch (TREE_CODE (parm))
	{
262
	case TYPE_DECL:
263
	case TEMPLATE_DECL:
264 265
	  pushdecl (parm);
	  break;
266 267 268 269 270 271 272 273 274

	case PARM_DECL:
	  {
	    /* Make a CONST_DECL as is done in process_template_parm. */
	    tree decl = build_decl (CONST_DECL, DECL_NAME (parm),
				    TREE_TYPE (parm));
	    DECL_INITIAL (decl) = DECL_INITIAL (parm);
	    pushdecl (decl);
	  }
275
	  break;
276

277 278 279 280 281 282
	default:
	  my_friendly_abort (0);
	}
    }
}

283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
/* Restore the template parameter context for a member template or
   a friend template defined in a class definition.  */

void
maybe_begin_member_template_processing (decl)
     tree decl;
{
  tree parms;
  int levels;

  if (! inline_needs_template_parms (decl))
    return;

  parms = DECL_TEMPLATE_PARMS (original_template (decl));

  levels = list_length (parms) - processing_template_decl;

  if (DECL_TEMPLATE_SPECIALIZATION (decl))
    {
      --levels;
      parms = TREE_CHAIN (parms);
    }

  push_inline_template_parms_recursive (parms, levels);
}

309 310 311
/* Undo the effects of begin_member_template_processing. */

void 
jason's avatar
jason committed
312 313
maybe_end_member_template_processing (decl)
     tree decl;
314 315 316 317
{
  if (! processing_template_decl)
    return;

318 319 320 321 322 323 324
  while (current_template_parms
	 && TEMPLATE_PARMS_FOR_INLINE (current_template_parms))
    {
      --processing_template_decl;
      current_template_parms = TREE_CHAIN (current_template_parms);
      poplevel (0, 0, 0);
    }
325 326
}

327
/* Returns non-zero iff T is a member template function.  We must be
jason's avatar
jason committed
328
   careful as in
329 330 331 332 333 334 335 336 337 338 339

     template <class T> class C { void f(); }

   Here, f is a template function, and a member, but not a member
   template.  This function does not concern itself with the origin of
   T, only its present state.  So if we have 

     template <class T> class C { template <class U> void f(U); }

   then neither C<int>::f<char> nor C<T>::f<double> is considered
   to be a member template.  */
340

341 342
int
is_member_template (t)
343 344
     tree t;
{
345 346
  if (TREE_CODE (t) != FUNCTION_DECL
      && !DECL_FUNCTION_TEMPLATE_P (t))
347
    /* Anything that isn't a function or a template function is
348 349 350
       certainly not a member template.  */
    return 0;

351 352 353 354 355
  /* A local class can't have member templates.  */
  if (hack_decl_function_context (t))
    return 0;

  if ((DECL_FUNCTION_MEMBER_P (t) 
356
       && !DECL_TEMPLATE_SPECIALIZATION (t))
jason's avatar
jason committed
357
      || (TREE_CODE (t) == TEMPLATE_DECL 
358
	  && DECL_FUNCTION_MEMBER_P (DECL_TEMPLATE_RESULT (t))))
359
    {
jason's avatar
jason committed
360
      tree tmpl;
361 362 363 364 365 366

      if (DECL_FUNCTION_TEMPLATE_P (t))
	tmpl = t;
      else if (DECL_TEMPLATE_INFO (t) 
	       && DECL_FUNCTION_TEMPLATE_P (DECL_TI_TEMPLATE (t)))
	tmpl = DECL_TI_TEMPLATE (t);
jason's avatar
jason committed
367 368 369
      else
	tmpl = NULL_TREE;

370
      if (tmpl
jason's avatar
jason committed
371 372 373
	  /* If there are more levels of template parameters than
	     there are template classes surrounding the declaration,
	     then we have a member template.  */
374 375
	  && (list_length (DECL_TEMPLATE_PARMS (tmpl)) > 
	      template_class_depth (DECL_CLASS_CONTEXT (t))))
jason's avatar
jason committed
376 377
	return 1;
    }
378

jason's avatar
jason committed
379 380
  return 0;
}
381

382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
/* Returns non-zero iff T is a member template class.  See
   is_member_template for a description of what precisely constitutes
   a member template.  */

int
is_member_template_class (t)
     tree t;
{
  if (!DECL_CLASS_TEMPLATE_P (t))
    /* Anything that isn't a class template, is certainly not a member
       template.  */
    return 0;

  if (!DECL_CLASS_SCOPE_P (t))
    /* Anything whose context isn't a class type is surely not a
       member template.  */
    return 0;

  /* If there are more levels of template parameters than there are
     template classes surrounding the declaration, then we have a
     member template.  */
  return  (list_length (DECL_TEMPLATE_PARMS (t)) > 
	   template_class_depth (DECL_CONTEXT (t)));
}

407
/* Return a new template argument vector which contains all of ARGS
408
   for all outer templates TMPL is contained in, but has as its 
409 410 411 412 413 414 415 416 417 418 419 420
   innermost set of arguments the EXTRA_ARGS.  If UNBOUND_ONLY, we
   are only interested in unbound template arguments, not arguments from
   enclosing templates that have been instantiated already.  */

static tree
complete_template_args (tmpl, extra_args, unbound_only)
     tree tmpl, extra_args;
     int unbound_only;
{
  /* depth is the number of levels of enclosing args we're adding.  */
  int depth, i;
  tree args, new_args, spec_args = NULL_TREE;
421 422
  int extra_arg_depth;

423 424 425
  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
  my_friendly_assert (TREE_CODE (extra_args) == TREE_VEC, 0);

426
  if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (extra_args))
427 428 429 430
    extra_arg_depth = TREE_VEC_LENGTH (extra_args);
  else
    extra_arg_depth = 1;

431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
  if (DECL_TEMPLATE_INFO (tmpl) && !unbound_only)
    {
      /* A specialization of a member template of a template class shows up
	 as a TEMPLATE_DECL with DECL_TEMPLATE_SPECIALIZATION set.
	 DECL_TI_ARGS is the specialization args, and DECL_TI_TEMPLATE
	 is the template being specialized.  */
      if (DECL_TEMPLATE_SPECIALIZATION (tmpl))
	{
	  spec_args = DECL_TI_ARGS (tmpl);
	  tmpl = DECL_TI_TEMPLATE (tmpl);
	}

      if (DECL_TEMPLATE_INFO (tmpl))
	{
	  /* A partial instantiation of a member template shows up as a
	     TEMPLATE_DECL with DECL_TEMPLATE_INFO.  DECL_TI_ARGS is
	     all the bound template arguments.  */
	  args = DECL_TI_ARGS (tmpl);
449
	  if (!TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
450 451 452 453 454 455 456 457 458
	    depth = 1;
	  else
	    depth = TREE_VEC_LENGTH (args);
	}
      else
	/* If we are a specialization, we might have no previously bound
	   template args.  */
	depth = 0;

459
      new_args = make_tree_vec (depth + extra_arg_depth + (!!spec_args));
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480

      if (depth == 1)
	TREE_VEC_ELT (new_args, 0) = args;
      else
	for (i = 0; i < depth; ++i)
	  TREE_VEC_ELT (new_args, i) = TREE_VEC_ELT (args, i);
    }
  else
    {
      tree type;
      int skip;

      /* For unbound args, we have to do more work.  We are getting bindings
	 for the innermost args from extra_args, so we start from our
	 context and work out until we've seen all the args.  We need to
	 do it this way to handle partial specialization.  */

      depth = list_length (DECL_TEMPLATE_PARMS (tmpl)) - 1;
      if (depth == 0)
	return extra_args;

481
      new_args = make_tree_vec (depth + extra_arg_depth);
482

483 484 485
      /* If this isn't a member template, extra_args is for the innermost
	 template class, so skip over it.  */
      skip = (! is_member_template (tmpl));
486

487 488 489 490 491
      if (depth > skip)
	{
	  type = DECL_REAL_CONTEXT (tmpl);
	  for (i = depth; i; type = TYPE_CONTEXT (type))
	    if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)))
492
	      {
493 494 495 496 497 498 499
		if (skip)
		  skip = 0;
		else
		  {
		    --i;
		    TREE_VEC_ELT (new_args, i) = CLASSTYPE_TI_ARGS (type);
		  }
500
	      }
501
	}
502 503
    }

504 505 506 507 508
  if (extra_arg_depth == 1)
    TREE_VEC_ELT (new_args, depth++) = extra_args;
  else
    for (i = 0; i < extra_arg_depth; ++i)
      TREE_VEC_ELT (new_args, depth++) = TREE_VEC_ELT (extra_args, i);
509 510

  if (spec_args)
511
    TREE_VEC_ELT (new_args, depth) = spec_args;
512 513 514 515

  return new_args;
}

516 517 518
/* Return a new template argument vector which contains all of ARGS,
   but has as its innermost set of arguments the EXTRA_ARGS.  */

519
static tree
520 521 522 523 524 525
add_to_template_args (args, extra_args)
     tree args;
     tree extra_args;
{
  tree new_args;

526
  if (!TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
527 528 529 530 531 532 533 534
    {
      new_args = make_tree_vec (2);
      TREE_VEC_ELT (new_args, 0) = args;
    }
  else 
    {
      int i;

535
      new_args = make_tree_vec (TREE_VEC_LENGTH (args) + 1);
536 537 538 539 540 541 542 543 544 545

      for (i = 0; i < TREE_VEC_LENGTH (args); ++i)
	TREE_VEC_ELT (new_args, i) = TREE_VEC_ELT (args, i);
    }
	  
  TREE_VEC_ELT (new_args, 
		TREE_VEC_LENGTH (new_args) - 1) = extra_args;

  return new_args;
}
mrs's avatar
mrs committed
546 547 548

/* We've got a template header coming up; push to a new level for storing
   the parms.  */
mrs's avatar
mrs committed
549 550 551 552

void
begin_template_parm_list ()
{
553 554 555 556 557 558 559 560 561 562 563 564 565 566
  /* We use a non-tag-transparent scope here, which causes pushtag to
     put tags in this scope, rather than in the enclosing class or
     namespace scope.  This is the right thing, since we want
     TEMPLATE_DECLS, and not TYPE_DECLS for template classes.  For a
     global template class, push_template_decl handles putting the
     TEMPLATE_DECL into top-level scope.  For a nested template class,
     e.g.:

       template <class T> struct S1 {
         template <class T> struct S2 {}; 
       };

     pushtag contains special code to call pushdecl_with_scope on the
     TEMPLATE_DECL for S2.  */
mrs's avatar
mrs committed
567
  pushlevel (0);
mrs's avatar
mrs committed
568
  declare_pseudo_global_level ();
mrs's avatar
mrs committed
569
  ++processing_template_decl;
570
  ++processing_template_parmlist;
571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
  note_template_header (0);
}

/* We've just seen template <>. */

void
begin_specialization ()
{
  note_template_header (1);
}

/* Called at then end of processing a declaration preceeded by
   template<>.  */

void 
end_specialization ()
{
  reset_specialization ();
}

/* Any template <>'s that we have seen thus far are not referring to a
   function specialization. */

void
reset_specialization ()
{
  processing_specialization = 0;
  template_header_count = 0;
}

/* We've just seen a template header.  If SPECIALIZATION is non-zero,
   it was of the form template <>.  */

604
static void 
605 606 607 608 609 610 611
note_template_header (specialization)
     int specialization;
{
  processing_specialization = specialization;
  template_header_count++;
}

612
/* We're beginning an explicit instantiation.  */
613

614 615
void
begin_explicit_instantiation ()
616
{
617 618
  ++processing_explicit_instantiation;
}
619 620


621 622 623 624 625 626
void
end_explicit_instantiation ()
{
  my_friendly_assert(processing_explicit_instantiation > 0, 0);
  --processing_explicit_instantiation;
}
627

628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
/* Retrieve the specialization (in the sense of [temp.spec] - a
   specialization is either an instantiation or an explicit
   specialization) of TMPL for the given template ARGS.  If there is
   no such specialization, return NULL_TREE.  The ARGS are a vector of
   arguments, or a vector of vectors of arguments, in the case of
   templates with more than one level of parameters.  */
   
static tree
retrieve_specialization (tmpl, args)
     tree tmpl;
     tree args;
{
  tree s;

  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);

  for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl);
       s != NULL_TREE;
       s = TREE_CHAIN (s))
    if (comp_template_args (TREE_PURPOSE (s), args))
      return TREE_VALUE (s);

  return NULL_TREE;
651 652
}

653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681
/* Returns non-zero iff DECL is a specialization of TMPL.  */

int
is_specialization_of (decl, tmpl)
     tree decl;
     tree tmpl;
{
  tree t;

  if (TREE_CODE (decl) == FUNCTION_DECL)
    {
      for (t = decl; 
	   t != NULL_TREE;
	   t = DECL_TEMPLATE_INFO (t) ? DECL_TI_TEMPLATE (t) : NULL_TREE)
	if (t == tmpl)
	  return 1;
    }
  else 
    {
      my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 0);

      for (t = TREE_TYPE (decl);
	   t != NULL_TREE;
	   t = CLASSTYPE_USE_TEMPLATE (t)
	     ? TREE_TYPE (CLASSTYPE_TI_TEMPLATE (t)) : NULL_TREE)
	if (comptypes (TYPE_MAIN_VARIANT (t), 
		       TYPE_MAIN_VARIANT (TREE_TYPE (tmpl)), 1))
	  return 1;
    }  
682

683 684
  return 0;
}
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752

/* Register the specialization SPEC as a specialization of TMPL with
   the indicated ARGS.  */

static void
register_specialization (spec, tmpl, args)
     tree spec;
     tree tmpl;
     tree args;
{
  tree s;

  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);

  if (TREE_CODE (spec) != TEMPLATE_DECL
      && list_length (DECL_TEMPLATE_PARMS (tmpl)) > 1)
    /* Avoid registering function declarations as
       specializations of member templates, as would otherwise
       happen with out-of-class specializations of member
       templates.  */
    return;
    
  for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl);
       s != NULL_TREE;
       s = TREE_CHAIN (s))
    if (comp_template_args (TREE_PURPOSE (s), args))
      {
	tree fn = TREE_VALUE (s);

	if (DECL_TEMPLATE_SPECIALIZATION (spec))
	  {
	    if (DECL_TEMPLATE_INSTANTIATION (fn))
	      {
		if (TREE_USED (fn) 
		    || DECL_EXPLICIT_INSTANTIATION (fn))
		  {
		    cp_error ("specialization of %D after instantiation",
			      fn);
		    return;
		  }
		else
		  {
		    /* This situation should occur only if the first
		       specialization is an implicit instantiation,
		       the second is an explicit specialization, and
		       the implicit instantiation has not yet been
		       used.  That situation can occur if we have
		       implicitly instantiated a member function of
		       class type, and then specialized it later.  */
		    TREE_VALUE (s) = spec;
		    return;
		  }
	      }
	    else if (DECL_TEMPLATE_SPECIALIZATION (fn))
	      {
		if (DECL_INITIAL (fn))
		  cp_error ("duplicate specialization of %D", fn);

		TREE_VALUE (s) = spec;
		return;
	      }
	  }
      }

  DECL_TEMPLATE_SPECIALIZATIONS (tmpl)
     = perm_tree_cons (args, spec, DECL_TEMPLATE_SPECIALIZATIONS (tmpl));
}

753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
/* Print the list of candidate FNS in an error message.  */

static void
print_candidates (fns)
     tree fns;
{
  tree fn;

  char* str = "candidates are:";

  for (fn = fns; fn != NULL_TREE; fn = TREE_CHAIN (fn))
    {
      cp_error_at ("%s %+#D", str, TREE_VALUE (fn));
      str = "               ";
    }
}

770
/* Returns the template (one of the functions given by TEMPLATE_ID)
771 772 773 774 775 776 777 778
   which can be specialized to match the indicated DECL with the
   explicit template args given in TEMPLATE_ID.  If
   NEED_MEMBER_TEMPLATE is true the function is a specialization of a
   member template.  The template args (those explicitly specified and
   those deduced) are output in a newly created vector *TARGS_OUT.  If
   it is impossible to determine the result, an error message is
   issued, unless COMPLAIN is 0.  The DECL may be NULL_TREE if none is
   available.  */
779

780
tree
781
determine_specialization (template_id, decl, targs_out, 
782 783
			  need_member_template,
			  complain)
784
     tree template_id;
785
     tree decl;
786 787 788 789
     tree* targs_out;
     int need_member_template;
     int complain;
{
790
  tree fns, targs_in;
791
  tree templates = NULL_TREE;
792
  tree fn;
793
  int i;
794

795 796
  *targs_out = NULL_TREE;

797 798 799 800 801 802
  if (template_id == error_mark_node)
    return error_mark_node;

  fns = TREE_OPERAND (template_id, 0);
  targs_in = TREE_OPERAND (template_id, 1);

803 804 805
  if (fns == error_mark_node)
    return error_mark_node;

jason's avatar
jason committed
806 807 808
  /* Check for baselinks. */
  if (TREE_CODE (fns) == TREE_LIST)
    fns = TREE_VALUE (fns);
809

jason's avatar
jason committed
810
  for (; fns; fns = OVL_NEXT (fns))
811
    {
812 813
      tree tmpl;

jason's avatar
jason committed
814
      fn = OVL_CURRENT (fns);
815 816
      if (!need_member_template 
	  && TREE_CODE (fn) == FUNCTION_DECL 
817
	  && DECL_FUNCTION_MEMBER_P (fn)
818 819
	  && DECL_USE_TEMPLATE (fn)
	  && DECL_TI_TEMPLATE (fn))
820 821 822 823 824
	/* We can get here when processing something like:
	     template <class T> class X { void f(); }
	     template <> void X<int>::f() {}
	   We're specializing a member function, but not a member
	   template.  */
825 826
	tmpl = DECL_TI_TEMPLATE (fn);
      else if (TREE_CODE (fn) != TEMPLATE_DECL
827
	       || (need_member_template && !is_member_template (fn)))
828
	continue;
829 830
      else
	tmpl = fn;
831

832
      if (list_length (targs_in) > DECL_NTPARMS (tmpl))
833 834
	continue;

835
      if (decl == NULL_TREE)
836
	{
837 838 839 840 841
	  tree targs = make_scratch_vec (DECL_NTPARMS (tmpl));

	  /* We allow incomplete unification here, because we are going to
	     check all the functions. */
	  i = type_unification (DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
842
				targs,
843 844 845
				NULL_TREE,
				NULL_TREE,  
				targs_in,
846
				DEDUCE_EXACT, 1);
847 848 849 850
      
	  if (i == 0) 
	    /* Unification was successful.  */
	    templates = scratch_tree_cons (targs, tmpl, templates);
851
	}
852 853
      else
	templates = scratch_tree_cons (NULL_TREE, tmpl, templates);
854
    }
855
  
856
  if (decl != NULL_TREE)
857
    {
858 859 860 861 862 863 864 865 866 867 868 869 870 871
      tree tmpl = most_specialized (templates, decl, targs_in);

      if (tmpl == error_mark_node) 
	goto ambiguous;
      else if (tmpl == NULL_TREE)
	goto no_match;

      *targs_out = get_bindings (tmpl, decl, targs_in);
      return tmpl;
    }

  if (templates == NULL_TREE)
    {
    no_match:
872
      if (complain)
873 874 875 876 877
	{
	  cp_error_at ("template-id `%D' for `%+D' does not match any template declaration",
		       template_id, decl);
	  return error_mark_node;
	}
878 879
      return NULL_TREE;
    }
880
  else if (TREE_CHAIN (templates) != NULL_TREE) 
881
    {
882
    ambiguous:
883 884
      if (complain)
	{
885 886
	  cp_error_at ("ambiguous template specialization `%D' for `%+D'",
		       template_id, decl);
887
	  print_candidates (templates);
888
	  return error_mark_node;
889 890 891 892 893
	}
      return NULL_TREE;
    }

  /* We have one, and exactly one, match. */
894 895
  *targs_out = TREE_PURPOSE (templates);
  return TREE_VALUE (templates);
mrs's avatar
mrs committed
896
}
897
      
898
/* Check to see if the function just declared, as indicated in
899 900 901 902
   DECLARATOR, and in DECL, is a specialization of a function
   template.  We may also discover that the declaration is an explicit
   instantiation at this point.

903 904
   Returns DECL, or an equivalent declaration that should be used
   instead. 
905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
   
   FLAGS is a bitmask consisting of the following flags: 

   1: We are being called by finish_struct.  (We are unable to
      determine what template is specialized by an in-class
      declaration until the class definition is complete, so
      finish_struct_methods calls this function again later to finish
      the job.)
   2: The function has a definition.
   4: The function is a friend.
   8: The function is known to be a specialization of a member
      template. 

   The TEMPLATE_COUNT is the number of references to qualifying
   template classes that appeared in the name of the function.  For
   example, in

     template <class T> struct S { void f(); };
     void S<int>::f();
     
   the TEMPLATE_COUNT would be 1.  However, explicitly specialized
   classes are not counted in the TEMPLATE_COUNT, so that in

     template <class T> struct S {};
     template <> struct S<int> { void f(); }
     template <>
     void S<int>::f();

   the TEMPLATE_COUNT would be 0.  (Note that this declaration is
   illegal; there should be no template <>.)

   If the function is a specialization, it is marked as such via
   DECL_TEMPLATE_SPECIALIZATION.  Furthermore, its DECL_TEMPLATE_INFO
   is set up correctly, and it is added to the list of specializations 
   for that template.  */
940

941
tree
942
check_explicit_specialization (declarator, decl, template_count, flags)
943 944 945 946 947
     tree declarator;
     tree decl;
     int template_count;
     int flags;
{
948 949 950 951
  int finish_member = flags & 1;
  int have_def = flags & 2;
  int is_friend = flags & 4;
  int specialization = 0;
952
  int explicit_instantiation = 0;
953 954 955 956
  int member_specialization = flags & 8;

  tree ctype = DECL_CLASS_CONTEXT (decl);
  tree dname = DECL_NAME (decl);
957

958
  if (!finish_member)
959
    {
960 961 962 963 964 965 966 967 968 969 970 971 972 973
      if (processing_specialization) 
	{
	  /* The last template header was of the form template <>.  */
	  
	  if (template_header_count > template_count) 
	    {
	      /* There were more template headers than qualifying template
		 classes.  */
	      if (template_header_count - template_count > 1)
		/* There shouldn't be that many template parameter
		   lists.  There can be at most one parameter list for
		   every qualifying class, plus one for the function
		   itself.  */
		cp_error ("too many template parameter lists in declaration of `%D'", decl);
974

975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
	      SET_DECL_TEMPLATE_SPECIALIZATION (decl);
	      if (ctype)
		member_specialization = 1;
	      else
		specialization = 1;
	    }
	  else if (template_header_count == template_count)
	    {
	      /* The counts are equal.  So, this might be a
		 specialization, but it is not a specialization of a
		 member template.  It might be something like
		 
		 template <class T> struct S { 
	         void f(int i); 
		 };
		 template <>
		 void S<int>::f(int i) {}  */
	      specialization = 1;
	      SET_DECL_TEMPLATE_SPECIALIZATION (decl);
	    }
	  else 
	    {
	      /* This cannot be an explicit specialization.  There are not
		 enough headers for all of the qualifying classes.  For
		 example, we might have:
	     
		 template <>
		 void S<int>::T<char>::f();

		 But, we're missing another template <>.  */
	      cp_error("too few template parameter lists in declaration of `%D'", decl);
1006
	      return decl;
1007 1008 1009 1010 1011 1012 1013 1014 1015
	    } 
	}
      else if (processing_explicit_instantiation)
	{
	  if (template_header_count)
	    cp_error ("template parameter list used in explicit instantiation");
	  
	  if (have_def)
	    cp_error ("definition provided for explicit instantiation");
1016

1017
	  explicit_instantiation = 1;
1018
	}
1019 1020 1021
      else if (ctype != NULL_TREE
	       && !TYPE_BEING_DEFINED (ctype)
	       && CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
1022
	{
1023
	  /* This case catches outdated code that looks like this:
1024

1025
	     template <class T> struct S { void f(); };
1026 1027 1028 1029 1030 1031 1032
	     void S<int>::f() {} // Missing template <>

	     We disable this check when the type is being defined to
	     avoid complaining about default compiler-generated
	     constructors, destructors, and assignment operators.
	     Since the type is an instantiation, not a specialization,
	     these are the only functions that can be defined before
1033
	     the class is complete.  */
1034

1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
	  /* If they said
	       template <class T> void S<int>::f() {}
	     that's bogus.  */
	  if (template_header_count)
	    {
	      cp_error ("template parameters specified in specialization");
	      return decl;
	    }

	  if (pedantic)
	    cp_pedwarn
	      ("explicit specialization not preceded by `template <>'");
	  specialization = 1;
	  SET_DECL_TEMPLATE_SPECIALIZATION (decl);
	}
      else if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
	{
	  /* This case handles bogus declarations like
1053 1054 1055
	     template <> template <class T>
	     void f<int>();  */

1056 1057
	  cp_error ("template-id `%D' in declaration of primary template",
		    declarator);
1058
	  return decl;
1059
	}
1060
    }
1061

1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
  if (specialization || member_specialization)
    {
      tree t = TYPE_ARG_TYPES (TREE_TYPE (decl));
      for (; t; t = TREE_CHAIN (t))
	if (TREE_PURPOSE (t))
	  {
	    cp_pedwarn
	      ("default argument specified in explicit specialization");
	    break;
	  }
    }

1074
  if (specialization || member_specialization || explicit_instantiation)
1075 1076 1077 1078 1079
    {
      tree tmpl = NULL_TREE;
      tree targs = NULL_TREE;

      /* Make sure that the declarator is a TEMPLATE_ID_EXPR.  */
1080 1081 1082 1083 1084 1085 1086
      if (TREE_CODE (declarator) != TEMPLATE_ID_EXPR)
	{
	  tree fns;

	  my_friendly_assert (TREE_CODE (declarator) == IDENTIFIER_NODE, 
			      0);
	  if (!ctype)
jason's avatar
jason committed
1087
	    fns = IDENTIFIER_NAMESPACE_VALUE (dname);
1088 1089 1090
	  else
	    fns = dname;

1091 1092
	  declarator = 
	    lookup_template_function (fns, NULL_TREE);
1093 1094
	}

1095 1096 1097 1098
      if (declarator == error_mark_node)
	return error_mark_node;

      if (TREE_CODE (TREE_OPERAND (declarator, 0)) == LOOKUP_EXPR)
1099 1100 1101 1102
	{
	  /* A friend declaration.  We can't do much, because we don't
	   know what this resolves to, yet.  */
	  my_friendly_assert (is_friend != 0, 0);
1103
	  my_friendly_assert (!explicit_instantiation, 0);
1104
	  SET_DECL_IMPLICIT_INSTANTIATION (decl);
1105
	  return decl;
1106 1107
	} 

1108 1109 1110 1111 1112 1113
      if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype))
	{
	  /* Since finish_struct_1 has not been called yet, we
	     can't call lookup_fnfields.  We note that this
	     template is a specialization, and proceed, letting
	     finish_struct fix this up later.  */
1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
	  tree ti = perm_tree_cons (NULL_TREE, 
				    TREE_OPERAND (declarator, 1),
				    NULL_TREE);
	  TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
	  DECL_TEMPLATE_INFO (decl) = ti;
	  /* This should not be an instantiation; explicit
	     instantiation directives can only occur at the top
	     level.  */
	  my_friendly_assert (!explicit_instantiation, 0);
	  return decl;
1124 1125 1126 1127
	}
      else if (ctype != NULL_TREE 
	       && (TREE_CODE (TREE_OPERAND (declarator, 0)) ==
		   IDENTIFIER_NODE))
1128
	{
1129 1130 1131
	  /* Find the list of functions in ctype that have the same
	     name as the declared function.  */
	  tree name = TREE_OPERAND (declarator, 0);
1132
	  tree fns;
1133 1134 1135
	  
	  if (name == constructor_name (ctype) 
	      || name == constructor_name_full (ctype))
1136
	    {
1137 1138 1139 1140 1141 1142
	      int is_constructor = DECL_CONSTRUCTOR_P (decl);
	      
	      if (is_constructor ? !TYPE_HAS_CONSTRUCTOR (ctype)
		  : !TYPE_HAS_DESTRUCTOR (ctype))
		{
		  /* From [temp.expl.spec]:
1143
		       
1144 1145 1146
		     If such an explicit specialization for the member
		     of a class template names an implicitly-declared
		     special member function (clause _special_), the
1147 1148 1149
		     program is ill-formed.  

		     Similar language is found in [temp.explicit].  */
1150 1151
		  cp_error ("specialization of implicitly-declared special member function");

1152
		  return decl;
1153
		}
1154

1155
	      name = is_constructor ? ctor_identifier : dtor_identifier;
1156
	    }
1157 1158

	  fns = lookup_fnfields (TYPE_BINFO (ctype), name, 1);
1159 1160 1161
	  
	  if (fns == NULL_TREE) 
	    {
1162 1163
	      cp_error ("no member function `%s' declared in `%T'",
			IDENTIFIER_POINTER (name),
1164
			ctype);
1165
	      return decl;
1166 1167 1168 1169
	    }
	  else
	    TREE_OPERAND (declarator, 0) = fns;
	}
1170
      
1171 1172
      /* Figure out what exactly is being specialized at this point.
	 Note that for an explicit instantiation, even one for a
law's avatar
law committed
1173
	 member function, we cannot tell apriori whether the
1174 1175 1176 1177 1178 1179
	 instantiation is for a member template, or just a member
	 function of a template class.  In particular, even in if the
	 instantiation is for a member template, the template
	 arguments could be deduced from the declaration.  */
      tmpl = determine_specialization (declarator, decl,
				       &targs, 
1180 1181
				       member_specialization,
				       1);
1182
	    
1183
      if (tmpl && tmpl != error_mark_node)
1184
	{
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
	  if (explicit_instantiation)
	    {
	      decl = instantiate_template (tmpl, targs);
	      if (!DECL_TEMPLATE_SPECIALIZATION (decl))
		/* There doesn't seem to be anything in the draft to
		   prevent a specialization from being explicitly
		   instantiated.  We're careful not to destroy the
		   information indicating that this is a
		   specialization here.  */
		SET_DECL_EXPLICIT_INSTANTIATION (decl);
	      return decl;
	    }
1197 1198
	  else if (DECL_STATIC_FUNCTION_P (tmpl)
		   && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
1199 1200 1201 1202
	    {
	      revert_static_member_fn (&decl, 0, 0);
	      last_function_parms = TREE_CHAIN (last_function_parms);
	    }
1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213

	  /* Mangle the function name appropriately.  Note that we do
	     not mangle specializations of non-template member
	     functions of template classes, e.g. with
	       template <class T> struct S { void f(); }
	     and given the specialization 
	       template <> void S<int>::f() {}
	     we do not mangle S<int>::f() here.  That's because it's
	     just an ordinary member function and doesn't need special
	     treatment.  */
	  if ((is_member_template (tmpl) || ctype == NULL_TREE)
1214
	      && name_mangling_version >= 1)
1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
	    {
	      tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (tmpl));

	      if (ctype 
		  && TREE_CODE (TREE_TYPE (tmpl)) == FUNCTION_TYPE)
		arg_types = 
		  hash_tree_chain (build_pointer_type (ctype),
				   arg_types);

	      DECL_ASSEMBLER_NAME (decl) 
		= build_template_decl_overload 
1226
		(decl, arg_types, TREE_TYPE (TREE_TYPE (tmpl)),
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
		 DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
		 targs, ctype != NULL_TREE);
	    }

	  if (is_friend && !have_def)
	    {
	      /* This is not really a declaration of a specialization.
		 It's just the name of an instantiation.  But, it's not
		 a request for an instantiation, either.  */
	      SET_DECL_IMPLICIT_INSTANTIATION (decl);
	      DECL_TEMPLATE_INFO (decl) 
		= perm_tree_cons (tmpl, targs, NULL_TREE);
1239
	      return decl;
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256
	    }

	  /* If DECL_TI_TEMPLATE (decl), the decl is an
	     instantiation of a specialization of a member template.
	     (In other words, there was a member template, in a
	     class template.  That member template was specialized.
	     We then instantiated the class, so there is now an
	     instance of that specialization.)  

	     According to the CD2,

	     14.7.3.13 [tmpl.expl.spec]
	       
	     A specialization  of  a member function template or
	     member class template of a non-specialized class
	     template is itself a template.	        

1257
	     So, we just leave the template info alone in this case.  */
1258 1259 1260
	  if (!(DECL_TEMPLATE_INFO (decl) && DECL_TI_TEMPLATE (decl)))
	    DECL_TEMPLATE_INFO (decl)
	      = perm_tree_cons (tmpl, targs, NULL_TREE);
1261 1262 1263

	  register_specialization (decl, tmpl, targs);

1264
	  return decl;
1265 1266
	}
    }
1267
  
1268
  return decl;
1269
}
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322

/* Returns 1 iff PARMS1 and PARMS2 are identical sets of template
   parameters.  These are represented in the same format used for
   DECL_TEMPLATE_PARMS.  */

int comp_template_parms (parms1, parms2)
     tree parms1;
     tree parms2;
{
  tree p1;
  tree p2;

  if (parms1 == parms2)
    return 1;

  for (p1 = parms1, p2 = parms2; 
       p1 != NULL_TREE && p2 != NULL_TREE;
       p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2))
    {
      tree t1 = TREE_VALUE (p1);
      tree t2 = TREE_VALUE (p2);
      int i;

      my_friendly_assert (TREE_CODE (t1) == TREE_VEC, 0);
      my_friendly_assert (TREE_CODE (t2) == TREE_VEC, 0);

      if (TREE_VEC_LENGTH (t1) != TREE_VEC_LENGTH (t2))
	return 0;

      for (i = 0; i < TREE_VEC_LENGTH (t2); ++i) 
	{
	  tree parm1 = TREE_VALUE (TREE_VEC_ELT (t1, i));
	  tree parm2 = TREE_VALUE (TREE_VEC_ELT (t2, i));

	  if (TREE_CODE (parm1) != TREE_CODE (parm2))
	    return 0;

	  if (TREE_CODE (parm1) == TEMPLATE_TYPE_PARM)
	    continue;
	  else if (!comptypes (TREE_TYPE (parm1), 
			       TREE_TYPE (parm2), 1))
	    return 0;
	}
    }

  if ((p1 != NULL_TREE) != (p2 != NULL_TREE))
    /* One set of parameters has more parameters lists than the
       other.  */
    return 0;

  return 1;
}

jason's avatar
jason committed
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344
/* Return a new TEMPLATE_PARM_INDEX with the indicated INDEX, LEVEL,
   ORIG_LEVEL, DECL, and TYPE.  */

static tree
build_template_parm_index (index, level, orig_level, decl, type)
     int index;
     int level;
     int orig_level;
     tree decl;
     tree type;
{
  tree t = make_node (TEMPLATE_PARM_INDEX);
  TEMPLATE_PARM_IDX (t) = index;
  TEMPLATE_PARM_LEVEL (t) = level;
  TEMPLATE_PARM_ORIG_LEVEL (t) = orig_level;
  TEMPLATE_PARM_DECL (t) = decl;
  TREE_TYPE (t) = type;

  return t;
}

/* Return a TEMPLATE_PARM_INDEX, similar to INDEX, but whose
1345
   TEMPLATE_PARM_LEVEL has been decreased by LEVELS.  If such a
jason's avatar
jason committed
1346 1347 1348 1349
   TEMPLATE_PARM_INDEX already exists, it is returned; otherwise, a
   new one is created.  */

static tree 
1350
reduce_template_parm_level (index, type, levels)
jason's avatar
jason committed
1351 1352
     tree index;
     tree type;
1353
     int levels;
jason's avatar
jason committed
1354 1355 1356
{
  if (TEMPLATE_PARM_DESCENDANTS (index) == NULL_TREE
      || (TEMPLATE_PARM_LEVEL (TEMPLATE_PARM_DESCENDANTS (index))
1357
	  != TEMPLATE_PARM_LEVEL (index) - levels))
jason's avatar
jason committed
1358 1359 1360 1361 1362 1363 1364
    {
      tree decl 
	= build_decl (TREE_CODE (TEMPLATE_PARM_DECL (index)),
		      DECL_NAME (TEMPLATE_PARM_DECL (index)),
		      type);
      tree t
	= build_template_parm_index (TEMPLATE_PARM_IDX (index),
1365
				     TEMPLATE_PARM_LEVEL (index) - levels,
jason's avatar
jason committed
1366 1367 1368
				     TEMPLATE_PARM_ORIG_LEVEL (index),
				     decl, type);
      TEMPLATE_PARM_DESCENDANTS (index) = t;
1369 1370 1371 1372

      /* Template template parameters need this.  */
      DECL_TEMPLATE_PARMS (decl)
	= DECL_TEMPLATE_PARMS (TEMPLATE_PARM_DECL (index));
jason's avatar
jason committed
1373 1374 1375 1376 1377
    }

  return TEMPLATE_PARM_DESCENDANTS (index);
}

mrs's avatar
mrs committed
1378
/* Process information from new template parameter NEXT and append it to the
mrs's avatar
mrs committed
1379
   LIST being built.  */
mrs's avatar
mrs committed
1380

mrs's avatar
mrs committed
1381 1382 1383 1384 1385 1386
tree
process_template_parm (list, next)
     tree list, next;
{
  tree parm;
  tree decl = 0;
mrs's avatar
mrs committed
1387
  tree defval;
mrs's avatar
mrs committed
1388
  int is_type, idx;
jason's avatar
jason committed
1389

mrs's avatar
mrs committed
1390 1391
  parm = next;
  my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259);
mrs's avatar
mrs committed
1392 1393 1394
  defval = TREE_PURPOSE (parm);
  parm = TREE_VALUE (parm);
  is_type = TREE_PURPOSE (parm) == class_type_node;
mrs's avatar
mrs committed
1395 1396 1397 1398 1399 1400 1401

  if (list)
    {
      tree p = TREE_VALUE (tree_last (list));

      if (TREE_CODE (p) == TYPE_DECL)
	idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p));
1402 1403
      else if (TREE_CODE (p) == TEMPLATE_DECL)
	idx = TEMPLATE_TYPE_IDX (TREE_TYPE (DECL_TEMPLATE_RESULT (p)));
mrs's avatar
mrs committed
1404
      else
jason's avatar
jason committed
1405
	idx = TEMPLATE_PARM_IDX (DECL_INITIAL (p));
mrs's avatar
mrs committed
1406 1407 1408 1409 1410
      ++idx;
    }
  else
    idx = 0;

mrs's avatar
mrs committed
1411 1412
  if (!is_type)
    {
mrs's avatar
mrs committed
1413
      my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260);
mrs's avatar
mrs committed
1414
      /* is a const-param */
mrs's avatar
mrs committed
1415
      parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm),
mrs's avatar
merging  
mrs committed
1416
			     PARM, 0, NULL_TREE);
mrs's avatar
mrs committed
1417 1418
      /* A template parameter is not modifiable.  */
      TREE_READONLY (parm) = 1;
mrs's avatar
mrs committed
1419
      if (IS_AGGR_TYPE (TREE_TYPE (parm))
1420 1421
	  && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM
	  && TREE_CODE (TREE_TYPE (parm)) != TYPENAME_TYPE)
mrs's avatar
mrs committed
1422
	{
mrs's avatar
mrs committed
1423 1424 1425 1426
	  cp_error ("`%#T' is not a valid type for a template constant parameter",
		    TREE_TYPE (parm));
	  if (DECL_NAME (parm) == NULL_TREE)
	    error ("  a template type parameter must begin with `class' or `typename'");
mrs's avatar
mrs committed
1427 1428
	  TREE_TYPE (parm) = void_type_node;
	}
mrs's avatar
mrs committed
1429 1430 1431
      else if (pedantic
	       && (TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE
		   || TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE))
mrs's avatar
mrs committed
1432 1433
	cp_pedwarn ("`%T' is not a valid type for a template constant parameter",
		    TREE_TYPE (parm));
mrs's avatar
mrs committed
1434 1435 1436 1437 1438 1439
      if (TREE_PERMANENT (parm) == 0)
        {
	  parm = copy_node (parm);
	  TREE_PERMANENT (parm) = 1;
        }
      decl = build_decl (CONST_DECL, DECL_NAME (parm), TREE_TYPE (parm));
jason's avatar
jason committed
1440 1441 1442 1443
      DECL_INITIAL (parm) = DECL_INITIAL (decl) 
	= build_template_parm_index (idx, processing_template_decl,
				     processing_template_decl,
				     decl, TREE_TYPE (parm));
mrs's avatar
mrs committed
1444 1445 1446
    }
  else
    {
1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465
      tree t;
      parm = TREE_VALUE (parm);
      
      if (parm && TREE_CODE (parm) == TEMPLATE_DECL)
	{
	  t = make_lang_type (TEMPLATE_TEMPLATE_PARM);
	  /* This is for distinguishing between real templates and template 
	     template parameters */
	  TREE_TYPE (parm) = t;
	  TREE_TYPE (DECL_TEMPLATE_RESULT (parm)) = t;
	  decl = parm;
	}
      else
	{
	  t = make_lang_type (TEMPLATE_TYPE_PARM);
	  /* parm is either IDENTIFIER_NODE or NULL_TREE */
	  decl = build_decl (TYPE_DECL, parm, t);
	}
        
mrs's avatar
mrs committed
1466
      CLASSTYPE_GOT_SEMICOLON (t) = 1;
mrs's avatar
mrs committed
1467 1468
      TYPE_NAME (t) = decl;
      TYPE_STUB_DECL (t) = decl;
mrs's avatar
mrs committed
1469
      parm = decl;
jason's avatar
jason committed
1470 1471 1472 1473
      TEMPLATE_TYPE_PARM_INDEX (t)
	= build_template_parm_index (idx, processing_template_decl, 
				     processing_template_decl,
				     decl, TREE_TYPE (parm));
mrs's avatar
mrs committed
1474
    }
mrs's avatar
mrs committed
1475
  SET_DECL_ARTIFICIAL (decl);
mrs's avatar
mrs committed
1476
  pushdecl (decl);
mrs's avatar
mrs committed
1477
  parm = build_tree_list (defval, parm);
mrs's avatar
mrs committed
1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489
  return chainon (list, parm);
}

/* The end of a template parameter list has been reached.  Process the
   tree list into a parameter vector, converting each parameter into a more
   useful form.	 Type parameters are saved as IDENTIFIER_NODEs, and others
   as PARM_DECLs.  */

tree
end_template_parm_list (parms)
     tree parms;
{
mrs's avatar
mrs committed
1490
  int nparms;
mrs's avatar
mrs committed
1491
  tree parm;
mrs's avatar
mrs committed
1492 1493 1494 1495 1496
  tree saved_parmlist = make_tree_vec (list_length (parms));

  current_template_parms
    = tree_cons (build_int_2 (0, processing_template_decl),
		 saved_parmlist, current_template_parms);
mrs's avatar
mrs committed
1497 1498

  for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++)
mrs's avatar
mrs committed
1499
    TREE_VEC_ELT (saved_parmlist, nparms) = parm;
mrs's avatar
mrs committed
1500

1501 1502
  --processing_template_parmlist;

mrs's avatar
mrs committed
1503 1504 1505
  return saved_parmlist;
}

mrs's avatar
mrs committed
1506 1507
/* end_template_decl is called after a template declaration is seen.  */

mrs's avatar
mrs committed
1508
void
mrs's avatar
mrs committed
1509
end_template_decl ()
mrs's avatar
mrs committed
1510
{
1511 1512
  reset_specialization ();

mrs's avatar
mrs committed
1513
  if (! processing_template_decl)
mrs's avatar
mrs committed
1514 1515
    return;

mrs's avatar
mrs committed
1516 1517
  /* This matches the pushlevel in begin_template_parm_list.  */
  poplevel (0, 0, 0);
mrs's avatar
mrs committed
1518

mrs's avatar
mrs committed
1519 1520 1521 1522
  --processing_template_decl;
  current_template_parms = TREE_CHAIN (current_template_parms);
  (void) get_pending_sizes ();	/* Why? */
}
mrs's avatar
mrs committed
1523

mrs's avatar
mrs committed
1524 1525 1526 1527
/* Generate a valid set of template args from current_template_parms.  */

tree
current_template_args ()
mrs's avatar
mrs committed
1528 1529
{
  tree header = current_template_parms;
1530 1531 1532 1533
  int length = list_length (header);
  tree args = make_tree_vec (length);
  int l = length;

mrs's avatar
mrs committed
1534
  while (header)
mrs's avatar
mrs committed
1535
    {
mrs's avatar
mrs committed
1536 1537 1538 1539 1540
      tree a = copy_node (TREE_VALUE (header));
      int i = TREE_VEC_LENGTH (a);
      TREE_TYPE (a) = NULL_TREE;
      while (i--)
	{
1541 1542 1543 1544 1545 1546 1547 1548 1549
	  tree t = TREE_VEC_ELT (a, i);

	  /* t will be a list if we are called from within a
	     begin/end_template_parm_list pair, but a vector directly
	     if within a begin/end_member_template_processing pair.  */
	  if (TREE_CODE (t) == TREE_LIST) 
	    {
	      t = TREE_VALUE (t);
	      
1550 1551
	      if (TREE_CODE (t) == TYPE_DECL 
		  || TREE_CODE (t) == TEMPLATE_DECL)
1552 1553 1554 1555 1556
		t = TREE_TYPE (t);
	      else
		t = DECL_INITIAL (t);
	    }

mrs's avatar
mrs committed
1557 1558
	  TREE_VEC_ELT (a, i) = t;
	}
1559
      TREE_VEC_ELT (args, --l) = a;
mrs's avatar
mrs committed
1560
      header = TREE_CHAIN (header);
mrs's avatar
mrs committed
1561 1562
    }

mrs's avatar
mrs committed
1563 1564
  return args;
}
1565

1566 1567 1568 1569

/* Return a TEMPLATE_DECL corresponding to DECL, using the indicated
   template PARMS.  Used by push_template_decl below.  */

1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587
static tree
build_template_decl (decl, parms)
     tree decl;
     tree parms;
{
  tree tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE);
  DECL_TEMPLATE_PARMS (tmpl) = parms;
  DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl);
  if (DECL_LANG_SPECIFIC (decl))
    {
      DECL_CLASS_CONTEXT (tmpl) = DECL_CLASS_CONTEXT (decl);
      DECL_STATIC_FUNCTION_P (tmpl) = 
	DECL_STATIC_FUNCTION_P (decl);
    }

  return tmpl;
}

1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627
struct template_parm_data
{
  int level;
  int* parms;
};

/* Subroutine of push_template_decl used to see if each template
   parameter in a partial specialization is used in the explicit
   argument list.  If T is of the LEVEL given in DATA (which is
   treated as a template_parm_data*), then DATA->PARMS is marked
   appropriately.  */

static int
mark_template_parm (t, data)
     tree t;
     void* data;
{
  int level;
  int idx;
  struct template_parm_data* tpd = (struct template_parm_data*) data;

  if (TREE_CODE (t) == TEMPLATE_PARM_INDEX)
    {
      level = TEMPLATE_PARM_LEVEL (t);
      idx = TEMPLATE_PARM_IDX (t);
    }
  else
    {
      level = TEMPLATE_TYPE_LEVEL (t);
      idx = TEMPLATE_TYPE_IDX (t);
    }

  if (level == tpd->level)
    tpd->parms[idx] = 1;

  /* Return zero so that for_each_template_parm will continue the
     traversal of the tree; we want to mark *every* template parm.  */
  return 0;
}

1628
/* Creates a TEMPLATE_DECL for the indicated DECL using the template
jason's avatar
jason committed
1629 1630
   parameters given by current_template_args, or reuses a
   previously existing one, if appropriate.  Returns the DECL, or an
1631 1632 1633
   equivalent one, if it is replaced via a call to duplicate_decls.  

   If IS_FRIEND is non-zero, DECL is a friend declaration.  */
1634 1635

tree
1636
push_template_decl_real (decl, is_friend)
mrs's avatar
mrs committed
1637
     tree decl;
1638
     int is_friend;
mrs's avatar
mrs committed
1639 1640
{
  tree tmpl;
jason's avatar
jason committed
1641
  tree args;
mrs's avatar
mrs committed
1642
  tree info;
jason's avatar
jason committed
1643 1644
  tree ctx;
  int primary;
1645 1646

  is_friend |= (TREE_CODE (decl) == FUNCTION_DECL && DECL_FRIEND_P (decl));
jason's avatar
jason committed
1647 1648 1649 1650 1651

  if (is_friend)
    /* For a friend, we want the context of the friend function, not
       the type of which it is a friend.  */
    ctx = DECL_CONTEXT (decl);
jason's avatar
jason committed
1652 1653
  else if (DECL_REAL_CONTEXT (decl)
	   && TREE_CODE (DECL_REAL_CONTEXT (decl)) != NAMESPACE_DECL)
jason's avatar
jason committed
1654 1655 1656 1657 1658 1659 1660 1661
    /* In the case of a virtual function, we want the class in which
       it is defined.  */
    ctx = DECL_REAL_CONTEXT (decl);
  else
    /* Otherwise, if we're currently definining some class, the DECL
       is assumed to be a member of the class.  */
    ctx = current_class_type;

jason's avatar
jason committed
1662 1663 1664 1665
  if (ctx && TREE_CODE (ctx) == NAMESPACE_DECL)
    ctx = NULL_TREE;

  if (!DECL_CONTEXT (decl))
1666
    DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
jason's avatar
jason committed
1667

1668 1669 1670
  /* For determining whether this is a primary template or not, we're really
     interested in the lexical context, not the true context.  */
  if (is_friend)
1671 1672 1673
    /* For a TYPE_DECL, there is no DECL_CLASS_CONTEXT.  */
    info = TREE_CODE (decl) == FUNCTION_DECL 
      ? DECL_CLASS_CONTEXT (decl) : current_class_type;
1674 1675 1676 1677 1678
  else
    info = ctx;

  if (info && TREE_CODE (info) == FUNCTION_DECL)
    primary = 0;
1679 1680 1681
  /* Note that template_class_depth returns 0 if given NULL_TREE, so
     this next line works even when we are at global scope.  */
  else if (processing_template_decl > template_class_depth (info))
mrs's avatar
mrs committed
1682
    primary = 1;
jason's avatar
jason committed
1683 1684
  else
    primary = 0;
mrs's avatar
mrs committed
1685

1686 1687 1688 1689 1690 1691 1692 1693
  if (primary)
    {
      if (current_lang_name == lang_name_c)
	cp_error ("template with C linkage");
      if (TREE_CODE (decl) == TYPE_DECL && ANON_AGGRNAME_P (DECL_NAME (decl)))
	cp_error ("template class without a name");
    }

mrs's avatar
mrs committed
1694
  /* Partial specialization.  */
mrs's avatar
mrs committed
1695
  if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)
mrs's avatar
mrs committed
1696 1697 1698 1699 1700 1701 1702
      && CLASSTYPE_TEMPLATE_SPECIALIZATION (TREE_TYPE (decl)))
    {
      tree type = TREE_TYPE (decl);
      tree maintmpl = CLASSTYPE_TI_TEMPLATE (type);
      tree mainargs = CLASSTYPE_TI_ARGS (type);
      tree spec = DECL_TEMPLATE_SPECIALIZATIONS (maintmpl);

1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762
      /* We check that each of the template parameters given in the
	 partial specialization is used in the argument list to the
	 specialization.  For example:
	 
	   template <class T> struct S;
	   template <class T> struct S<T*>;

	 The second declaration is OK because `T*' uses the template
	 parameter T, whereas
       
           template <class T> struct S<int>;

	 is no good.  Even trickier is:

	   template <class T>
	   struct S1
	   {
	      template <class U>
	      struct S2;
	      template <class U>
	      struct S2<T>;
	   };
	   
	 The S2<T> declaration is actually illegal; it is a
	 full-specialization.  Of course, 

              template <class U>
              struct S2<T (*)(U)>;

         or some such would have been OK.  */
      int  i;
      struct template_parm_data tpd;
      int ntparms = TREE_VEC_LENGTH (TREE_VALUE (current_template_parms));
      int did_error_intro = 0;

      tpd.level = TREE_INT_CST_HIGH (TREE_PURPOSE (current_template_parms));
      tpd.parms = alloca (sizeof (int) * ntparms);
      for (i = 0; i < ntparms; ++i)
	tpd.parms[i] = 0;
      for (i = 0; i < TREE_VEC_LENGTH (mainargs); ++i)
	for_each_template_parm (TREE_VEC_ELT (mainargs, i),
				&mark_template_parm,
				&tpd);
      for (i = 0; i < ntparms; ++i)
	if (tpd.parms[i] == 0)
	  {
	    /* One of the template parms was not used in the
	       specialization.  */
	    if (!did_error_intro)
	      {
		cp_error ("template parameters not used in partial specialization:");
		did_error_intro = 1;
	      }

	    cp_error ("        `%D'", 
		      TREE_VALUE (TREE_VEC_ELT 
				  (TREE_VALUE (current_template_parms),
				   i)));
	  }

mrs's avatar
mrs committed
1763 1764 1765 1766 1767
      for (; spec; spec = TREE_CHAIN (spec))
	{
	  /* purpose: args to main template
	     value: spec template */
	  if (comp_template_args (TREE_PURPOSE (spec), mainargs))
1768
	    return decl;
mrs's avatar
mrs committed
1769 1770
	}

mrs's avatar
mrs committed
1771 1772 1773
      DECL_TEMPLATE_SPECIALIZATIONS (maintmpl) = CLASSTYPE_TI_SPEC_INFO (type)
	= perm_tree_cons (mainargs, TREE_VALUE (current_template_parms),
			  DECL_TEMPLATE_SPECIALIZATIONS (maintmpl));
mrs's avatar
mrs committed
1774
      TREE_TYPE (DECL_TEMPLATE_SPECIALIZATIONS (maintmpl)) = type;
1775
      return decl;
mrs's avatar
mrs committed
1776 1777
    }

mrs's avatar
mrs committed
1778 1779
  args = current_template_args ();

jason's avatar
jason committed
1780 1781 1782 1783
  if (!ctx 
      || TREE_CODE (ctx) == FUNCTION_DECL
      || TYPE_BEING_DEFINED (ctx)
      || (is_friend && !DECL_TEMPLATE_INFO (decl)))
mrs's avatar
mrs committed
1784
    {
1785
      if (DECL_LANG_SPECIFIC (decl)
jason's avatar
jason committed
1786 1787 1788 1789
	  && DECL_TEMPLATE_INFO (decl)
	  && DECL_TI_TEMPLATE (decl))
	tmpl = DECL_TI_TEMPLATE (decl);
      else
1790
	{
jason's avatar
jason committed
1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801
	  tmpl = build_template_decl (decl, current_template_parms);
	  
	  if (DECL_LANG_SPECIFIC (decl)
	      && DECL_TEMPLATE_SPECIALIZATION (decl))
	    {
	      /* A specialization of a member template of a template
		 class. */
	      SET_DECL_TEMPLATE_SPECIALIZATION (tmpl);
	      DECL_TEMPLATE_INFO (tmpl) = DECL_TEMPLATE_INFO (decl);
	      DECL_TEMPLATE_INFO (decl) = NULL_TREE;
	    }
1802
	}
mrs's avatar
mrs committed
1803 1804 1805
    }
  else
    {
mrs's avatar
mrs committed
1806
      tree t;
1807
      tree a;
mrs's avatar
mrs committed
1808

mrs's avatar
mrs committed
1809 1810 1811
      if (CLASSTYPE_TEMPLATE_INSTANTIATION (ctx))
	cp_error ("must specialize `%#T' before defining member `%#D'",
		  ctx, decl);
1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823
      if (TREE_CODE (decl) == TYPE_DECL)
	{
	  if (IS_AGGR_TYPE_CODE (TREE_CODE (TREE_TYPE (decl)))
	      && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (decl))
	      && CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl)))
	    tmpl = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl));
	  else
	    {
	      cp_error ("`%D' does not declare a template type", decl);
	      return decl;
	    }
	}
mrs's avatar
mrs committed
1824
      else if (! DECL_TEMPLATE_INFO (decl))
mrs's avatar
mrs committed
1825 1826
	{
	  cp_error ("template definition of non-template `%#D'", decl);
1827
	  return decl;
mrs's avatar
mrs committed
1828
	}
mrs's avatar
mrs committed
1829
      else
mrs's avatar
mrs committed
1830
	tmpl = DECL_TI_TEMPLATE (decl);
1831
      
1832
      if (is_member_template (tmpl) || is_member_template_class (tmpl))
1833
	{
1834 1835
	  if (DECL_FUNCTION_TEMPLATE_P (tmpl)
	      && DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl) 
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856
	      && DECL_TEMPLATE_SPECIALIZATION (decl))
	    {
	      tree new_tmpl;

	      /* The declaration is a specialization of a member
		 template, declared outside the class.  Therefore, the
		 innermost template arguments will be NULL, so we
		 replace them with the arguments determined by the
		 earlier call to check_explicit_specialization.  */
	      args = DECL_TI_ARGS (decl);

	      new_tmpl 
		= build_template_decl (decl, current_template_parms);
	      DECL_TEMPLATE_RESULT (new_tmpl) = decl;
	      TREE_TYPE (new_tmpl) = TREE_TYPE (decl);
	      DECL_TI_TEMPLATE (decl) = new_tmpl;
	      SET_DECL_TEMPLATE_SPECIALIZATION (new_tmpl);
	      DECL_TEMPLATE_INFO (new_tmpl) = 
		perm_tree_cons (tmpl, args, NULL_TREE);

	      register_specialization (new_tmpl, tmpl, args);
1857
	      return decl;
1858 1859
	    }
	  
1860
	  a = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
1861
	  t = DECL_INNERMOST_TEMPLATE_PARMS (tmpl);
jason's avatar
jason committed
1862
	  if (TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a))
1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878
	    {
	      cp_error ("got %d template parameters for `%#D'",
			TREE_VEC_LENGTH (a), decl);
	      cp_error ("  but %d required", TREE_VEC_LENGTH (t));
	    }
	  if (TREE_VEC_LENGTH (args) > 1)
	    /* Get the template parameters for the enclosing template
	       class.  */ 
	    a = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 2);
	  else
	    a = NULL_TREE;
	}
      else 
	a = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);

      t = NULL_TREE;
mrs's avatar
mrs committed
1879 1880

      if (CLASSTYPE_TEMPLATE_SPECIALIZATION (ctx))
1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892
	{
	  /* When processing an inline member template of a
	     specialized class, there is no CLASSTYPE_TI_SPEC_INFO.  */
	  if (CLASSTYPE_TI_SPEC_INFO (ctx))
	    t = TREE_VALUE (CLASSTYPE_TI_SPEC_INFO (ctx));
	}
      else if (CLASSTYPE_TEMPLATE_INFO (ctx))
	t = DECL_INNERMOST_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (ctx));

      /* There should be template arguments if and only if there is a
	 template class.  */
      my_friendly_assert((a != NULL_TREE) == (t != NULL_TREE), 0);
mrs's avatar
mrs committed
1893

1894 1895
      if (t != NULL_TREE 
	  && TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a))
mrs's avatar
mrs committed
1896 1897
	{
	  cp_error ("got %d template parameters for `%#D'",
1898
		    TREE_VEC_LENGTH (a), decl);
mrs's avatar
mrs committed
1899 1900
	  cp_error ("  but `%#T' has %d", ctx, TREE_VEC_LENGTH (t));
	}
mrs's avatar
mrs committed
1901
    }
1902 1903 1904 1905 1906 1907 1908 1909 1910
  /* Get the innermost set of template arguments.  We don't do this
     for a non-template member function of a nested template class
     because there we will never get a `partial instantiation' of the
     function containing the outer arguments, and so we must save all
     of the arguments here.  */
  if (TREE_CODE (decl) != FUNCTION_DECL 
      || template_class_depth (ctx) <= 1
      || primary)
    args = innermost_args (args, 0);
mrs's avatar
mrs committed
1911

mrs's avatar
mrs committed
1912 1913
  DECL_TEMPLATE_RESULT (tmpl) = decl;
  TREE_TYPE (tmpl) = TREE_TYPE (decl);
mrs's avatar
mrs committed
1914

1915 1916 1917 1918
  if (! ctx && !(is_friend && template_class_depth (info) > 0))
    /* Note that we do not try to push a global template friend
       declared in a template class; such a thing may well depend on
       the template parameters of the class.  */
jason's avatar
jason committed
1919
    tmpl = pushdecl_namespace_level (tmpl);
mrs's avatar
mrs committed
1920

mrs's avatar
mrs committed
1921
  if (primary)
1922
    DECL_PRIMARY_TEMPLATE (tmpl) = tmpl;
mrs's avatar
mrs committed
1923 1924 1925

  info = perm_tree_cons (tmpl, args, NULL_TREE);

mrs's avatar
mrs committed
1926
  if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl))
mrs's avatar
mrs committed
1927
    {
mrs's avatar
mrs committed
1928
      CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (tmpl)) = info;
1929 1930
      if (!ctx || TREE_CODE (ctx) != FUNCTION_DECL)
	DECL_NAME (decl) = classtype_mangled_name (TREE_TYPE (decl));
mrs's avatar
mrs committed
1931
    }
mrs's avatar
mrs committed
1932 1933
  else if (! DECL_LANG_SPECIFIC (decl))
    cp_error ("template declaration of `%#D'", decl);
mrs's avatar
mrs committed
1934
  else
mrs's avatar
mrs committed
1935
    DECL_TEMPLATE_INFO (decl) = info;
1936 1937

  return DECL_TEMPLATE_RESULT (tmpl);
mrs's avatar
mrs committed
1938 1939
}

1940 1941 1942 1943 1944 1945 1946 1947 1948
tree
push_template_decl (decl)
     tree decl;
{
  return push_template_decl_real (decl, 0);
}

/* Called when a class template TYPE is redeclared with the indicated
   template PARMS, e.g.:
1949 1950 1951 1952 1953

     template <class T> struct S;
     template <class T> struct S {};  */

void 
1954
redeclare_class_template (type, parms)
1955
     tree type;
1956
     tree parms;
1957 1958
{
  tree tmpl = CLASSTYPE_TI_TEMPLATE (type);
1959
  tree tmpl_parms;
1960 1961 1962 1963 1964 1965 1966 1967
  int i;

  if (!PRIMARY_TEMPLATE_P (tmpl))
    /* The type is nested in some template class.  Nothing to worry
       about here; there are no new template parameters for the nested
       type.  */
    return;

1968 1969 1970
  parms = INNERMOST_TEMPLATE_PARMS (parms);
  tmpl_parms = DECL_INNERMOST_TEMPLATE_PARMS (tmpl);

1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001
  if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms))
    {
      cp_error_at ("previous declaration `%D'", tmpl);
      cp_error ("used %d template parameter%s instead of %d",
		TREE_VEC_LENGTH (tmpl_parms), 
		TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s",
		TREE_VEC_LENGTH (parms));
      return;
    }

  for (i = 0; i < TREE_VEC_LENGTH (tmpl_parms); ++i)
    {
      tree tmpl_parm = TREE_VALUE (TREE_VEC_ELT (tmpl_parms, i));
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
      tree tmpl_default = TREE_PURPOSE (TREE_VEC_ELT (tmpl_parms, i));
      tree parm_default = TREE_PURPOSE (TREE_VEC_ELT (parms, i));

      if (TREE_CODE (tmpl_parm) != TREE_CODE (parm))
	{
	  cp_error_at ("template parameter `%#D'", tmpl_parm);
	  cp_error ("redeclared here as `%#D'", parm);
	  return;
	}

      if (tmpl_default != NULL_TREE && parm_default != NULL_TREE)
	{
	  /* We have in [temp.param]:

	     A template-parameter may not be given default arguments
	     by two different declarations in the same scope.  */
	  cp_error ("redefinition of default argument for `%#D'", parm);
2002
	  cp_error_at ("  original definition appeared here", tmpl_parm);
2003 2004 2005 2006 2007 2008 2009 2010 2011
	  return;
	}

      if (parm_default != NULL_TREE)
	/* Update the previous template parameters (which are the ones
	   that will really count) with the new default value.  */
	TREE_PURPOSE (TREE_VEC_ELT (tmpl_parms, i)) = parm_default;
    }
}
2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023

/* Attempt to convert the non-type template parameter EXPR to the
   indicated TYPE.  If the conversion is successful, return the
   converted value.  If the conversion is unsuccesful, return
   NULL_TREE if we issued an error message, or error_mark_node if we
   did not.  We issue error messages for out-and-out bad template
   parameters, but not simply because the conversion failed, since we
   might be just trying to do argument deduction.  By the time this
   function is called, neither TYPE nor EXPR may make use of template
   parameters.  */

static tree
2024
convert_nontype_argument (type, expr)
2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
     tree type;
     tree expr;
{
  tree expr_type = TREE_TYPE (expr);

  /* A template-argument for a non-type, non-template
     template-parameter shall be one of:

     --an integral constant-expression of integral or enumeration
     type; or
     
     --the name of a non-type template-parameter; or
     
     --the name of an object or function with external linkage,
     including function templates and function template-ids but
2040
     excluding non-static class members, expressed as id-expression;
2041 2042 2043 2044 2045 2046 2047 2048 2049 2050
     or
     
     --the address of an object or function with external linkage,
     including function templates and function template-ids but
     excluding non-static class members, expressed as & id-expression
     where the & is optional if the name refers to a function or
     array; or
     
     --a pointer to member expressed as described in _expr.unary.op_.  */

2051 2052 2053 2054 2055
  /* An integral constant-expression can include const variables
     or enumerators.  */
  if (INTEGRAL_TYPE_P (expr_type) && TREE_READONLY_DECL_P (expr))
    expr = decl_constant_value (expr);

2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066
  if (is_overloaded_fn (expr))
    /* OK for now.  We'll check that it has external linkage later.
       Check this first since if expr_type is the unknown_type_node
       we would otherwise complain below.  */
    ;
  else if (INTEGRAL_TYPE_P (expr_type) 
	   || TYPE_PTRMEM_P (expr_type) 
	   || TYPE_PTRMEMFUNC_P (expr_type)
	   /* The next two are g++ extensions.  */
	   || TREE_CODE (expr_type) == REAL_TYPE
	   || TREE_CODE (expr_type) == COMPLEX_TYPE)
2067
    {
2068
      if (! TREE_CONSTANT (expr))
2069
	{
2070
	non_constant:
2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
	  cp_error ("non-constant `%E' cannot be used as template argument",
		    expr);
	  return NULL_TREE;
	}
    }
  else if (TYPE_PTR_P (expr_type) 
	   /* If expr is the address of an overloaded function, we
	      will get the unknown_type_node at this point.  */
	   || expr_type == unknown_type_node)
    {
      tree referent;
2082 2083
      tree e = expr;
      STRIP_NOPS (e);
2084

2085
      if (TREE_CODE (e) != ADDR_EXPR)
2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096
	{
	bad_argument:
	  cp_error ("`%E' is not a valid template argument", expr);
	  error ("it must be %s%s with external linkage",
		 TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE
		 ? "a pointer to " : "",
		 TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == FUNCTION_TYPE
		 ? "a function" : "an object");
	  return NULL_TREE;
	}

2097
      referent = TREE_OPERAND (e, 0);
2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118
      STRIP_NOPS (referent);
      
      if (TREE_CODE (referent) == STRING_CST)
	{
	  cp_error ("string literal %E is not a valid template argument", 
		    referent);
	  error ("because it is the address of an object with static linkage");
	  return NULL_TREE;
	}

      if (is_overloaded_fn (referent))
	/* We'll check that it has external linkage later.  */
	;
      else if (TREE_CODE (referent) != VAR_DECL)
	goto bad_argument;
      else if (!TREE_PUBLIC (referent))
	{
	  cp_error ("address of non-extern `%E' cannot be used as template argument", referent); 
	  return error_mark_node;
	}
    }
2119
  else if (TREE_CODE (expr) == VAR_DECL)
2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142
    {
      if (!TREE_PUBLIC (expr))
	goto bad_argument;
    }
  else 
    {
      cp_error ("object `%E' cannot be used as template argument", expr);
      return NULL_TREE;
    }

  switch (TREE_CODE (type))
    {
    case INTEGER_TYPE:
    case BOOLEAN_TYPE:
    case ENUMERAL_TYPE:
      /* For a non-type template-parameter of integral or enumeration
         type, integral promotions (_conv.prom_) and integral
         conversions (_conv.integral_) are applied. */
      if (!INTEGRAL_TYPE_P (expr_type))
	return error_mark_node;
      
      /* It's safe to call digest_init in this case; we know we're
	 just converting one integral constant expression to another.  */
2143
      expr = digest_init (type, expr, (tree*) 0);
2144

2145 2146 2147 2148 2149 2150 2151 2152
      if (TREE_CODE (expr) != INTEGER_CST)
	/* Curiously, some TREE_CONSTNAT integral expressions do not
	   simplify to integer constants.  For example, `3 % 0',
	   remains a TRUNC_MOD_EXPR.  */
	goto non_constant;
      
      return expr;
	
2153 2154 2155 2156 2157 2158
    case REAL_TYPE:
    case COMPLEX_TYPE:
      /* These are g++ extensions.  */
      if (TREE_CODE (expr_type) != TREE_CODE (type))
	return error_mark_node;

2159 2160 2161 2162 2163 2164
      expr = digest_init (type, expr, (tree*) 0);
      
      if (TREE_CODE (expr) != REAL_CST)
	goto non_constant;

      return expr;
2165

2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185
    case POINTER_TYPE:
      {
	tree type_pointed_to = TREE_TYPE (type);
 
	if (TYPE_PTRMEM_P (type))
	  /* For a non-type template-parameter of type pointer to data
	     member, qualification conversions (_conv.qual_) are
	     applied.  */
	  return perform_qualification_conversions (type, expr);
	else if (TREE_CODE (type_pointed_to) == FUNCTION_TYPE)
	  { 
	    /* For a non-type template-parameter of type pointer to
	       function, only the function-to-pointer conversion
	       (_conv.func_) is applied.  If the template-argument
	       represents a set of overloaded functions (or a pointer to
	       such), the matching function is selected from the set
	       (_over.over_).  */
	    tree fns;
	    tree fn;

2186
	    if (TREE_CODE (expr) == ADDR_EXPR)
2187 2188 2189 2190
	      fns = TREE_OPERAND (expr, 0);
	    else
	      fns = expr;

2191
	    fn = instantiate_type (type_pointed_to, fns, 0);
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219

	    if (fn == error_mark_node)
	      return error_mark_node;

	    if (!TREE_PUBLIC (fn))
	      {
		if (really_overloaded_fn (fns))
		  return error_mark_node;
		else
		  goto bad_argument;
	      }

	    expr = build_unary_op (ADDR_EXPR, fn, 0);

	    my_friendly_assert (comptypes (type, TREE_TYPE (expr), 1), 
				0);
	    return expr;
	  }
	else 
	  {
	    /* For a non-type template-parameter of type pointer to
	       object, qualification conversions (_conv.qual_) and the
	       array-to-pointer conversion (_conv.array_) are applied.
	       [Note: In particular, neither the null pointer conversion
	       (_conv.ptr_) nor the derived-to-base conversion
	       (_conv.ptr_) are applied.  Although 0 is a valid
	       template-argument for a non-type template-parameter of
	       integral type, it is not a valid template-argument for a
2220 2221 2222 2223 2224
	       non-type template-parameter of pointer type.]  
	    
	       The call to decay_conversion performs the
	       array-to-pointer conversion, if appropriate.  */
	    expr = decay_conversion (expr);
2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247

	    if (expr == error_mark_node)
	      return error_mark_node;
	    else
	      return perform_qualification_conversions (type, expr);
	  }
      }
      break;

    case REFERENCE_TYPE:
      {
	tree type_referred_to = TREE_TYPE (type);

	if (TREE_CODE (type_referred_to) == FUNCTION_TYPE)
	  {
	    /* For a non-type template-parameter of type reference to
	      function, no conversions apply.  If the
	      template-argument represents a set of overloaded
	      functions, the matching function is selected from the
	      set (_over.over_).  */
	    tree fns = expr;
	    tree fn;

2248
	    fn = instantiate_type (type_referred_to, fns, 0);
2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295

	    if (!TREE_PUBLIC (fn))
	      {
		if (really_overloaded_fn (fns))
		  /* Don't issue an error here; we might get a different
		     function if the overloading had worked out
		     differently.  */
		  return error_mark_node;
		else
		  goto bad_argument;
	      }

	    if (fn == error_mark_node)
	      return error_mark_node;

	    my_friendly_assert (comptypes (type, TREE_TYPE (fn), 1),
				0);

	    return fn;
	  }
	else
	  {
	    /* For a non-type template-parameter of type reference to
	       object, no conversions apply.  The type referred to by the
	       reference may be more cv-qualified than the (otherwise
	       identical) type of the template-argument.  The
	       template-parameter is bound directly to the
	       template-argument, which must be an lvalue.  */
	    if (!comptypes (TYPE_MAIN_VARIANT (expr_type),
			    TYPE_MAIN_VARIANT (type), 1)
		|| (TYPE_READONLY (expr_type) >
		    TYPE_READONLY (type_referred_to))
		|| (TYPE_VOLATILE (expr_type) >
		    TYPE_VOLATILE (type_referred_to))
		|| !real_lvalue_p (expr))
	      return error_mark_node;
	    else
	      return expr;
	  }
      }
      break;

    case RECORD_TYPE:
      {
	tree fns;
	tree fn;

2296 2297 2298 2299 2300 2301 2302
	if (!TYPE_PTRMEMFUNC_P (type))
	  /* This handles templates like
	       template<class T, T t> void f();
	     when T is substituted with any class.  The second template
	     parameter becomes invalid and the template candidate is
	     rejected.  */
	  return error_mark_node;
2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327

	/* For a non-type template-parameter of type pointer to member
	   function, no conversions apply.  If the template-argument
	   represents a set of overloaded member functions, the
	   matching member function is selected from the set
	   (_over.over_).  */

	if (!TYPE_PTRMEMFUNC_P (expr_type) && 
	    expr_type != unknown_type_node)
	  return error_mark_node;

	if (TREE_CODE (expr) == CONSTRUCTOR)
	  {
	    /* A ptr-to-member constant.  */
	    if (!comptypes (type, expr_type, 1))
	      return error_mark_node;
	    else 
	      return expr;
	  }

	if (TREE_CODE (expr) != ADDR_EXPR)
	  return error_mark_node;

	fns = TREE_OPERAND (expr, 0);
	
2328 2329
	fn = instantiate_type (TREE_TYPE (TREE_TYPE (type)), 
			       fns, 0);
2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350
	
	if (fn == error_mark_node)
	  return error_mark_node;

	expr = build_unary_op (ADDR_EXPR, fn, 0);
	
	my_friendly_assert (comptypes (type, TREE_TYPE (expr), 1), 
			    0);
	return expr;
      }
      break;

    default:
      /* All non-type parameters must have one of these types.  */
      my_friendly_abort (0);
      break;
    }

  return error_mark_node;
}

2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426
/* Return 1 if PARM_PARMS and ARG_PARMS matches using rule for 
   template template parameters.  Both PARM_PARMS and ARG_PARMS are 
   vectors of TREE_LIST nodes containing TYPE_DECL, TEMPLATE_DECL 
   or PARM_DECL.
   
   ARG_PARMS may contain more parameters than PARM_PARMS.  If this is 
   the case, then extra parameters must have default arguments.

   Consider the example:
     template <class T, class Allocator = allocator> class vector;
     template<template <class U> class TT> class C;

   C<vector> is a valid instantiation.  PARM_PARMS for the above code 
   contains a TYPE_DECL (for U),  ARG_PARMS contains two TYPE_DECLs (for 
   T and Allocator) and OUTER_ARGS contains the argument that is used to 
   substitute the TT parameter.  */

static int
coerce_template_template_parms (parm_parms, arg_parms, in_decl, outer_args)
     tree parm_parms, arg_parms, in_decl, outer_args;
{
  int nparms, nargs, i;
  tree parm, arg;

  my_friendly_assert (TREE_CODE (parm_parms) == TREE_VEC, 0);
  my_friendly_assert (TREE_CODE (arg_parms) == TREE_VEC, 0);

  nparms = TREE_VEC_LENGTH (parm_parms);
  nargs = TREE_VEC_LENGTH (arg_parms);

  /* The rule here is opposite of coerce_template_parms.  */
  if (nargs < nparms
      || (nargs > nparms
	  && TREE_PURPOSE (TREE_VEC_ELT (arg_parms, nparms)) == NULL_TREE))
    return 0;

  for (i = 0; i < nparms; ++i)
    {
      parm = TREE_VALUE (TREE_VEC_ELT (parm_parms, i));
      arg = TREE_VALUE (TREE_VEC_ELT (arg_parms, i));

      if (arg == NULL_TREE || arg == error_mark_node
          || parm == NULL_TREE || parm == error_mark_node)
	return 0;

      if (TREE_CODE (arg) != TREE_CODE (parm))
        return 0;

      switch (TREE_CODE (parm))
	{
	case TYPE_DECL:
	  break;

	case TEMPLATE_DECL:
	  /* We encounter instantiations of templates like
	       template <template <template <class> class> class TT>
	       class C;  */
	  sorry ("nested template template parameter");
	  return 0;

	case PARM_DECL:
	  /* The tsubst call is used to handle cases such as
	       template <class T, template <T> class TT> class D;  
	     i.e. the parameter list of TT depends on earlier parameters.  */
	  if (!comptypes (tsubst (TREE_TYPE (parm), outer_args, in_decl), 
			  TREE_TYPE (arg), 1))
	    return 0;
	  break;
	  
	default:
	  my_friendly_abort (0);
	}
    }
  return 1;
}

mrs's avatar
mrs committed
2427 2428
/* Convert all template arguments to their appropriate types, and return
   a vector containing the resulting values.  If any error occurs, return
2429 2430 2431 2432 2433 2434 2435
   error_mark_node, and, if COMPLAIN is non-zero, issue an error message.
   Some error messages are issued even if COMPLAIN is zero; for
   instance, if a template argument is composed from a local class. 

   If REQUIRE_ALL_ARGUMENTS is non-zero, all arguments must be
   provided in ARGLIST, or else trailing parameters must have default
   values.  If REQUIRE_ALL_ARGUMENTS is zero, we will attempt argument
2436
   deduction for any unspecified trailing arguments.  */
2437
   
mrs's avatar
mrs committed
2438
static tree
2439 2440
coerce_template_parms (parms, arglist, in_decl,
		       complain,
2441
		       require_all_arguments)
mrs's avatar
mrs committed
2442 2443
     tree parms, arglist;
     tree in_decl;
2444 2445
     int complain;
     int require_all_arguments;
mrs's avatar
mrs committed
2446
{
mrs's avatar
mrs committed
2447
  int nparms, nargs, i, lost = 0;
2448
  tree vec = NULL_TREE;
mrs's avatar
mrs committed
2449

mrs's avatar
mrs committed
2450 2451 2452 2453
  if (arglist == NULL_TREE)
    nargs = 0;
  else if (TREE_CODE (arglist) == TREE_VEC)
    nargs = TREE_VEC_LENGTH (arglist);
mrs's avatar
mrs committed
2454
  else
mrs's avatar
mrs committed
2455 2456 2457 2458 2459 2460
    nargs = list_length (arglist);

  nparms = TREE_VEC_LENGTH (parms);

  if (nargs > nparms
      || (nargs < nparms
2461
	  && require_all_arguments
mrs's avatar
mrs committed
2462
	  && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
mrs's avatar
mrs committed
2463
    {
2464 2465 2466 2467 2468 2469 2470 2471 2472 2473
      if (complain) 
	{
	  error ("incorrect number of parameters (%d, should be %d)",
		 nargs, nparms);
	  
	  if (in_decl)
	    cp_error_at ("in template expansion for decl `%D'",
			 in_decl);
	}

mrs's avatar
mrs committed
2474 2475 2476
      return error_mark_node;
    }

2477 2478
  if (arglist && TREE_CODE (arglist) == TREE_VEC && nargs == nparms)
    vec = copy_node (arglist);
mrs's avatar
mrs committed
2479 2480 2481
  else
    {
      vec = make_tree_vec (nparms);
2482

mrs's avatar
mrs committed
2483 2484
      for (i = 0; i < nparms; i++)
	{
mrs's avatar
mrs committed
2485
	  tree arg;
2486
	  tree parm = TREE_VEC_ELT (parms, i);
mrs's avatar
mrs committed
2487

2488
	  if (arglist && TREE_CODE (arglist) == TREE_LIST)
mrs's avatar
mrs committed
2489 2490 2491 2492 2493 2494 2495 2496 2497
	    {
	      arg = arglist;
	      arglist = TREE_CHAIN (arglist);

	      if (arg == error_mark_node)
		lost++;
	      else
		arg = TREE_VALUE (arg);
	    }
2498
	  else if (i < nargs)
2499 2500 2501 2502 2503
	    {
	      arg = TREE_VEC_ELT (arglist, i);
	      if (arg == error_mark_node)
		lost++;
	    }
2504 2505 2506 2507 2508 2509
	  else if (TREE_PURPOSE (parm) == NULL_TREE)
	    {
	      my_friendly_assert (!require_all_arguments, 0);
	      break;
	    }
	  else if (TREE_CODE (TREE_VALUE (parm)) == TYPE_DECL)
2510
	    arg = tsubst (TREE_PURPOSE (parm), vec, in_decl);
mrs's avatar
mrs committed
2511
	  else
2512
	    arg = tsubst_expr (TREE_PURPOSE (parm), vec, in_decl);
mrs's avatar
mrs committed
2513

mrs's avatar
mrs committed
2514 2515 2516 2517 2518 2519
	  TREE_VEC_ELT (vec, i) = arg;
	}
    }
  for (i = 0; i < nparms; i++)
    {
      tree arg = TREE_VEC_ELT (vec, i);
mrs's avatar
mrs committed
2520
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
mrs's avatar
mrs committed
2521
      tree val = 0;
2522
      int is_type, requires_type, is_tmpl_type, requires_tmpl_type;
mrs's avatar
mrs committed
2523

2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537
      if (arg == NULL_TREE)
	/* We're out of arguments.  */
	{
	  my_friendly_assert (!require_all_arguments, 0);
	  break;
	}

      if (arg == error_mark_node)
	{
	  cp_error ("template argument %d is invalid", i + 1);
	  lost++;
	  continue;
	}

2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549
      if (TREE_CODE (arg) == TREE_LIST 
	  && TREE_TYPE (arg) != NULL_TREE
	  && TREE_CODE (TREE_TYPE (arg)) == OFFSET_TYPE)
	{  
	  /* The template argument was the name of some
	     member function.  That's usually
	     illegal, but static members are OK.  In any
	     case, grab the underlying fields/functions
	     and issue an error later if required.  */
	  arg = TREE_VALUE (arg);
	  TREE_TYPE (arg) = unknown_type_node;
	}
2550

2551 2552 2553 2554 2555
      requires_tmpl_type = TREE_CODE (parm) == TEMPLATE_DECL;
      requires_type = TREE_CODE (parm) == TYPE_DECL
		      || requires_tmpl_type;

      /* Check if it is a class template.  If REQUIRES_TMPL_TYPE is true,
2556 2557 2558 2559 2560
	 we also accept implicitly created TYPE_DECL as a valid argument.
         This is necessary to handle the case where we pass a template name
         to a template template parameter in a scope where we've derived from
         in instantiation of that template, so the template name refers to that
         instantiation.  We really ought to handle this better.  */
2561 2562 2563
      is_tmpl_type = (TREE_CODE (arg) == TEMPLATE_DECL
		      && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL)
		     || (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
2564 2565 2566 2567 2568
			 && !CLASSTYPE_TEMPLATE_INFO (arg))
		     || (TREE_CODE (arg) == RECORD_TYPE
		         && CLASSTYPE_TEMPLATE_INFO (arg)
		         && TREE_CODE (TYPE_NAME (arg)) == TYPE_DECL
			 && DECL_ARTIFICIAL (TYPE_NAME (arg))
2569 2570 2571 2572
			 && requires_tmpl_type
			 && current_class_type
			 /* FIXME what about nested types?  */
			 && get_binfo (arg, current_class_type, 0));
2573 2574
      if (is_tmpl_type && TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM)
	arg = TYPE_STUB_DECL (arg);
2575 2576
      else if (is_tmpl_type && TREE_CODE (arg) == RECORD_TYPE)
	arg = CLASSTYPE_TI_TEMPLATE (arg);
2577

2578
      is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't' || is_tmpl_type;
mrs's avatar
mrs committed
2579 2580 2581 2582 2583 2584

      if (requires_type && ! is_type && TREE_CODE (arg) == SCOPE_REF
	  && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM)
	{
	  cp_pedwarn ("to refer to a type member of a template parameter,");
	  cp_pedwarn ("  use `typename %E'", arg);
2585

mrs's avatar
mrs committed
2586 2587 2588 2589
	  arg = make_typename_type (TREE_OPERAND (arg, 0),
				    TREE_OPERAND (arg, 1));
	  is_type = 1;
	}
mrs's avatar
mrs committed
2590 2591 2592
      if (is_type != requires_type)
	{
	  if (in_decl)
mrs's avatar
mrs committed
2593
	    {
2594 2595 2596 2597 2598 2599
	      if (complain)
		{
		  cp_error ("type/value mismatch at argument %d in template parameter list for `%D'",
			    i + 1, in_decl);
		  if (is_type)
		    cp_error ("  expected a constant of type `%T', got `%T'",
2600 2601
			      TREE_TYPE (parm),
			      (is_tmpl_type ? DECL_NAME (arg) : arg));
2602 2603 2604
		  else
		    cp_error ("  expected a type, got `%E'", arg);
		}
mrs's avatar
mrs committed
2605
	    }
mrs's avatar
mrs committed
2606 2607 2608 2609
	  lost++;
	  TREE_VEC_ELT (vec, i) = error_mark_node;
	  continue;
	}
2610 2611
      if (is_tmpl_type ^ requires_tmpl_type)
	{
2612
	  if (in_decl && complain)
2613 2614
	    {
	      cp_error ("type/value mismatch at argument %d in template parameter list for `%D'",
2615
			i + 1, in_decl);
2616 2617 2618 2619 2620 2621 2622 2623 2624 2625
	      if (is_tmpl_type)
		cp_error ("  expected a type, got `%T'", DECL_NAME (arg));
	      else
		cp_error ("  expected a class template, got `%T'", arg);
	    }
	  lost++;
	  TREE_VEC_ELT (vec, i) = error_mark_node;
	  continue;
	}
        
mrs's avatar
mrs committed
2626
      if (is_type)
mrs's avatar
mrs committed
2627
	{
2628 2629 2630 2631 2632
	  if (requires_tmpl_type)
	    {
	      tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm);
	      tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg);

2633 2634 2635 2636
	      if (coerce_template_template_parms (parmparm, argparm, 
						  in_decl, vec))
		{
		  val = arg;
2637

2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654
		  /* TEMPLATE_TEMPLATE_PARM node is preferred over 
		     TEMPLATE_DECL.  */
		  if (val != error_mark_node 
		      && DECL_TEMPLATE_TEMPLATE_PARM_P (val))
		    val = TREE_TYPE (val);
		}
	      else
		{
		  if (in_decl && complain)
		    {
		      cp_error ("type/value mismatch at argument %d in template parameter list for `%D'",
				i + 1, in_decl);
		      cp_error ("  expected a template of type `%D', got `%D'", parm, arg);
		    }

		  val = error_mark_node;
		}
2655 2656
	    }
	  else
mrs's avatar
mrs committed
2657
	    {
2658 2659
	      val = groktypename (arg);
	      if (! processing_template_decl)
mrs's avatar
mrs committed
2660
		{
2661 2662 2663 2664 2665 2666 2667 2668 2669
		  tree t = target_type (val);
		  if (TREE_CODE (t) != TYPENAME_TYPE 
		      && IS_AGGR_TYPE (t)
		      && decl_function_context (TYPE_MAIN_DECL (t)))
		    {
		      cp_error ("type `%T' composed from a local class is not a valid template-argument",
				val);
		      return error_mark_node;
		    }
mrs's avatar
mrs committed
2670 2671 2672
		}
	    }
	}
mrs's avatar
mrs committed
2673 2674
      else
	{
2675
	  tree t = tsubst (TREE_TYPE (parm), vec, in_decl);
2676

2677
	  if (processing_template_decl)
2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690
	    arg = maybe_fold_nontype_arg (arg);

	  if (!uses_template_parms (arg) && !uses_template_parms (t))
	    /* We used to call digest_init here.  However, digest_init
	       will report errors, which we don't want when complain
	       is zero.  More importantly, digest_init will try too
	       hard to convert things: for example, `0' should not be
	       converted to pointer type at this point according to
	       the standard.  Accepting this is not merely an
	       extension, since deciding whether or not these
	       conversions can occur is part of determining which
	       function template to call, or whether a given epxlicit
	       argument specification is legal.  */
2691
	    val = convert_nontype_argument (t, arg);
mrs's avatar
mrs committed
2692
	  else
2693 2694
	    val = arg;

2695 2696 2697 2698 2699
	  if (val == NULL_TREE)
	    val = error_mark_node;
	  else if (val == error_mark_node && complain)
	    cp_error ("could not convert template argument `%E' to `%T'", 
		      arg, t);
mrs's avatar
mrs committed
2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711
	}

      if (val == error_mark_node)
	lost++;

      TREE_VEC_ELT (vec, i) = val;
    }
  if (lost)
    return error_mark_node;
  return vec;
}

jason's avatar
jason committed
2712 2713 2714
/* Renturns 1 iff the OLDARGS and NEWARGS are in fact identical sets
   of template arguments.  Returns 0 otherwise.  */

2715
int
mrs's avatar
mrs committed
2716 2717 2718 2719 2720
comp_template_args (oldargs, newargs)
     tree oldargs, newargs;
{
  int i;

2721 2722 2723
  if (TREE_VEC_LENGTH (oldargs) != TREE_VEC_LENGTH (newargs))
    return 0;

mrs's avatar
mrs committed
2724 2725 2726 2727 2728 2729 2730 2731 2732
  for (i = 0; i < TREE_VEC_LENGTH (oldargs); ++i)
    {
      tree nt = TREE_VEC_ELT (newargs, i);
      tree ot = TREE_VEC_ELT (oldargs, i);

      if (nt == ot)
	continue;
      if (TREE_CODE (nt) != TREE_CODE (ot))
	return 0;
2733 2734 2735 2736 2737 2738 2739
      if (TREE_CODE (nt) == TREE_VEC)
        {
          /* For member templates */
	  if (comp_template_args (nt, ot))
	    continue;
        }
      else if (TREE_CODE_CLASS (TREE_CODE (ot)) == 't')
mrs's avatar
mrs committed
2740 2741 2742 2743 2744
	{
	  if (comptypes (ot, nt, 1))
	    continue;
	}
      else if (cp_tree_equal (ot, nt) > 0)
mrs's avatar
mrs committed
2745 2746 2747 2748 2749 2750
	continue;
      return 0;
    }
  return 1;
}

mrs's avatar
mrs committed
2751 2752
/* Given class template name and parameter list, produce a user-friendly name
   for the instantiation.  */
mrs's avatar
mrs committed
2753

mrs's avatar
mrs committed
2754
static char *
2755
mangle_class_name_for_template (name, parms, arglist, ctx)
mrs's avatar
mrs committed
2756 2757
     char *name;
     tree parms, arglist;
2758
     tree ctx;
mrs's avatar
mrs committed
2759 2760 2761 2762 2763 2764
{
  static struct obstack scratch_obstack;
  static char *scratch_firstobj;
  int i, nparms;

  if (!scratch_firstobj)
mrs's avatar
mrs committed
2765
    gcc_obstack_init (&scratch_obstack);
mrs's avatar
mrs committed
2766 2767
  else
    obstack_free (&scratch_obstack, scratch_firstobj);
mrs's avatar
mrs committed
2768
  scratch_firstobj = obstack_alloc (&scratch_obstack, 1);
mrs's avatar
mrs committed
2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782

#if 0
#define buflen	sizeof(buf)
#define check	if (bufp >= buf+buflen-1) goto too_long
#define ccat(c) *bufp++=(c); check
#define advance	bufp+=strlen(bufp); check
#define cat(s)	strncpy(bufp, s, buf+buflen-bufp-1); advance
#else
#define check
#define ccat(c)	obstack_1grow (&scratch_obstack, (c));
#define advance
#define cat(s)	obstack_grow (&scratch_obstack, (s), strlen (s))
#endif

jason's avatar
jason committed
2783
  if (ctx && ctx != global_namespace)
2784
    {
2785 2786 2787
      char* s;

      if (TREE_CODE (ctx) == FUNCTION_DECL)
2788
	s = fndecl_as_string (ctx, 0);
2789
      else if (TREE_CODE_CLASS (TREE_CODE (ctx)) == 't')
2790
	s = type_as_string_real (ctx, 0, 1);
jason's avatar
jason committed
2791 2792
      else if (TREE_CODE (ctx) == NAMESPACE_DECL)
	s = decl_as_string (ctx, 0);
2793 2794
      else
	my_friendly_abort (0);
2795 2796 2797
      cat (s);
      cat ("::");
    }
mrs's avatar
mrs committed
2798 2799 2800 2801 2802 2803
  cat (name);
  ccat ('<');
  nparms = TREE_VEC_LENGTH (parms);
  my_friendly_assert (nparms == TREE_VEC_LENGTH (arglist), 268);
  for (i = 0; i < nparms; i++)
    {
mrs's avatar
mrs committed
2804 2805
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
      tree arg = TREE_VEC_ELT (arglist, i);
mrs's avatar
mrs committed
2806 2807 2808 2809

      if (i)
	ccat (',');

mrs's avatar
mrs committed
2810
      if (TREE_CODE (parm) == TYPE_DECL)
mrs's avatar
mrs committed
2811
	{
2812
	  cat (type_as_string_real (arg, 0, 1));
mrs's avatar
mrs committed
2813 2814
	  continue;
	}
2815 2816 2817
      else if (TREE_CODE (parm) == TEMPLATE_DECL)
	{
	  if (TREE_CODE (arg) == TEMPLATE_DECL)
jason's avatar
jason committed
2818 2819 2820
	    {
	      /* Already substituted with real template.  Just output 
		 the template name here */
2821 2822
              tree context = DECL_CONTEXT (arg);
	      if (context)
jason's avatar
jason committed
2823
		{
2824
                  my_friendly_assert (TREE_CODE (context) == NAMESPACE_DECL, 980422);
jason's avatar
jason committed
2825 2826 2827 2828 2829
		  cat(decl_as_string (DECL_CONTEXT (arg), 0));
		  cat("::");
		}
	      cat (IDENTIFIER_POINTER (DECL_NAME (arg)));
	    }
2830 2831
	  else
	    /* Output the parameter declaration */
2832
	    cat (type_as_string_real (arg, 0, 1));
2833 2834
	  continue;
	}
mrs's avatar
mrs committed
2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863
      else
	my_friendly_assert (TREE_CODE (parm) == PARM_DECL, 269);

      if (TREE_CODE (arg) == TREE_LIST)
	{
	  /* New list cell was built because old chain link was in
	     use.  */
	  my_friendly_assert (TREE_PURPOSE (arg) == NULL_TREE, 270);
	  arg = TREE_VALUE (arg);
	}
      /* No need to check arglist against parmlist here; we did that
	 in coerce_template_parms, called from lookup_template_class.  */
      cat (expr_as_string (arg, 0));
    }
  {
    char *bufp = obstack_next_free (&scratch_obstack);
    int offset = 0;
    while (bufp[offset - 1] == ' ')
      offset--;
    obstack_blank_fast (&scratch_obstack, offset);

    /* B<C<char> >, not B<C<char>> */
    if (bufp[offset - 1] == '>')
      ccat (' ');
  }
  ccat ('>');
  ccat ('\0');
  return (char *) obstack_base (&scratch_obstack);

mrs's avatar
mrs committed
2864
#if 0
mrs's avatar
mrs committed
2865
 too_long:
mrs's avatar
mrs committed
2866
#endif
mrs's avatar
mrs committed
2867 2868 2869 2870 2871
  fatal ("out of (preallocated) string space creating template instantiation name");
  /* NOTREACHED */
  return NULL;
}

mrs's avatar
mrs committed
2872
static tree
mrs's avatar
mrs committed
2873 2874 2875 2876 2877 2878 2879
classtype_mangled_name (t)
     tree t;
{
  if (CLASSTYPE_TEMPLATE_INFO (t)
      && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)))
    {
      tree name = DECL_NAME (CLASSTYPE_TI_TEMPLATE (t));
2880 2881 2882 2883 2884 2885 2886 2887 2888
      /* We do not pass in the context here since that is only needed
	 when mangling the name of instantiations, not the primary
	 template declaration.  In reality, it should not be needed
	 then either, but the way lookup_template_class operates
	 requires the context for the moment.  In the long run,
	 lookup_template_class should not be looking for existing
	 instantiations by matching mangled names, but rather by
	 matching the templates, and then scanning the instantiation
	 list.  */
mrs's avatar
mrs committed
2889 2890
      char *mangled_name = mangle_class_name_for_template
	(IDENTIFIER_POINTER (name),
2891
	 DECL_INNERMOST_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (t)),
2892
	 CLASSTYPE_TI_ARGS (t), NULL_TREE);
mrs's avatar
mrs committed
2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904
      tree id = get_identifier (mangled_name);
      IDENTIFIER_TEMPLATE (id) = name;
      return id;
    }
  else
    return TYPE_IDENTIFIER (t);
}

static void
add_pending_template (d)
     tree d;
{
mrs's avatar
mrs committed
2905 2906 2907 2908 2909 2910 2911
  tree ti;

  if (TREE_CODE_CLASS (TREE_CODE (d)) == 't')
    ti = CLASSTYPE_TEMPLATE_INFO (d);
  else
    ti = DECL_TEMPLATE_INFO (d);

mrs's avatar
mrs committed
2912
  if (TI_PENDING_TEMPLATE_FLAG (ti))
mrs's avatar
mrs committed
2913 2914 2915
    return;

  *template_tail = perm_tree_cons
jason's avatar
jason committed
2916
    (build_srcloc_here (), d, NULL_TREE);
mrs's avatar
mrs committed
2917
  template_tail = &TREE_CHAIN (*template_tail);
mrs's avatar
mrs committed
2918
  TI_PENDING_TEMPLATE_FLAG (ti) = 1;
mrs's avatar
mrs committed
2919 2920
}

2921 2922 2923 2924 2925 2926 2927 2928 2929

/* Return a TEMPLATE_ID_EXPR corresponding to the indicated FNS (which
   may be either a _DECL or an overloaded function or an
   IDENTIFIER_NODE), and ARGLIST.  */

tree
lookup_template_function (fns, arglist)
     tree fns, arglist;
{
jason's avatar
jason committed
2930
  tree type;
2931

2932 2933 2934 2935 2936 2937 2938
  if (fns == NULL_TREE)
    {
      cp_error ("non-template used as template");
      return error_mark_node;
    }

  if (arglist != NULL_TREE && !TREE_PERMANENT (arglist))
2939
    copy_to_permanent (arglist);
2940

jason's avatar
jason committed
2941 2942 2943 2944 2945
  type = TREE_TYPE (fns);
  if (TREE_CODE (fns) == OVERLOAD || !type)
    type = unknown_type_node;

  return build_min (TEMPLATE_ID_EXPR, type, fns, arglist);  
2946 2947
}

2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964
/* Within the scope of a template class S<T>, the name S gets bound
   (in build_self_reference) to a TYPE_DECL for the class, not a
   TEMPLATE_DECL.  If DECL is a TYPE_DECL for current_class_type,
   or one of its enclosing classes, and that type is a template,
   return the associated TEMPLATE_DECL.  Otherwise, the original
   DECL is returned.  */

tree
maybe_get_template_decl_from_type_decl (decl)
     tree decl;
{
  return (decl != NULL_TREE
	  && TREE_CODE (decl) == TYPE_DECL 
	  && DECL_ARTIFICIAL (decl)
	  && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (decl))) 
    ? CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl)) : decl;
}
2965

mrs's avatar
mrs committed
2966 2967 2968 2969 2970 2971 2972 2973
/* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of
   parameters, find the desired type.

   D1 is the PTYPENAME terminal, and ARGLIST is the list of arguments.
   Since ARGLIST is build on the decl_obstack, we must copy it here
   to keep it from being reclaimed when the decl storage is reclaimed.

   IN_DECL, if non-NULL, is the template declaration we are trying to
2974 2975 2976 2977 2978
   instantiate.  

   If the template class is really a local class in a template
   function, then the FUNCTION_CONTEXT is the function in which it is
   being instantiated.  */
mrs's avatar
mrs committed
2979

mrs's avatar
mrs committed
2980
tree
2981
lookup_template_class (d1, arglist, in_decl, context)
mrs's avatar
mrs committed
2982 2983
     tree d1, arglist;
     tree in_decl;
2984
     tree context;
mrs's avatar
mrs committed
2985
{
2986
  tree template = NULL_TREE, parmlist;
mrs's avatar
mrs committed
2987
  char *mangled_name;
2988
  tree id, t;
mrs's avatar
mrs committed
2989 2990 2991

  if (TREE_CODE (d1) == IDENTIFIER_NODE)
    {
2992 2993 2994 2995 2996
      if (IDENTIFIER_LOCAL_VALUE (d1) 
	  && DECL_TEMPLATE_TEMPLATE_PARM_P (IDENTIFIER_LOCAL_VALUE (d1)))
	template = IDENTIFIER_LOCAL_VALUE (d1);
      else
	{
jason's avatar
jason committed
2997 2998
	  if (context)
	    push_decl_namespace (context);
2999 3000 3001 3002
	  if (current_class_type != NULL_TREE)
	    template = 
	      maybe_get_template_decl_from_type_decl
	      (IDENTIFIER_CLASS_VALUE (d1));
3003
	  if (template == NULL_TREE)
jason's avatar
jason committed
3004 3005 3006
	    template = lookup_name_nonclass (d1);
	  if (context)
	    pop_decl_namespace ();
3007
	}
3008 3009
      if (template)
	context = DECL_CONTEXT (template);
mrs's avatar
mrs committed
3010
    }
mrs's avatar
mrs committed
3011 3012
  else if (TREE_CODE (d1) == TYPE_DECL && IS_AGGR_TYPE (TREE_TYPE (d1)))
    {
3013 3014
      if (CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (d1)) == NULL_TREE)
	return error_mark_node;
mrs's avatar
mrs committed
3015 3016 3017
      template = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (d1));
      d1 = DECL_NAME (template);
    }
mrs's avatar
mrs committed
3018 3019 3020 3021 3022
  else if (TREE_CODE_CLASS (TREE_CODE (d1)) == 't' && IS_AGGR_TYPE (d1))
    {
      template = CLASSTYPE_TI_TEMPLATE (d1);
      d1 = DECL_NAME (template);
    }
3023 3024 3025 3026 3027 3028 3029
  else if (TREE_CODE (d1) == TEMPLATE_DECL
	   && TREE_CODE (DECL_RESULT (d1)) == TYPE_DECL)
    {
      template = d1;
      d1 = DECL_NAME (template);
      context = DECL_CONTEXT (template);
    }
mrs's avatar
mrs committed
3030 3031
  else
    my_friendly_abort (272);
mrs's avatar
mrs committed
3032 3033 3034 3035 3036 3037 3038

  /* With something like `template <class T> class X class X { ... };'
     we could end up with D1 having nothing but an IDENTIFIER_LOCAL_VALUE.
     We don't want to do that, but we have to deal with the situation, so
     let's give them some syntax errors to chew on instead of a crash.  */
  if (! template)
    return error_mark_node;
jason's avatar
jason committed
3039

3040 3041
  if (context == NULL_TREE)
    context = global_namespace;
jason's avatar
jason committed
3042

mrs's avatar
mrs committed
3043 3044 3045 3046 3047 3048 3049 3050
  if (TREE_CODE (template) != TEMPLATE_DECL)
    {
      cp_error ("non-template type `%T' used as a template", d1);
      if (in_decl)
	cp_error_at ("for template declaration `%D'", in_decl);
      return error_mark_node;
    }

3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062
  if (DECL_TEMPLATE_TEMPLATE_PARM_P (template))
    {
      /* Create a new TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM node to store
         template arguments */

      tree parm = copy_template_template_parm (TREE_TYPE (template));
      tree template2 = TYPE_STUB_DECL (parm);
      tree arglist2;

      CLASSTYPE_GOT_SEMICOLON (parm) = 1;
      parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template);

3063
      arglist2 = coerce_template_parms (parmlist, arglist, template, 1, 1);
3064 3065 3066 3067 3068 3069 3070 3071 3072
      if (arglist2 == error_mark_node)
	return error_mark_node;

      arglist2 = copy_to_permanent (arglist2);
      CLASSTYPE_TEMPLATE_INFO (parm)
	= perm_tree_cons (template2, arglist2, NULL_TREE);
      TYPE_SIZE (parm) = 0;
      return parm;
    }
3073 3074 3075
  else if (PRIMARY_TEMPLATE_P (template)
	   || (TREE_CODE (TYPE_CONTEXT (TREE_TYPE (template))) 
	       == FUNCTION_DECL))
mrs's avatar
mrs committed
3076
    {
3077 3078
      tree arglist_for_mangling;

3079
      parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template);
mrs's avatar
mrs committed
3080

3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098
      if (/* ARGLIST can be NULL_TREE if there are default arguments.  */
	  arglist != NULL_TREE
	  && TREE_CODE (arglist) == TREE_VEC 
	  && TREE_VEC_LENGTH (arglist) > 1
	  && list_length (DECL_TEMPLATE_PARMS (template)) > 1)
	{
	  /* We have multiple levels of arguments to coerce, at once.  */
	  tree new_args = 
	    make_tree_vec (list_length (DECL_TEMPLATE_PARMS (template)));
	  int i;
	  
	  for (i = TREE_VEC_LENGTH (arglist) - 1, 
		 t = DECL_TEMPLATE_PARMS (template); 
	       i >= 0 && t != NULL_TREE;
	       --i, t = TREE_CHAIN (t))
	    TREE_VEC_ELT (new_args, i) =
	      coerce_template_parms (TREE_VALUE (t),
				     TREE_VEC_ELT (arglist, i),
3099
				     template, 1, 1);
3100 3101 3102 3103 3104
	  arglist = new_args;
	}
      else
	arglist = coerce_template_parms (parmlist, 
					 innermost_args (arglist, 0),
3105
					 template, 1, 1);
3106
     if (arglist == error_mark_node)
mrs's avatar
mrs committed
3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134
	return error_mark_node;
      if (uses_template_parms (arglist))
	{
	  tree found;
	  if (comp_template_args
	      (CLASSTYPE_TI_ARGS (TREE_TYPE (template)), arglist))
	    found = TREE_TYPE (template);
	  else
	    {
	      for (found = DECL_TEMPLATE_INSTANTIATIONS (template);
		   found; found = TREE_CHAIN (found))
		{
		  if (TI_USES_TEMPLATE_PARMS (found)
		      && comp_template_args (TREE_PURPOSE (found), arglist))
		    break;
		}
	      if (found)
		found = TREE_VALUE (found);
	    }

	  if (found)
	    {
	      if (can_free (&permanent_obstack, arglist))
		obstack_free (&permanent_obstack, arglist);
	      return found;
	    }
	}

3135 3136 3137 3138 3139
      if (TREE_CODE (arglist) == TREE_VEC)
	arglist_for_mangling = innermost_args (arglist, 0);
      else
	arglist_for_mangling = arglist;

3140
      /* FIXME avoid duplication.  */
mrs's avatar
mrs committed
3141
      mangled_name = mangle_class_name_for_template (IDENTIFIER_POINTER (d1),
3142
						     parmlist,
3143
						     arglist_for_mangling,
3144
						     context);
mrs's avatar
mrs committed
3145
      id = get_identifier (mangled_name);
mrs's avatar
mrs committed
3146
      IDENTIFIER_TEMPLATE (id) = d1;
mrs's avatar
mrs committed
3147

mrs's avatar
mrs committed
3148
      maybe_push_to_top_level (uses_template_parms (arglist));
mrs's avatar
mrs committed
3149
      t = xref_tag_from_type (TREE_TYPE (template), id, 1);
3150

3151
      if (context != NULL_TREE)
3152 3153 3154 3155 3156 3157
	{
	  /* Set up the context for the type_decl correctly.  Note
	     that we must clear DECL_ASSEMBLER_NAME to fool
	     build_overload_name into creating a new name.  */
	  tree type_decl = TYPE_STUB_DECL (t);

3158 3159
	  TYPE_CONTEXT (t) = FROB_CONTEXT (context);
	  DECL_CONTEXT (type_decl) = FROB_CONTEXT (context);
3160 3161 3162 3163 3164
	  DECL_ASSEMBLER_NAME (type_decl) = DECL_NAME (type_decl);
	  DECL_ASSEMBLER_NAME (type_decl) = 
	    get_identifier (build_overload_name (t, 1, 1));
	}

mrs's avatar
mrs committed
3165
      pop_from_top_level ();
mrs's avatar
mrs committed
3166
    }
mrs's avatar
mrs committed
3167
  else
mrs's avatar
mrs committed
3168
    {
3169
      tree type_ctx = TYPE_CONTEXT (TREE_TYPE (template));
3170
      tree args = tsubst (CLASSTYPE_TI_ARGS (type_ctx), arglist, in_decl);
3171 3172
      tree ctx = lookup_template_class (type_ctx, args,
					in_decl, NULL_TREE);
mrs's avatar
mrs committed
3173 3174
      id = d1;
      arglist = CLASSTYPE_TI_ARGS (ctx);
mrs's avatar
mrs committed
3175

mrs's avatar
mrs committed
3176
      if (TYPE_BEING_DEFINED (ctx) && ctx == current_class_type)
mrs's avatar
mrs committed
3177
	{
mrs's avatar
mrs committed
3178 3179
	  int save_temp = processing_template_decl;
	  processing_template_decl = 0;
mrs's avatar
mrs committed
3180
	  t = xref_tag_from_type (TREE_TYPE (template), id, 0);
mrs's avatar
mrs committed
3181
	  processing_template_decl = save_temp;
mrs's avatar
mrs committed
3182 3183 3184
	}
      else
	{
mrs's avatar
mrs committed
3185 3186
	  t = lookup_nested_type_by_name (ctx, id);
	  my_friendly_assert (t != NULL_TREE, 42);
mrs's avatar
mrs committed
3187
	}
mrs's avatar
mrs committed
3188 3189
    }

mrs's avatar
mrs committed
3190
  /* Seems to be wanted.  */
mrs's avatar
mrs committed
3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204
  CLASSTYPE_GOT_SEMICOLON (t) = 1;

  if (! CLASSTYPE_TEMPLATE_INFO (t))
    {
      arglist = copy_to_permanent (arglist);
      CLASSTYPE_TEMPLATE_INFO (t)
	= perm_tree_cons (template, arglist, NULL_TREE);
      DECL_TEMPLATE_INSTANTIATIONS (template) = perm_tree_cons
	(arglist, t, DECL_TEMPLATE_INSTANTIATIONS (template));
      TI_USES_TEMPLATE_PARMS (DECL_TEMPLATE_INSTANTIATIONS (template))
	= uses_template_parms (arglist);

      SET_CLASSTYPE_IMPLICIT_INSTANTIATION (t);

mrs's avatar
mrs committed
3205
      /* We need to set this again after CLASSTYPE_TEMPLATE_INFO is set up.  */
mrs's avatar
mrs committed
3206
      DECL_ASSEMBLER_NAME (TYPE_MAIN_DECL (t)) = id;
mmitchel's avatar
 
mmitchel committed
3207
      if (! uses_template_parms (arglist))
mrs's avatar
mrs committed
3208 3209 3210 3211 3212 3213
	DECL_ASSEMBLER_NAME (TYPE_MAIN_DECL (t)) 
	  = get_identifier (build_overload_name (t, 1, 1));

      if (flag_external_templates && ! uses_template_parms (arglist)
	  && CLASSTYPE_INTERFACE_KNOWN (TREE_TYPE (template))
	  && ! CLASSTYPE_INTERFACE_ONLY (TREE_TYPE (template)))
mrs's avatar
mrs committed
3214
	add_pending_template (t);
3215 3216 3217 3218 3219

      if (uses_template_parms (arglist))
	/* If the type makes use of template parameters, the
	   code that generates debugging information will crash.  */
	DECL_IGNORED_P (TYPE_STUB_DECL (t)) = 1;
mrs's avatar
mrs committed
3220 3221
    }

mrs's avatar
mrs committed
3222
  return t;
mrs's avatar
mrs committed
3223 3224
}

mrs's avatar
mrs committed
3225
/* Should be defined in parse.h.  */
mrs's avatar
mrs committed
3226 3227
extern int yychar;

3228 3229 3230 3231 3232 3233 3234 3235
/* For each TEMPLATE_TYPE_PARM, TEMPLATE_TEMPLATE_PARM, or
   TEMPLATE_PARM_INDEX in T, call FN with the parameter and the DATA.
   If FN returns non-zero, the iteration is terminated, and
   for_each_template_parm returns 1.  Otherwise, the iteration
   continues.  If FN never returns a non-zero value, the value
   returned by for_each_template_parm is 0.  If FN is NULL, it is
   considered to be the function which always returns 1.  */

mrs's avatar
mrs committed
3236
int
3237
for_each_template_parm (t, fn, data)
mrs's avatar
mrs committed
3238
     tree t;
3239 3240
     tree_fn_t fn;
     void* data;
mrs's avatar
mrs committed
3241 3242 3243
{
  if (!t)
    return 0;
3244 3245 3246 3247 3248

  if (TREE_CODE_CLASS (TREE_CODE (t)) == 't'
      && for_each_template_parm (TYPE_CONTEXT (t), fn, data))
    return 1;

mrs's avatar
mrs committed
3249 3250 3251 3252 3253 3254 3255
  switch (TREE_CODE (t))
    {
    case INDIRECT_REF:
    case COMPONENT_REF:
      /* We assume that the object must be instantiated in order to build
	 the COMPONENT_REF, so we test only whether the type of the
	 COMPONENT_REF uses template parms.  */
3256
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3257 3258 3259 3260

    case IDENTIFIER_NODE:
      if (!IDENTIFIER_TEMPLATE (t))
	return 0;
mrs's avatar
mrs committed
3261
      my_friendly_abort (42);
mrs's avatar
mrs committed
3262 3263 3264 3265 3266 3267

      /* aggregates of tree nodes */
    case TREE_VEC:
      {
	int i = TREE_VEC_LENGTH (t);
	while (i--)
3268
	  if (for_each_template_parm (TREE_VEC_ELT (t, i), fn, data))
mrs's avatar
mrs committed
3269 3270 3271 3272
	    return 1;
	return 0;
      }
    case TREE_LIST:
3273 3274
      if (for_each_template_parm (TREE_PURPOSE (t), fn, data)
	  || for_each_template_parm (TREE_VALUE (t), fn, data))
mrs's avatar
mrs committed
3275
	return 1;
3276
      return for_each_template_parm (TREE_CHAIN (t), fn, data);
mrs's avatar
mrs committed
3277

jason's avatar
jason committed
3278 3279 3280 3281 3282
    case OVERLOAD:
      if (for_each_template_parm (OVL_FUNCTION (t), fn, data))
	return 1;
      return for_each_template_parm (OVL_CHAIN (t), fn, data);

mrs's avatar
mrs committed
3283 3284 3285
      /* constructed type nodes */
    case POINTER_TYPE:
    case REFERENCE_TYPE:
3286
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3287
    case RECORD_TYPE:
mrs's avatar
mrs committed
3288
      if (TYPE_PTRMEMFUNC_FLAG (t))
3289 3290
	return for_each_template_parm (TYPE_PTRMEMFUNC_FN_TYPE (t),
				       fn, data);
mrs's avatar
mrs committed
3291
    case UNION_TYPE:
mrs's avatar
mrs committed
3292
      if (! CLASSTYPE_TEMPLATE_INFO (t))
mrs's avatar
mrs committed
3293
	return 0;
3294 3295 3296
      return for_each_template_parm (TREE_VALUE
				     (CLASSTYPE_TEMPLATE_INFO (t)),
				     fn, data);
mrs's avatar
mrs committed
3297
    case FUNCTION_TYPE:
3298
      if (for_each_template_parm (TYPE_ARG_TYPES (t), fn, data))
mrs's avatar
mrs committed
3299
	return 1;
3300
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3301
    case ARRAY_TYPE:
3302
      if (for_each_template_parm (TYPE_DOMAIN (t), fn, data))
mrs's avatar
mrs committed
3303
	return 1;
3304
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3305
    case OFFSET_TYPE:
3306
      if (for_each_template_parm (TYPE_OFFSET_BASETYPE (t), fn, data))
mrs's avatar
mrs committed
3307
	return 1;
3308
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3309
    case METHOD_TYPE:
3310
      if (for_each_template_parm (TYPE_METHOD_BASETYPE (t), fn, data))
mrs's avatar
mrs committed
3311
	return 1;
3312
      if (for_each_template_parm (TYPE_ARG_TYPES (t), fn, data))
mrs's avatar
mrs committed
3313
	return 1;
3314
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3315 3316 3317

      /* decl nodes */
    case TYPE_DECL:
3318
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3319

3320 3321 3322
    case TEMPLATE_DECL:
      /* A template template parameter is encountered */
      if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
3323 3324
	return for_each_template_parm (TREE_TYPE (t), fn, data);
      /* Already substituted template template parameter */
3325 3326
      return 0;
      
3327
    case CONST_DECL:
3328
      if (for_each_template_parm (DECL_INITIAL (t), fn, data))
3329 3330 3331
	return 1;
      goto check_type_and_context;

mrs's avatar
mrs committed
3332
    case FUNCTION_DECL:
mrs's avatar
mrs committed
3333 3334 3335
    case VAR_DECL:
      /* ??? What about FIELD_DECLs?  */
      if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
3336
	  && for_each_template_parm (DECL_TI_ARGS (t), fn, data))
mrs's avatar
mrs committed
3337 3338 3339
	return 1;
      /* fall through */
    case PARM_DECL:
3340
    check_type_and_context:
3341
      if (for_each_template_parm (TREE_TYPE (t), fn, data))
mrs's avatar
mrs committed
3342
	return 1;
3343 3344
      if (DECL_CONTEXT (t) 
	  && for_each_template_parm (DECL_CONTEXT (t), fn, data))
mrs's avatar
mrs committed
3345 3346 3347 3348
	return 1;
      return 0;

    case CALL_EXPR:
3349
      return for_each_template_parm (TREE_TYPE (t), fn, data);
mrs's avatar
mrs committed
3350
    case ADDR_EXPR:
3351
      return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
mrs's avatar
mrs committed
3352 3353

      /* template parm nodes */
3354
    case TEMPLATE_TEMPLATE_PARM:
3355 3356 3357 3358 3359
      /* Record template parameters such as `T' inside `TT<T>'.  */
      if (CLASSTYPE_TEMPLATE_INFO (t)
	  && for_each_template_parm (CLASSTYPE_TI_ARGS (t), fn, data))
	return 1;
    case TEMPLATE_TYPE_PARM:
jason's avatar
jason committed
3360
    case TEMPLATE_PARM_INDEX:
3361 3362 3363 3364
      if (fn)
	return (*fn)(t, data);
      else
	return 1;
mrs's avatar
mrs committed
3365 3366 3367

      /* simple type nodes */
    case INTEGER_TYPE:
3368
      if (for_each_template_parm (TYPE_MIN_VALUE (t), fn, data))
mrs's avatar
mrs committed
3369
	return 1;
3370
      return for_each_template_parm (TYPE_MAX_VALUE (t), fn, data);
mrs's avatar
mrs committed
3371 3372

    case REAL_TYPE:
mrs's avatar
mrs committed
3373
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
3374
    case VOID_TYPE:
mrs's avatar
mrs committed
3375
    case BOOLEAN_TYPE:
jason's avatar
jason committed
3376
    case NAMESPACE_DECL:
mrs's avatar
mrs committed
3377 3378
      return 0;

3379 3380 3381 3382 3383
    case ENUMERAL_TYPE:
      {
	tree v;

	for (v = TYPE_VALUES (t); v != NULL_TREE; v = TREE_CHAIN (v))
3384
	  if (for_each_template_parm (TREE_VALUE (v), fn, data))
3385 3386 3387 3388
	    return 1;
      }
      return 0;

mrs's avatar
mrs committed
3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400
      /* constants */
    case INTEGER_CST:
    case REAL_CST:
    case STRING_CST:
      return 0;

    case ERROR_MARK:
      /* Non-error_mark_node ERROR_MARKs are bad things.  */
      my_friendly_assert (t == error_mark_node, 274);
      /* NOTREACHED */
      return 0;

mrs's avatar
mrs committed
3401
    case LOOKUP_EXPR:
mrs's avatar
mrs committed
3402
    case TYPENAME_TYPE:
mrs's avatar
mrs committed
3403 3404
      return 1;

mrs's avatar
mrs committed
3405
    case SCOPE_REF:
3406
      return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
mrs's avatar
mrs committed
3407

mrs's avatar
mrs committed
3408 3409
    case CONSTRUCTOR:
      if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
3410 3411 3412
	return for_each_template_parm (TYPE_PTRMEMFUNC_FN_TYPE
				       (TREE_TYPE (t)), fn, data);
      return for_each_template_parm (TREE_OPERAND (t, 1), fn, data);
mrs's avatar
mrs committed
3413

brendan's avatar
brendan committed
3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424
    case MODOP_EXPR:
    case CAST_EXPR:
    case REINTERPRET_CAST_EXPR:
    case CONST_CAST_EXPR:
    case STATIC_CAST_EXPR:
    case DYNAMIC_CAST_EXPR:
    case ARROW_EXPR:
    case DOTSTAR_EXPR:
    case TYPEID_EXPR:
      return 1;

3425 3426
    case SIZEOF_EXPR:
    case ALIGNOF_EXPR:
3427
      return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
3428

mrs's avatar
mrs committed
3429 3430 3431 3432 3433
    default:
      switch (TREE_CODE_CLASS (TREE_CODE (t)))
	{
	case '1':
	case '2':
mrs's avatar
mrs committed
3434
	case 'e':
mrs's avatar
mrs committed
3435 3436 3437
	case '<':
	  {
	    int i;
3438
	    for (i = first_rtl_op (TREE_CODE (t)); --i >= 0;)
3439
	      if (for_each_template_parm (TREE_OPERAND (t, i), fn, data))
mrs's avatar
mrs committed
3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453
		return 1;
	    return 0;
	  }
	default:
	  break;
	}
      sorry ("testing %s for template parms",
	     tree_code_name [(int) TREE_CODE (t)]);
      my_friendly_abort (82);
      /* NOTREACHED */
      return 0;
    }
}

3454 3455 3456 3457 3458 3459 3460
int
uses_template_parms (t)
     tree t;
{
  return for_each_template_parm (t, 0, 0);
}

3461 3462 3463
static struct tinst_level *current_tinst_level;
static struct tinst_level *free_tinst_level;
static int tinst_depth;
mrs's avatar
mrs committed
3464
extern int max_tinst_depth;
mrs's avatar
mrs committed
3465
#ifdef GATHER_STATISTICS
3466
int depth_reached;
mrs's avatar
mrs committed
3467
#endif
3468 3469
int tinst_level_tick;
int last_template_error_tick;
mrs's avatar
mrs committed
3470

3471
/* Print out all the template instantiations that we are currently
3472 3473
   working on.  If ERR, we are being called from cp_thing, so do
   the right thing for an error message.  */
3474

3475 3476 3477
static void
print_template_context (err)
     int err;
3478 3479 3480 3481 3482
{
  struct tinst_level *p = current_tinst_level;
  int line = lineno;
  char *file = input_filename;

3483 3484 3485 3486 3487
  if (err)
    {
      if (current_function_decl == p->decl)
	/* Avoid redundancy with the the "In function" line.  */;
      else if (current_function_decl == NULL_TREE)
jason's avatar
jason committed
3488 3489
	fprintf (stderr, "%s: In instantiation of `%s':\n",
		 file, decl_as_string (p->decl, 0));
3490 3491 3492 3493 3494
      else
	my_friendly_abort (980521);

      if (p)
	{
3495 3496
	  line = p->line;
	  file = p->file;
3497 3498 3499 3500 3501
	  p = p->next;
	}
    }

 next:
3502 3503
  for (; p; p = p->next)
    {
3504 3505 3506 3507
      fprintf (stderr, "%s:%d:   instantiated from `%s'\n", file, line,
	       decl_as_string (p->decl, 0));
      line = p->line;
      file = p->file;
3508
    }
3509
  fprintf (stderr, "%s:%d:   instantiated from here\n", file, line);
3510 3511
}

3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524
/* Called from cp_thing to print the template context for an error.  */

void
maybe_print_template_context ()
{
  if (last_template_error_tick == tinst_level_tick
      || current_tinst_level == 0)
    return;

  last_template_error_tick = tinst_level_tick;
  print_template_context (1);
}

mrs's avatar
mrs committed
3525
static int
mrs's avatar
mrs committed
3526 3527
push_tinst_level (d)
     tree d;
mrs's avatar
mrs committed
3528 3529 3530
{
  struct tinst_level *new;

mrs's avatar
mrs committed
3531 3532
  if (tinst_depth >= max_tinst_depth)
    {
3533 3534 3535 3536 3537 3538
      /* If the instantiation in question still has unbound template parms,
	 we don't really care if we can't instantiate it, so just return.
         This happens with base instantiation for implicit `typename'.  */
      if (uses_template_parms (d))
	return 0;

jason's avatar
jason committed
3539
      last_template_error_tick = tinst_level_tick;
mrs's avatar
mrs committed
3540 3541
      error ("template instantiation depth exceeds maximum of %d",
	     max_tinst_depth);
mrs's avatar
mrs committed
3542
      error (" (use -ftemplate-depth-NN to increase the maximum)");
mrs's avatar
mrs committed
3543 3544
      cp_error ("  instantiating `%D'", d);

3545
      print_template_context (0);
mrs's avatar
mrs committed
3546

mrs's avatar
mrs committed
3547 3548 3549
      return 0;
    }

mrs's avatar
mrs committed
3550 3551 3552 3553 3554 3555 3556 3557
  if (free_tinst_level)
    {
      new = free_tinst_level;
      free_tinst_level = new->next;
    }
  else
    new = (struct tinst_level *) xmalloc (sizeof (struct tinst_level));

mrs's avatar
mrs committed
3558 3559 3560
  new->decl = d;
  new->line = lineno;
  new->file = input_filename;
mrs's avatar
mrs committed
3561 3562
  new->next = current_tinst_level;
  current_tinst_level = new;
mrs's avatar
mrs committed
3563

mrs's avatar
mrs committed
3564
  ++tinst_depth;
mrs's avatar
mrs committed
3565 3566 3567 3568 3569
#ifdef GATHER_STATISTICS
  if (tinst_depth > depth_reached)
    depth_reached = tinst_depth;
#endif

3570
  ++tinst_level_tick;
mrs's avatar
mrs committed
3571
  return 1;
mrs's avatar
mrs committed
3572 3573 3574 3575 3576 3577 3578 3579 3580 3581
}

void
pop_tinst_level ()
{
  struct tinst_level *old = current_tinst_level;

  current_tinst_level = old->next;
  old->next = free_tinst_level;
  free_tinst_level = old;
mrs's avatar
mrs committed
3582
  --tinst_depth;
3583
  ++tinst_level_tick;
mrs's avatar
mrs committed
3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596
}

struct tinst_level *
tinst_for_decl ()
{
  struct tinst_level *p = current_tinst_level;

  if (p)
    for (; p->next ; p = p->next )
      ;
  return p;
}

jason's avatar
jason committed
3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607
/* DECL is a friend FUNCTION_DECL or TEMPLATE_DECL.  ARGS is the
   vector of template arguments, as for tsubst.

   Returns an appropriate tsbust'd friend declaration.  */

static tree
tsubst_friend_function (decl, args)
     tree decl;
     tree args;
{
  tree new_friend;
3608 3609 3610 3611 3612 3613
  int line = lineno;
  char *file = input_filename;

  lineno = DECL_SOURCE_LINE (decl);
  input_filename = DECL_SOURCE_FILE (decl);

jason's avatar
jason committed
3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632
  if (TREE_CODE (decl) == FUNCTION_DECL 
      && DECL_TEMPLATE_INSTANTIATION (decl)
      && TREE_CODE (DECL_TI_TEMPLATE (decl)) != TEMPLATE_DECL)
    /* This was a friend declared with an explicit template
       argument list, e.g.:
       
       friend void f<>(T);
       
       to indicate that f was a template instantiation, not a new
       function declaration.  Now, we have to figure out what
       instantiation of what template.  */
    {
      tree template_id;
      tree new_args;
      tree tmpl;
      tree tinfo;

      template_id
	= lookup_template_function (tsubst_expr (DECL_TI_TEMPLATE (decl),
3633
						 args, NULL_TREE),
jason's avatar
jason committed
3634
				    tsubst (DECL_TI_ARGS (decl),
3635
					    args, NULL_TREE));
jason's avatar
jason committed
3636 3637 3638 3639 3640
      
      /* Temporarily remove the DECL_TEMPLATE_INFO so as not to
	 confuse tsubst.  */
      tinfo = DECL_TEMPLATE_INFO (decl);
      DECL_TEMPLATE_INFO (decl) = NULL_TREE;
3641
      new_friend = tsubst (decl, args, NULL_TREE);
jason's avatar
jason committed
3642 3643 3644 3645 3646 3647
      DECL_TEMPLATE_INFO (decl) = tinfo;

      tmpl = determine_specialization (template_id,
				       new_friend,
				       &new_args,
				       0, 1);
3648 3649
      new_friend = instantiate_template (tmpl, new_args);
      goto done;
jason's avatar
jason committed
3650
    }
3651 3652
  else
    new_friend = tsubst (decl, args, NULL_TREE);
jason's avatar
jason committed
3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667
	
  /* The new_friend will look like an instantiation, to the
     compiler, but is not an instantiation from the point of view of
     the language.  For example, we might have had:
     
     template <class T> struct S {
       template <class U> friend void f(T, U);
     };
     
     Then, in S<int>, template <class U> void f(int, U) is not an
     instantiation of anything.  */
  DECL_USE_TEMPLATE (new_friend) = 0;
  if (TREE_CODE (decl) == TEMPLATE_DECL)
    DECL_USE_TEMPLATE (DECL_TEMPLATE_RESULT (new_friend)) = 0;
  
3668
  if (DECL_NAMESPACE_SCOPE_P (new_friend))
jason's avatar
jason committed
3669 3670 3671 3672 3673 3674
    {
      if (TREE_CODE (new_friend) == TEMPLATE_DECL)
	/* This declaration is a `primary' template.  */
	TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (new_friend))
	    = new_friend;

jason's avatar
jason committed
3675
	new_friend = pushdecl_namespace_level (new_friend);
jason's avatar
jason committed
3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687
    }
  else if (TYPE_SIZE (DECL_CONTEXT (new_friend)))
    {
      /* Check to see that the declaration is really present, and,
	 possibly obtain an improved declaration.  */
      tree fn = check_classfn (DECL_CONTEXT (new_friend),
			       new_friend);
      
      if (fn)
	new_friend = fn;
    }

3688 3689 3690
 done:
  lineno = line;
  input_filename = file;
jason's avatar
jason committed
3691 3692 3693
  return new_friend;
}

3694 3695
/* FRIEND_TMPL is a friend TEMPLATE_DECL.  ARGS is the vector of
   template arguments, as for tsubst.
3696 3697 3698 3699

   Returns an appropriate tsbust'd friend type.  */

static tree
3700 3701
tsubst_friend_class (friend_tmpl, args)
     tree friend_tmpl;
3702 3703
     tree args;
{
3704
  tree friend_type;
3705
  tree tmpl = lookup_name (DECL_NAME (friend_tmpl), 1); 
3706 3707 3708 3709 3710 3711 3712

  tmpl = maybe_get_template_decl_from_type_decl (tmpl);

  if (tmpl != NULL_TREE && DECL_CLASS_TEMPLATE_P (tmpl))
    {
      /* The friend template has already been declared.  Just
	 check to see that the declarations match.  */
3713 3714
      redeclare_class_template (TREE_TYPE (tmpl),
				DECL_TEMPLATE_PARMS (friend_tmpl));
3715 3716 3717 3718 3719 3720 3721
      friend_type = TREE_TYPE (tmpl);
    }
  else
    {
      /* The friend template has not already been declared.  In this
	 case, the instantiation of the template class will cause the
	 injection of this template into the global scope.  */
3722
      tmpl = tsubst (friend_tmpl, args, NULL_TREE);
3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737

      /* The new TMPL is not an instantiation of anything, so we
 	 forget its origins.  We don't reset CLASSTYPE_TI_TEMPLATE for
	 the new type because that is supposed to be the corresponding
	 template decl, i.e., TMPL.  */
      DECL_USE_TEMPLATE (tmpl) = 0;
      DECL_TEMPLATE_INFO (tmpl) = NULL_TREE;
      CLASSTYPE_USE_TEMPLATE (TREE_TYPE (tmpl)) = 0;

      /* Inject this template into the global scope.  */
      friend_type = TREE_TYPE (pushdecl_top_level (tmpl));
    }

  return friend_type;
}
jason's avatar
jason committed
3738

mrs's avatar
mrs committed
3739
tree
mrs's avatar
mrs committed
3740 3741
instantiate_class_template (type)
     tree type;
mrs's avatar
mrs committed
3742
{
mrs's avatar
mrs committed
3743
  tree template, template_info, args, pattern, t, *field_chain;
3744
  tree typedecl, outer_args;
mrs's avatar
mrs committed
3745

mrs's avatar
mrs committed
3746
  if (type == error_mark_node)
mrs's avatar
mrs committed
3747 3748
    return error_mark_node;

mrs's avatar
mrs committed
3749 3750 3751 3752 3753 3754 3755 3756
  template_info = CLASSTYPE_TEMPLATE_INFO (type);

  if (TYPE_BEING_DEFINED (type) || TYPE_SIZE (type))
    return type;

  template = TI_TEMPLATE (template_info);
  my_friendly_assert (TREE_CODE (template) == TEMPLATE_DECL, 279);
  args = TI_ARGS (template_info);
mrs's avatar
mrs committed
3757

3758 3759
  if (DECL_TEMPLATE_INFO (template))
    {
3760
      outer_args = DECL_TI_ARGS (template);
3761 3762 3763
      while (DECL_TEMPLATE_INFO (template))
	template = DECL_TI_TEMPLATE (template);
    }
3764 3765
  else
    outer_args = NULL_TREE;
3766

mrs's avatar
mrs committed
3767
  t = most_specialized_class
3768
    (DECL_TEMPLATE_SPECIALIZATIONS (template), args, outer_args);
mrs's avatar
mrs committed
3769 3770 3771 3772 3773 3774 3775

  if (t == error_mark_node)
    {
      char *str = "candidates are:";
      cp_error ("ambiguous class template instantiation for `%#T'", type);
      for (t = DECL_TEMPLATE_SPECIALIZATIONS (template); t; t = TREE_CHAIN (t))
	{
3776 3777
	  if (get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
				  args, outer_args))
mrs's avatar
mrs committed
3778 3779 3780 3781 3782 3783
	    {
	      cp_error_at ("%s %+#T", str, TREE_TYPE (t));
	      str = "               ";
	    }
	}
      TYPE_BEING_DEFINED (type) = 1;
mrs's avatar
mrs committed
3784
      return error_mark_node;
mrs's avatar
mrs committed
3785 3786 3787 3788 3789
    }
  else if (t)
    pattern = TREE_TYPE (t);
  else
    pattern = TREE_TYPE (template);
mrs's avatar
mrs committed
3790 3791

  if (TYPE_SIZE (pattern) == NULL_TREE)
mrs's avatar
mrs committed
3792
    return type;
mrs's avatar
mrs committed
3793

mrs's avatar
mrs committed
3794
  if (t)
3795 3796 3797
    args = get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
			       args, outer_args);

3798 3799 3800 3801 3802 3803 3804
  if (pedantic && uses_template_parms (args))
    /* If there are still template parameters amongst the args, then
       we can't instantiate the type; there's no telling whether or not one
       of the template parameters might eventually be instantiated to some
       value that results in a specialization being used.  */
    return type;

3805 3806 3807 3808 3809
  /* We must copy the arguments to the permanent obstack since
     during the tsubst'ing below they may wind up in the
     DECL_TI_ARGS of some instantiated member template.  */
  args = copy_to_permanent (args);

mrs's avatar
mrs committed
3810 3811 3812 3813
  TYPE_BEING_DEFINED (type) = 1;

  if (! push_tinst_level (type))
    return type;
mrs's avatar
mrs committed
3814

mrs's avatar
mrs committed
3815 3816 3817
  maybe_push_to_top_level (uses_template_parms (type));
  pushclass (type, 0);

3818 3819 3820
  if (outer_args)
    args = add_to_template_args (outer_args, args);

mrs's avatar
mrs committed
3821 3822 3823 3824 3825 3826 3827
  if (flag_external_templates)
    {
      if (flag_alt_external_templates)
	{
	  CLASSTYPE_INTERFACE_ONLY (type) = interface_only;
	  SET_CLASSTYPE_INTERFACE_UNKNOWN_X (type, interface_unknown);
	  CLASSTYPE_VTABLE_NEEDS_WRITING (type)
3828 3829
	    = (! CLASSTYPE_INTERFACE_ONLY (type)
	       && CLASSTYPE_INTERFACE_KNOWN (type));
mrs's avatar
mrs committed
3830 3831 3832 3833 3834 3835 3836
	}
      else
	{
	  CLASSTYPE_INTERFACE_ONLY (type) = CLASSTYPE_INTERFACE_ONLY (pattern);
	  SET_CLASSTYPE_INTERFACE_UNKNOWN_X
	    (type, CLASSTYPE_INTERFACE_UNKNOWN (pattern));
	  CLASSTYPE_VTABLE_NEEDS_WRITING (type)
3837 3838
	    = (! CLASSTYPE_INTERFACE_ONLY (type)
	       && CLASSTYPE_INTERFACE_KNOWN (type));
mrs's avatar
mrs committed
3839 3840 3841
	}
    }
  else
mrs's avatar
mrs committed
3842
    {
mrs's avatar
mrs committed
3843 3844
      SET_CLASSTYPE_INTERFACE_UNKNOWN (type);
      CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
mrs's avatar
mrs committed
3845 3846
    }

mrs's avatar
mrs committed
3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870
  TYPE_HAS_CONSTRUCTOR (type) = TYPE_HAS_CONSTRUCTOR (pattern);
  TYPE_HAS_DESTRUCTOR (type) = TYPE_HAS_DESTRUCTOR (pattern);
  TYPE_HAS_ASSIGNMENT (type) = TYPE_HAS_ASSIGNMENT (pattern);
  TYPE_OVERLOADS_CALL_EXPR (type) = TYPE_OVERLOADS_CALL_EXPR (pattern);
  TYPE_OVERLOADS_ARRAY_REF (type) = TYPE_OVERLOADS_ARRAY_REF (pattern);
  TYPE_OVERLOADS_ARROW (type) = TYPE_OVERLOADS_ARROW (pattern);
  TYPE_GETS_NEW (type) = TYPE_GETS_NEW (pattern);
  TYPE_GETS_DELETE (type) = TYPE_GETS_DELETE (pattern);
  TYPE_VEC_DELETE_TAKES_SIZE (type) = TYPE_VEC_DELETE_TAKES_SIZE (pattern);
  TYPE_HAS_ASSIGN_REF (type) = TYPE_HAS_ASSIGN_REF (pattern);
  TYPE_HAS_CONST_ASSIGN_REF (type) = TYPE_HAS_CONST_ASSIGN_REF (pattern);
  TYPE_HAS_ABSTRACT_ASSIGN_REF (type) = TYPE_HAS_ABSTRACT_ASSIGN_REF (pattern);
  TYPE_HAS_INIT_REF (type) = TYPE_HAS_INIT_REF (pattern);
  TYPE_HAS_CONST_INIT_REF (type) = TYPE_HAS_CONST_INIT_REF (pattern);
  TYPE_HAS_DEFAULT_CONSTRUCTOR (type) = TYPE_HAS_DEFAULT_CONSTRUCTOR (pattern);
  TYPE_HAS_CONVERSION (type) = TYPE_HAS_CONVERSION (pattern);
  TYPE_USES_COMPLEX_INHERITANCE (type)
    = TYPE_USES_COMPLEX_INHERITANCE (pattern);
  TYPE_USES_MULTIPLE_INHERITANCE (type)
    = TYPE_USES_MULTIPLE_INHERITANCE (pattern);
  TYPE_USES_VIRTUAL_BASECLASSES (type)
    = TYPE_USES_VIRTUAL_BASECLASSES (pattern);
  TYPE_PACKED (type) = TYPE_PACKED (pattern);
  TYPE_ALIGN (type) = TYPE_ALIGN (pattern);
bothner's avatar
d  
bothner committed
3871
  TYPE_FOR_JAVA (type) = TYPE_FOR_JAVA (pattern); /* For libjava's JArray<T> */
mrs's avatar
mrs committed
3872

3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887
  CLASSTYPE_LOCAL_TYPEDECLS (type) = CLASSTYPE_LOCAL_TYPEDECLS (pattern);

  /* If this is a partial instantiation, don't tsubst anything.  We will
     only use this type for implicit typename, so the actual contents don't
     matter.  All that matters is whether a particular name is a type.  */
  if (uses_template_parms (type))
    {
      TYPE_BINFO_BASETYPES (type) = TYPE_BINFO_BASETYPES (pattern);
      TYPE_FIELDS (type) = TYPE_FIELDS (pattern);
      TYPE_METHODS (type) = TYPE_METHODS (pattern);
      CLASSTYPE_TAGS (type) = CLASSTYPE_TAGS (pattern);
      TYPE_SIZE (type) = integer_zero_node;
      goto end;
    }

mrs's avatar
mrs committed
3888 3889 3890 3891 3892 3893 3894 3895 3896
  {
    tree binfo = TYPE_BINFO (type);
    tree pbases = TYPE_BINFO_BASETYPES (pattern);

    if (pbases)
      {
	tree bases;
	int i;
	int len = TREE_VEC_LENGTH (pbases);
mrs's avatar
mrs committed
3897
	bases = make_tree_vec (len);
mrs's avatar
mrs committed
3898 3899
	for (i = 0; i < len; ++i)
	  {
3900
	    tree elt, basetype;
mrs's avatar
mrs committed
3901 3902

	    TREE_VEC_ELT (bases, i) = elt
3903
	      = tsubst (TREE_VEC_ELT (pbases, i), args, NULL_TREE);
mrs's avatar
mrs committed
3904 3905
	    BINFO_INHERITANCE_CHAIN (elt) = binfo;

3906 3907 3908
	    basetype = TREE_TYPE (elt);

	    if (! IS_AGGR_TYPE (basetype))
mrs's avatar
mrs committed
3909 3910
	      cp_error
		("base type `%T' of `%T' fails to be a struct or class type",
3911 3912
		 basetype, type);
	    else if (TYPE_SIZE (complete_type (basetype)) == NULL_TREE)
mrs's avatar
mrs committed
3913
	      cp_error ("base class `%T' of `%T' has incomplete type",
3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926
			basetype, type);

	    /* These are set up in xref_basetypes for normal classes, so
	       we have to handle them here for template bases.  */
	    if (TYPE_USES_VIRTUAL_BASECLASSES (basetype))
	      {
		TYPE_USES_VIRTUAL_BASECLASSES (type) = 1;
		TYPE_USES_COMPLEX_INHERITANCE (type) = 1;
	      }
	    TYPE_GETS_NEW (type) |= TYPE_GETS_NEW (basetype);
	    TYPE_GETS_DELETE (type) |= TYPE_GETS_DELETE (basetype);
	    CLASSTYPE_LOCAL_TYPEDECLS (type)
	      |= CLASSTYPE_LOCAL_TYPEDECLS (basetype);
mrs's avatar
mrs committed
3927
	  }
mrs's avatar
mrs committed
3928 3929 3930
	/* Don't initialize this until the vector is filled out, or
	   lookups will crash.  */
	BINFO_BASETYPES (binfo) = bases;
mrs's avatar
mrs committed
3931 3932 3933 3934 3935 3936
      }
  }

  field_chain = &TYPE_FIELDS (type);

  for (t = CLASSTYPE_TAGS (pattern); t; t = TREE_CHAIN (t))
mrs's avatar
mrs committed
3937
    {
mrs's avatar
mrs committed
3938 3939
      tree tag = TREE_VALUE (t);

mrs's avatar
mrs committed
3940
      /* These will add themselves to CLASSTYPE_TAGS for the new type.  */
mrs's avatar
mrs committed
3941
      if (TREE_CODE (tag) == ENUMERAL_TYPE)
mrs's avatar
mrs committed
3942
	{
manfred's avatar
d  
manfred committed
3943
	  (void) tsubst_enum (tag, args, field_chain);
mrs's avatar
mrs committed
3944
	  while (*field_chain)
mrs's avatar
mrs committed
3945 3946 3947 3948
	    {
	      DECL_FIELD_CONTEXT (*field_chain) = type;
	      field_chain = &TREE_CHAIN (*field_chain);
	    }
mrs's avatar
mrs committed
3949
	}
mrs's avatar
mrs committed
3950
      else
3951
	tsubst (tag, args, NULL_TREE);
mrs's avatar
mrs committed
3952 3953
    }

mrs's avatar
mrs committed
3954 3955 3956 3957
  /* Don't replace enum constants here.  */
  for (t = TYPE_FIELDS (pattern); t; t = TREE_CHAIN (t))
    if (TREE_CODE (t) != CONST_DECL)
      {
3958
	tree r = tsubst (t, args, NULL_TREE);
mrs's avatar
mrs committed
3959 3960
	if (TREE_CODE (r) == VAR_DECL)
	  {
3961 3962
	    pending_statics = perm_tree_cons (NULL_TREE, r, pending_statics);
	    /* Perhaps we should do more of grokfield here.  */
mrs's avatar
mrs committed
3963 3964 3965 3966 3967 3968 3969 3970 3971
	    start_decl_1 (r);
	    DECL_IN_AGGR_P (r) = 1;
	    DECL_EXTERNAL (r) = 1;
	    cp_finish_decl (r, DECL_INITIAL (r), NULL_TREE, 0, 0);
	  }

	*field_chain = r;
	field_chain = &TREE_CHAIN (r);
      }
mrs's avatar
mrs committed
3972

mrs's avatar
mrs committed
3973
  TYPE_METHODS (type) = tsubst_chain (TYPE_METHODS (pattern), args);
mrs's avatar
mrs committed
3974

3975 3976 3977 3978 3979
  /* Construct the DECL_FRIENDLIST for the new class type.  */
  typedecl = TYPE_MAIN_DECL (type);
  for (t = DECL_FRIENDLIST (TYPE_MAIN_DECL (pattern));
       t != NULL_TREE;
       t = TREE_CHAIN (t))
jason's avatar
jason committed
3980
    {
3981
      tree friends;
jason's avatar
jason committed
3982

3983 3984 3985
      DECL_FRIENDLIST (typedecl)
	= tree_cons (TREE_PURPOSE (t), NULL_TREE, 
		     DECL_FRIENDLIST (typedecl));
jason's avatar
jason committed
3986

3987 3988 3989 3990 3991
      for (friends = TREE_VALUE (t);
	   friends != NULL_TREE;
	   friends = TREE_CHAIN (friends))
	{
	  if (TREE_PURPOSE (friends) == error_mark_node)
jason's avatar
jason committed
3992
	    {
3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004
	      TREE_VALUE (DECL_FRIENDLIST (typedecl))
		= tree_cons (error_mark_node, 
			     tsubst_friend_function (TREE_VALUE (friends),
						     args),
			     TREE_VALUE (DECL_FRIENDLIST (typedecl)));
	    }
	  else
	    {
	      TREE_VALUE (DECL_FRIENDLIST (typedecl))
		= tree_cons (tsubst (TREE_PURPOSE (friends), args, NULL_TREE),
			     NULL_TREE,
			     TREE_VALUE (DECL_FRIENDLIST (typedecl)));
jason's avatar
jason committed
4005 4006 4007

	    }
	}
4008
    }
mrs's avatar
mrs committed
4009

4010 4011 4012 4013 4014
  for (t = CLASSTYPE_FRIEND_CLASSES (pattern);
       t != NULL_TREE;
       t = TREE_CHAIN (t))
    {
      tree friend_type = TREE_VALUE (t);
4015
      tree new_friend_type;
4016

4017
      if (TREE_CODE (friend_type) != TEMPLATE_DECL)
4018 4019
	/* The call to xref_tag_from_type does injection for friend
	   classes.  */
4020
	new_friend_type = 
4021 4022 4023
	  xref_tag_from_type (tsubst (friend_type, args, NULL_TREE),
			      NULL_TREE, 1);
      else
4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034
	new_friend_type = tsubst_friend_class (friend_type, args);

      if (TREE_CODE (friend_type) == TEMPLATE_DECL)
	/* Trick make_friend_class into realizing that the friend
	   we're adding is a template, not an ordinary class.  It's
	   important that we use make_friend_class since it will
	   perform some error-checking and output cross-reference
	   information.  */
	++processing_template_decl;

      make_friend_class (type, new_friend_type);
mrs's avatar
mrs committed
4035

4036 4037
      if (TREE_CODE (friend_type) == TEMPLATE_DECL)
	--processing_template_decl;
4038
    }
mrs's avatar
mrs committed
4039

4040 4041 4042 4043
  /* This does injection for friend functions. */
  if (!processing_template_decl)
    {
      t = tsubst (DECL_TEMPLATE_INJECT (template), args, NULL_TREE);
mrs's avatar
mrs committed
4044

4045 4046 4047
      for (; t; t = TREE_CHAIN (t))
	{
	  tree d = TREE_VALUE (t);
mrs's avatar
mrs committed
4048

4049 4050 4051 4052 4053 4054
	  if (TREE_CODE (d) == TYPE_DECL)
	    /* Already injected.  */;
	  else
	    pushdecl (d);
	}
    } 
mrs's avatar
mrs committed
4055

4056 4057 4058 4059 4060 4061
  for (t = TYPE_FIELDS (type); t; t = TREE_CHAIN (t))
    if (TREE_CODE (t) == FIELD_DECL)
      {
	TREE_TYPE (t) = complete_type (TREE_TYPE (t));
	require_complete_type (t);
      }
mrs's avatar
mrs committed
4062

4063 4064
  type = finish_struct_1 (type, 0);
  CLASSTYPE_GOT_SEMICOLON (type) = 1;
mrs's avatar
mrs committed
4065

4066 4067 4068
  repo_template_used (type);
  if (at_eof && TYPE_BINFO_VTABLE (type) != NULL_TREE)
    finish_prevtable_vardecl (NULL, TYPE_BINFO_VTABLE (type));
mrs's avatar
mrs committed
4069

4070
 end:
mrs's avatar
mrs committed
4071 4072 4073 4074 4075 4076 4077
  TYPE_BEING_DEFINED (type) = 0;
  popclass (0);

  pop_from_top_level ();
  pop_tinst_level ();

  return type;
mrs's avatar
mrs committed
4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095
}

static int
list_eq (t1, t2)
     tree t1, t2;
{
  if (t1 == NULL_TREE)
    return t2 == NULL_TREE;
  if (t2 == NULL_TREE)
    return 0;
  /* Don't care if one declares its arg const and the other doesn't -- the
     main variant of the arg type is all that matters.  */
  if (TYPE_MAIN_VARIANT (TREE_VALUE (t1))
      != TYPE_MAIN_VARIANT (TREE_VALUE (t2)))
    return 0;
  return list_eq (TREE_CHAIN (t1), TREE_CHAIN (t2));
}

mrs's avatar
mrs committed
4096
tree 
mrs's avatar
mrs committed
4097 4098 4099 4100 4101
lookup_nested_type_by_name (ctype, name)
        tree ctype, name;
{
  tree t;

mrs's avatar
mrs committed
4102 4103
  complete_type (ctype);

mrs's avatar
mrs committed
4104 4105
  for (t = CLASSTYPE_TAGS (ctype); t; t = TREE_CHAIN (t))
    {
4106 4107 4108
      if (name == TREE_PURPOSE (t)
	  /* this catches typedef enum { foo } bar; */
	  || name == TYPE_IDENTIFIER (TREE_VALUE (t)))
mrs's avatar
mrs committed
4109 4110
	return TREE_VALUE (t);
    }
mrs's avatar
mrs committed
4111 4112 4113
  return NULL_TREE;
}

4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139
/* If arg is a non-type template parameter that does not depend on template
   arguments, fold it like we weren't in the body of a template.  */

static tree
maybe_fold_nontype_arg (arg)
     tree arg;
{
  if (TREE_CODE_CLASS (TREE_CODE (arg)) != 't'
      && !uses_template_parms (arg))
    {
      /* Sometimes, one of the args was an expression involving a
	 template constant parameter, like N - 1.  Now that we've
	 tsubst'd, we might have something like 2 - 1.  This will
	 confuse lookup_template_class, so we do constant folding
	 here.  We have to unset processing_template_decl, to
	 fool build_expr_from_tree() into building an actual
	 tree.  */

      int saved_processing_template_decl = processing_template_decl; 
      processing_template_decl = 0;
      arg = fold (build_expr_from_tree (arg));
      processing_template_decl = saved_processing_template_decl; 
    }
  return arg;
}

4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151
/* Return the TREE_VEC with the arguments for the innermost template header,
   where ARGS is either that or the VEC of VECs for all the arguments.

   If is_spec, then we are dealing with a specialization of a member
   template, and want the second-innermost args, the innermost ones that
   are instantiated.  */

tree
innermost_args (args, is_spec)
     tree args;
     int is_spec;
{
4152
  if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
4153 4154 4155
    return TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1 - is_spec);
  return args;
}
jason's avatar
jason committed
4156

4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191
/* Substitute ARGS into the vector of template arguments T.  */

tree
tsubst_template_arg_vector (t, args)
     tree t;
     tree args;
{
  int len = TREE_VEC_LENGTH (t), need_new = 0, i;
  tree *elts = (tree *) alloca (len * sizeof (tree));
  
  bzero ((char *) elts, len * sizeof (tree));
  
  for (i = 0; i < len; i++)
    {
      if (TREE_VEC_ELT (t, i) != NULL_TREE
	  && TREE_CODE (TREE_VEC_ELT (t, i)) == TREE_VEC)
	elts[i] = tsubst_template_arg_vector (TREE_VEC_ELT (t, i), args);
      else
	elts[i] = maybe_fold_nontype_arg
	  (tsubst_expr (TREE_VEC_ELT (t, i), args, NULL_TREE));
      
      if (elts[i] != TREE_VEC_ELT (t, i))
	need_new = 1;
    }
  
  if (!need_new)
    return t;
  
  t = make_tree_vec (len);
  for (i = 0; i < len; i++)
    TREE_VEC_ELT (t, i) = elts[i];
  
  return t;
}

4192
/* Take the tree structure T and replace template parameters used therein
4193 4194
   with the argument vector ARGS.  IN_DECL is an associated decl for
   diagnostics.
4195 4196 4197 4198

   tsubst is used for dealing with types, decls and the like; for
   expressions, use tsubst_expr or tsubst_copy.  */

4199
tree
4200
tsubst (t, args, in_decl)
4201
     tree t, args;
mrs's avatar
mrs committed
4202 4203 4204 4205
     tree in_decl;
{
  tree type;

mrs's avatar
mrs committed
4206 4207 4208
  if (t == NULL_TREE || t == error_mark_node
      || t == integer_type_node
      || t == void_type_node
jason's avatar
jason committed
4209 4210
      || t == char_type_node
      || TREE_CODE (t) == NAMESPACE_DECL)
mrs's avatar
mrs committed
4211 4212
    return t;

jason's avatar
jason committed
4213 4214 4215 4216
  if (TREE_CODE (t) == IDENTIFIER_NODE)
    type = IDENTIFIER_TYPE_VALUE (t);
  else
    type = TREE_TYPE (t);
mrs's avatar
mrs committed
4217 4218
  if (type == unknown_type_node)
    my_friendly_abort (42);
4219

mrs's avatar
mrs committed
4220
  if (type && TREE_CODE (t) != FUNCTION_DECL
jason's avatar
jason committed
4221
      && TREE_CODE (t) != TYPENAME_TYPE
4222 4223
      && TREE_CODE (t) != TEMPLATE_DECL
      && TREE_CODE (t) != IDENTIFIER_NODE)
4224
    type = tsubst (type, args, in_decl);
mrs's avatar
mrs committed
4225

mrs's avatar
mrs committed
4226 4227 4228 4229
  switch (TREE_CODE (t))
    {
    case RECORD_TYPE:
      if (TYPE_PTRMEMFUNC_P (t))
mrs's avatar
mrs committed
4230 4231
	{
	  tree r = build_ptrmemfunc_type
4232
	    (tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
4233 4234 4235 4236
	  return cp_build_type_variant (r, TYPE_READONLY (t),
					TYPE_VOLATILE (t));
	}

mrs's avatar
mrs committed
4237
      /* else fall through */
mrs's avatar
mrs committed
4238 4239 4240
    case UNION_TYPE:
      if (uses_template_parms (t))
	{
4241
	  tree argvec = tsubst (CLASSTYPE_TI_ARGS (t), args, in_decl);
4242 4243 4244
	  tree context;
	  tree r;

4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266
	  if (TYPE_CONTEXT (t) != NULL_TREE)
	    {
	      context = tsubst (TYPE_CONTEXT (t), args, in_decl);
	  
	      if (TREE_CODE (context) != FUNCTION_DECL
		  && TREE_CODE (context) != NAMESPACE_DECL)
		{
		  /* For a member class template, we need all the
		     template arguments.  */
		  if (CLASSTYPE_IS_TEMPLATE (TYPE_CONTEXT (t)))
		    argvec = 
		      add_to_template_args (CLASSTYPE_TI_ARGS (context),
					    argvec);

		  if (CLASSTYPE_TEMPLATE_INFO (context))
		    argvec = 
		      complete_template_args (CLASSTYPE_TI_TEMPLATE (context),
					      argvec, 0);
		}
	    }
	  else
	    context = NULL_TREE;
4267 4268 4269

	  r = lookup_template_class (t, argvec, in_decl, context);

mrs's avatar
mrs committed
4270
	  return cp_build_type_variant (r, TYPE_READONLY (t),
4271
					TYPE_VOLATILE (t));
mrs's avatar
mrs committed
4272
	}
mrs's avatar
mrs committed
4273

mrs's avatar
mrs committed
4274
      /* else fall through */
mrs's avatar
mrs committed
4275 4276 4277 4278 4279
    case ERROR_MARK:
    case IDENTIFIER_NODE:
    case OP_IDENTIFIER:
    case VOID_TYPE:
    case REAL_TYPE:
mrs's avatar
mrs committed
4280
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
4281
    case BOOLEAN_TYPE:
mrs's avatar
mrs committed
4282 4283 4284
    case INTEGER_CST:
    case REAL_CST:
    case STRING_CST:
jason's avatar
jason committed
4285
    case NAMESPACE_DECL:
mrs's avatar
mrs committed
4286 4287
      return t;

mrs's avatar
mrs committed
4288 4289
    case ENUMERAL_TYPE:
      {
4290
	tree ctx = tsubst (TYPE_CONTEXT (t), args, in_decl);
jason's avatar
jason committed
4291
	if (ctx == NULL_TREE || TREE_CODE (ctx) == NAMESPACE_DECL)
mrs's avatar
mrs committed
4292
	  return t;
mrs's avatar
mrs committed
4293 4294
	else if (ctx == current_function_decl)
	  return lookup_name (TYPE_IDENTIFIER (t), 1);
mrs's avatar
mrs committed
4295 4296 4297 4298
	else
	  return lookup_nested_type_by_name (ctx, TYPE_IDENTIFIER (t));
      }

mrs's avatar
mrs committed
4299 4300 4301 4302 4303 4304 4305
    case INTEGER_TYPE:
      if (t == integer_type_node)
	return t;

      if (TREE_CODE (TYPE_MIN_VALUE (t)) == INTEGER_CST
	  && TREE_CODE (TYPE_MAX_VALUE (t)) == INTEGER_CST)
	return t;
mrs's avatar
mrs committed
4306 4307

      {
mrs's avatar
mrs committed
4308
	tree max = TREE_OPERAND (TYPE_MAX_VALUE (t), 0);
4309
	max = tsubst_expr (max, args, in_decl);
mrs's avatar
mrs committed
4310
	if (processing_template_decl)
mrs's avatar
mrs committed
4311 4312 4313
	  {
	    tree itype = make_node (INTEGER_TYPE);
	    TYPE_MIN_VALUE (itype) = size_zero_node;
mrs's avatar
mrs committed
4314 4315
	    TYPE_MAX_VALUE (itype) = build_min (MINUS_EXPR, sizetype, max,
						integer_one_node);
mrs's avatar
mrs committed
4316 4317
	    return itype;
	  }
mrs's avatar
mrs committed
4318 4319

	max = fold (build_binary_op (MINUS_EXPR, max, integer_one_node, 1));
mrs's avatar
mrs committed
4320 4321
	return build_index_2_type (size_zero_node, max);
      }
mrs's avatar
mrs committed
4322 4323

    case TEMPLATE_TYPE_PARM:
4324
    case TEMPLATE_TEMPLATE_PARM:
jason's avatar
jason committed
4325
    case TEMPLATE_PARM_INDEX:
mrs's avatar
mrs committed
4326
      {
4327 4328
	int idx;
	int level;
4329
	int levels;
jason's avatar
jason committed
4330
	tree r = NULL_TREE;
4331

4332 4333
	if (TREE_CODE (t) == TEMPLATE_TYPE_PARM
	    || TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM)
4334 4335 4336 4337 4338 4339
	  {
	    idx = TEMPLATE_TYPE_IDX (t);
	    level = TEMPLATE_TYPE_LEVEL (t);
	  }
	else
	  {
jason's avatar
jason committed
4340 4341
	    idx = TEMPLATE_PARM_IDX (t);
	    level = TEMPLATE_PARM_LEVEL (t);
4342 4343
	  }

jason's avatar
jason committed
4344
	if (TREE_VEC_LENGTH (args) > 0)
4345 4346 4347
	  {
	    tree arg = NULL_TREE;

4348
	    if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
4349
	      {
4350 4351
		levels = TREE_VEC_LENGTH (args);
		if (level <= levels)
4352 4353 4354
		  arg = TREE_VEC_ELT
		    (TREE_VEC_ELT (args, level - 1), idx);
	      }
4355 4356 4357 4358 4359 4360
	    else
	      {
		levels = 1;
		if (level == 1)
		  arg = TREE_VEC_ELT (args, idx);
	      }
4361 4362 4363 4364 4365 4366 4367

	    if (arg != NULL_TREE)
	      {
		if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
		  return cp_build_type_variant
		    (arg, TYPE_READONLY (arg) || TYPE_READONLY (t),
		     TYPE_VOLATILE (arg) || TYPE_VOLATILE (t));
4368 4369 4370 4371 4372 4373
		else if (TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM)
		  {
		    if (CLASSTYPE_TEMPLATE_INFO (t))
		      {
			/* We are processing a type constructed from
			   a template template parameter */
jason's avatar
tweak  
jason committed
4374
			tree argvec = tsubst (CLASSTYPE_TI_ARGS (t),
4375
					      args, in_decl);
4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386
			tree r;

			/* We can get a TEMPLATE_TEMPLATE_PARM here when 
			   we are resolving nested-types in the signature of 
			   a member function templates.
			   Otherwise ARG is a TEMPLATE_DECL and is the real 
			   template to be instantiated.  */
			if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM)
			  arg = TYPE_NAME (arg);

			r = lookup_template_class (DECL_NAME (arg), 
4387 4388
						   argvec, in_decl, 
						   DECL_CONTEXT (arg));
4389 4390 4391 4392 4393 4394 4395
			return cp_build_type_variant (r, TYPE_READONLY (t),
						      TYPE_VOLATILE (t));
		      }
		    else
		      /* We are processing a template argument list.  */ 
		      return arg;
		  }
4396 4397 4398 4399 4400
		else
		  return arg;
	      }
	  }

4401 4402 4403 4404 4405 4406
	if (level == 1)
	  /* This can happen during the attempted tsubst'ing in
	     unify.  This means that we don't yet have any information
	     about the template parameter in question.  */
	  return t;

4407
	/* If we get here, we must have been looking at a parm for a
4408 4409
	   more deeply nested template.  Make a new version of this
	   template parameter, but with a lower level.  */
jason's avatar
jason committed
4410 4411 4412 4413
	switch (TREE_CODE (t))
	  {
	  case TEMPLATE_TYPE_PARM:
	  case TEMPLATE_TEMPLATE_PARM:
4414
	    r = copy_node (t);
jason's avatar
jason committed
4415 4416
	    TEMPLATE_TYPE_PARM_INDEX (r)
	      = reduce_template_parm_level (TEMPLATE_TYPE_PARM_INDEX (t),
4417
					    r, levels);
jason's avatar
jason committed
4418 4419 4420
	    TYPE_STUB_DECL (r) = TYPE_NAME (r) = TEMPLATE_TYPE_DECL (r);
	    TYPE_MAIN_VARIANT (r) = r;
	    TYPE_POINTER_TO (r) = NULL_TREE;
4421
	    TYPE_REFERENCE_TO (r) = NULL_TREE;
4422 4423 4424 4425 4426 4427 4428 4429

	    if (TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM
		&& CLASSTYPE_TEMPLATE_INFO (t))
	      {
		tree argvec = tsubst (CLASSTYPE_TI_ARGS (t), args, in_decl);
		CLASSTYPE_TEMPLATE_INFO (r)
		  = perm_tree_cons (TYPE_NAME (t), argvec, NULL_TREE);
	      }
jason's avatar
jason committed
4430 4431 4432
	    break;

	  case TEMPLATE_PARM_INDEX:
4433
	    r = reduce_template_parm_level (t, type, levels);
jason's avatar
jason committed
4434 4435 4436 4437 4438 4439 4440
	    break;
	   
	  default:
	    my_friendly_abort (0);
	  }

	return r;
mrs's avatar
mrs committed
4441
      }
mrs's avatar
mrs committed
4442

4443 4444 4445 4446 4447 4448 4449
    case TEMPLATE_DECL:
      {
	/* We can get here when processing a member template function
	   of a template class.  */
	tree tmpl;
	tree decl = DECL_TEMPLATE_RESULT (t);
	tree parms;
jason's avatar
jason committed
4450
	tree* new_parms;
4451
	tree spec;
4452
	int is_template_template_parm = DECL_TEMPLATE_TEMPLATE_PARM_P (t);
4453

4454 4455 4456 4457 4458 4459 4460
	if (!is_template_template_parm)
	  {
	    /* We might already have an instance of this template. */
	    spec = retrieve_specialization (t, args);
	    if (spec != NULL_TREE)
	      return spec;
	  }
4461 4462 4463 4464 4465 4466 4467 4468 4469 4470

	/* Make a new template decl.  It will be similar to the
	   original, but will record the current template arguments. 
	   We also create a new function declaration, which is just
	   like the old one, but points to this new template, rather
	   than the old one.  */
	tmpl = copy_node (t);
	copy_lang_decl (tmpl);
	my_friendly_assert (DECL_LANG_SPECIFIC (tmpl) != 0, 0);
	TREE_CHAIN (tmpl) = NULL_TREE;
4471 4472 4473 4474 4475 4476 4477 4478 4479

	if (is_template_template_parm)
	  {
	    tree new_decl = tsubst (decl, args, in_decl);
	    DECL_RESULT (tmpl) = new_decl;
	    TREE_TYPE (tmpl) = TREE_TYPE (new_decl);
	    return tmpl;
	  }

jason's avatar
jason committed
4480
	DECL_CONTEXT (tmpl) = tsubst (DECL_CONTEXT (t),
4481
				      args, in_decl);
jason's avatar
jason committed
4482
	DECL_CLASS_CONTEXT (tmpl) = tsubst (DECL_CLASS_CONTEXT (t),
4483
					    args, in_decl);
4484
	DECL_TEMPLATE_INFO (tmpl) = build_tree_list (t, args);
4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500

	if (TREE_CODE (decl) == TYPE_DECL)
	  {
	    tree new_type = tsubst (TREE_TYPE (t), args, in_decl);
	    TREE_TYPE (tmpl) = new_type;
	    CLASSTYPE_TI_TEMPLATE (new_type) = tmpl;
	    DECL_RESULT (tmpl) = TYPE_MAIN_DECL (new_type);
	  }
	else
	  {
	    tree new_decl = tsubst (decl, args, in_decl);
	    DECL_RESULT (tmpl) = new_decl;
	    DECL_TI_TEMPLATE (new_decl) = tmpl;
	    TREE_TYPE (tmpl) = TREE_TYPE (new_decl);
	  }

4501
	DECL_TEMPLATE_INSTANTIATIONS (tmpl) = NULL_TREE;
jason's avatar
jason committed
4502
	SET_DECL_IMPLICIT_INSTANTIATION (tmpl);
4503 4504 4505 4506

	/* The template parameters for this new template are all the
	   template parameters for the old template, except the
	   outermost level of parameters. */
jason's avatar
jason committed
4507 4508
	for (new_parms = &DECL_TEMPLATE_PARMS (tmpl),
	       parms = DECL_TEMPLATE_PARMS (t);
4509
	     TREE_CHAIN (parms) != NULL_TREE;
jason's avatar
jason committed
4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524
	     new_parms = &(TREE_CHAIN (*new_parms)),
	       parms = TREE_CHAIN (parms))
	  {
	    tree new_vec = 
	      make_tree_vec (TREE_VEC_LENGTH (TREE_VALUE (parms)));
	    int i;

	    for (i = 0; i < TREE_VEC_LENGTH (new_vec); ++i)
	      {
		tree default_value =
		  TREE_PURPOSE (TREE_VEC_ELT (TREE_VALUE (parms), i));
		tree parm_decl = 
		  TREE_VALUE (TREE_VEC_ELT (TREE_VALUE (parms), i));
		  
		TREE_VEC_ELT (new_vec, i)
4525 4526
		  = build_tree_list (tsubst (default_value, args, in_decl),
				     tsubst (parm_decl, args, in_decl));
jason's avatar
jason committed
4527 4528 4529 4530 4531 4532 4533 4534 4535 4536
		  
	      }

	    *new_parms = 
	      tree_cons (build_int_2 (0, 
				      TREE_INT_CST_HIGH 
				      (TREE_PURPOSE (parms)) - 1),
			 new_vec,
			 NULL_TREE);
	  }
4537

4538
	if (PRIMARY_TEMPLATE_P (t))
4539
	  DECL_PRIMARY_TEMPLATE (tmpl) = tmpl;
4540

4541
	/* We don't partially instantiate partial specializations.  */
4542 4543 4544
	if (TREE_CODE (decl) == TYPE_DECL)
	  return tmpl;

4545 4546 4547 4548 4549
	/* What should we do with the specializations of this member
	   template?  Are they specializations of this new template,
	   or instantiations of the templates they previously were?
	   this new template?  And where should their
	   DECL_TI_TEMPLATES point?  */ 
4550
	DECL_TEMPLATE_SPECIALIZATIONS (tmpl) = NULL_TREE;
4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590
	for (spec = DECL_TEMPLATE_SPECIALIZATIONS (t);
	     spec != NULL_TREE;
	     spec = TREE_CHAIN (spec))
	  {
	    /* It helps to consider example here.  Consider:

	       template <class T>
	       struct S {
	         template <class U>
		 void f(U u);

		 template <>
		 void f(T* t) {}
	       };
	       
	       Now, for example, we are instantiating S<int>::f(U u).  
	       We want to make a template:

	       template <class U>
	       void S<int>::f(U);

	       It will have a specialization, for the case U = int*, of
	       the form:

	       template <>
	       void S<int>::f<int*>(int*);

	       This specialization will be an instantiation of
	       the specialization given in the declaration of S, with
	       argument list int*.  */

	    tree fn = TREE_VALUE (spec);
	    tree spec_args;
	    tree new_fn;

	    if (!DECL_TEMPLATE_SPECIALIZATION (fn))
	      /* Instantiations are on the same list, but they're of
		 no concern to us.  */
	      continue;

4591
	    spec_args = tsubst (DECL_TI_ARGS (fn), args,
4592
				in_decl); 
4593
	    new_fn = tsubst (DECL_RESULT (fn), args,
4594 4595 4596 4597 4598 4599 4600 4601 4602
			     in_decl); 
	    DECL_TEMPLATE_SPECIALIZATIONS (tmpl) = 
	      perm_tree_cons (spec_args, new_fn, 
			      DECL_TEMPLATE_SPECIALIZATIONS (tmpl));
	  }

	/* Record this partial instantiation.  */
	register_specialization (tmpl, t, args);

4603 4604
	return tmpl;
      }
mrs's avatar
mrs committed
4605 4606 4607

    case FUNCTION_DECL:
      {
mrs's avatar
mrs committed
4608
	tree r = NULL_TREE;
4609
	tree ctx;
4610
	tree argvec;
jason's avatar
jason committed
4611
	tree tmpl = NULL_TREE;
mrs's avatar
mrs committed
4612 4613
	int member;

4614
	if (DECL_CLASS_SCOPE_P (t))
mrs's avatar
mrs committed
4615
	  {
mrs's avatar
mrs committed
4616 4617 4618 4619
	    if (DECL_NAME (t) == constructor_name (DECL_CONTEXT (t)))
	      member = 2;
	    else
	      member = 1;
4620
	    ctx = tsubst (DECL_CLASS_CONTEXT (t), args, t);
mrs's avatar
mrs committed
4621 4622 4623 4624 4625 4626
	  }
	else
	  {
	    member = 0;
	    ctx = NULL_TREE;
	  }
bothner's avatar
d  
bothner committed
4627
	type = tsubst (type, args, in_decl);
mrs's avatar
mrs committed
4628

jason's avatar
jason committed
4629
	/* If we are instantiating a specialization, get the other args.  */
mrs's avatar
mrs committed
4630 4631
	if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
	  {
jason's avatar
jason committed
4632 4633 4634
	    tree spec;

	    tmpl = DECL_TI_TEMPLATE (t);
4635 4636

	    /* Start by getting the innermost args.  */
4637 4638 4639 4640
	    if (DECL_TEMPLATE_SPECIALIZATION (tmpl))
	      argvec = args;
	    else
	      argvec = tsubst (DECL_TI_ARGS (t), args, in_decl);
4641

4642 4643
	    if (DECL_TEMPLATE_INFO (tmpl))
	      argvec = complete_template_args (tmpl, argvec, 0);
mrs's avatar
mrs committed
4644

jason's avatar
jason committed
4645
	    /* Do we already have this instantiation?  */
4646
	    spec = retrieve_specialization (tmpl, argvec);
4647 4648
	    if (spec)
	      return spec;
mrs's avatar
mrs committed
4649 4650 4651 4652 4653
	  }

	/* We do NOT check for matching decls pushed separately at this
           point, as they may not represent instantiations of this
           template, and in any case are considered separate under the
mrs's avatar
mrs committed
4654
           discrete model.  Instead, see add_maybe_template.  */
mrs's avatar
mrs committed
4655 4656 4657

	r = copy_node (t);
	copy_lang_decl (r);
4658
	DECL_USE_TEMPLATE (r) = 0;
mrs's avatar
mrs committed
4659 4660 4661
	TREE_TYPE (r) = type;

	DECL_CONTEXT (r)
4662
	  = tsubst (DECL_CONTEXT (t), args, t);
mrs's avatar
mrs committed
4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673
	DECL_CLASS_CONTEXT (r) = ctx;

	if (member && !strncmp (OPERATOR_TYPENAME_FORMAT,
				IDENTIFIER_POINTER (DECL_NAME (r)),
				sizeof (OPERATOR_TYPENAME_FORMAT) - 1))
	  {
	    /* Type-conversion operator.  Reconstruct the name, in
	       case it's the name of one of the template's parameters.  */
	    DECL_NAME (r) = build_typename_overload (TREE_TYPE (type));
	  }

4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688
	DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args, t);
	DECL_MAIN_VARIANT (r) = r;
	DECL_RESULT (r) = NULL_TREE;
	DECL_INITIAL (r) = NULL_TREE;

	TREE_STATIC (r) = 0;
	TREE_PUBLIC (r) = TREE_PUBLIC (t);
	DECL_EXTERNAL (r) = 1;
	DECL_INTERFACE_KNOWN (r) = 0;
	DECL_DEFER_OUTPUT (r) = 0;
	TREE_CHAIN (r) = NULL_TREE;
	DECL_PENDING_INLINE_INFO (r) = 0;
	TREE_USED (r) = 0;

	if (DECL_CONSTRUCTOR_P (r))
mrs's avatar
mrs committed
4689
	  {
4690 4691
	    maybe_retrofit_in_chrg (r);
	    grok_ctor_properties (ctx, r);
mrs's avatar
mrs committed
4692
	  }
4693 4694 4695 4696 4697
	if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
	  grok_op_properties (r, DECL_VIRTUAL_P (r), DECL_FRIEND_P (r));

	if (DECL_DESTRUCTOR_P (t))
	  DECL_ASSEMBLER_NAME (r) = build_destructor_name (ctx);
4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713
	else 
	  {
	    /* Instantiations of template functions must be mangled
	       specially, in order to conform to 14.5.5.1
	       [temp.over.link].  We use in_decl below rather than
	       DECL_TI_TEMPLATE (r) because the latter is set to
	       NULL_TREE in instantiate_decl.  */
	    tree tmpl;
	    tree arg_types;

	    if (DECL_TEMPLATE_INFO (r))
	      tmpl = DECL_TI_TEMPLATE (r);
	    else
	      tmpl = in_decl;

	    /* tmpl will be NULL if this is a specialization of a
4714
	       member function of a template class.  */
4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731
	    if (name_mangling_version < 1
		|| tmpl == NULL_TREE
		|| (member && !is_member_template (tmpl)
		    && !DECL_TEMPLATE_INFO (tmpl)))
	      {
		arg_types = TYPE_ARG_TYPES (type);
		if (member && TREE_CODE (type) == FUNCTION_TYPE)
		  arg_types = hash_tree_chain 
		    (build_pointer_type (DECL_CONTEXT (r)),
		     arg_types); 
		
		DECL_ASSEMBLER_NAME (r) 
		  = build_decl_overload (DECL_NAME (r), arg_types,
					 member);
	      }
	    else
	      {
jason's avatar
jason committed
4732
		tree tparms; 
4733 4734 4735 4736
		tree targs;

		if (!DECL_TEMPLATE_SPECIALIZATION (tmpl)) 
		  {
4737 4738 4739 4740 4741 4742
		    /* We pass the outermost template parameters to
		       build_template_decl_overload, since the innermost
		       template parameters are still just template
		       parameters; there are no corresponding subsitution
		       arguments.  Levels of parms that have been bound
		       before are not represented in DECL_TEMPLATE_PARMS.  */
4743 4744 4745 4746
		    tparms = DECL_TEMPLATE_PARMS (tmpl);
		    while (tparms && TREE_CHAIN (tparms) != NULL_TREE)
		      tparms = TREE_CHAIN (tparms);
		    
4747
		    targs = innermost_args (args, 0);
4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768
		  }
		else
		  {
		    /* If the template is a specialization, then it is
		       a member template specialization.  We have
		       something like:

		       template <class T> struct S {
		         template <int i> void f();
			 template <> void f<7>();
		       };

		       and now we are forming S<double>::f<7>.
		       Therefore, the template parameters of interest
		       are those that are specialized by the template
		       (i.e., the int), not those we are using to
		       instantiate the template, i.e. the double.  */
		    tparms = DECL_TEMPLATE_PARMS (DECL_TI_TEMPLATE (tmpl));
		    targs = DECL_TI_ARGS (tmpl);
		  }
		    
4769 4770 4771 4772
		my_friendly_assert (tparms != NULL_TREE
				    && TREE_CODE (tparms) == TREE_LIST,
				    0);
		tparms = TREE_VALUE (tparms);
4773
		 
4774 4775 4776 4777 4778 4779 4780 4781
		arg_types = TYPE_ARG_TYPES (TREE_TYPE (tmpl));
		if (member && TREE_CODE (type) == FUNCTION_TYPE)
		  arg_types = hash_tree_chain 
		    (build_pointer_type (DECL_CONTEXT (r)),
		     arg_types); 

		DECL_ASSEMBLER_NAME (r)
		  = build_template_decl_overload 
4782
		  (r, arg_types, TREE_TYPE (TREE_TYPE (tmpl)),
4783
		   tparms, targs, member);
4784 4785
	      }
	  }
mrs's avatar
mrs committed
4786 4787 4788 4789 4790 4791 4792
	DECL_RTL (r) = 0;
	make_decl_rtl (r, NULL_PTR, 1);

	if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
	  {
	    DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE);

4793 4794 4795 4796 4797 4798 4799
	    /* If we're not using ANSI overloading, then we might have
	       called duplicate_decls above, and gotten back an
	       preexisting version of this function.  We treat such a
	       function as a specialization.  Otherwise, we cleared
	       both TREE_STATIC and DECL_TEMPLATE_SPECIALIZATION, so
	       this condition will be false.  */
	    if (TREE_STATIC (r) || DECL_TEMPLATE_SPECIALIZATION (r))
mrs's avatar
mrs committed
4800 4801 4802 4803
	      SET_DECL_TEMPLATE_SPECIALIZATION (r);
	    else
	      SET_DECL_IMPLICIT_INSTANTIATION (r);

4804
	    register_specialization (r, tmpl, argvec);
mrs's avatar
mrs committed
4805 4806
	  }

mrs's avatar
mrs committed
4807 4808 4809 4810
	/* Like grokfndecl.  If we don't do this, pushdecl will mess up our
	   TREE_CHAIN because it doesn't find a previous decl.  Sigh.  */
	if (member
	    && IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (r)) == NULL_TREE)
jason's avatar
jason committed
4811
	  SET_IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (r), r);
mrs's avatar
mrs committed
4812

mrs's avatar
mrs committed
4813 4814 4815 4816 4817
	return r;
      }

    case PARM_DECL:
      {
mrs's avatar
mrs committed
4818 4819
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
4820 4821 4822 4823 4824
	if (TREE_CODE (DECL_INITIAL (r)) != TEMPLATE_PARM_INDEX)
	  DECL_INITIAL (r) = TREE_TYPE (r);
	else
	  DECL_INITIAL (r) = tsubst (DECL_INITIAL (r), args, in_decl);

mrs's avatar
mrs committed
4825
	DECL_CONTEXT (r) = NULL_TREE;
kenner's avatar
kenner committed
4826 4827 4828 4829 4830 4831
#ifdef PROMOTE_PROTOTYPES
	if ((TREE_CODE (type) == INTEGER_TYPE
	     || TREE_CODE (type) == ENUMERAL_TYPE)
	    && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
	  DECL_ARG_TYPE (r) = integer_type_node;
#endif
mrs's avatar
mrs committed
4832
	if (TREE_CHAIN (t))
4833
	  TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, TREE_CHAIN (t));
mrs's avatar
mrs committed
4834 4835 4836
	return r;
      }

mrs's avatar
mrs committed
4837 4838 4839 4840 4841 4842
    case FIELD_DECL:
      {
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
	copy_lang_decl (r);
#if 0
4843
	DECL_FIELD_CONTEXT (r) = tsubst (DECL_FIELD_CONTEXT (t), args, in_decl);
mrs's avatar
mrs committed
4844
#endif
4845
	DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args, in_decl);
mrs's avatar
mrs committed
4846
	TREE_CHAIN (r) = NULL_TREE;
4847 4848
	if (TREE_CODE (type) == VOID_TYPE)
	  cp_error_at ("instantiation of `%D' as type void", r);
mrs's avatar
mrs committed
4849 4850 4851 4852 4853 4854 4855
	return r;
      }

    case USING_DECL:
      {
	tree r = copy_node (t);
	DECL_INITIAL (r)
4856
	  = tsubst_copy (DECL_INITIAL (t), args, in_decl);
mrs's avatar
mrs committed
4857 4858 4859 4860 4861 4862 4863
	TREE_CHAIN (r) = NULL_TREE;
	return r;
      }

    case VAR_DECL:
      {
	tree r;
4864
	tree ctx = tsubst_copy (DECL_CONTEXT (t), args, in_decl);
mrs's avatar
mrs committed
4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882

	/* Do we already have this instantiation?  */
	if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
	  {
	    tree tmpl = DECL_TI_TEMPLATE (t);
	    tree decls = DECL_TEMPLATE_INSTANTIATIONS (tmpl);

	    for (; decls; decls = TREE_CHAIN (decls))
	      if (DECL_CONTEXT (TREE_VALUE (decls)) == ctx)
		return TREE_VALUE (decls);
	  }

	r = copy_node (t);
	TREE_TYPE (r) = type;
	DECL_CONTEXT (r) = ctx;
	if (TREE_STATIC (r))
	  DECL_ASSEMBLER_NAME (r)
	    = build_static_name (DECL_CONTEXT (r), DECL_NAME (r));
mrs's avatar
mrs committed
4883 4884 4885 4886

	/* Don't try to expand the initializer until someone tries to use
	   this variable; otherwise we run into circular dependencies.  */
	DECL_INITIAL (r) = NULL_TREE;
mrs's avatar
mrs committed
4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900

	DECL_RTL (r) = 0;
	DECL_SIZE (r) = 0;

	if (DECL_LANG_SPECIFIC (r))
	  {
	    copy_lang_decl (r);
	    DECL_CLASS_CONTEXT (r) = DECL_CONTEXT (r);
	  }

	if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
	  {
	    tree tmpl = DECL_TI_TEMPLATE (t);
	    tree *declsp = &DECL_TEMPLATE_INSTANTIATIONS (tmpl);
4901
	    tree argvec = tsubst (DECL_TI_ARGS (t), args, in_decl);
mrs's avatar
mrs committed
4902 4903 4904 4905 4906 4907

	    DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE);
	    *declsp = perm_tree_cons (argvec, r, *declsp);
	    SET_DECL_IMPLICIT_INSTANTIATION (r);
	  }
	TREE_CHAIN (r) = NULL_TREE;
4908 4909
	if (TREE_CODE (type) == VOID_TYPE)
	  cp_error_at ("instantiation of `%D' as type void", r);
mrs's avatar
mrs committed
4910 4911 4912 4913
	return r;
      }

    case TYPE_DECL:
mrs's avatar
mrs committed
4914 4915 4916
      if (t == TYPE_NAME (TREE_TYPE (t)))
	return TYPE_NAME (type);

mrs's avatar
mrs committed
4917 4918 4919
      {
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
mrs's avatar
mrs committed
4920
	DECL_CONTEXT (r) = current_class_type;
mrs's avatar
mrs committed
4921 4922 4923 4924
	TREE_CHAIN (r) = NULL_TREE;
	return r;
      }	  

mrs's avatar
mrs committed
4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938
    case TREE_LIST:
      {
	tree purpose, value, chain, result;
	int via_public, via_virtual, via_protected;

	if (t == void_list_node)
	  return t;

	via_public = TREE_VIA_PUBLIC (t);
	via_protected = TREE_VIA_PROTECTED (t);
	via_virtual = TREE_VIA_VIRTUAL (t);

	purpose = TREE_PURPOSE (t);
	if (purpose)
4939
	  purpose = tsubst (purpose, args, in_decl);
mrs's avatar
mrs committed
4940 4941
	value = TREE_VALUE (t);
	if (value)
4942
	  value = tsubst (value, args, in_decl);
mrs's avatar
mrs committed
4943 4944
	chain = TREE_CHAIN (t);
	if (chain && chain != void_type_node)
4945
	  chain = tsubst (chain, args, in_decl);
mrs's avatar
mrs committed
4946 4947 4948 4949 4950 4951 4952 4953 4954 4955
	if (purpose == TREE_PURPOSE (t)
	    && value == TREE_VALUE (t)
	    && chain == TREE_CHAIN (t))
	  return t;
	result = hash_tree_cons (via_public, via_virtual, via_protected,
				 purpose, value, chain);
	TREE_PARMLIST (result) = TREE_PARMLIST (t);
	return result;
      }
    case TREE_VEC:
mrs's avatar
mrs committed
4956 4957
      if (type != NULL_TREE)
	{
4958 4959
	  /* A binfo node.  We always need to make a copy, of the node
	     itself and of its BINFO_BASETYPES.  */
4960

mrs's avatar
mrs committed
4961 4962
	  t = copy_node (t);

4963 4964 4965
	  /* Make sure type isn't a typedef copy.  */
	  type = BINFO_TYPE (TYPE_BINFO (type));

mrs's avatar
mrs committed
4966
	  TREE_TYPE (t) = complete_type (type);
mrs's avatar
mrs committed
4967 4968 4969 4970 4971 4972 4973
	  if (IS_AGGR_TYPE (type))
	    {
	      BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (type);
	      BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (type);
	      if (TYPE_BINFO_BASETYPES (type) != NULL_TREE)
		BINFO_BASETYPES (t) = copy_node (TYPE_BINFO_BASETYPES (type));
	    }
mrs's avatar
mrs committed
4974 4975
	  return t;
	}
4976 4977

      /* Otherwise, a vector of template arguments.  */
4978
      return tsubst_template_arg_vector (t, args);
mrs's avatar
mrs committed
4979 4980 4981 4982 4983 4984

    case POINTER_TYPE:
    case REFERENCE_TYPE:
      {
	tree r;
	enum tree_code code;
4985

mrs's avatar
mrs committed
4986 4987 4988 4989
	if (type == TREE_TYPE (t))
	  return t;

	code = TREE_CODE (t);
4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016
	if (TREE_CODE (type) == REFERENCE_TYPE) 
	  {
	    static int   last_line = 0;
	    static char* last_file = 0;

	    /* We keep track of the last time we issued this error
	       message to avoid spewing a ton of messages during a
	       single bad template instantiation.  */
	    if (last_line != lineno ||
		last_file != input_filename)
	      {
		cp_error ("cannot form type %s to reference type %T during template instantiation",
			  (code == POINTER_TYPE) ? "pointer" : "reference",
			  type);
		last_line = lineno;
		last_file = input_filename;
	      }

	    /* Use the underlying type in an attempt at error
	       recovery; maybe the user meant vector<int> and wrote
	       vector<int&>, or some such.  */
	    if (code == REFERENCE_TYPE)
	      r = type;
	    else
	      r = build_pointer_type (TREE_TYPE (type));
	  }
	else if (code == POINTER_TYPE)
mrs's avatar
mrs committed
5017 5018 5019
	  r = build_pointer_type (type);
	else
	  r = build_reference_type (type);
mrs's avatar
mrs committed
5020
	r = cp_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t));
5021

mrs's avatar
mrs committed
5022 5023 5024 5025
	/* Will this ever be needed for TYPE_..._TO values?  */
	layout_type (r);
	return r;
      }
mrs's avatar
mrs committed
5026 5027
    case OFFSET_TYPE:
      return build_offset_type
5028
	(tsubst (TYPE_OFFSET_BASETYPE (t), args, in_decl), type);
mrs's avatar
mrs committed
5029 5030 5031
    case FUNCTION_TYPE:
    case METHOD_TYPE:
      {
5032
	tree values = TYPE_ARG_TYPES (t);
mrs's avatar
mrs committed
5033
	tree context = TYPE_CONTEXT (t);
mrs's avatar
merging  
mrs committed
5034 5035
	tree raises = TYPE_RAISES_EXCEPTIONS (t);
	tree fntype;
mrs's avatar
mrs committed
5036 5037 5038

	/* Don't bother recursing if we know it won't change anything.	*/
	if (values != void_list_node)
mrs's avatar
mrs committed
5039 5040 5041 5042
	  {
	    /* This should probably be rewritten to use hash_tree_cons for
               the memory savings.  */
	    tree first = NULL_TREE;
5043
	    tree last = NULL_TREE;
mrs's avatar
mrs committed
5044 5045 5046 5047

	    for (; values && values != void_list_node;
		 values = TREE_CHAIN (values))
	      {
mrs's avatar
mrs committed
5048
		tree value = TYPE_MAIN_VARIANT (type_decays_to
5049
		  (tsubst (TREE_VALUE (values), args, in_decl)));
mrs's avatar
mrs committed
5050 5051 5052
		/* Don't instantiate default args unless they are used.
		   Handle it in build_over_call instead.  */
		tree purpose = TREE_PURPOSE (values);
mrs's avatar
mrs committed
5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066
		tree x = build_tree_list (purpose, value);

		if (first)
		  TREE_CHAIN (last) = x;
		else
		  first = x;
		last = x;
	      }

	    if (values == void_list_node)
	      TREE_CHAIN (last) = void_list_node;

	    values = first;
	  }
mrs's avatar
mrs committed
5067
	if (context)
5068
	  context = tsubst (context, args, in_decl);
mrs's avatar
mrs committed
5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081
	/* Could also optimize cases where return value and
	   values have common elements (e.g., T min(const &T, const T&).  */

	/* If the above parameters haven't changed, just return the type.  */
	if (type == TREE_TYPE (t)
	    && values == TYPE_VALUES (t)
	    && context == TYPE_CONTEXT (t))
	  return t;

	/* Construct a new type node and return it.  */
	if (TREE_CODE (t) == FUNCTION_TYPE
	    && context == NULL_TREE)
	  {
mrs's avatar
merging  
mrs committed
5082
	    fntype = build_function_type (type, values);
mrs's avatar
mrs committed
5083 5084 5085 5086
	  }
	else if (context == NULL_TREE)
	  {
	    tree base = tsubst (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))),
5087
				args, in_decl);
mrs's avatar
merging  
mrs committed
5088 5089
	    fntype = build_cplus_method_type (base, type,
					      TREE_CHAIN (values));
mrs's avatar
mrs committed
5090 5091 5092
	  }
	else
	  {
mrs's avatar
merging  
mrs committed
5093 5094
	    fntype = make_node (TREE_CODE (t));
	    TREE_TYPE (fntype) = type;
5095
	    TYPE_CONTEXT (fntype) = FROB_CONTEXT (context);
mrs's avatar
merging  
mrs committed
5096 5097 5098 5099
	    TYPE_VALUES (fntype) = values;
	    TYPE_SIZE (fntype) = TYPE_SIZE (t);
	    TYPE_ALIGN (fntype) = TYPE_ALIGN (t);
	    TYPE_MODE (fntype) = TYPE_MODE (t);
mrs's avatar
mrs committed
5100
	    if (TYPE_METHOD_BASETYPE (t))
mrs's avatar
merging  
mrs committed
5101
	      TYPE_METHOD_BASETYPE (fntype) = tsubst (TYPE_METHOD_BASETYPE (t),
5102
						      args, in_decl);
mrs's avatar
mrs committed
5103 5104 5105
	    /* Need to generate hash value.  */
	    my_friendly_abort (84);
	  }
mrs's avatar
merging  
mrs committed
5106 5107 5108 5109 5110
	fntype = build_type_variant (fntype,
				     TYPE_READONLY (t),
				     TYPE_VOLATILE (t));
	if (raises)
	  {
5111
	    raises = tsubst (raises, args, in_decl);
mrs's avatar
merging  
mrs committed
5112 5113 5114
	    fntype = build_exception_variant (fntype, raises);
	  }
	return fntype;
mrs's avatar
mrs committed
5115 5116 5117
      }
    case ARRAY_TYPE:
      {
5118
	tree domain = tsubst (TYPE_DOMAIN (t), args, in_decl);
mrs's avatar
mrs committed
5119 5120 5121 5122 5123 5124 5125 5126
	tree r;
	if (type == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
	  return t;
	r = build_cplus_array_type (type, domain);
	return r;
      }

    case PLUS_EXPR:
mrs's avatar
mrs committed
5127
    case MINUS_EXPR:
mrs's avatar
mrs committed
5128
      return fold (build (TREE_CODE (t), TREE_TYPE (t),
5129 5130
			  tsubst (TREE_OPERAND (t, 0), args, in_decl),
			  tsubst (TREE_OPERAND (t, 1), args, in_decl)));
mrs's avatar
mrs committed
5131 5132 5133 5134

    case NEGATE_EXPR:
    case NOP_EXPR:
      return fold (build1 (TREE_CODE (t), TREE_TYPE (t),
5135
			   tsubst (TREE_OPERAND (t, 0), args, in_decl)));
mrs's avatar
mrs committed
5136

mrs's avatar
mrs committed
5137 5138
    case TYPENAME_TYPE:
      {
5139
	tree ctx = tsubst (TYPE_CONTEXT (t), args, in_decl);
5140 5141
	tree f = tsubst_copy (TYPENAME_TYPE_FULLNAME (t), args, in_decl);
	f = make_typename_type (ctx, f);
mrs's avatar
mrs committed
5142 5143 5144 5145 5146 5147 5148
	return cp_build_type_variant
	  (f, TYPE_READONLY (f) || TYPE_READONLY (t),
	   TYPE_VOLATILE (f) || TYPE_VOLATILE (t));
      }

    case INDIRECT_REF:
      return make_pointer_declarator
5149
	(type, tsubst (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
5150 5151 5152
      
    case ADDR_EXPR:
      return make_reference_declarator
5153
	(type, tsubst (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
5154 5155 5156

    case ARRAY_REF:
      return build_parse_node
5157 5158
	(ARRAY_REF, tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_expr (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
5159 5160

    case CALL_EXPR:
mrs's avatar
merging  
mrs committed
5161
      return make_call_declarator
5162 5163
	(tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst (TREE_OPERAND (t, 1), args, in_decl),
mrs's avatar
merging  
mrs committed
5164
	 TREE_OPERAND (t, 2),
5165
	 tsubst (TREE_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
5166

mrs's avatar
mrs committed
5167 5168
    case SCOPE_REF:
      return build_parse_node
5169 5170
	(TREE_CODE (t), tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
5171

mrs's avatar
mrs committed
5172
    default:
mrs's avatar
mrs committed
5173
      sorry ("use of `%s' in template",
mrs's avatar
mrs committed
5174 5175 5176 5177 5178
	     tree_code_name [(int) TREE_CODE (t)]);
      return error_mark_node;
    }
}

mrs's avatar
mrs committed
5179 5180 5181 5182 5183 5184 5185 5186 5187 5188
void
do_pushlevel ()
{
  emit_line_note (input_filename, lineno);
  pushlevel (0);
  clear_last_expr ();
  push_momentary ();
  expand_start_bindings (0);
}  

mrs's avatar
mrs committed
5189
tree
mrs's avatar
mrs committed
5190
do_poplevel ()
mrs's avatar
mrs committed
5191
{
mrs's avatar
mrs committed
5192
  tree t;
5193
  int saved_warn_unused = 0;
mrs's avatar
mrs committed
5194

5195 5196 5197 5198 5199
  if (processing_template_decl)
    {
      saved_warn_unused = warn_unused;
      warn_unused = 0;
    }
5200
  expand_end_bindings (getdecls (), kept_level_p (), 0);
5201 5202
  if (processing_template_decl)
    warn_unused = saved_warn_unused;
mrs's avatar
mrs committed
5203 5204 5205 5206
  t = poplevel (kept_level_p (), 1, 0);
  pop_momentary ();
  return t;
}
mrs's avatar
mrs committed
5207

5208 5209 5210 5211
/* Like tsubst, but deals with expressions.  This function just replaces
   template parms; to finish processing the resultant expression, use
   tsubst_expr.  */

mrs's avatar
mrs committed
5212
tree
5213
tsubst_copy (t, args, in_decl)
5214
     tree t, args;
mrs's avatar
mrs committed
5215 5216 5217
     tree in_decl;
{
  enum tree_code code;
mrs's avatar
mrs committed
5218

mrs's avatar
mrs committed
5219 5220 5221 5222
  if (t == NULL_TREE || t == error_mark_node)
    return t;

  code = TREE_CODE (t);
mrs's avatar
mrs committed
5223

mrs's avatar
mrs committed
5224 5225 5226
  switch (code)
    {
    case PARM_DECL:
5227
      return do_identifier (DECL_NAME (t), 0, NULL_TREE);
mrs's avatar
mrs committed
5228 5229 5230 5231 5232

    case CONST_DECL:
    case FIELD_DECL:
      if (DECL_CONTEXT (t))
	{
5233 5234
	  tree ctx;
	  if (TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL)
mrs's avatar
mrs committed
5235
	    return lookup_name (DECL_NAME (t), 0);
5236 5237 5238

	  ctx = tsubst (DECL_CONTEXT (t), args, in_decl);
	  if (ctx != DECL_CONTEXT (t))
mrs's avatar
mrs committed
5239 5240 5241 5242 5243 5244 5245
	    return lookup_field (ctx, DECL_NAME (t), 0, 0);
	}
      return t;

    case VAR_DECL:
    case FUNCTION_DECL:
      if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
5246
	t = tsubst (t, args, in_decl);
mrs's avatar
mrs committed
5247 5248 5249
      mark_used (t);
      return t;

5250 5251
    case TEMPLATE_DECL:
      if (is_member_template (t))
5252
	return tsubst (t, args, in_decl);
5253 5254 5255
      else
	return t;

mrs's avatar
mrs committed
5256 5257 5258 5259 5260 5261 5262
#if 0
    case IDENTIFIER_NODE:
      return do_identifier (t, 0);
#endif
      
    case CAST_EXPR:
    case REINTERPRET_CAST_EXPR:
mrs's avatar
mrs committed
5263 5264 5265
    case CONST_CAST_EXPR:
    case STATIC_CAST_EXPR:
    case DYNAMIC_CAST_EXPR:
mrs's avatar
mrs committed
5266
      return build1
5267 5268
	(code, tsubst (TREE_TYPE (t), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
5269 5270 5271 5272 5273 5274 5275 5276

    case INDIRECT_REF:
    case PREDECREMENT_EXPR:
    case PREINCREMENT_EXPR:
    case POSTDECREMENT_EXPR:
    case POSTINCREMENT_EXPR:
    case NEGATE_EXPR:
    case TRUTH_NOT_EXPR:
mrs's avatar
mrs committed
5277
    case BIT_NOT_EXPR:
mrs's avatar
mrs committed
5278 5279 5280
    case ADDR_EXPR:
    case CONVERT_EXPR:      /* Unary + */
    case SIZEOF_EXPR:
5281
    case ALIGNOF_EXPR:
mrs's avatar
mrs committed
5282
    case ARROW_EXPR:
mrs's avatar
mrs committed
5283
    case THROW_EXPR:
mrs's avatar
mrs committed
5284
    case TYPEID_EXPR:
mrs's avatar
mrs committed
5285 5286
      return build1
	(code, NULL_TREE,
5287
	 tsubst_copy (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325

    case PLUS_EXPR:
    case MINUS_EXPR:
    case MULT_EXPR:
    case TRUNC_DIV_EXPR:
    case CEIL_DIV_EXPR:
    case FLOOR_DIV_EXPR:
    case ROUND_DIV_EXPR:
    case EXACT_DIV_EXPR:
    case BIT_AND_EXPR:
    case BIT_ANDTC_EXPR:
    case BIT_IOR_EXPR:
    case BIT_XOR_EXPR:
    case TRUNC_MOD_EXPR:
    case FLOOR_MOD_EXPR:
    case TRUTH_ANDIF_EXPR:
    case TRUTH_ORIF_EXPR:
    case TRUTH_AND_EXPR:
    case TRUTH_OR_EXPR:
    case RSHIFT_EXPR:
    case LSHIFT_EXPR:
    case RROTATE_EXPR:
    case LROTATE_EXPR:
    case EQ_EXPR:
    case NE_EXPR:
    case MAX_EXPR:
    case MIN_EXPR:
    case LE_EXPR:
    case GE_EXPR:
    case LT_EXPR:
    case GT_EXPR:
    case COMPONENT_REF:
    case ARRAY_REF:
    case COMPOUND_EXPR:
    case SCOPE_REF:
    case DOTSTAR_EXPR:
    case MEMBER_REF:
      return build_nt
5326 5327
	(code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
5328 5329 5330 5331

    case CALL_EXPR:
      {
	tree fn = TREE_OPERAND (t, 0);
jason's avatar
jason committed
5332
	if (is_overloaded_fn (fn))
5333
	  fn = tsubst_copy (get_first_fn (fn), args, in_decl);
mrs's avatar
mrs committed
5334
	else
jason's avatar
jason committed
5335
	  /* Sometimes FN is a LOOKUP_EXPR.  */
5336
	  fn = tsubst_copy (fn, args, in_decl);
mrs's avatar
mrs committed
5337
	return build_nt
5338
	  (code, fn, tsubst_copy (TREE_OPERAND (t, 1), args, in_decl),
mrs's avatar
mrs committed
5339 5340 5341 5342 5343 5344 5345 5346
	   NULL_TREE);
      }

    case METHOD_CALL_EXPR:
      {
	tree name = TREE_OPERAND (t, 0);
	if (TREE_CODE (name) == BIT_NOT_EXPR)
	  {
5347
	    name = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
5348
	    name = build1 (BIT_NOT_EXPR, NULL_TREE, name);
mrs's avatar
mrs committed
5349 5350 5351 5352
	  }
	else if (TREE_CODE (name) == SCOPE_REF
		 && TREE_CODE (TREE_OPERAND (name, 1)) == BIT_NOT_EXPR)
	  {
5353
	    tree base = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
mrs's avatar
mrs committed
5354
	    name = TREE_OPERAND (name, 1);
5355
	    name = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
5356
	    name = build1 (BIT_NOT_EXPR, NULL_TREE, name);
mrs's avatar
mrs committed
5357 5358 5359
	    name = build_nt (SCOPE_REF, base, name);
	  }
	else
5360
	  name = tsubst_copy (TREE_OPERAND (t, 0), args, in_decl);
mrs's avatar
mrs committed
5361
	return build_nt
5362 5363
	  (code, name, tsubst_copy (TREE_OPERAND (t, 1), args, in_decl),
	   tsubst_copy (TREE_OPERAND (t, 2), args, in_decl),
mrs's avatar
mrs committed
5364 5365 5366
	   NULL_TREE);
      }

5367
    case BIND_EXPR:
mrs's avatar
mrs committed
5368 5369
    case COND_EXPR:
    case MODOP_EXPR:
5370 5371
      {
	tree r = build_nt
5372 5373 5374
	  (code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	   tsubst_copy (TREE_OPERAND (t, 1), args, in_decl),
	   tsubst_copy (TREE_OPERAND (t, 2), args, in_decl));
5375 5376 5377 5378 5379 5380 5381 5382 5383

	if (code == BIND_EXPR && !processing_template_decl)
	  {
	    /* This processing  should really occur in tsubst_expr,
	       However, tsubst_expr does not recurse into expressions,
	       since it assumes that there aren't any statements
	       inside them.  Instead, it simply calls
	       build_expr_from_tree.  So, we need to expand the
	       BIND_EXPR here.  */ 
5384
	    tree rtl_expr = begin_stmt_expr ();
5385
	    tree block = tsubst_expr (TREE_OPERAND (r, 1), args, in_decl);
5386
	    r = finish_stmt_expr (rtl_expr, block);
5387 5388 5389 5390
	  }

	return r;
      }
mrs's avatar
mrs committed
5391 5392 5393 5394

    case NEW_EXPR:
      {
	tree r = build_nt
5395 5396 5397
	(code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 1), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 2), args, in_decl));
mrs's avatar
mrs committed
5398 5399 5400 5401 5402 5403 5404
	NEW_EXPR_USE_GLOBAL (r) = NEW_EXPR_USE_GLOBAL (t);
	return r;
      }

    case DELETE_EXPR:
      {
	tree r = build_nt
5405 5406
	(code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
5407 5408 5409 5410 5411
	DELETE_EXPR_USE_GLOBAL (r) = DELETE_EXPR_USE_GLOBAL (t);
	DELETE_EXPR_USE_VEC (r) = DELETE_EXPR_USE_VEC (t);
	return r;
      }

5412 5413
    case TEMPLATE_ID_EXPR:
      {
5414
        /* Substituted template arguments */
5415
	tree targs = tsubst_copy (TREE_OPERAND (t, 1), args, in_decl);
5416 5417 5418 5419 5420
	tree chain;
	for (chain = targs; chain; chain = TREE_CHAIN (chain))
	  TREE_VALUE (chain) = maybe_fold_nontype_arg (TREE_VALUE (chain));

	return lookup_template_function
5421
	  (tsubst_copy (TREE_OPERAND (t, 0), args, in_decl), targs);
5422 5423
      }

mrs's avatar
mrs committed
5424 5425 5426 5427 5428 5429 5430 5431 5432
    case TREE_LIST:
      {
	tree purpose, value, chain;

	if (t == void_list_node)
	  return t;

	purpose = TREE_PURPOSE (t);
	if (purpose)
5433
	  purpose = tsubst_copy (purpose, args, in_decl);
mrs's avatar
mrs committed
5434 5435
	value = TREE_VALUE (t);
	if (value)
5436
	  value = tsubst_copy (value, args, in_decl);
mrs's avatar
mrs committed
5437 5438
	chain = TREE_CHAIN (t);
	if (chain && chain != void_type_node)
5439
	  chain = tsubst_copy (chain, args, in_decl);
mrs's avatar
mrs committed
5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451
	if (purpose == TREE_PURPOSE (t)
	    && value == TREE_VALUE (t)
	    && chain == TREE_CHAIN (t))
	  return t;
	return tree_cons (purpose, value, chain);
      }

    case RECORD_TYPE:
    case UNION_TYPE:
    case ENUMERAL_TYPE:
    case INTEGER_TYPE:
    case TEMPLATE_TYPE_PARM:
5452
    case TEMPLATE_TEMPLATE_PARM:
jason's avatar
jason committed
5453
    case TEMPLATE_PARM_INDEX:
mrs's avatar
mrs committed
5454 5455 5456 5457 5458 5459 5460
    case POINTER_TYPE:
    case REFERENCE_TYPE:
    case OFFSET_TYPE:
    case FUNCTION_TYPE:
    case METHOD_TYPE:
    case ARRAY_TYPE:
    case TYPENAME_TYPE:
jason's avatar
jason committed
5461
    case TYPE_DECL:
5462
      return tsubst (t, args, in_decl);
mrs's avatar
mrs committed
5463

mrs's avatar
mrs committed
5464 5465 5466
    case IDENTIFIER_NODE:
      if (IDENTIFIER_TYPENAME_P (t))
	return build_typename_overload
5467
	  (tsubst (TREE_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
5468 5469 5470
      else
	return t;

mrs's avatar
mrs committed
5471 5472
    case CONSTRUCTOR:
      return build
5473 5474
	(CONSTRUCTOR, tsubst (TREE_TYPE (t), args, in_decl), NULL_TREE,
	 tsubst_copy (CONSTRUCTOR_ELTS (t), args, in_decl));
mrs's avatar
mrs committed
5475

mrs's avatar
mrs committed
5476 5477 5478 5479 5480
    default:
      return t;
    }
}

5481 5482
/* Like tsubst_copy, but also does semantic processing and RTL expansion.  */

mrs's avatar
mrs committed
5483
tree
5484
tsubst_expr (t, args, in_decl)
5485
     tree t, args;
mrs's avatar
mrs committed
5486 5487 5488 5489 5490
     tree in_decl;
{
  if (t == NULL_TREE || t == error_mark_node)
    return t;

mrs's avatar
mrs committed
5491
  if (processing_template_decl)
5492
    return tsubst_copy (t, args, in_decl);
mrs's avatar
mrs committed
5493 5494

  switch (TREE_CODE (t))
mrs's avatar
mrs committed
5495
    {
mrs's avatar
mrs committed
5496 5497
    case RETURN_STMT:
      lineno = TREE_COMPLEXITY (t);
5498 5499
      finish_return_stmt (tsubst_expr (RETURN_EXPR (t),
				       args, in_decl));
mrs's avatar
mrs committed
5500 5501 5502 5503
      break;

    case EXPR_STMT:
      lineno = TREE_COMPLEXITY (t);
5504 5505
      finish_expr_stmt (tsubst_expr (EXPR_STMT_EXPR (t),
				     args, in_decl));
mrs's avatar
mrs committed
5506 5507 5508 5509 5510
      break;

    case DECL_STMT:
      {
	int i = suspend_momentary ();
mrs's avatar
mrs committed
5511
	tree dcl, init;
mrs's avatar
mrs committed
5512 5513 5514 5515

	lineno = TREE_COMPLEXITY (t);
	emit_line_note (input_filename, lineno);
	dcl = start_decl
5516 5517
	  (tsubst (TREE_OPERAND (t, 0), args, in_decl),
	   tsubst (TREE_OPERAND (t, 1), args, in_decl),
bkoz's avatar
d  
bkoz committed
5518
	   TREE_OPERAND (t, 2) != 0, NULL_TREE, NULL_TREE);
5519
	init = tsubst_expr (TREE_OPERAND (t, 2), args, in_decl);
mrs's avatar
mrs committed
5520
	cp_finish_decl
mrs's avatar
mrs committed
5521
	  (dcl, init, NULL_TREE, 1, /*init ? LOOKUP_ONLYCONVERTING :*/ 0);
mrs's avatar
mrs committed
5522 5523 5524
	resume_momentary (i);
	return dcl;
      }
mrs's avatar
mrs committed
5525

mrs's avatar
mrs committed
5526 5527 5528 5529 5530
    case FOR_STMT:
      {
	tree tmp;
	lineno = TREE_COMPLEXITY (t);

5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541
	begin_for_stmt ();
	for (tmp = FOR_INIT_STMT (t); tmp; tmp = TREE_CHAIN (tmp))
	  tsubst_expr (tmp, args, in_decl);
	finish_for_init_stmt (NULL_TREE);
	finish_for_cond (tsubst_expr (FOR_COND (t), args,
				      in_decl),
			 NULL_TREE);
	tmp = tsubst_expr (FOR_EXPR (t), args, in_decl);
	finish_for_expr (tmp, NULL_TREE);
	tsubst_expr (FOR_BODY (t), args, in_decl);
	finish_for_stmt (tmp, NULL_TREE);
mrs's avatar
mrs committed
5542 5543
      }
      break;
mrs's avatar
mrs committed
5544

mrs's avatar
mrs committed
5545 5546 5547
    case WHILE_STMT:
      {
	lineno = TREE_COMPLEXITY (t);
5548 5549 5550 5551 5552 5553
	begin_while_stmt ();
	finish_while_stmt_cond (tsubst_expr (WHILE_COND (t),
					     args, in_decl),
				NULL_TREE);
	tsubst_expr (WHILE_BODY (t), args, in_decl);
	finish_while_stmt (NULL_TREE);
mrs's avatar
mrs committed
5554 5555
      }
      break;
mrs's avatar
mrs committed
5556

mrs's avatar
mrs committed
5557 5558 5559
    case DO_STMT:
      {
	lineno = TREE_COMPLEXITY (t);
5560 5561 5562 5563 5564 5565
	begin_do_stmt ();
	tsubst_expr (DO_BODY (t), args, in_decl);
	finish_do_body (NULL_TREE);
	finish_do_stmt (tsubst_expr (DO_COND (t), args,
				     in_decl),
			NULL_TREE);
mrs's avatar
mrs committed
5566 5567
      }
      break;
mrs's avatar
mrs committed
5568

mrs's avatar
mrs committed
5569
    case IF_STMT:
mrs's avatar
mrs committed
5570
      {
mrs's avatar
mrs committed
5571 5572 5573
	tree tmp;

	lineno = TREE_COMPLEXITY (t);
5574 5575 5576 5577
	begin_if_stmt ();
	finish_if_stmt_cond (tsubst_expr (IF_COND (t),
					  args, in_decl),
			     NULL_TREE);
mrs's avatar
mrs committed
5578

5579
	if (tmp = THEN_CLAUSE (t), tmp)
mrs's avatar
mrs committed
5580
	  {
5581
	    tsubst_expr (tmp, args, in_decl);
5582
	    finish_then_clause (NULL_TREE);
mrs's avatar
mrs committed
5583 5584
	  }

5585 5586 5587 5588 5589 5590
	if (tmp = ELSE_CLAUSE (t), tmp)
	  {
	    begin_else_clause ();
	    tsubst_expr (tmp, args, in_decl);
	    finish_else_clause (NULL_TREE);
	  }
mrs's avatar
mrs committed
5591

5592
	finish_if_stmt ();
mrs's avatar
mrs committed
5593
      }
mrs's avatar
mrs committed
5594
      break;
mrs's avatar
mrs committed
5595

mrs's avatar
mrs committed
5596 5597
    case COMPOUND_STMT:
      {
5598
	tree substmt;
mrs's avatar
mrs committed
5599

mrs's avatar
mrs committed
5600
	lineno = TREE_COMPLEXITY (t);
5601 5602 5603 5604
	begin_compound_stmt (COMPOUND_STMT_NO_SCOPE (t));
	for (substmt = COMPOUND_BODY (t); 
	     substmt != NULL_TREE;
	     substmt = TREE_CHAIN (substmt))
5605
	  tsubst_expr (substmt, args, in_decl);
5606 5607
	return finish_compound_stmt (COMPOUND_STMT_NO_SCOPE (t), 
				     NULL_TREE);
mrs's avatar
mrs committed
5608 5609
      }
      break;
mrs's avatar
mrs committed
5610

mrs's avatar
mrs committed
5611 5612
    case BREAK_STMT:
      lineno = TREE_COMPLEXITY (t);
5613
      finish_break_stmt ();
mrs's avatar
mrs committed
5614
      break;
mrs's avatar
mrs committed
5615

mrs's avatar
mrs committed
5616 5617
    case CONTINUE_STMT:
      lineno = TREE_COMPLEXITY (t);
5618
      finish_continue_stmt ();
mrs's avatar
mrs committed
5619 5620
      break;

mrs's avatar
mrs committed
5621 5622 5623 5624 5625
    case SWITCH_STMT:
      {
	tree val, tmp;

	lineno = TREE_COMPLEXITY (t);
5626 5627 5628
	begin_switch_stmt ();
	val = tsubst_expr (SWITCH_COND (t), args, in_decl);
	finish_switch_cond (val);
mrs's avatar
mrs committed
5629 5630
	
	if (tmp = TREE_OPERAND (t, 1), tmp)
5631
	  tsubst_expr (tmp, args, in_decl);
mrs's avatar
mrs committed
5632

5633
	finish_switch_stmt (val, NULL_TREE);
mrs's avatar
mrs committed
5634 5635 5636 5637
      }
      break;

    case CASE_LABEL:
5638 5639
      finish_case_label (tsubst_expr (CASE_LOW (t), args, in_decl),
			 tsubst_expr (CASE_HIGH (t), args, in_decl));
mrs's avatar
mrs committed
5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650
      break;

    case LABEL_DECL:
      t = define_label (DECL_SOURCE_FILE (t), DECL_SOURCE_LINE (t),
			DECL_NAME (t));
      if (t)
	expand_label (t);
      break;

    case GOTO_STMT:
      lineno = TREE_COMPLEXITY (t);
mmitchel's avatar
 
mmitchel committed
5651 5652 5653 5654 5655 5656 5657
      t = GOTO_DESTINATION (t);
      if (TREE_CODE (t) != IDENTIFIER_NODE)
	/* Computed goto's must be tsubst'd into.  On the other hand,
	   non-computed gotos must not be; the identifier in question
	   will have no binding.  */
	t = tsubst_expr (t, args, in_decl);
      finish_goto_stmt (t);
5658 5659 5660 5661 5662 5663 5664 5665 5666
      break;

    case ASM_STMT:
      lineno = TREE_COMPLEXITY (t);
      finish_asm_stmt (tsubst_expr (ASM_CV_QUAL (t), args, in_decl),
		       tsubst_expr (ASM_STRING (t), args, in_decl),
		       tsubst_expr (ASM_OUTPUTS (t), args, in_decl),
		       tsubst_expr (ASM_INPUTS (t), args, in_decl), 
		       tsubst_expr (ASM_CLOBBERS (t), args, in_decl));
mrs's avatar
mrs committed
5667
      break;
mrs's avatar
mrs committed
5668 5669 5670

    case TRY_BLOCK:
      lineno = TREE_COMPLEXITY (t);
5671 5672 5673
      begin_try_block ();
      tsubst_expr (TRY_STMTS (t), args, in_decl);
      finish_try_block (NULL_TREE);
mrs's avatar
mrs committed
5674
      {
5675
	tree handler = TRY_HANDLERS (t);
mrs's avatar
mrs committed
5676
	for (; handler; handler = TREE_CHAIN (handler))
5677
	  tsubst_expr (handler, args, in_decl);
mrs's avatar
mrs committed
5678
      }
5679
      finish_handler_sequence (NULL_TREE);
mrs's avatar
mrs committed
5680 5681 5682 5683
      break;

    case HANDLER:
      lineno = TREE_COMPLEXITY (t);
5684 5685
      begin_handler ();
      if (HANDLER_PARMS (t))
mrs's avatar
mrs committed
5686
	{
5687
	  tree d = HANDLER_PARMS (t);
mrs's avatar
mrs committed
5688
	  expand_start_catch_block
5689 5690
	    (tsubst (TREE_OPERAND (d, 1), args, in_decl),
	     tsubst (TREE_OPERAND (d, 0), args, in_decl));
mrs's avatar
mrs committed
5691 5692 5693
	}
      else
	expand_start_catch_block (NULL_TREE, NULL_TREE);
5694 5695 5696
      finish_handler_parms (NULL_TREE);
      tsubst_expr (HANDLER_BODY (t), args, in_decl);
      finish_handler (NULL_TREE);
mrs's avatar
mrs committed
5697 5698
      break;

mrs's avatar
mrs committed
5699 5700 5701 5702
    case TAG_DEFN:
      lineno = TREE_COMPLEXITY (t);
      t = TREE_TYPE (t);
      if (TREE_CODE (t) == ENUMERAL_TYPE)
5703
	tsubst_enum (t, args, NULL);
mrs's avatar
mrs committed
5704 5705
      break;

mrs's avatar
mrs committed
5706
    default:
5707
      return build_expr_from_tree (tsubst_copy (t, args, in_decl));
mrs's avatar
mrs committed
5708 5709
    }
  return NULL_TREE;
mrs's avatar
mrs committed
5710 5711
}

mrs's avatar
mrs committed
5712 5713
tree
instantiate_template (tmpl, targ_ptr)
5714
     tree tmpl, targ_ptr;
mrs's avatar
mrs committed
5715
{
mrs's avatar
mrs committed
5716 5717 5718 5719 5720
  tree fndecl;
  int i, len;
  struct obstack *old_fmp_obstack;
  extern struct obstack *function_maybepermanent_obstack;

5721 5722 5723
  if (tmpl == error_mark_node)
    return error_mark_node;

5724 5725
  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 283);

5726 5727 5728
  /* Check to see if we already have this specialization.  This does work
     for member template specializations; the list is set up from the
     tsubst TEMPLATE_DECL case when the containing class is instantiated.  */
5729 5730
  if (DECL_FUNCTION_TEMPLATE_P (tmpl))
    {
5731
      tree spec = retrieve_specialization (tmpl, targ_ptr);
5732
      
5733 5734
      if (spec != NULL_TREE)
	return spec;
5735 5736
    }

mrs's avatar
mrs committed
5737 5738 5739
  push_obstacks (&permanent_obstack, &permanent_obstack);
  old_fmp_obstack = function_maybepermanent_obstack;
  function_maybepermanent_obstack = &permanent_obstack;
mrs's avatar
mrs committed
5740

5741
  len = DECL_NTPARMS (tmpl);
mrs's avatar
mrs committed
5742

mrs's avatar
mrs committed
5743 5744
  i = len;
  while (i--)
mrs's avatar
mrs committed
5745
    {
5746
      tree t = TREE_VEC_ELT (targ_ptr, i);
mrs's avatar
mrs committed
5747 5748 5749
      if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
	{
	  tree nt = target_type (t);
mrs's avatar
mrs committed
5750
	  if (IS_AGGR_TYPE (nt) && decl_function_context (TYPE_MAIN_DECL (nt)))
mrs's avatar
mrs committed
5751 5752 5753 5754 5755 5756 5757
	    {
	      cp_error ("type `%T' composed from a local class is not a valid template-argument", t);
	      cp_error ("  trying to instantiate `%D'", tmpl);
	      fndecl = error_mark_node;
	      goto out;
	    }
	}
5758
      TREE_VEC_ELT (targ_ptr, i) = copy_to_permanent (t);
mrs's avatar
mrs committed
5759
    }
5760
  targ_ptr = copy_to_permanent (targ_ptr);
mrs's avatar
mrs committed
5761

mrs's avatar
mrs committed
5762
  /* substitute template parameters */
5763
  fndecl = tsubst (DECL_RESULT (tmpl), targ_ptr, tmpl);
mrs's avatar
mrs committed
5764

mrs's avatar
mrs committed
5765 5766 5767
  if (flag_external_templates)
    add_pending_template (fndecl);

mrs's avatar
mrs committed
5768 5769 5770
 out:
  function_maybepermanent_obstack = old_fmp_obstack;
  pop_obstacks ();
mrs's avatar
mrs committed
5771

mrs's avatar
mrs committed
5772
  return fndecl;
mrs's avatar
mrs committed
5773
}
mrs's avatar
mrs committed
5774 5775

/* Push the name of the class template into the scope of the instantiation.  */
mrs's avatar
mrs committed
5776 5777

void
mrs's avatar
mrs committed
5778 5779
overload_template_name (type)
     tree type;
mrs's avatar
mrs committed
5780
{
mrs's avatar
mrs committed
5781 5782
  tree id = DECL_NAME (CLASSTYPE_TI_TEMPLATE (type));
  tree decl;
mrs's avatar
mrs committed
5783

mrs's avatar
mrs committed
5784 5785 5786
  if (IDENTIFIER_CLASS_VALUE (id)
      && TREE_TYPE (IDENTIFIER_CLASS_VALUE (id)) == type)
    return;
mrs's avatar
mrs committed
5787

mrs's avatar
mrs committed
5788 5789 5790
  decl = build_decl (TYPE_DECL, id, type);
  SET_DECL_ARTIFICIAL (decl);
  pushdecl_class_level (decl);
mrs's avatar
mrs committed
5791 5792
}

law's avatar
law committed
5793
/* Like type_unification but designed specially to handle conversion
5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805
   operators.  

   The FN is a TEMPLATE_DECL for a function.  The ARGS are the
   arguments that are being used when calling it.  

   If FN is a conversion operator, RETURN_TYPE is the type desired as
   the result of the conversion operator.

   The EXTRA_FN_ARG, if any, is the type of an additional
   parameter to be added to the beginning of FN's parameter list.  

   The other arguments are as for type_unification.  */
5806 5807

int
5808 5809
fn_type_unification (fn, explicit_targs, targs, args, return_type,
		     strict, extra_fn_arg)
5810
     tree fn, explicit_targs, targs, args, return_type;
5811
     unification_kind_t strict;
5812
     tree extra_fn_arg;
5813
{
5814
  tree parms;
5815 5816 5817

  my_friendly_assert (TREE_CODE (fn) == TEMPLATE_DECL, 0);

5818 5819
  parms = TYPE_ARG_TYPES (TREE_TYPE (fn));

5820 5821 5822 5823
  if (IDENTIFIER_TYPENAME_P (DECL_NAME (fn))) 
    {
      /* This is a template conversion operator.  Use the return types
         as well as the argument types.  */
5824 5825 5826 5827
      parms = scratch_tree_cons (NULL_TREE, 
				 TREE_TYPE (TREE_TYPE (fn)),
				 parms);
      args = scratch_tree_cons (NULL_TREE, return_type, args);
5828 5829
    }

5830
  if (extra_fn_arg != NULL_TREE)
5831
    parms = scratch_tree_cons (NULL_TREE, extra_fn_arg, parms);
5832

5833 5834 5835 5836
  /* We allow incomplete unification without an error message here
     because the standard doesn't seem to explicitly prohibit it.  Our
     callers must be ready to deal with unification failures in any
     event.  */
5837 5838 5839 5840 5841 5842
  return type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn), 
			   targs,
			   parms,
			   args,
			   explicit_targs,
			   strict, 1);
5843 5844 5845
}


mrs's avatar
mrs committed
5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856
/* Type unification.

   We have a function template signature with one or more references to
   template parameters, and a parameter list we wish to fit to this
   template.  If possible, produce a list of parameters for the template
   which will cause it to fit the supplied parameter list.

   Return zero for success, 2 for an incomplete match that doesn't resolve
   all the types, and 1 for complete failure.  An error message will be
   printed only for an incomplete match.

5857
   TPARMS[NTPARMS] is an array of template parameter types.
mrs's avatar
mrs committed
5858

5859 5860 5861 5862 5863 5864 5865
   TARGS[NTPARMS] is the array into which the deduced template
   parameter values are placed.  PARMS is the function template's
   signature (using TEMPLATE_PARM_IDX nodes), and ARGS is the argument
   list we're trying to match against it.

   The EXPLICIT_TARGS are explicit template arguments provided via a
   template-id.
mrs's avatar
mrs committed
5866

5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881
   The parameter STRICT is one of:

   DEDUCE_CALL: 
     We are deducing arguments for a function call, as in
     [temp.deduct.call].

   DEDUCE_CONV:
     We are deducing arguments for a conversion function, as in 
     [temp.deduct.conv].

   DEDUCE_EXACT:
     We are deducing arguments when calculating the partial
     ordering between specializations of function or class
     templates, as in [temp.func.order] and [temp.class.order],
     when doing an explicit instantiation as in [temp.explicit],
5882
     when determining an explicit specialization as in
5883 5884
     [temp.expl.spec], or when taking the address of a function
     template, as in [temp.deduct.funcaddr].  */
mrs's avatar
mrs committed
5885 5886

int
5887
type_unification (tparms, targs, parms, args, explicit_targs,
5888
		  strict, allow_incomplete)
5889
     tree tparms, targs, parms, args, explicit_targs;
5890 5891
     unification_kind_t strict;
     int allow_incomplete;
5892
{
5893
  int* explicit_mask;
5894 5895
  int i;

5896
  for (i = 0; i < TREE_VEC_LENGTH (tparms); i++)
5897
    TREE_VEC_ELT (targs, i) = NULL_TREE;
5898

5899
  if (explicit_targs != NULL_TREE)
5900 5901
    {
      tree arg_vec;
5902
      arg_vec = coerce_template_parms (tparms, explicit_targs, NULL_TREE, 0,
5903
				       0);
5904 5905 5906

      if (arg_vec == error_mark_node)
	return 1;
5907

5908
      explicit_mask = alloca (sizeof (int) * TREE_VEC_LENGTH (targs));
ghazi's avatar
ghazi committed
5909
      bzero ((char *) explicit_mask, sizeof(int) * TREE_VEC_LENGTH (targs));
5910

5911 5912
      for (i = 0; 
	   i < TREE_VEC_LENGTH (arg_vec) 
5913
	     && TREE_VEC_ELT (arg_vec, i) != NULL_TREE;  
5914
	   ++i)
5915 5916 5917 5918 5919
	{
	  TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (arg_vec, i);
	  /* Let unify know that this argument was explicit.  */
	  explicit_mask [i] = 1;
	}
5920
    }
5921 5922
  else
    explicit_mask = 0;
5923

5924 5925 5926 5927 5928 5929 5930
  return 
    type_unification_real (tparms, targs, parms, args, 0,
			   strict, allow_incomplete, explicit_mask); 
}

/* Adjust types before performing type deduction, as described in
   [temp.deduct.call] and [temp.deduct.conv].  The rules in these two
mmitchel's avatar
mmitchel committed
5931 5932 5933 5934
   sections are symmetric.  PARM is the type of a function parameter
   or the return type of the conversion function.  ARG is the type of
   the argument passed to the call, or the type of the value
   intialized with the result of the conversion function.  */
5935

5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948
void
maybe_adjust_types_for_deduction (strict, parm, arg)
     unification_kind_t strict;
     tree* parm;
     tree* arg;
{
  switch (strict)
    {
    case DEDUCE_CALL:
      break;

    case DEDUCE_CONV:
      {
mmitchel's avatar
mmitchel committed
5949 5950 5951
	/* Swap PARM and ARG throughout the remainder of this
	   function; the handling is precisely symmetric since PARM
	   will initialize ARG rather than vice versa.  */
5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001
	tree* temp = parm;
	parm = arg;
	arg = temp;
	break;
      }

    case DEDUCE_EXACT:
      /* There is nothing to do in this case.  */
      return;

    default:
      my_friendly_abort (0);
    }

  if (TREE_CODE (*parm) != REFERENCE_TYPE)
    {
      /* [temp.deduct.call]
	 
	 If P is not a reference type:
	 
	 --If A is an array type, the pointer type produced by the
	 array-to-pointer standard conversion (_conv.array_) is
	 used in place of A for type deduction; otherwise,
	 
	 --If A is a function type, the pointer type produced by
	 the function-to-pointer standard conversion
	 (_conv.func_) is used in place of A for type deduction;
	 otherwise,
	 
	 --If A is a cv-qualified type, the top level
	 cv-qualifiers of A's type are ignored for type
	 deduction.  */
      if (TREE_CODE (*arg) == ARRAY_TYPE)
	*arg = build_pointer_type (TREE_TYPE (*arg));
      else if (TREE_CODE (*arg) == FUNCTION_TYPE
	  || TREE_CODE (*arg) == METHOD_TYPE)
	*arg = build_pointer_type (*arg);
      else
	*arg = TYPE_MAIN_VARIANT (*arg);
    }
  
  /* [temp.deduct.call]
     
     If P is a cv-qualified type, the top level cv-qualifiers
     of P's type are ignored for type deduction.  If P is a
     reference type, the type referred to by P is used for
     type deduction.  */
  *parm = TYPE_MAIN_VARIANT (*parm);
  if (TREE_CODE (*parm) == REFERENCE_TYPE)
    *parm = TREE_TYPE (*parm);
6002 6003
}

6004 6005
/* Like type_unfication.  EXPLICIT_MASK, if non-NULL, is an array of
   integers, with ones in positions corresponding to arguments in
6006 6007 6008 6009 6010
   targs that were provided explicitly, and zeros elsewhere.  

   If SUBR is 1, we're being called recursively (to unify the
   arguments of a function or method parameter of a function
   template).  */
6011

6012
static int
6013
type_unification_real (tparms, targs, parms, args, subr,
6014 6015
		       strict, allow_incomplete, explicit_mask)
     tree tparms, targs, parms, args;
6016 6017 6018
     int subr;
     unification_kind_t strict;
     int allow_incomplete;
6019
     int* explicit_mask;
mrs's avatar
mrs committed
6020 6021 6022 6023
{
  tree parm, arg;
  int i;
  int ntparms = TREE_VEC_LENGTH (tparms);
6024
  int sub_strict;
mrs's avatar
mrs committed
6025 6026

  my_friendly_assert (TREE_CODE (tparms) == TREE_VEC, 289);
6027 6028
  my_friendly_assert (parms == NULL_TREE 
		      || TREE_CODE (parms) == TREE_LIST, 290);
mrs's avatar
mrs committed
6029
  /* ARGS could be NULL (via a call from parse.y to
mrs's avatar
mrs committed
6030 6031 6032 6033 6034
     build_x_function_call).  */
  if (args)
    my_friendly_assert (TREE_CODE (args) == TREE_LIST, 291);
  my_friendly_assert (ntparms > 0, 292);

6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052
  switch (strict)
    {
    case DEDUCE_CALL:
      sub_strict = UNIFY_ALLOW_MORE_CV_QUAL | UNIFY_ALLOW_DERIVED;
      break;
      
    case DEDUCE_CONV:
      sub_strict = UNIFY_ALLOW_LESS_CV_QUAL;
      break;

    case DEDUCE_EXACT:
      sub_strict = UNIFY_ALLOW_NONE;
      break;
      
    default:
      my_friendly_abort (0);
    }

mrs's avatar
mrs committed
6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066
  while (parms
	 && parms != void_list_node
	 && args
	 && args != void_list_node)
    {
      parm = TREE_VALUE (parms);
      parms = TREE_CHAIN (parms);
      arg = TREE_VALUE (args);
      args = TREE_CHAIN (args);

      if (arg == error_mark_node)
	return 1;
      if (arg == unknown_type_node)
	return 1;
mrs's avatar
mrs committed
6067

6068 6069 6070 6071 6072
      /* Conversions will be performed on a function argument that
	 corresponds with a function parameter that contains only
	 non-deducible template parameters and explicitly specified
	 template parameters.  */
      if (! uses_template_parms (parm))
mrs's avatar
mrs committed
6073
	{
6074 6075 6076 6077 6078 6079 6080 6081 6082 6083
	  tree type;

	  if (TREE_CODE_CLASS (TREE_CODE (arg)) != 't')
	    type = TREE_TYPE (arg);
	  else
	    {
	      type = arg;
	      arg = NULL_TREE;
	    }

6084
	  if (strict == DEDUCE_EXACT)
6085 6086 6087 6088 6089
	    {
	      if (comptypes (parm, type, 1))
		continue;
	    }
	  else
6090 6091 6092 6093
	    /* It might work; we shouldn't check now, because we might
	       get into infinite recursion.  Overload resolution will
	       handle it.  */
	    continue;
6094

mrs's avatar
mrs committed
6095 6096 6097
	  return 1;
	}
	
mrs's avatar
mrs committed
6098 6099 6100 6101 6102 6103 6104 6105 6106
#if 0
      if (TREE_CODE (arg) == VAR_DECL)
	arg = TREE_TYPE (arg);
      else if (TREE_CODE_CLASS (TREE_CODE (arg)) == 'e')
	arg = TREE_TYPE (arg);
#else
      if (TREE_CODE_CLASS (TREE_CODE (arg)) != 't')
	{
	  my_friendly_assert (TREE_TYPE (arg) != NULL_TREE, 293);
jason's avatar
jason committed
6107 6108
	  if (TREE_CODE (arg) == OVERLOAD
	      && TREE_CODE (OVL_FUNCTION (arg)) == TEMPLATE_DECL)
mrs's avatar
mrs committed
6109
	    {
6110
	      tree targs;
6111
	      tree arg_type;
mrs's avatar
mrs committed
6112 6113

	      /* Have to back unify here */
jason's avatar
jason committed
6114
	      arg = OVL_FUNCTION (arg);
6115 6116 6117
	      targs = make_scratch_vec (DECL_NTPARMS (arg));
	      arg_type = TREE_TYPE (arg);
	      maybe_adjust_types_for_deduction (strict, &parm, &arg_type);
6118
	      parm = expr_tree_cons (NULL_TREE, parm, NULL_TREE);
6119
	      arg_type = scratch_tree_cons (NULL_TREE, arg_type, NULL_TREE);
6120 6121
	      return 
		type_unification (DECL_INNERMOST_TEMPLATE_PARMS (arg), 
6122 6123
				  targs, arg_type, parm, NULL_TREE,
				  DEDUCE_EXACT, allow_incomplete); 
mrs's avatar
mrs committed
6124
	    }
mrs's avatar
mrs committed
6125 6126 6127
	  arg = TREE_TYPE (arg);
	}
#endif
6128 6129 6130 6131 6132 6133
      if (! flag_ansi && arg == TREE_TYPE (null_node))
	{
	  warning ("using type void* for NULL");
	  arg = ptr_type_node;
	}

6134 6135
      if (!subr)
	maybe_adjust_types_for_deduction (strict, &parm, &arg);
mrs's avatar
mrs committed
6136

6137
      switch (unify (tparms, targs, parm, arg, sub_strict,
6138
		     explicit_mask)) 
mrs's avatar
mrs committed
6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156
	{
	case 0:
	  break;
	case 1:
	  return 1;
	}
    }
  /* Fail if we've reached the end of the parm list, and more args
     are present, and the parm list isn't variadic.  */
  if (args && args != void_list_node && parms == void_list_node)
    return 1;
  /* Fail if parms are left and they don't have default values.	 */
  if (parms
      && parms != void_list_node
      && TREE_PURPOSE (parms) == NULL_TREE)
    return 1;
  if (!subr)
    for (i = 0; i < ntparms; i++)
6157
      if (TREE_VEC_ELT (targs, i) == NULL_TREE)
mrs's avatar
mrs committed
6158
	{
6159 6160
	  if (!allow_incomplete)
	    error ("incomplete type unification");
mrs's avatar
mrs committed
6161 6162 6163 6164 6165
	  return 2;
	}
  return 0;
}

6166 6167
/* Returns the level of DECL, which declares a template parameter.  */

mmitchel's avatar
mmitchel committed
6168
int
6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182
template_decl_level (decl)
     tree decl;
{
  switch (TREE_CODE (decl))
    {
    case TYPE_DECL:
    case TEMPLATE_DECL:
      return TEMPLATE_TYPE_LEVEL (TREE_TYPE (decl));

    case PARM_DECL:
      return TEMPLATE_PARM_LEVEL (DECL_INITIAL (decl));

    default:
      my_friendly_abort (0);
6183
      return 0;
6184 6185 6186
    }
}

6187 6188 6189
/* Decide whether ARG can be unified with PARM, considering only the
   cv-qualifiers of each type, given STRICT as documented for unify.
   Returns non-zero iff the unification is OK on that basis.*/
mrs's avatar
mrs committed
6190

6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221
int
check_cv_quals_for_unify (strict, arg, parm)
     int strict;
     tree arg;
     tree parm;
{
  return !((!(strict & UNIFY_ALLOW_MORE_CV_QUAL)
	    && (TYPE_READONLY (arg) < TYPE_READONLY (parm)
		|| TYPE_VOLATILE (arg) < TYPE_VOLATILE (parm)))
	   || (!(strict & UNIFY_ALLOW_LESS_CV_QUAL)
	       && (TYPE_READONLY (arg) > TYPE_READONLY (parm)
		   || TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm))));
}

/* Takes parameters as for type_unification.  Returns 0 if the
   type deduction suceeds, 1 otherwise.  The parameter STRICT is a
   bitwise or of the following flags:

     UNIFY_ALLOW_NONE:
       Require an exact match between PARM and ARG.
     UNIFY_ALLOW_MORE_CV_QUAL:
       Allow the deduced ARG to be more cv-qualified than ARG.
     UNIFY_ALLOW_LESS_CV_QUAL:
       Allow the deduced ARG to be less cv-qualified than ARG.
     UNIFY_ALLOW_DERIVED:
       Allow the deduced ARG to be a template base class of ARG,
       or a pointer to a template base class of the type pointed to by
       ARG.  */

int
unify (tparms, targs, parm, arg, strict, explicit_mask)
6222
     tree tparms, targs, parm, arg;
6223
     int strict;
6224
     int* explicit_mask;
mrs's avatar
mrs committed
6225 6226
{
  int idx;
6227
  tree targ;
6228
  tree tparm;
mrs's avatar
mrs committed
6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240

  /* I don't think this will do the right thing with respect to types.
     But the only case I've seen it in so far has been array bounds, where
     signedness is the only information lost, and I think that will be
     okay.  */
  while (TREE_CODE (parm) == NOP_EXPR)
    parm = TREE_OPERAND (parm, 0);

  if (arg == error_mark_node)
    return 1;
  if (arg == unknown_type_node)
    return 1;
6241 6242 6243 6244 6245
  /* If PARM uses template parameters, then we can't bail out here,
     even in ARG == PARM, since we won't record unifications for the
     template parameters.  We might need them if we're trying to
     figure out which of two things is more specialized.  */
  if (arg == parm && !uses_template_parms (parm))
mrs's avatar
mrs committed
6246 6247
    return 0;

6248 6249 6250
  /* Immediately reject some pairs that won't unify because of
     cv-qualification mismatches.  */
  if (TREE_CODE (arg) == TREE_CODE (parm)
6251
      && TREE_CODE_CLASS (TREE_CODE (arg)) == 't'
6252 6253 6254 6255 6256 6257
      /* We check the cv-qualifiers when unifying with template type
	 parameters below.  We want to allow ARG `const T' to unify with
	 PARM `T' for example, when computing which of two templates
	 is more specialized, for example.  */
      && TREE_CODE (arg) != TEMPLATE_TYPE_PARM
      && !check_cv_quals_for_unify (strict, arg, parm))
6258 6259
    return 1;

mrs's avatar
mrs committed
6260 6261
  switch (TREE_CODE (parm))
    {
6262 6263 6264 6265 6266 6267
    case TYPENAME_TYPE:
      /* In a type which contains a nested-name-specifier, template
	 argument values cannot be deduced for template parameters used
	 within the nested-name-specifier.  */
      return 0;

mrs's avatar
mrs committed
6268
    case TEMPLATE_TYPE_PARM:
6269
    case TEMPLATE_TEMPLATE_PARM:
6270 6271 6272 6273 6274 6275 6276
      tparm = TREE_VALUE (TREE_VEC_ELT (tparms, 0));

      if (TEMPLATE_TYPE_LEVEL (parm)
	  != template_decl_level (tparm))
	/* The PARM is not one we're trying to unify.  Just check
	   to see if it matches ARG.  */
	return (TREE_CODE (arg) == TREE_CODE (parm)
6277
		&& comptypes (parm, arg, 1)) ? 0 : 1;
6278
      idx = TEMPLATE_TYPE_IDX (parm);
6279
      targ = TREE_VEC_ELT (targs, idx);
6280
      tparm = TREE_VALUE (TREE_VEC_ELT (tparms, idx));
6281

6282
      /* Check for mixed types and values.  */
6283 6284 6285 6286
      if ((TREE_CODE (parm) == TEMPLATE_TYPE_PARM
	   && TREE_CODE (tparm) != TYPE_DECL)
	  || (TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM 
	      && TREE_CODE (tparm) != TEMPLATE_DECL))
6287 6288
	return 1;

6289 6290
      if (!strict && targ != NULL_TREE 
	  && explicit_mask && explicit_mask[idx])
6291 6292 6293 6294 6295
	/* An explicit template argument.  Don't even try to match
	   here; the overload resolution code will manage check to
	   see whether the call is legal.  */ 
	return 0;

6296
      if (TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM)
6297
	{
6298 6299 6300 6301
	  if (CLASSTYPE_TEMPLATE_INFO (parm))
	    {
	      /* We arrive here when PARM does not involve template 
		 specialization.  */
6302

6303 6304 6305
	      /* ARG must be constructed from a template class.  */
	      if (TREE_CODE (arg) != RECORD_TYPE || !CLASSTYPE_TEMPLATE_INFO (arg))
		return 1;
6306

6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318
	      {
		tree parmtmpl = CLASSTYPE_TI_TEMPLATE (parm);
		tree parmvec = CLASSTYPE_TI_ARGS (parm);
		tree argvec = CLASSTYPE_TI_ARGS (arg);
		tree argtmplvec
		  = DECL_INNERMOST_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (arg));
		int i;

		/* The parameter and argument roles have to be switched here 
		   in order to handle default arguments properly.  For example, 
		   template<template <class> class TT> void f(TT<int>) 
		   should be able to accept vector<int> which comes from 
6319
		   template <class T, class Allocator = allocator> 
6320 6321
		   class vector.  */

6322
		if (coerce_template_parms (argtmplvec, parmvec, parmtmpl, 1, 1)
6323 6324
		    == error_mark_node)
		  return 1;
6325
	  
6326 6327 6328 6329 6330 6331 6332 6333
		/* Deduce arguments T, i from TT<T> or TT<i>.  */
		for (i = 0; i < TREE_VEC_LENGTH (parmvec); ++i)
		  {
		    tree t = TREE_VEC_ELT (parmvec, i);
		    if (TREE_CODE (t) != TEMPLATE_TYPE_PARM
			&& TREE_CODE (t) != TEMPLATE_TEMPLATE_PARM
			&& TREE_CODE (t) != TEMPLATE_PARM_INDEX)
		      continue;
6334

6335
		    /* This argument can be deduced.  */
6336

6337 6338 6339
		    if (unify (tparms, targs, t, 
			       TREE_VEC_ELT (argvec, i), 
			       UNIFY_ALLOW_NONE, explicit_mask))
6340 6341
		      return 1;
		  }
6342
	      }
6343 6344 6345 6346 6347
	      arg = CLASSTYPE_TI_TEMPLATE (arg);
	    }
	}
      else
	{
6348 6349 6350 6351 6352 6353
	  /* If PARM is `const T' and ARG is only `int', we don't have
	     a match unless we are allowing additional qualification.
	     If ARG is `const int' and PARM is just `T' that's OK;
	     that binds `const int' to `T'.  */
	  if (!check_cv_quals_for_unify (strict | UNIFY_ALLOW_LESS_CV_QUAL, 
					 arg, parm))
6354 6355
	    return 1;

6356 6357 6358 6359 6360 6361
	  /* Consider the case where ARG is `const volatile int' and
	     PARM is `const T'.  Then, T should be `volatile int'.  */
	  arg = 
	    cp_build_type_variant (arg, 
				   TYPE_READONLY (arg) > TYPE_READONLY (parm),
				   TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm));
6362 6363 6364
	}

      /* Simple cases: Value already set, does match or doesn't.  */
6365 6366 6367
      if (targ != NULL_TREE 
	  && (comptypes (targ, arg, 1)
	      || (explicit_mask && explicit_mask[idx])))
6368
	return 0;
6369
      else if (targ)
6370
	return 1;
6371
      TREE_VEC_ELT (targs, idx) = arg;
6372 6373
      return 0;

jason's avatar
jason committed
6374
    case TEMPLATE_PARM_INDEX:
6375 6376 6377 6378 6379 6380 6381
      tparm = TREE_VALUE (TREE_VEC_ELT (tparms, 0));

      if (TEMPLATE_PARM_LEVEL (parm) 
	  != template_decl_level (tparm))
	/* The PARM is not one we're trying to unify.  Just check
	   to see if it matches ARG.  */
	return (TREE_CODE (arg) == TREE_CODE (parm)
6382
		&& cp_tree_equal (parm, arg) > 0) ? 0 : 1;
6383

jason's avatar
jason committed
6384
      idx = TEMPLATE_PARM_IDX (parm);
6385
      targ = TREE_VEC_ELT (targs, idx);
6386

6387
      if (targ)
mrs's avatar
mrs committed
6388
	{
6389
	  int i = (cp_tree_equal (targ, arg) > 0);
mrs's avatar
mrs committed
6390 6391 6392 6393 6394 6395
	  if (i == 1)
	    return 0;
	  else if (i == 0)
	    return 1;
	  else
	    my_friendly_abort (42);
mrs's avatar
mrs committed
6396 6397
	}

6398
      TREE_VEC_ELT (targs, idx) = copy_to_permanent (arg);
mrs's avatar
mrs committed
6399 6400 6401
      return 0;

    case POINTER_TYPE:
6402 6403
      {
	int sub_strict;
mrs's avatar
mrs committed
6404

6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437
	if (TREE_CODE (arg) == RECORD_TYPE && TYPE_PTRMEMFUNC_FLAG (arg))
	  return (unify (tparms, targs, parm, 
			 TYPE_PTRMEMFUNC_FN_TYPE (arg), strict,
			 explicit_mask)); 
	
	if (TREE_CODE (arg) != POINTER_TYPE)
	  return 1;
	
	/* [temp.deduct.call]

	   A can be another pointer or pointer to member type that can
	   be converted to the deduced A via a qualification
	   conversion (_conv.qual_).

	   We pass down STRICT here rather than UNIFY_ALLOW_NONE.
	   This will allow for additional cv-qualification of the
	   pointed-to types if appropriate.  In general, this is a bit
	   too generous; we are only supposed to allow qualification
	   conversions and this method will allow an ARG of char** and
	   a deduced ARG of const char**.  However, overload
	   resolution will subsequently invalidate the candidate, so
	   this is probably OK.  */
	sub_strict = strict;
	
	if (TREE_CODE (TREE_TYPE (arg)) != RECORD_TYPE
	    || TYPE_PTRMEMFUNC_FLAG (TREE_TYPE (arg)))
	  /* The derived-to-base conversion only persists through one
	     level of pointers.  */
	  sub_strict &= ~UNIFY_ALLOW_DERIVED;

	return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE
		      (arg), sub_strict,  explicit_mask);
      }
mrs's avatar
mrs committed
6438 6439

    case REFERENCE_TYPE:
6440 6441 6442 6443
      if (TREE_CODE (arg) != REFERENCE_TYPE)
	return 1;
      return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
		    UNIFY_ALLOW_NONE, explicit_mask);
mrs's avatar
mrs committed
6444 6445 6446 6447

    case ARRAY_TYPE:
      if (TREE_CODE (arg) != ARRAY_TYPE)
	return 1;
6448 6449 6450 6451
      if ((TYPE_DOMAIN (parm) == NULL_TREE)
	  != (TYPE_DOMAIN (arg) == NULL_TREE))
	return 1;
      if (TYPE_DOMAIN (parm) != NULL_TREE
6452 6453
	  && unify (tparms, targs, TYPE_DOMAIN (parm),
		    TYPE_DOMAIN (arg), UNIFY_ALLOW_NONE, explicit_mask) != 0)
mrs's avatar
mrs committed
6454
	return 1;
6455 6456
      return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
		    UNIFY_ALLOW_NONE, explicit_mask);
mrs's avatar
mrs committed
6457 6458

    case REAL_TYPE:
mrs's avatar
mrs committed
6459
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
6460
    case INTEGER_TYPE:
brendan's avatar
brendan committed
6461
    case BOOLEAN_TYPE:
6462
    case VOID_TYPE:
mrs's avatar
mrs committed
6463 6464 6465 6466
      if (TREE_CODE (arg) != TREE_CODE (parm))
	return 1;

      if (TREE_CODE (parm) == INTEGER_TYPE)
mrs's avatar
mrs committed
6467 6468
	{
	  if (TYPE_MIN_VALUE (parm) && TYPE_MIN_VALUE (arg)
6469 6470
	      && unify (tparms, targs, TYPE_MIN_VALUE (parm),
			TYPE_MIN_VALUE (arg), UNIFY_ALLOW_NONE, explicit_mask))
mrs's avatar
mrs committed
6471 6472
	    return 1;
	  if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg)
6473 6474
	      && unify (tparms, targs, TYPE_MAX_VALUE (parm),
			TYPE_MAX_VALUE (arg), UNIFY_ALLOW_NONE, explicit_mask))
mrs's avatar
mrs committed
6475 6476
	    return 1;
	}
6477
      else if (TREE_CODE (parm) == REAL_TYPE
6478 6479 6480 6481 6482
	       /* We use the TYPE_MAIN_VARIANT since we have already
		  checked cv-qualification at the top of the
		  function.  */
	       && !comptypes (TYPE_MAIN_VARIANT (arg),
			      TYPE_MAIN_VARIANT (parm), 1))
6483 6484
	return 1;

mrs's avatar
mrs committed
6485 6486 6487 6488 6489
      /* As far as unification is concerned, this wins.	 Later checks
	 will invalidate it if necessary.  */
      return 0;

      /* Types INTEGER_CST and MINUS_EXPR can come from array bounds.  */
mrs's avatar
mrs committed
6490
      /* Type INTEGER_CST can come from ordinary constant template args.  */
mrs's avatar
mrs committed
6491
    case INTEGER_CST:
mrs's avatar
mrs committed
6492 6493 6494
      while (TREE_CODE (arg) == NOP_EXPR)
	arg = TREE_OPERAND (arg, 0);

mrs's avatar
mrs committed
6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506
      if (TREE_CODE (arg) != INTEGER_CST)
	return 1;
      return !tree_int_cst_equal (parm, arg);

    case TREE_VEC:
      {
	int i;
	if (TREE_CODE (arg) != TREE_VEC)
	  return 1;
	if (TREE_VEC_LENGTH (parm) != TREE_VEC_LENGTH (arg))
	  return 1;
	for (i = TREE_VEC_LENGTH (parm) - 1; i >= 0; i--)
6507
	  if (unify (tparms, targs,
mrs's avatar
mrs committed
6508
		     TREE_VEC_ELT (parm, i), TREE_VEC_ELT (arg, i),
6509
		     UNIFY_ALLOW_NONE, explicit_mask))
mrs's avatar
mrs committed
6510 6511 6512 6513 6514
	    return 1;
	return 0;
      }

    case RECORD_TYPE:
mrs's avatar
mrs committed
6515
      if (TYPE_PTRMEMFUNC_FLAG (parm))
6516
	return unify (tparms, targs, TYPE_PTRMEMFUNC_FN_TYPE (parm),
6517
		      arg, strict, explicit_mask);
mrs's avatar
mrs committed
6518

6519
      if (TREE_CODE (arg) != RECORD_TYPE)
mrs's avatar
mrs committed
6520
	return 1;
6521
  
mrs's avatar
mrs committed
6522
      if (CLASSTYPE_TEMPLATE_INFO (parm) && uses_template_parms (parm))
mrs's avatar
mrs committed
6523
	{
mrs's avatar
mrs committed
6524
	  tree t = NULL_TREE;
6525 6526 6527 6528 6529 6530 6531 6532
	  if (strict & UNIFY_ALLOW_DERIVED)
	    /* [temp.deduct.call]

	       If P is a class, and P has the form template-id, then A
	       can be a derived class of the deduced A.  Likewise, if
	       P is a pointer to a class of the form template-id, A
	       can be a pointer to a derived class pointed to by the
	       deduced A.  */
mrs's avatar
mrs committed
6533
	    t = get_template_base (CLASSTYPE_TI_TEMPLATE (parm), arg);
mrs's avatar
mrs committed
6534 6535 6536
	  else if
	    (CLASSTYPE_TEMPLATE_INFO (arg)
	     && CLASSTYPE_TI_TEMPLATE (parm) == CLASSTYPE_TI_TEMPLATE (arg))
mrs's avatar
mrs committed
6537 6538
	    t = arg;
	  if (! t || t == error_mark_node)
mrs's avatar
mrs committed
6539
	    return 1;
mrs's avatar
mrs committed
6540

6541 6542 6543
	  return unify (tparms, targs, CLASSTYPE_TI_ARGS (parm),
			CLASSTYPE_TI_ARGS (t), UNIFY_ALLOW_NONE,
			explicit_mask);
mrs's avatar
mrs committed
6544
	}
6545 6546
      else if (!comptypes (TYPE_MAIN_VARIANT (parm),
			   TYPE_MAIN_VARIANT (arg), 1))
mrs's avatar
mrs committed
6547
	return 1;
mrs's avatar
mrs committed
6548
      return 0;
mrs's avatar
mrs committed
6549 6550 6551

    case METHOD_TYPE:
    case FUNCTION_TYPE:
6552
      if (TREE_CODE (arg) != TREE_CODE (parm))
mrs's avatar
mrs committed
6553
	return 1;
6554 6555 6556

      if (unify (tparms, targs, TREE_TYPE (parm),
		 TREE_TYPE (arg), UNIFY_ALLOW_NONE, explicit_mask))
mrs's avatar
mrs committed
6557
	return 1;
6558
      return type_unification_real (tparms, targs, TYPE_ARG_TYPES (parm),
6559
				    TYPE_ARG_TYPES (arg), 1, 
6560
				    DEDUCE_EXACT, 0, explicit_mask);
mrs's avatar
mrs committed
6561 6562 6563 6564

    case OFFSET_TYPE:
      if (TREE_CODE (arg) != OFFSET_TYPE)
	return 1;
6565 6566
      if (unify (tparms, targs, TYPE_OFFSET_BASETYPE (parm),
		 TYPE_OFFSET_BASETYPE (arg), UNIFY_ALLOW_NONE, explicit_mask))
mrs's avatar
mrs committed
6567
	return 1;
6568 6569
      return unify (tparms, targs, TREE_TYPE (parm), TREE_TYPE (arg),
		    UNIFY_ALLOW_NONE, explicit_mask);
mrs's avatar
mrs committed
6570

jason's avatar
merge  
jason committed
6571
    case CONST_DECL:
6572
      if (arg != decl_constant_value (parm)) 
jason's avatar
merge  
jason committed
6573 6574 6575
	return 1;
      return 0;

6576 6577 6578 6579
    case TEMPLATE_DECL:
      /* Matched cases are handled by the ARG == PARM test above.  */
      return 1;

mrs's avatar
mrs committed
6580
    default:
6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619
      if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (parm))))
	{
	  /* We're looking at an expression.  This can happen with
	     something like:

	       template <int I>
	       void foo(S<I>, S<I + 2>);

             If the call looked like:

               foo(S<2>(), S<4>());

	     we would have already matched `I' with `2'.  Now, we'd
	     like to know if `4' matches `I + 2'.  So, we substitute
	     into that expression, and fold constants, in the hope of
	     figuring it out.  */
	  tree t = 
	    maybe_fold_nontype_arg (tsubst_expr (parm, targs, NULL_TREE)); 
	  enum tree_code tc = TREE_CODE (t);

	  if (tc == MINUS_EXPR 
	      && TREE_CODE (TREE_OPERAND (t, 0)) == TEMPLATE_PARM_INDEX
	      && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST)
	    {
	      /* We handle this case specially, since it comes up with
		 arrays.  In particular, something like:

		 template <int N> void f(int (&x)[N]);

		 Here, we are trying to unify the range type, which
		 looks like [0 ... (N - 1)].  */
	      tree t1, t2;
	      t1 = TREE_OPERAND (parm, 0);
	      t2 = TREE_OPERAND (parm, 1);

	      t = maybe_fold_nontype_arg (build (PLUS_EXPR,
						 integer_type_node,
						 arg, t2));

6620 6621
	      return unify (tparms, targs, t1, t, UNIFY_ALLOW_NONE,
			    explicit_mask);
6622 6623 6624 6625
	    }

	  if (!IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (tc)))
	    /* Good, we mangaged to simplify the exression.  */
6626
	    return unify (tparms, targs, t, arg, UNIFY_ALLOW_NONE,
6627 6628 6629 6630 6631 6632 6633
			  explicit_mask);
	  else
	    /* Bad, we couldn't simplify this.  Assume it doesn't
	       unify.  */
	    return 1;
	}
      else
6634 6635
	sorry ("use of `%s' in template type unification",
	       tree_code_name [(int) TREE_CODE (parm)]);
6636

mrs's avatar
mrs committed
6637 6638 6639 6640
      return 1;
    }
}

mrs's avatar
mrs committed
6641
void
mrs's avatar
mrs committed
6642
mark_decl_instantiated (result, extern_p)
mrs's avatar
mrs committed
6643 6644 6645 6646 6647
     tree result;
     int extern_p;
{
  if (DECL_TEMPLATE_INSTANTIATION (result))
    SET_DECL_EXPLICIT_INSTANTIATION (result);
6648 6649 6650 6651 6652

  if (TREE_CODE (result) != FUNCTION_DECL)
    /* The TREE_PUBLIC flag for function declarations will have been
       set correctly by tsubst.  */
    TREE_PUBLIC (result) = 1;
mrs's avatar
mrs committed
6653 6654 6655 6656 6657

  if (! extern_p)
    {
      DECL_INTERFACE_KNOWN (result) = 1;
      DECL_NOT_REALLY_EXTERN (result) = 1;
6658 6659 6660

      /* For WIN32 we also want to put explicit instantiations in
	 linkonce sections.  */
6661 6662
      if (TREE_PUBLIC (result))
	maybe_make_one_only (result);
mrs's avatar
mrs committed
6663
    }
mrs's avatar
mrs committed
6664 6665
  else if (TREE_CODE (result) == FUNCTION_DECL)
    mark_inline_for_output (result);
mrs's avatar
mrs committed
6666 6667
}

6668 6669
/* Given two function templates PAT1 and PAT2, and explicit template
   arguments EXPLICIT_ARGS return:
mrs's avatar
mrs committed
6670 6671 6672 6673 6674 6675

   1 if PAT1 is more specialized than PAT2 as described in [temp.func.order].
   -1 if PAT2 is more specialized than PAT1.
   0 if neither is more specialized.  */
   
int
6676 6677
more_specialized (pat1, pat2, explicit_args)
     tree pat1, pat2, explicit_args;
mrs's avatar
mrs committed
6678
{
6679
  tree targs;
mrs's avatar
mrs committed
6680
  int winner = 0;
mrs's avatar
mrs committed
6681

6682
  targs = get_bindings_overload (pat1, pat2, explicit_args);
mrs's avatar
mrs committed
6683 6684 6685 6686
  if (targs)
    {
      --winner;
    }
mrs's avatar
mrs committed
6687

6688
  targs = get_bindings_overload (pat2, pat1, explicit_args);
mrs's avatar
mrs committed
6689 6690 6691 6692
  if (targs)
    {
      ++winner;
    }
mrs's avatar
mrs committed
6693

mrs's avatar
mrs committed
6694 6695
  return winner;
}
mrs's avatar
mrs committed
6696

mrs's avatar
mrs committed
6697
/* Given two class template specialization list nodes PAT1 and PAT2, return:
mrs's avatar
mrs committed
6698

mrs's avatar
mrs committed
6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710
   1 if PAT1 is more specialized than PAT2 as described in [temp.class.order].
   -1 if PAT2 is more specialized than PAT1.
   0 if neither is more specialized.  */
   
int
more_specialized_class (pat1, pat2)
     tree pat1, pat2;
{
  tree targs;
  int winner = 0;

  targs = get_class_bindings
6711 6712
    (TREE_VALUE (pat1), TREE_PURPOSE (pat1),
     TREE_PURPOSE (pat2), NULL_TREE);
mrs's avatar
mrs committed
6713 6714 6715 6716
  if (targs)
    --winner;

  targs = get_class_bindings
6717 6718
    (TREE_VALUE (pat2), TREE_PURPOSE (pat2),
     TREE_PURPOSE (pat1), NULL_TREE);
mrs's avatar
mrs committed
6719
  if (targs)
mrs's avatar
mrs committed
6720 6721 6722 6723
    ++winner;

  return winner;
}
mrs's avatar
mrs committed
6724 6725

/* Return the template arguments that will produce the function signature
6726
   DECL from the function template FN, with the explicit template
6727 6728
   arguments EXPLICIT_ARGS.  If CHECK_RETTYPE is 1, the return type must
   also match.  */
mrs's avatar
mrs committed
6729

6730 6731
static tree
get_bindings_real (fn, decl, explicit_args, check_rettype)
6732
     tree fn, decl, explicit_args;
6733
     int check_rettype;
mrs's avatar
mrs committed
6734
{
6735
  int ntparms = DECL_NTPARMS (fn);
6736
  tree targs = make_scratch_vec (ntparms);
6737 6738
  tree decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
  tree extra_fn_arg = NULL_TREE;
6739 6740
  int i;

6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760
  if (DECL_STATIC_FUNCTION_P (fn) 
      && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
    {
      /* Sometimes we are trying to figure out what's being
	 specialized by a declaration that looks like a method, and it
	 turns out to be a static member function.  */
      if (CLASSTYPE_TEMPLATE_INFO (DECL_REAL_CONTEXT (fn))
	  && !is_member_template (fn))
	/* The natural thing to do here seems to be to remove the
	   spurious `this' parameter from the DECL, but that prevents
	   unification from making use of the class type.  So,
	   instead, we have fn_type_unification add to the parameters
	   for FN.  */
	extra_fn_arg = build_pointer_type (DECL_REAL_CONTEXT (fn));
      else
	/* In this case, though, adding the extra_fn_arg can confuse
	   things, so we remove from decl_arg_types instead.  */
	decl_arg_types = TREE_CHAIN (decl_arg_types);
    }

6761
  i = fn_type_unification (fn, explicit_args, targs, 
6762
			   decl_arg_types,
6763
			   TREE_TYPE (TREE_TYPE (decl)),
6764
			   DEDUCE_EXACT,
6765
			   extra_fn_arg);
6766

6767 6768 6769 6770
  if (i != 0)
    return NULL_TREE;

  if (check_rettype)
6771 6772
    {
      /* Check to see that the resulting return type is also OK.  */
6773 6774 6775
      tree t = tsubst (TREE_TYPE (TREE_TYPE (fn)),
		       complete_template_args (fn, targs, 1),
		       NULL_TREE);
6776

jason's avatar
jason committed
6777
      if (!comptypes (t, TREE_TYPE (TREE_TYPE (decl)), 1))
6778 6779 6780
	return NULL_TREE;
    }

6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799
  return targs;
}

/* For most uses, we want to check the return type.  */

tree 
get_bindings (fn, decl, explicit_args)
     tree fn, decl, explicit_args;
{
  return get_bindings_real (fn, decl, explicit_args, 1);
}

/* But for more_specialized, we only care about the parameter types.  */

static tree
get_bindings_overload (fn, decl, explicit_args)
     tree fn, decl, explicit_args;
{
  return get_bindings_real (fn, decl, explicit_args, 0);
mrs's avatar
mrs committed
6800 6801
}

mrs's avatar
mrs committed
6802
static tree
6803 6804
get_class_bindings (tparms, parms, args, outer_args)
     tree tparms, parms, args, outer_args;
mrs's avatar
mrs committed
6805
{
6806
  int i, ntparms = TREE_VEC_LENGTH (tparms);
mrs's avatar
mrs committed
6807 6808
  tree vec = make_temp_vec (ntparms);

6809 6810 6811 6812 6813 6814
  if (outer_args)
    {
      tparms = tsubst (tparms, outer_args, NULL_TREE);
      parms = tsubst (parms, outer_args, NULL_TREE);
    }

mrs's avatar
mrs committed
6815 6816
  for (i = 0; i < TREE_VEC_LENGTH (parms); ++i)
    {
6817
      switch (unify (tparms, vec, 
6818
		     TREE_VEC_ELT (parms, i), TREE_VEC_ELT (args, i),
6819
		     UNIFY_ALLOW_NONE, 0))
mrs's avatar
mrs committed
6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835
	{
	case 0:
	  break;
	case 1:
	  return NULL_TREE;
	}
    }

  for (i =  0; i < ntparms; ++i)
    if (! TREE_VEC_ELT (vec, i))
      return NULL_TREE;

  return vec;
}

/* Return the most specialized of the list of templates in FNS that can
6836 6837
   produce an instantiation matching DECL, given the explicit template
   arguments EXPLICIT_ARGS.  */
mrs's avatar
mrs committed
6838 6839

tree
6840 6841
most_specialized (fns, decl, explicit_args)
     tree fns, decl, explicit_args;
mrs's avatar
mrs committed
6842
{
6843
  tree fn, champ, args, *p;
mrs's avatar
mrs committed
6844 6845 6846 6847
  int fate;

  for (p = &fns; *p; )
    {
6848
      args = get_bindings (TREE_VALUE (*p), decl, explicit_args);
mrs's avatar
mrs committed
6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864
      if (args)
	{
	  p = &TREE_CHAIN (*p);
	}
      else
	*p = TREE_CHAIN (*p);
    }

  if (! fns)
    return NULL_TREE;

  fn = fns;
  champ = TREE_VALUE (fn);
  fn = TREE_CHAIN (fn);
  for (; fn; fn = TREE_CHAIN (fn))
    {
6865
      fate = more_specialized (champ, TREE_VALUE (fn), explicit_args);
mrs's avatar
mrs committed
6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881
      if (fate == 1)
	;
      else
	{
	  if (fate == 0)
	    {
	      fn = TREE_CHAIN (fn);
	      if (! fn)
		return error_mark_node;
	    }
	  champ = TREE_VALUE (fn);
	}
    }

  for (fn = fns; fn && TREE_VALUE (fn) != champ; fn = TREE_CHAIN (fn))
    {
6882
      fate = more_specialized (champ, TREE_VALUE (fn), explicit_args);
mrs's avatar
mrs committed
6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893
      if (fate != 1)
	return error_mark_node;
    }

  return champ;
}

/* Return the most specialized of the class template specializations in
   SPECS that can produce an instantiation matching ARGS.  */

tree
6894 6895
most_specialized_class (specs, mainargs, outer_args)
     tree specs, mainargs, outer_args;
mrs's avatar
mrs committed
6896 6897 6898 6899 6900 6901
{
  tree list = NULL_TREE, t, args, champ;
  int fate;

  for (t = specs; t; t = TREE_CHAIN (t))
    {
6902 6903
      args = get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
				 mainargs, outer_args);
mrs's avatar
mrs committed
6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935
      if (args)
	{
	  list = decl_tree_cons (TREE_PURPOSE (t), TREE_VALUE (t), list);
	  TREE_TYPE (list) = TREE_TYPE (t);
	}
    }

  if (! list)
    return NULL_TREE;

  t = list;
  champ = t;
  t = TREE_CHAIN (t);
  for (; t; t = TREE_CHAIN (t))
    {
      fate = more_specialized_class (champ, t);
      if (fate == 1)
	;
      else
	{
	  if (fate == 0)
	    {
	      t = TREE_CHAIN (t);
	      if (! t)
		return error_mark_node;
	    }
	  champ = t;
	}
    }

  for (t = list; t && t != champ; t = TREE_CHAIN (t))
    {
6936
      fate = more_specialized_class (champ, t);
mrs's avatar
mrs committed
6937 6938 6939 6940 6941 6942 6943
      if (fate != 1)
	return error_mark_node;
    }

  return champ;
}

mrs's avatar
mrs committed
6944
/* called from the parser.  */
mrs's avatar
mrs committed
6945

mrs's avatar
mrs committed
6946
void
mrs's avatar
mrs committed
6947
do_decl_instantiation (declspecs, declarator, storage)
mrs's avatar
mrs committed
6948
     tree declspecs, declarator, storage;
mrs's avatar
mrs committed
6949
{
mrs's avatar
merging  
mrs committed
6950
  tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0, NULL_TREE);
mrs's avatar
mrs committed
6951
  tree result = NULL_TREE;
mrs's avatar
mrs committed
6952
  int extern_p = 0;
mrs's avatar
mrs committed
6953

mrs's avatar
mrs committed
6954 6955 6956 6957 6958 6959
  if (! DECL_LANG_SPECIFIC (decl))
    {
      cp_error ("explicit instantiation of non-template `%#D'", decl);
      return;
    }

mrs's avatar
mrs committed
6960
  /* If we've already seen this template instance, use it.  */
mrs's avatar
mrs committed
6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971
  if (TREE_CODE (decl) == VAR_DECL)
    {
      result = lookup_field (DECL_CONTEXT (decl), DECL_NAME (decl), 0, 0);
      if (result && TREE_CODE (result) != VAR_DECL)
	result = NULL_TREE;
    }
  else if (TREE_CODE (decl) != FUNCTION_DECL)
    {
      cp_error ("explicit instantiation of `%#D'", decl);
      return;
    }
6972 6973
  else if (DECL_TEMPLATE_INSTANTIATION (decl))
    result = decl;
6974

mrs's avatar
mrs committed
6975
  if (! result)
mrs's avatar
mrs committed
6976 6977 6978 6979
    {
      cp_error ("no matching template for `%D' found", decl);
      return;
    }
mrs's avatar
mrs committed
6980

mrs's avatar
mrs committed
6981 6982 6983 6984 6985 6986
  if (! DECL_TEMPLATE_INFO (result))
    {
      cp_pedwarn ("explicit instantiation of non-template `%#D'", result);
      return;
    }

mrs's avatar
mrs committed
6987 6988 6989
  if (flag_external_templates)
    return;

mrs's avatar
mrs committed
6990
  if (storage == NULL_TREE)
mrs's avatar
mrs committed
6991
    ;
mrs's avatar
mrs committed
6992 6993
  else if (storage == ridpointers[(int) RID_EXTERN])
    extern_p = 1;
mrs's avatar
mrs committed
6994 6995 6996
  else
    cp_error ("storage class `%D' applied to template instantiation",
	      storage);
mrs's avatar
mrs committed
6997 6998

  mark_decl_instantiated (result, extern_p);
mrs's avatar
mrs committed
6999
  repo_template_instantiated (result, extern_p);
mrs's avatar
mrs committed
7000 7001
  if (! extern_p)
    instantiate_decl (result);
mrs's avatar
mrs committed
7002 7003
}

mrs's avatar
mrs committed
7004 7005 7006 7007 7008 7009
void
mark_class_instantiated (t, extern_p)
     tree t;
     int extern_p;
{
  SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
7010 7011
  SET_CLASSTYPE_INTERFACE_KNOWN (t);
  CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
mrs's avatar
mrs committed
7012 7013 7014 7015 7016 7017 7018 7019
  CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p;
  TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p;
  if (! extern_p)
    {
      CLASSTYPE_DEBUG_REQUESTED (t) = 1;
      rest_of_type_compilation (t, 1);
    }
}     
mrs's avatar
mrs committed
7020

mrs's avatar
mrs committed
7021
void
7022 7023
do_type_instantiation (t, storage)
     tree t, storage;
mrs's avatar
mrs committed
7024
{
mrs's avatar
mrs committed
7025 7026
  int extern_p = 0;
  int nomem_p = 0;
mrs's avatar
mrs committed
7027 7028
  int static_p = 0;

7029 7030 7031 7032 7033 7034 7035 7036 7037
  if (TREE_CODE (t) == TYPE_DECL)
    t = TREE_TYPE (t);

  if (! IS_AGGR_TYPE (t) || ! CLASSTYPE_TEMPLATE_INFO (t))
    {
      cp_error ("explicit instantiation of non-template type `%T'", t);
      return;
    }

mrs's avatar
mrs committed
7038
  complete_type (t);
mrs's avatar
mrs committed
7039

mrs's avatar
mrs committed
7040 7041
  /* With -fexternal-templates, explicit instantiations are treated the same
     as implicit ones.  */
mrs's avatar
mrs committed
7042 7043 7044
  if (flag_external_templates)
    return;

mrs's avatar
mrs committed
7045 7046 7047 7048 7049 7050 7051 7052
  if (TYPE_SIZE (t) == NULL_TREE)
    {
      cp_error ("explicit instantiation of `%#T' before definition of template",
		t);
      return;
    }

  if (storage == NULL_TREE)
mrs's avatar
mrs committed
7053 7054 7055
    /* OK */;
  else if (storage == ridpointers[(int) RID_INLINE])
    nomem_p = 1;
mrs's avatar
mrs committed
7056 7057
  else if (storage == ridpointers[(int) RID_EXTERN])
    extern_p = 1;
mrs's avatar
mrs committed
7058 7059
  else if (storage == ridpointers[(int) RID_STATIC])
    static_p = 1;
mrs's avatar
mrs committed
7060 7061 7062 7063 7064 7065 7066
  else
    {
      cp_error ("storage class `%D' applied to template instantiation",
		storage);
      extern_p = 0;
    }

mrs's avatar
mrs committed
7067
  /* We've already instantiated this.  */
mrs's avatar
mrs committed
7068 7069 7070
  if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && ! CLASSTYPE_INTERFACE_ONLY (t)
      && extern_p)
    return;
mrs's avatar
mrs committed
7071

mrs's avatar
mrs committed
7072
  if (! CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
mrs's avatar
mrs committed
7073 7074 7075 7076
    {
      mark_class_instantiated (t, extern_p);
      repo_template_instantiated (t, extern_p);
    }
mrs's avatar
mrs committed
7077 7078 7079 7080

  if (nomem_p)
    return;

mrs's avatar
mrs committed
7081
  {
mrs's avatar
mrs committed
7082
    tree tmp;
mrs's avatar
mrs committed
7083 7084 7085

    if (! static_p)
      for (tmp = TYPE_METHODS (t); tmp; tmp = TREE_CHAIN (tmp))
7086
	if (TREE_CODE (tmp) == FUNCTION_DECL
7087
	    && DECL_TEMPLATE_INSTANTIATION (tmp))
mrs's avatar
mrs committed
7088 7089 7090 7091 7092 7093 7094 7095 7096
	  {
	    mark_decl_instantiated (tmp, extern_p);
	    repo_template_instantiated (tmp, extern_p);
	    if (! extern_p)
	      instantiate_decl (tmp);
	  }

    for (tmp = TYPE_FIELDS (t); tmp; tmp = TREE_CHAIN (tmp))
      if (TREE_CODE (tmp) == VAR_DECL && DECL_TEMPLATE_INSTANTIATION (tmp))
mrs's avatar
mrs committed
7097
	{
mrs's avatar
mrs committed
7098
	  mark_decl_instantiated (tmp, extern_p);
mrs's avatar
mrs committed
7099
	  repo_template_instantiated (tmp, extern_p);
mrs's avatar
mrs committed
7100 7101
	  if (! extern_p)
	    instantiate_decl (tmp);
mrs's avatar
mrs committed
7102
	}
mrs's avatar
mrs committed
7103

mrs's avatar
mrs committed
7104
    for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp))
mrs's avatar
mrs committed
7105 7106
      if (IS_AGGR_TYPE (TREE_VALUE (tmp)))
	do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage);
mrs's avatar
mrs committed
7107
  }
mrs's avatar
mrs committed
7108
}
mrs's avatar
mrs committed
7109

7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178
/* Given a function DECL, which is a specialization of TEMP, modify
   DECL to be a re-instantiation of TEMPL with the same template
   arguments.

   One reason for doing this is a scenario like this:

     template <class T>
     void f(const T&, int i);

     void g() { f(3, 7); }

     template <class T>
     void f(const T& t, const int i) { }

   Note that when the template is first instantiated, with
   instantiate_template, the resulting DECL will have no name for the
   first parameter, and the wrong type for the second.  So, when we go
   to instantiate the DECL, we regenerate it.  */

void
regenerate_decl_from_template (decl, tmpl)
     tree decl;
     tree tmpl;
{
  tree args;
  tree save_ti;
  tree code_pattern;
  tree new_decl;

  args = DECL_TI_ARGS (decl);
  code_pattern = DECL_TEMPLATE_RESULT (tmpl);

  /* Trick tsubst into giving us a new decl.  CODE_PATTERN must be the
     most distant ancestor of DECL, since that's the one that will
     actually be altered by a redefinition.  */
  save_ti = DECL_TEMPLATE_INFO (code_pattern);
  DECL_TEMPLATE_INFO (code_pattern) = NULL_TREE;
  new_decl = tsubst (code_pattern, args, NULL_TREE);
  SET_DECL_IMPLICIT_INSTANTIATION (new_decl);
  DECL_TEMPLATE_INFO (code_pattern) = save_ti;

  if (TREE_CODE (decl) == VAR_DECL)
    {
      /* Set up DECL_INITIAL, since tsubst doesn't.  */
      pushclass (DECL_CONTEXT (decl), 2);
      DECL_INITIAL (new_decl) = 
	tsubst_expr (DECL_INITIAL (code_pattern), args, 
		     DECL_TI_TEMPLATE (decl));
      popclass (1);
    }

  if (TREE_CODE (decl) == FUNCTION_DECL)
    {
      /* Convince duplicate_decls to use the DECL_ARGUMENTS from the
	 new decl.  */ 
      DECL_INITIAL (new_decl) = error_mark_node;

      if (DECL_TEMPLATE_SPECIALIZATION (new_decl) 
	  && !DECL_TEMPLATE_INFO (new_decl))
	/* Set up the information about what is being specialized. */
	DECL_TEMPLATE_INFO (new_decl) = DECL_TEMPLATE_INFO (decl);
    }

  duplicate_decls (new_decl, decl);

  if (TREE_CODE (decl) == FUNCTION_DECL)
    DECL_INITIAL (new_decl) = NULL_TREE;
}

jason's avatar
jason committed
7179 7180
/* Produce the definition of D, a _DECL generated from a template.  */

mrs's avatar
mrs committed
7181
tree
mrs's avatar
mrs committed
7182 7183
instantiate_decl (d)
     tree d;
mrs's avatar
mrs committed
7184
{
mrs's avatar
mrs committed
7185 7186 7187
  tree ti = DECL_TEMPLATE_INFO (d);
  tree tmpl = TI_TEMPLATE (ti);
  tree args = TI_ARGS (ti);
7188
  tree td;
jason's avatar
jason committed
7189
  tree decl_pattern, code_pattern;
mrs's avatar
mrs committed
7190 7191 7192
  int nested = in_function_p ();
  int d_defined;
  int pattern_defined;
mrs's avatar
mrs committed
7193 7194
  int line = lineno;
  char *file = input_filename;
mrs's avatar
mrs committed
7195

jason's avatar
jason committed
7196 7197 7198 7199 7200 7201 7202 7203 7204
  for (td = tmpl; 
       DECL_TEMPLATE_INSTANTIATION (td) 
	 /* This next clause handles friend templates defined inside
	    class templates.  The friend templates are not really
	    instantiations from the point of view of the language, but
	    they are instantiations from the point of view of the
	    compiler.  */
	 || (DECL_TEMPLATE_INFO (td) && !DECL_TEMPLATE_SPECIALIZATION (td)); 
       )
jason's avatar
jason committed
7205
    td = DECL_TI_TEMPLATE (td);
7206

jason's avatar
jason committed
7207 7208 7209 7210 7211
  /* In the case of a member template, decl_pattern is the partially
     instantiated declaration (in the instantiated class), and code_pattern
     is the original template definition.  */
  decl_pattern = DECL_TEMPLATE_RESULT (tmpl);
  code_pattern = DECL_TEMPLATE_RESULT (td);
7212

mrs's avatar
mrs committed
7213 7214 7215
  if (TREE_CODE (d) == FUNCTION_DECL)
    {
      d_defined = (DECL_INITIAL (d) != NULL_TREE);
jason's avatar
jason committed
7216
      pattern_defined = (DECL_INITIAL (code_pattern) != NULL_TREE);
mrs's avatar
mrs committed
7217 7218 7219 7220
    }
  else
    {
      d_defined = ! DECL_IN_AGGR_P (d);
jason's avatar
jason committed
7221
      pattern_defined = ! DECL_IN_AGGR_P (code_pattern);
mrs's avatar
mrs committed
7222 7223 7224 7225
    }

  if (d_defined)
    return d;
mrs's avatar
mrs committed
7226

7227 7228
  if (TREE_CODE (d) == FUNCTION_DECL) 
    {
7229 7230 7231 7232 7233
      tree spec = retrieve_specialization (tmpl, args);
      
      if (spec != NULL_TREE 
	  && DECL_TEMPLATE_SPECIALIZATION (spec))
	return spec;
7234 7235
    }

mrs's avatar
mrs committed
7236 7237 7238 7239 7240 7241 7242 7243 7244
  /* This needs to happen before any tsubsting.  */
  if (! push_tinst_level (d))
    return d;

  push_to_top_level ();
  lineno = DECL_SOURCE_LINE (d);
  input_filename = DECL_SOURCE_FILE (d);

  if (pattern_defined)
mrs's avatar
mrs committed
7245 7246 7247 7248 7249 7250 7251 7252 7253 7254
    {
      repo_template_used (d);

      if (flag_external_templates && ! DECL_INTERFACE_KNOWN (d))
	{
	  if (flag_alt_external_templates)
	    {
	      if (interface_unknown)
		warn_if_unknown_interface (d);
	    }
jason's avatar
jason committed
7255
	  else if (DECL_INTERFACE_KNOWN (code_pattern))
mrs's avatar
mrs committed
7256 7257
	    {
	      DECL_INTERFACE_KNOWN (d) = 1;
jason's avatar
jason committed
7258
	      DECL_NOT_REALLY_EXTERN (d) = ! DECL_EXTERNAL (code_pattern);
mrs's avatar
mrs committed
7259 7260
	    }
	  else
jason's avatar
jason committed
7261
	    warn_if_unknown_interface (code_pattern);
mrs's avatar
mrs committed
7262 7263
	}

mrs's avatar
mrs committed
7264
      if (at_eof)
mrs's avatar
mrs committed
7265 7266 7267
	import_export_decl (d);
    }

7268 7269 7270 7271 7272 7273
  /* Reject all external templates except inline functions.  */
  if (DECL_INTERFACE_KNOWN (d)
      && ! DECL_NOT_REALLY_EXTERN (d)
      && ! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d)))
    goto out;

7274
  if (TREE_CODE (d) == VAR_DECL 
7275
      && TREE_READONLY (d)
7276 7277 7278 7279 7280 7281 7282
      && DECL_INITIAL (d) == NULL_TREE
      && DECL_INITIAL (code_pattern) != NULL_TREE)
    /* We need to set up DECL_INITIAL regardless of pattern_defined if
	 the variable is a static const initialized in the class body.  */;
  else if (! pattern_defined
	   || (! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d) && nested)
	       && ! at_eof))
mrs's avatar
mrs committed
7283
    {
7284 7285
      /* Defer all templates except inline functions used in another
         function.  */
jason's avatar
jason committed
7286 7287 7288
      lineno = line;
      input_filename = file;

mrs's avatar
mrs committed
7289
      add_pending_template (d);
mrs's avatar
mrs committed
7290
      goto out;
mrs's avatar
mrs committed
7291 7292
    }

7293 7294 7295 7296
  regenerate_decl_from_template (d, td);

  /* We already set the file and line above.  Reset them now in case
     they changed as a result of calling regenerate_decl_from_template.  */
mrs's avatar
mrs committed
7297 7298 7299
  lineno = DECL_SOURCE_LINE (d);
  input_filename = DECL_SOURCE_FILE (d);

mrs's avatar
mrs committed
7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313
  if (TREE_CODE (d) == VAR_DECL)
    {
      DECL_IN_AGGR_P (d) = 0;
      if (DECL_INTERFACE_KNOWN (d))
	DECL_EXTERNAL (d) = ! DECL_NOT_REALLY_EXTERN (d);
      else
	{
	  DECL_EXTERNAL (d) = 1;
	  DECL_NOT_REALLY_EXTERN (d) = 1;
	}
      cp_finish_decl (d, DECL_INITIAL (d), NULL_TREE, 0, 0);
    }
  else if (TREE_CODE (d) == FUNCTION_DECL)
    {
jason's avatar
jason committed
7314
      tree t = DECL_SAVED_TREE (code_pattern);
mrs's avatar
mrs committed
7315

mrs's avatar
merging  
mrs committed
7316
      start_function (NULL_TREE, d, NULL_TREE, 1);
mrs's avatar
mrs committed
7317 7318
      store_parm_decls ();

mrs's avatar
mrs committed
7319 7320 7321 7322
      if (t && TREE_CODE (t) == RETURN_INIT)
	{
	  store_return_init
	    (TREE_OPERAND (t, 0),
7323
	     tsubst_expr (TREE_OPERAND (t, 1), args, tmpl));
mrs's avatar
mrs committed
7324 7325 7326
	  t = TREE_CHAIN (t);
	}

mrs's avatar
mrs committed
7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337
      if (t && TREE_CODE (t) == CTOR_INITIALIZER)
	{
	  current_member_init_list
	    = tsubst_expr_values (TREE_OPERAND (t, 0), args);
	  current_base_init_list
	    = tsubst_expr_values (TREE_OPERAND (t, 1), args);
	  t = TREE_CHAIN (t);
	}

      setup_vtbl_ptr ();
      /* Always keep the BLOCK node associated with the outermost
law's avatar
law committed
7338
	 pair of curly braces of a function.  These are needed
mrs's avatar
mrs committed
7339 7340 7341 7342
	 for correct operation of dwarfout.c.  */
      keep_next_level ();

      my_friendly_assert (TREE_CODE (t) == COMPOUND_STMT, 42);
7343
      tsubst_expr (t, args, tmpl);
mrs's avatar
mrs committed
7344

mrs's avatar
mrs committed
7345 7346 7347
      finish_function (lineno, 0, nested);
    }

mrs's avatar
mrs committed
7348
out:
mrs's avatar
mrs committed
7349 7350 7351
  lineno = line;
  input_filename = file;

mrs's avatar
mrs committed
7352 7353
  pop_from_top_level ();
  pop_tinst_level ();
mrs's avatar
mrs committed
7354 7355 7356

  return d;
}
mrs's avatar
mrs committed
7357 7358 7359 7360 7361 7362 7363

tree
tsubst_chain (t, argvec)
     tree t, argvec;
{
  if (t)
    {
7364
      tree first = tsubst (t, argvec, NULL_TREE);
mrs's avatar
mrs committed
7365 7366 7367 7368
      tree last = first;

      for (t = TREE_CHAIN (t); t; t = TREE_CHAIN (t))
	{
7369
	  tree x = tsubst (t, argvec, NULL_TREE);
mrs's avatar
mrs committed
7370 7371 7372 7373 7374 7375 7376 7377 7378
	  TREE_CHAIN (last) = x;
	  last = x;
	}

      return first;
    }
  return NULL_TREE;
}

mrs's avatar
mrs committed
7379
static tree
mrs's avatar
mrs committed
7380 7381 7382 7383 7384 7385 7386 7387
tsubst_expr_values (t, argvec)
     tree t, argvec;
{
  tree first = NULL_TREE;
  tree *p = &first;

  for (; t; t = TREE_CHAIN (t))
    {
7388 7389
      tree pur = tsubst_copy (TREE_PURPOSE (t), argvec, NULL_TREE);
      tree val = tsubst_expr (TREE_VALUE (t), argvec, NULL_TREE);
mrs's avatar
mrs committed
7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403
      *p = build_tree_list (pur, val);
      p = &TREE_CHAIN (*p);
    }
  return first;
}

tree last_tree;

void
add_tree (t)
     tree t;
{
  last_tree = TREE_CHAIN (last_tree) = t;
}
mrs's avatar
mrs committed
7404

7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422

void
begin_tree ()
{
  saved_trees = tree_cons (NULL_TREE, last_tree, saved_trees);
  last_tree = NULL_TREE;
}


void 
end_tree ()
{
  my_friendly_assert (saved_trees != NULL_TREE, 0);

  last_tree = TREE_VALUE (saved_trees);
  saved_trees = TREE_CHAIN (saved_trees);
}

mrs's avatar
mrs committed
7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436
/* D is an undefined function declaration in the presence of templates with
   the same name, listed in FNS.  If one of them can produce D as an
   instantiation, remember this so we can instantiate it at EOF if D has
   not been defined by that time.  */

void
add_maybe_template (d, fns)
     tree d, fns;
{
  tree t;

  if (DECL_MAYBE_TEMPLATE (d))
    return;

7437
  t = most_specialized (fns, d, NULL_TREE);
mrs's avatar
mrs committed
7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449
  if (! t)
    return;
  if (t == error_mark_node)
    {
      cp_error ("ambiguous template instantiation for `%D'", d);
      return;
    }

  *maybe_template_tail = perm_tree_cons (t, d, NULL_TREE);
  maybe_template_tail = &TREE_CHAIN (*maybe_template_tail);
  DECL_MAYBE_TEMPLATE (d) = 1;
}
mrs's avatar
mrs committed
7450 7451 7452 7453 7454

/* Instantiate an enumerated type.  Used by instantiate_class_template and
   tsubst_expr.  */

static tree
7455
tsubst_enum (tag, args, field_chain)
7456
     tree tag, args;
7457
     tree * field_chain;
mrs's avatar
mrs committed
7458
{
7459 7460 7461
  extern tree current_local_enum;
  tree prev_local_enum = current_local_enum;

mrs's avatar
mrs committed
7462 7463 7464 7465 7466 7467 7468
  tree newtag = start_enum (TYPE_IDENTIFIER (tag));
  tree e, values = NULL_TREE;

  for (e = TYPE_VALUES (tag); e; e = TREE_CHAIN (e))
    {
      tree elt = build_enumerator (TREE_PURPOSE (e),
				   tsubst_expr (TREE_VALUE (e), args,
7469
						NULL_TREE));
mrs's avatar
mrs committed
7470 7471 7472 7473 7474 7475
      TREE_CHAIN (elt) = values;
      values = elt;
    }

  finish_enum (newtag, values);

7476
  if (NULL != field_chain)
7477
    *field_chain = grok_enum_decls (NULL_TREE);
7478 7479 7480

  current_local_enum = prev_local_enum;

mrs's avatar
mrs committed
7481 7482
  return newtag;
}