pt.c 174 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 29 30 31 32 33 34 35 36

#include "config.h"
#include <stdio.h>
#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 41 42 43 44
#include "except.h"

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
mrs's avatar
mrs committed
45 46 47 48 49 50 51

extern struct obstack permanent_obstack;

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

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

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

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

mrs's avatar
mrs committed
61
int minimal_parse_mode;
62

63
int processing_specialization;
64
int processing_explicit_instantiation;
65 66
static int template_header_count;

67 68
static tree saved_trees;

mrs's avatar
mrs committed
69 70 71
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free

72
static int unify PROTO((tree, tree *, int, tree, tree, int));
73 74 75
static void add_pending_template PROTO((tree));
static int push_tinst_level PROTO((tree));
static tree classtype_mangled_name PROTO((tree));
76
static char *mangle_class_name_for_template PROTO((char *, tree, tree, tree));
77
static tree tsubst_expr_values PROTO((tree, tree));
mrs's avatar
mrs committed
78
static int comp_template_args PROTO((tree, tree));
79
static int list_eq PROTO((tree, tree));
80
static tree get_class_bindings PROTO((tree, tree, tree, tree));
81
static tree coerce_template_parms PROTO((tree, tree, tree, int, int, int));
82
static tree tsubst_enum	PROTO((tree, tree, tree *));
83
static tree add_to_template_args PROTO((tree, tree));
84
static tree complete_template_args PROTO((tree, tree, int));
85
static int  type_unification_real PROTO((tree, tree *, tree, tree,
86 87
					 int, int, int));
static void note_template_header PROTO((int));
88
static tree maybe_fold_nontype_arg PROTO((tree));
89
static tree convert_nontype_argument PROTO((tree, tree));
90
static tree get_bindings_overload PROTO((tree, tree, tree));
91 92 93 94 95 96 97 98 99 100 101 102

/* 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)
103
    end_template_decl ();
104
  else
105
    end_specialization ();
106

107 108 109 110
  if (decl == NULL_TREE || decl == void_type_node)
    return NULL_TREE;
  else if (TREE_CODE (decl) == TREE_LIST)
    {
jason's avatar
comment  
jason committed
111
      /* Assume that the class is the only declspec.  */
112
      decl = TREE_VALUE (decl);
113 114
      if (IS_AGGR_TYPE (decl) && CLASSTYPE_TEMPLATE_INFO (decl)
	  && ! CLASSTYPE_TEMPLATE_SPECIALIZATION (decl))
115 116 117 118 119
	{
	  tree tmpl = CLASSTYPE_TI_TEMPLATE (decl);
	  check_member_template (tmpl);
	  return tmpl;
	}
120
      return NULL_TREE;
121
    }
122
  else if (DECL_TEMPLATE_INFO (decl))
123
    {
124 125 126 127 128 129 130 131 132 133 134
      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);
	
135

136
  return error_mark_node;
jason's avatar
jason committed
137
}
138

jason's avatar
jason committed
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
/* 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;
{
156
  int depth;
jason's avatar
jason committed
157

158 159 160 161 162 163
  for (depth = 0; type && TREE_CODE (type) != FUNCTION_DECL;
       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
164 165

  return depth;
166
}
167

168 169
/* Return the original template for this decl, disregarding any
   specializations.  */
170

171 172
static tree
original_template (decl)
173
     tree decl;
174
{
175 176 177 178
  while (DECL_TEMPLATE_INFO (decl))
    decl = DECL_TI_TEMPLATE (decl);
  return decl;
}
179

180 181 182 183 184 185 186 187 188
/* 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
189

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
  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);
209

210
  ++processing_template_decl;
211
  current_template_parms
212 213
    = tree_cons (build_int_2 (0, processing_template_decl),
		 parms, current_template_parms);
214 215
  TEMPLATE_PARMS_FOR_INLINE (current_template_parms) = 1;

216
  pushlevel (0);
217 218
  for (i = 0; i < TREE_VEC_LENGTH (parms); ++i) 
    {
219 220
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
      my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (parm)) == 'd', 0);
221

222 223
      switch (TREE_CODE (parm))
	{
224
	case TYPE_DECL:
225
	case TEMPLATE_DECL:
226 227
	  pushdecl (parm);
	  break;
228 229 230 231 232 233 234 235 236

	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);
	  }
237
	  break;
238

239 240 241 242 243 244
	default:
	  my_friendly_abort (0);
	}
    }
}

245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
/* 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);
}

271 272 273
/* Undo the effects of begin_member_template_processing. */

void 
jason's avatar
jason committed
274 275
maybe_end_member_template_processing (decl)
     tree decl;
276 277 278 279
{
  if (! processing_template_decl)
    return;

280 281 282 283 284 285 286
  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);
    }
287 288
}

289
/* Returns non-zero iff T is a member template function.  We must be
jason's avatar
jason committed
290
   careful as in
291 292 293 294 295 296 297 298 299 300 301

     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.  */
302

303 304
int
is_member_template (t)
305 306
     tree t;
{
307 308
  if (TREE_CODE (t) != FUNCTION_DECL
      && !DECL_FUNCTION_TEMPLATE_P (t))
309
    /* Anything that isn't a function or a template function is
310 311 312
       certainly not a member template.  */
    return 0;

313 314 315 316 317
  /* A local class can't have member templates.  */
  if (hack_decl_function_context (t))
    return 0;

  if ((DECL_FUNCTION_MEMBER_P (t) 
318
       && !DECL_TEMPLATE_SPECIALIZATION (t))
jason's avatar
jason committed
319
      || (TREE_CODE (t) == TEMPLATE_DECL 
320
	  && DECL_FUNCTION_MEMBER_P (DECL_TEMPLATE_RESULT (t))))
321
    {
jason's avatar
jason committed
322
      tree tmpl;
323 324 325 326 327 328

      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
329 330 331
      else
	tmpl = NULL_TREE;

332
      if (tmpl
jason's avatar
jason committed
333 334 335
	  /* If there are more levels of template parameters than
	     there are template classes surrounding the declaration,
	     then we have a member template.  */
336 337
	  && (list_length (DECL_TEMPLATE_PARMS (tmpl)) > 
	      template_class_depth (DECL_CLASS_CONTEXT (t))))
jason's avatar
jason committed
338 339
	return 1;
    }
340

jason's avatar
jason committed
341 342
  return 0;
}
343

344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 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 407 408 409 410 411 412 413
/* Return a new template argument vector which contains all of ARGS
   for all outer templates TYPE is contained in, but has as its 
   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;
  
  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
  my_friendly_assert (TREE_CODE (extra_args) == TREE_VEC, 0);

  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);
	  if (TREE_CODE (TREE_VEC_ELT (args, 0)) != TREE_VEC)
	    depth = 1;
	  else
	    depth = TREE_VEC_LENGTH (args);
	}
      else
	/* If we are a specialization, we might have no previously bound
	   template args.  */
	depth = 0;

      new_args = make_tree_vec (depth + 1 + (!!spec_args));

      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;

      new_args = make_tree_vec (depth + 1);

414 415 416
      /* If this isn't a member template, extra_args is for the innermost
	 template class, so skip over it.  */
      skip = (! is_member_template (tmpl));
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439

      type = DECL_REAL_CONTEXT (tmpl);
      for (i = depth; i; type = TYPE_CONTEXT (type))
	if (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)))
	  {
	    if (skip)
	      skip = 0;
	    else
	      {
		--i;
		TREE_VEC_ELT (new_args, i) = CLASSTYPE_TI_ARGS (type);
	      }
	  }
    }

  TREE_VEC_ELT (new_args, depth) = extra_args;

  if (spec_args)
    TREE_VEC_ELT (new_args, depth + 1) = spec_args;

  return new_args;
}

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

443
static tree
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
add_to_template_args (args, extra_args)
     tree args;
     tree extra_args;
{
  tree new_args;

  if (TREE_CODE (TREE_VEC_ELT (args, 0)) != TREE_VEC)
    {
      new_args = make_tree_vec (2);
      TREE_VEC_ELT (new_args, 0) = args;
    }
  else 
    {
      int i;

459
      new_args = make_tree_vec (TREE_VEC_LENGTH (args) + 1);
460 461 462 463 464 465 466 467 468 469

      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
470 471 472

/* We've got a template header coming up; push to a new level for storing
   the parms.  */
mrs's avatar
mrs committed
473 474 475 476 477

void
begin_template_parm_list ()
{
  pushlevel (0);
mrs's avatar
mrs committed
478
  declare_pseudo_global_level ();
mrs's avatar
mrs committed
479
  ++processing_template_decl;
480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516
  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 <>.  */

517
static void 
518 519 520 521 522 523 524 525
note_template_header (specialization)
     int specialization;
{
  processing_specialization = specialization;
  template_header_count++;
}


526
/* We're beginning an explicit instantiation.  */
527

528 529
void
begin_explicit_instantiation ()
530
{
531 532
  ++processing_explicit_instantiation;
}
533 534


535 536 537 538 539 540
void
end_explicit_instantiation ()
{
  my_friendly_assert(processing_explicit_instantiation > 0, 0);
  --processing_explicit_instantiation;
}
541 542


543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
/* 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;
566 567 568
}


569 570 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 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637

/* 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));
}


638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654
/* 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 = "               ";
    }
}

655
/* Returns the template (one of the functions given by TEMPLATE_ID)
656 657 658 659 660 661 662 663
   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.  */
664

665
tree
666
determine_specialization (template_id, decl, targs_out, 
667 668
			  need_member_template,
			  complain)
669
     tree template_id;
670
     tree decl;
671 672 673 674
     tree* targs_out;
     int need_member_template;
     int complain;
{
675 676
  tree fns = TREE_OPERAND (template_id, 0);
  tree targs_in = TREE_OPERAND (template_id, 1);
677
  tree templates = NULL_TREE;
678
  tree fn;
679 680
  int overloaded;
  int i;
681

682 683
  *targs_out = NULL_TREE;

684 685 686 687
  if (is_overloaded_fn (fns))
    fn = get_first_fn (fns);
  else
    fn = NULL_TREE;
688

689 690
  overloaded = really_overloaded_fn (fns);
  for (; fn != NULL_TREE; 
691 692
       fn = overloaded ? DECL_CHAIN (fn) : NULL_TREE)
    {
693 694 695 696
      tree tmpl;

      if (!need_member_template 
	  && TREE_CODE (fn) == FUNCTION_DECL 
697
	  && DECL_FUNCTION_MEMBER_P (fn)
698 699
	  && DECL_USE_TEMPLATE (fn)
	  && DECL_TI_TEMPLATE (fn))
700 701 702 703 704
	/* 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.  */
705 706
	tmpl = DECL_TI_TEMPLATE (fn);
      else if (TREE_CODE (fn) != TEMPLATE_DECL
707
	       || (need_member_template && !is_member_template (fn)))
708
	continue;
709 710
      else
	tmpl = fn;
711

712
      if (list_length (targs_in) > DECL_NTPARMS (tmpl))
713 714
	continue;

715
      if (decl == NULL_TREE)
716
	{
717 718 719 720 721 722 723 724 725
	  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),
				&TREE_VEC_ELT (targs, 0),
				NULL_TREE,
				NULL_TREE,  
				targs_in,
726
				1, 1);
727 728 729 730
      
	  if (i == 0) 
	    /* Unification was successful.  */
	    templates = scratch_tree_cons (targs, tmpl, templates);
731
	}
732 733
      else
	templates = scratch_tree_cons (NULL_TREE, tmpl, templates);
734
    }
735
  
736
  if (decl != NULL_TREE)
737
    {
738 739 740 741 742 743 744 745 746 747 748 749 750 751
      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:
752
      if (complain)
753 754
	cp_error ("`%D' does not match any template declaration",
		  template_id);
755
      
756 757
      return NULL_TREE;
    }
758
  else if (TREE_CHAIN (templates) != NULL_TREE) 
759
    {
760
    ambiguous:
761 762
      if (complain)
	{
763 764
	  cp_error ("ambiguous template specialization `%D'",
		    template_id);
765
	  print_candidates (templates);
766 767 768 769 770
	}
      return NULL_TREE;
    }

  /* We have one, and exactly one, match. */
771 772
  *targs_out = TREE_PURPOSE (templates);
  return TREE_VALUE (templates);
mrs's avatar
mrs committed
773 774
}

775 776
	
/* Check to see if the function just declared, as indicated in
777 778 779 780
   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.

781 782
   Returns DECL, or an equivalent declaration that should be used
   instead. 
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
   
   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.  */
818

819
tree
820
check_explicit_specialization (declarator, decl, template_count, flags)
821 822 823 824 825
     tree declarator;
     tree decl;
     int template_count;
     int flags;
{
826 827 828 829
  int finish_member = flags & 1;
  int have_def = flags & 2;
  int is_friend = flags & 4;
  int specialization = 0;
830
  int explicit_instantiation = 0;
831 832 833 834
  int member_specialization = flags & 8;

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

836
  if (!finish_member)
837
    {
838 839 840 841 842 843 844 845 846 847 848 849 850 851
      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);
852

853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883
	      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);
884
	      return decl;
885 886 887 888 889 890 891 892 893
	    } 
	}
      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");
894

895
	  explicit_instantiation = 1;
896
	}
897 898 899
      else if (ctype != NULL_TREE
	       && !TYPE_BEING_DEFINED (ctype)
	       && CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
900
	{
901
	  /* This case catches outdated code that looks like this:
902

903
	     template <class T> struct S { void f(); };
904 905 906 907 908 909 910
	     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
911
	     the class is complete.  */
912

913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
	  /* 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
931 932 933
	     template <> template <class T>
	     void f<int>();  */

934 935
	  cp_error ("template-id `%D' in declaration of primary template",
		    declarator);
936
	  return decl;
937
	}
938
    }
939

940 941 942 943 944 945 946 947 948 949 950 951
  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;
	  }
    }

952
  if (specialization || member_specialization || explicit_instantiation)
953 954 955 956 957
    {
      tree tmpl = NULL_TREE;
      tree targs = NULL_TREE;

      /* Make sure that the declarator is a TEMPLATE_ID_EXPR.  */
958 959 960 961 962 963 964
      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
965
	    fns = IDENTIFIER_NAMESPACE_VALUE (dname);
966 967 968
	  else
	    fns = dname;

969 970
	  declarator = 
	    lookup_template_function (fns, NULL_TREE);
971 972 973 974 975 976 977
	}

      if (TREE_CODE (TREE_OPERAND (declarator, 0)) == LOOKUP_EXPR) 
	{
	  /* 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);
978
	  my_friendly_assert (!explicit_instantiation, 0);
979
	  SET_DECL_IMPLICIT_INSTANTIATION (decl);
980
	  return decl;
981 982
	} 

983 984 985 986 987 988
      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.  */
989 990 991 992 993 994 995 996 997 998
	  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;
999 1000 1001 1002
	}
      else if (ctype != NULL_TREE 
	       && (TREE_CODE (TREE_OPERAND (declarator, 0)) ==
		   IDENTIFIER_NODE))
1003
	{
1004 1005 1006
	  /* Find the list of functions in ctype that have the same
	     name as the declared function.  */
	  tree name = TREE_OPERAND (declarator, 0);
1007
	  tree fns;
1008 1009 1010
	  
	  if (name == constructor_name (ctype) 
	      || name == constructor_name_full (ctype))
1011
	    {
1012 1013 1014 1015 1016 1017
	      int is_constructor = DECL_CONSTRUCTOR_P (decl);
	      
	      if (is_constructor ? !TYPE_HAS_CONSTRUCTOR (ctype)
		  : !TYPE_HAS_DESTRUCTOR (ctype))
		{
		  /* From [temp.expl.spec]:
1018
		       
1019 1020 1021
		     If such an explicit specialization for the member
		     of a class template names an implicitly-declared
		     special member function (clause _special_), the
1022 1023 1024
		     program is ill-formed.  

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

1027
		  return decl;
1028
		}
1029

1030 1031 1032 1033 1034 1035
	      fns = TREE_VEC_ELT(CLASSTYPE_METHOD_VEC (ctype),
				 is_constructor ? 0 : 1);
	    }
	  else 
	    fns = lookup_fnfields (TYPE_BINFO (ctype), name,
				   1);
1036 1037 1038
	  
	  if (fns == NULL_TREE) 
	    {
1039 1040
	      cp_error ("no member function `%s' declared in `%T'",
			IDENTIFIER_POINTER (name),
1041
			ctype);
1042
	      return decl;
1043 1044 1045 1046
	    }
	  else
	    TREE_OPERAND (declarator, 0) = fns;
	}
1047
      
1048 1049 1050 1051 1052 1053 1054 1055 1056
      /* Figure out what exactly is being specialized at this point.
	 Note that for an explicit instantiation, even one for a
	 member function, we cannot tell apriori whether the the
	 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, 
1057 1058
				       member_specialization,
				       1);
1059 1060 1061
	    
      if (tmpl)
	{
1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
	  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;
	    }
1074 1075
	  else if (DECL_STATIC_FUNCTION_P (tmpl)
		   && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
1076 1077 1078 1079
	    {
	      revert_static_member_fn (&decl, 0, 0);
	      last_function_parms = TREE_CHAIN (last_function_parms);
	    }
1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090

	  /* 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)
1091
	      && name_mangling_version >= 1)
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
	    {
	      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 
		(DECL_NAME (decl), 
		 arg_types,
		 TREE_TYPE (TREE_TYPE (tmpl)),
		 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);
1118
	      return decl;
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
	    }

	  /* 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.	        

1136
	     So, we just leave the template info alone in this case.  */
1137 1138 1139
	  if (!(DECL_TEMPLATE_INFO (decl) && DECL_TI_TEMPLATE (decl)))
	    DECL_TEMPLATE_INFO (decl)
	      = perm_tree_cons (tmpl, targs, NULL_TREE);
1140 1141 1142

	  register_specialization (decl, tmpl, targs);

1143
	  return decl;
1144 1145
	}
    }
1146
  
1147
  return decl;
1148
}
1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203


/* 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
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226
/* 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
1227
   TEMPLATE_PARM_LEVEL has been decreased by LEVELS.  If such a
jason's avatar
jason committed
1228 1229 1230 1231
   TEMPLATE_PARM_INDEX already exists, it is returned; otherwise, a
   new one is created.  */

static tree 
1232
reduce_template_parm_level (index, type, levels)
jason's avatar
jason committed
1233 1234
     tree index;
     tree type;
1235
     int levels;
jason's avatar
jason committed
1236 1237 1238
{
  if (TEMPLATE_PARM_DESCENDANTS (index) == NULL_TREE
      || (TEMPLATE_PARM_LEVEL (TEMPLATE_PARM_DESCENDANTS (index))
1239
	  != TEMPLATE_PARM_LEVEL (index) - levels))
jason's avatar
jason committed
1240 1241 1242 1243 1244 1245 1246
    {
      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),
1247
				     TEMPLATE_PARM_LEVEL (index) - levels,
jason's avatar
jason committed
1248 1249 1250
				     TEMPLATE_PARM_ORIG_LEVEL (index),
				     decl, type);
      TEMPLATE_PARM_DESCENDANTS (index) = t;
1251 1252 1253 1254

      /* Template template parameters need this.  */
      DECL_TEMPLATE_PARMS (decl)
	= DECL_TEMPLATE_PARMS (TEMPLATE_PARM_DECL (index));
jason's avatar
jason committed
1255 1256 1257 1258 1259
    }

  return TEMPLATE_PARM_DESCENDANTS (index);
}

mrs's avatar
mrs committed
1260
/* Process information from new template parameter NEXT and append it to the
mrs's avatar
mrs committed
1261
   LIST being built.  */
mrs's avatar
mrs committed
1262

mrs's avatar
mrs committed
1263 1264 1265 1266 1267 1268
tree
process_template_parm (list, next)
     tree list, next;
{
  tree parm;
  tree decl = 0;
mrs's avatar
mrs committed
1269
  tree defval;
mrs's avatar
mrs committed
1270
  int is_type, idx;
jason's avatar
jason committed
1271

mrs's avatar
mrs committed
1272 1273
  parm = next;
  my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259);
mrs's avatar
mrs committed
1274 1275 1276
  defval = TREE_PURPOSE (parm);
  parm = TREE_VALUE (parm);
  is_type = TREE_PURPOSE (parm) == class_type_node;
mrs's avatar
mrs committed
1277 1278 1279 1280 1281 1282 1283

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

      if (TREE_CODE (p) == TYPE_DECL)
	idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p));
1284 1285
      else if (TREE_CODE (p) == TEMPLATE_DECL)
	idx = TEMPLATE_TYPE_IDX (TREE_TYPE (DECL_TEMPLATE_RESULT (p)));
mrs's avatar
mrs committed
1286
      else
jason's avatar
jason committed
1287
	idx = TEMPLATE_PARM_IDX (DECL_INITIAL (p));
mrs's avatar
mrs committed
1288 1289 1290 1291 1292
      ++idx;
    }
  else
    idx = 0;

mrs's avatar
mrs committed
1293 1294
  if (!is_type)
    {
mrs's avatar
mrs committed
1295
      my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260);
mrs's avatar
mrs committed
1296
      /* is a const-param */
mrs's avatar
mrs committed
1297
      parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm),
mrs's avatar
merging  
mrs committed
1298
			     PARM, 0, NULL_TREE);
mrs's avatar
mrs committed
1299 1300
      /* A template parameter is not modifiable.  */
      TREE_READONLY (parm) = 1;
mrs's avatar
mrs committed
1301 1302
      if (IS_AGGR_TYPE (TREE_TYPE (parm))
	  && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM)
mrs's avatar
mrs committed
1303
	{
mrs's avatar
mrs committed
1304 1305 1306 1307
	  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
1308 1309
	  TREE_TYPE (parm) = void_type_node;
	}
mrs's avatar
mrs committed
1310 1311 1312
      else if (pedantic
	       && (TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE
		   || TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE))
mrs's avatar
mrs committed
1313 1314
	cp_pedwarn ("`%T' is not a valid type for a template constant parameter",
		    TREE_TYPE (parm));
mrs's avatar
mrs committed
1315 1316 1317 1318 1319 1320
      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
1321 1322 1323 1324
      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
1325 1326 1327
    }
  else
    {
1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
      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
1347
      CLASSTYPE_GOT_SEMICOLON (t) = 1;
mrs's avatar
mrs committed
1348 1349
      TYPE_NAME (t) = decl;
      TYPE_STUB_DECL (t) = decl;
mrs's avatar
mrs committed
1350
      parm = decl;
jason's avatar
jason committed
1351 1352 1353 1354
      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
1355
    }
mrs's avatar
mrs committed
1356
  SET_DECL_ARTIFICIAL (decl);
mrs's avatar
mrs committed
1357
  pushdecl (decl);
mrs's avatar
mrs committed
1358
  parm = build_tree_list (defval, parm);
mrs's avatar
mrs committed
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
  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
1371
  int nparms;
mrs's avatar
mrs committed
1372
  tree parm;
mrs's avatar
mrs committed
1373 1374 1375 1376 1377
  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
1378 1379

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

mrs's avatar
mrs committed
1382 1383 1384
  return saved_parmlist;
}

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

mrs's avatar
mrs committed
1387
void
mrs's avatar
mrs committed
1388
end_template_decl ()
mrs's avatar
mrs committed
1389
{
1390 1391
  reset_specialization ();

mrs's avatar
mrs committed
1392
  if (! processing_template_decl)
mrs's avatar
mrs committed
1393 1394
    return;

mrs's avatar
mrs committed
1395 1396
  /* This matches the pushlevel in begin_template_parm_list.  */
  poplevel (0, 0, 0);
mrs's avatar
mrs committed
1397

mrs's avatar
mrs committed
1398 1399 1400 1401
  --processing_template_decl;
  current_template_parms = TREE_CHAIN (current_template_parms);
  (void) get_pending_sizes ();	/* Why? */
}
mrs's avatar
mrs committed
1402

mrs's avatar
mrs committed
1403 1404 1405 1406
/* Generate a valid set of template args from current_template_parms.  */

tree
current_template_args ()
mrs's avatar
mrs committed
1407 1408
{
  tree header = current_template_parms;
1409 1410 1411 1412
  int length = list_length (header);
  tree args = make_tree_vec (length);
  int l = length;

mrs's avatar
mrs committed
1413
  while (header)
mrs's avatar
mrs committed
1414
    {
mrs's avatar
mrs committed
1415 1416 1417 1418 1419
      tree a = copy_node (TREE_VALUE (header));
      int i = TREE_VEC_LENGTH (a);
      TREE_TYPE (a) = NULL_TREE;
      while (i--)
	{
1420 1421 1422 1423 1424 1425 1426 1427 1428
	  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);
	      
1429 1430
	      if (TREE_CODE (t) == TYPE_DECL 
		  || TREE_CODE (t) == TEMPLATE_DECL)
1431 1432 1433 1434 1435
		t = TREE_TYPE (t);
	      else
		t = DECL_INITIAL (t);
	    }

mrs's avatar
mrs committed
1436 1437
	  TREE_VEC_ELT (a, i) = t;
	}
1438
      TREE_VEC_ELT (args, --l) = a;
mrs's avatar
mrs committed
1439
      header = TREE_CHAIN (header);
mrs's avatar
mrs committed
1440 1441
    }

mrs's avatar
mrs committed
1442 1443
  return args;
}
1444

1445 1446 1447 1448

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

1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466
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;
}

mrs's avatar
mrs committed
1467
  
1468
/* Creates a TEMPLATE_DECL for the indicated DECL using the template
jason's avatar
jason committed
1469 1470 1471
   parameters given by current_template_args, or reuses a
   previously existing one, if appropriate.  Returns the DECL, or an
   equivalent one, if it is replaced via a call to duplicate_decls.  */
1472 1473

tree
mrs's avatar
mrs committed
1474 1475 1476 1477
push_template_decl (decl)
     tree decl;
{
  tree tmpl;
jason's avatar
jason committed
1478
  tree args;
mrs's avatar
mrs committed
1479
  tree info;
jason's avatar
jason committed
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
  tree ctx;
  int primary;
  int is_friend = (TREE_CODE (decl) == FUNCTION_DECL
		   && DECL_FRIEND_P (decl));

  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);
  else if (DECL_REAL_CONTEXT (decl))
    /* 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;

1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
  /* 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)
    info = DECL_CLASS_CONTEXT (decl);
  else
    info = ctx;

  if (info && TREE_CODE (info) == FUNCTION_DECL)
    primary = 0;
  else if (! info
	   || (TYPE_BEING_DEFINED (info) && template_header_count
	       && ! processing_specialization)
	   || (template_header_count > template_class_depth (info)))
mrs's avatar
mrs committed
1511
    primary = 1;
jason's avatar
jason committed
1512 1513
  else
    primary = 0;
mrs's avatar
mrs committed
1514

1515 1516 1517 1518 1519 1520 1521 1522
  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
1523
  /* Partial specialization.  */
mrs's avatar
mrs committed
1524
  if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl)
mrs's avatar
mrs committed
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
      && 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);

      for (; spec; spec = TREE_CHAIN (spec))
	{
	  /* purpose: args to main template
	     value: spec template */
	  if (comp_template_args (TREE_PURPOSE (spec), mainargs))
1537
	    return decl;
mrs's avatar
mrs committed
1538 1539
	}

mrs's avatar
mrs committed
1540 1541 1542
      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
1543
      TREE_TYPE (DECL_TEMPLATE_SPECIALIZATIONS (maintmpl)) = type;
1544
      return decl;
mrs's avatar
mrs committed
1545 1546
    }

mrs's avatar
mrs committed
1547 1548
  args = current_template_args ();

jason's avatar
jason committed
1549 1550 1551 1552
  if (!ctx 
      || TREE_CODE (ctx) == FUNCTION_DECL
      || TYPE_BEING_DEFINED (ctx)
      || (is_friend && !DECL_TEMPLATE_INFO (decl)))
mrs's avatar
mrs committed
1553
    {
1554
      if (DECL_LANG_SPECIFIC (decl)
jason's avatar
jason committed
1555 1556 1557 1558
	  && DECL_TEMPLATE_INFO (decl)
	  && DECL_TI_TEMPLATE (decl))
	tmpl = DECL_TI_TEMPLATE (decl);
      else
1559
	{
jason's avatar
jason committed
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570
	  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;
	    }
1571
	}
mrs's avatar
mrs committed
1572 1573 1574
    }
  else
    {
mrs's avatar
mrs committed
1575
      tree t;
1576
      tree a;
mrs's avatar
mrs committed
1577

mrs's avatar
mrs committed
1578 1579 1580
      if (CLASSTYPE_TEMPLATE_INSTANTIATION (ctx))
	cp_error ("must specialize `%#T' before defining member `%#D'",
		  ctx, decl);
mrs's avatar
mrs committed
1581
      if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl))
mrs's avatar
mrs committed
1582
	tmpl = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl));
mrs's avatar
mrs committed
1583
      else if (! DECL_TEMPLATE_INFO (decl))
mrs's avatar
mrs committed
1584 1585
	{
	  cp_error ("template definition of non-template `%#D'", decl);
1586
	  return decl;
mrs's avatar
mrs committed
1587
	}
mrs's avatar
mrs committed
1588
      else
mrs's avatar
mrs committed
1589
	tmpl = DECL_TI_TEMPLATE (decl);
1590 1591 1592
      
      if (is_member_template (tmpl))
	{
1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614
	  if (DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl) 
	      && 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);
1615
	      return decl;
1616 1617
	    }
	  
1618 1619
	  a = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
	  t = DECL_INNERMOST_TEMPLATE_PARMS (DECL_TI_TEMPLATE (decl));
jason's avatar
jason committed
1620
	  if (TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a))
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636
	    {
	      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
1637 1638

      if (CLASSTYPE_TEMPLATE_SPECIALIZATION (ctx))
1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
	{
	  /* 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
1651

1652 1653
      if (t != NULL_TREE 
	  && TREE_VEC_LENGTH (t) != TREE_VEC_LENGTH (a))
mrs's avatar
mrs committed
1654 1655
	{
	  cp_error ("got %d template parameters for `%#D'",
1656
		    TREE_VEC_LENGTH (a), decl);
mrs's avatar
mrs committed
1657 1658
	  cp_error ("  but `%#T' has %d", ctx, TREE_VEC_LENGTH (t));
	}
mrs's avatar
mrs committed
1659
    }
1660
  /* Get the innermost set of template arguments. */
jason's avatar
jason committed
1661
  args = innermost_args (args, 0);
mrs's avatar
mrs committed
1662

mrs's avatar
mrs committed
1663 1664
  DECL_TEMPLATE_RESULT (tmpl) = decl;
  TREE_TYPE (tmpl) = TREE_TYPE (decl);
mrs's avatar
mrs committed
1665

jason's avatar
jason committed
1666 1667 1668 1669
  if (! ctx && primary)
    /* The check of PRIMARY ensures 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.  */
mrs's avatar
mrs committed
1670
    tmpl = pushdecl_top_level (tmpl);
mrs's avatar
mrs committed
1671

mrs's avatar
mrs committed
1672
  if (primary)
1673
    TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (tmpl)) = tmpl;
mrs's avatar
mrs committed
1674 1675 1676

  info = perm_tree_cons (tmpl, args, NULL_TREE);

mrs's avatar
mrs committed
1677
  if (TREE_CODE (decl) == TYPE_DECL && DECL_ARTIFICIAL (decl))
mrs's avatar
mrs committed
1678
    {
mrs's avatar
mrs committed
1679
      CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (tmpl)) = info;
1680 1681
      if (!ctx || TREE_CODE (ctx) != FUNCTION_DECL)
	DECL_NAME (decl) = classtype_mangled_name (TREE_TYPE (decl));
mrs's avatar
mrs committed
1682
    }
mrs's avatar
mrs committed
1683 1684
  else if (! DECL_LANG_SPECIFIC (decl))
    cp_error ("template declaration of `%#D'", decl);
mrs's avatar
mrs committed
1685
  else
mrs's avatar
mrs committed
1686
    DECL_TEMPLATE_INFO (decl) = info;
1687 1688

  return DECL_TEMPLATE_RESULT (tmpl);
mrs's avatar
mrs committed
1689 1690
}

1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702

/* 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
1703
convert_nontype_argument (type, expr)
1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718
     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
1719
     excluding non-static class members, expressed as id-expression;
1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
     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_.  */

1730 1731 1732 1733 1734
  /* 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);

1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745
  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)
1746
    {
1747
      if (! TREE_CONSTANT (expr))
1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
	{
	  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;

      if (TREE_CODE (expr) != ADDR_EXPR)
	{
	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;
	}

      referent = TREE_OPERAND (expr, 0);
      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;
	}
    }
1795
  else if (TREE_CODE (expr) == VAR_DECL)
1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820
    {
      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.  */
      return digest_init (type, expr, (tree*) 0);

1821 1822 1823 1824 1825 1826 1827 1828
    case REAL_TYPE:
    case COMPLEX_TYPE:
      /* These are g++ extensions.  */
      if (TREE_CODE (expr_type) != TREE_CODE (type))
	return error_mark_node;

      return digest_init (type, expr, (tree*) 0);

1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848
    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;

1849
	    if (TREE_CODE (expr) == ADDR_EXPR)
1850 1851 1852 1853
	      fns = TREE_OPERAND (expr, 0);
	    else
	      fns = expr;

1854
	    fn = instantiate_type (type_pointed_to, fns, 0);
1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882

	    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
1883 1884 1885 1886 1887
	       non-type template-parameter of pointer type.]  
	    
	       The call to decay_conversion performs the
	       array-to-pointer conversion, if appropriate.  */
	    expr = decay_conversion (expr);
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910

	    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;

1911
	    fn = instantiate_type (type_referred_to, fns, 0);
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984

	    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;

	my_friendly_assert (TYPE_PTRMEMFUNC_P (type), 0);

	/* 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);
	
1985 1986
	fn = instantiate_type (TREE_TYPE (TREE_TYPE (type)), 
			       fns, 0);
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
	
	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;
}

mrs's avatar
mrs committed
2008 2009
/* Convert all template arguments to their appropriate types, and return
   a vector containing the resulting values.  If any error occurs, return
2010 2011 2012 2013 2014 2015 2016
   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
2017 2018 2019 2020 2021
   deduction for any unspecified trailing arguments.
   
   If IS_TMPL_PARM is non-zero,  we will coercing parameters of template 
   template arguments.  In this case, ARGLIST is a chain of TREE_LIST
   nodes containing TYPE_DECL, TEMPLATE_DECL or PARM_DECL.  */
mrs's avatar
mrs committed
2022

mrs's avatar
mrs committed
2023
static tree
2024 2025
coerce_template_parms (parms, arglist, in_decl,
		       complain,
2026 2027
		       require_all_arguments,
		       is_tmpl_parm)
mrs's avatar
mrs committed
2028 2029
     tree parms, arglist;
     tree in_decl;
2030 2031
     int complain;
     int require_all_arguments;
2032
     int is_tmpl_parm;
mrs's avatar
mrs committed
2033
{
mrs's avatar
mrs committed
2034
  int nparms, nargs, i, lost = 0;
2035
  tree vec = NULL_TREE;
mrs's avatar
mrs committed
2036

mrs's avatar
mrs committed
2037 2038 2039 2040
  if (arglist == NULL_TREE)
    nargs = 0;
  else if (TREE_CODE (arglist) == TREE_VEC)
    nargs = TREE_VEC_LENGTH (arglist);
mrs's avatar
mrs committed
2041
  else
mrs's avatar
mrs committed
2042 2043 2044 2045 2046 2047
    nargs = list_length (arglist);

  nparms = TREE_VEC_LENGTH (parms);

  if (nargs > nparms
      || (nargs < nparms
2048
	  && require_all_arguments
mrs's avatar
mrs committed
2049
	  && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
mrs's avatar
mrs committed
2050
    {
2051 2052 2053 2054 2055 2056 2057 2058 2059 2060
      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
2061 2062 2063
      return error_mark_node;
    }

2064 2065
  if (arglist && TREE_CODE (arglist) == TREE_VEC && nargs == nparms)
    vec = copy_node (arglist);
mrs's avatar
mrs committed
2066 2067 2068
  else
    {
      vec = make_tree_vec (nparms);
2069

mrs's avatar
mrs committed
2070 2071
      for (i = 0; i < nparms; i++)
	{
mrs's avatar
mrs committed
2072
	  tree arg;
2073
	  tree parm = TREE_VEC_ELT (parms, i);
mrs's avatar
mrs committed
2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084

	  if (arglist)
	    {
	      arg = arglist;
	      arglist = TREE_CHAIN (arglist);

	      if (arg == error_mark_node)
		lost++;
	      else
		arg = TREE_VALUE (arg);
	    }
2085 2086 2087 2088 2089 2090
	  else if (is_tmpl_parm && i < nargs)
	    {
	      arg = TREE_VEC_ELT (arglist, i);
	      if (arg == error_mark_node)
		lost++;
	    }
2091 2092 2093 2094 2095 2096
	  else if (TREE_PURPOSE (parm) == NULL_TREE)
	    {
	      my_friendly_assert (!require_all_arguments, 0);
	      break;
	    }
	  else if (TREE_CODE (TREE_VALUE (parm)) == TYPE_DECL)
2097
	    arg = tsubst (TREE_PURPOSE (parm), vec, in_decl);
mrs's avatar
mrs committed
2098
	  else
2099
	    arg = tsubst_expr (TREE_PURPOSE (parm), vec, in_decl);
mrs's avatar
mrs committed
2100

mrs's avatar
mrs committed
2101 2102 2103 2104 2105 2106
	  TREE_VEC_ELT (vec, i) = arg;
	}
    }
  for (i = 0; i < nparms; i++)
    {
      tree arg = TREE_VEC_ELT (vec, i);
mrs's avatar
mrs committed
2107
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
mrs's avatar
mrs committed
2108
      tree val = 0;
2109
      int is_type, requires_type, is_tmpl_type, requires_tmpl_type;
mrs's avatar
mrs committed
2110

2111 2112 2113 2114 2115 2116 2117 2118 2119 2120
      if (is_tmpl_parm && i < nargs)
	{
	  /* In case we are checking arguments inside a template template
	     parameter, ARG that does not come from default argument is 
	     also a TREE_LIST node.  Note that ARG can also be a TREE_LIST
	     in other cases such as overloaded functions.  */
	  if (arg != NULL_TREE && arg != error_mark_node)
	    arg = TREE_VALUE (arg);
	}

2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134
      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;
	}

2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146
      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;
	}
2147

2148 2149 2150 2151 2152 2153
      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,
	 we also accept implicitly created TYPE_DECL as a valid argument.  */
2154 2155 2156
      is_tmpl_type = (TREE_CODE (arg) == TEMPLATE_DECL
		      && TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL)
		     || (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
2157 2158 2159 2160 2161 2162
			 && !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))
			 && requires_tmpl_type);
2163 2164
      if (is_tmpl_type && TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM)
	arg = TYPE_STUB_DECL (arg);
2165 2166
      else if (is_tmpl_type && TREE_CODE (arg) == RECORD_TYPE)
	arg = CLASSTYPE_TI_TEMPLATE (arg);
2167 2168 2169 2170 2171

      if (is_tmpl_parm && i < nargs)
	is_type = TREE_CODE (arg) == TYPE_DECL || is_tmpl_type;
      else
	is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't' || is_tmpl_type;
mrs's avatar
mrs committed
2172 2173 2174 2175 2176 2177

      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);
2178

mrs's avatar
mrs committed
2179 2180 2181 2182
	  arg = make_typename_type (TREE_OPERAND (arg, 0),
				    TREE_OPERAND (arg, 1));
	  is_type = 1;
	}
mrs's avatar
mrs committed
2183 2184 2185
      if (is_type != requires_type)
	{
	  if (in_decl)
mrs's avatar
mrs committed
2186
	    {
2187 2188 2189 2190 2191 2192
	      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'",
2193 2194
			      TREE_TYPE (parm),
			      (is_tmpl_type ? DECL_NAME (arg) : arg));
2195 2196 2197
		  else
		    cp_error ("  expected a type, got `%E'", arg);
		}
mrs's avatar
mrs committed
2198
	    }
mrs's avatar
mrs committed
2199 2200 2201 2202
	  lost++;
	  TREE_VEC_ELT (vec, i) = error_mark_node;
	  continue;
	}
2203 2204 2205 2206 2207
      if (is_tmpl_type ^ requires_tmpl_type)
	{
	  if (in_decl)
	    {
	      cp_error ("type/value mismatch at argument %d in template parameter list for `%D'",
2208
			i + 1, in_decl);
2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228
	      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;
	}
      if (is_tmpl_parm)
	{
	  if (requires_tmpl_type)
	    {
	      cp_error ("nested template template parameter not implemented");
	      lost++;
	      TREE_VEC_ELT (vec, i) = error_mark_node;
	    }
	  continue;
	}
        
mrs's avatar
mrs committed
2229
      if (is_type)
mrs's avatar
mrs committed
2230
	{
2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243
	  if (requires_tmpl_type)
	    {
	      tree parmparm = DECL_INNERMOST_TEMPLATE_PARMS (parm);
	      tree argparm = DECL_INNERMOST_TEMPLATE_PARMS (arg);

	      /* 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 
		   template <class T, class Allcator = allocator> 
		   class vector.  */

2244
	      val = coerce_template_parms (argparm, parmparm, in_decl, 1, 1, 1);
2245 2246 2247 2248 2249 2250 2251 2252 2253 2254
	      if (val != error_mark_node)
		val = arg;
		    
	      /* 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
mrs's avatar
mrs committed
2255
	    {
2256 2257
	      val = groktypename (arg);
	      if (! processing_template_decl)
mrs's avatar
mrs committed
2258
		{
2259 2260 2261 2262 2263 2264 2265 2266 2267
		  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
2268 2269 2270
		}
	    }
	}
mrs's avatar
mrs committed
2271 2272
      else
	{
2273
	  tree t = tsubst (TREE_TYPE (parm), vec, in_decl);
2274

2275
	  if (processing_template_decl)
2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288
	    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.  */
2289
	    val = convert_nontype_argument (t, arg);
mrs's avatar
mrs committed
2290
	  else
2291 2292
	    val = arg;

2293 2294 2295 2296 2297
	  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
2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309
	}

      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
2310 2311 2312
/* Renturns 1 iff the OLDARGS and NEWARGS are in fact identical sets
   of template arguments.  Returns 0 otherwise.  */

mrs's avatar
mrs committed
2313
static int
mrs's avatar
mrs committed
2314 2315 2316 2317 2318
comp_template_args (oldargs, newargs)
     tree oldargs, newargs;
{
  int i;

2319 2320 2321
  if (TREE_VEC_LENGTH (oldargs) != TREE_VEC_LENGTH (newargs))
    return 0;

mrs's avatar
mrs committed
2322 2323 2324 2325 2326 2327 2328 2329 2330
  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;
2331 2332 2333 2334 2335 2336 2337
      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
2338 2339 2340 2341 2342
	{
	  if (comptypes (ot, nt, 1))
	    continue;
	}
      else if (cp_tree_equal (ot, nt) > 0)
mrs's avatar
mrs committed
2343 2344 2345 2346 2347 2348
	continue;
      return 0;
    }
  return 1;
}

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

mrs's avatar
mrs committed
2352
static char *
2353
mangle_class_name_for_template (name, parms, arglist, ctx)
mrs's avatar
mrs committed
2354 2355
     char *name;
     tree parms, arglist;
2356
     tree ctx;
mrs's avatar
mrs committed
2357 2358 2359 2360 2361 2362
{
  static struct obstack scratch_obstack;
  static char *scratch_firstobj;
  int i, nparms;

  if (!scratch_firstobj)
mrs's avatar
mrs committed
2363
    gcc_obstack_init (&scratch_obstack);
mrs's avatar
mrs committed
2364 2365
  else
    obstack_free (&scratch_obstack, scratch_firstobj);
mrs's avatar
mrs committed
2366
  scratch_firstobj = obstack_alloc (&scratch_obstack, 1);
mrs's avatar
mrs committed
2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380

#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

2381 2382
  if (ctx)
    {
2383 2384 2385 2386 2387 2388 2389 2390
      char* s;

      if (TREE_CODE (ctx) == FUNCTION_DECL)
	s = fndecl_as_string(ctx, 0);
      else if (TREE_CODE_CLASS (TREE_CODE (ctx)) == 't')
	s = type_as_string(ctx, 0);
      else
	my_friendly_abort (0);
2391 2392 2393
      cat (s);
      cat ("::");
    }
mrs's avatar
mrs committed
2394 2395 2396 2397 2398 2399
  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
2400 2401
      tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
      tree arg = TREE_VEC_ELT (arglist, i);
mrs's avatar
mrs committed
2402 2403 2404 2405

      if (i)
	ccat (',');

mrs's avatar
mrs committed
2406
      if (TREE_CODE (parm) == TYPE_DECL)
mrs's avatar
mrs committed
2407 2408 2409 2410
	{
	  cat (type_as_string (arg, 0));
	  continue;
	}
2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421
      else if (TREE_CODE (parm) == TEMPLATE_DECL)
	{
	  if (TREE_CODE (arg) == TEMPLATE_DECL)
	    /* Already substituted with real template.  Just output 
	       the template name here */
	    cat (IDENTIFIER_POINTER (DECL_NAME (arg)));
	  else
	    /* Output the parameter declaration */
	    cat (type_as_string (arg, 0));
	  continue;
	}
mrs's avatar
mrs committed
2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
      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
2451
#if 0
mrs's avatar
mrs committed
2452
 too_long:
mrs's avatar
mrs committed
2453
#endif
mrs's avatar
mrs committed
2454 2455 2456 2457 2458
  fatal ("out of (preallocated) string space creating template instantiation name");
  /* NOTREACHED */
  return NULL;
}

mrs's avatar
mrs committed
2459
static tree
mrs's avatar
mrs committed
2460 2461 2462 2463 2464 2465 2466 2467 2468
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));
      char *mangled_name = mangle_class_name_for_template
	(IDENTIFIER_POINTER (name),
2469
	 DECL_INNERMOST_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (t)),
2470
	 CLASSTYPE_TI_ARGS (t), DECL_CONTEXT (t));
mrs's avatar
mrs committed
2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482
      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
2483 2484 2485 2486 2487 2488 2489
  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
2490
  if (TI_PENDING_TEMPLATE_FLAG (ti))
mrs's avatar
mrs committed
2491 2492 2493 2494 2495
    return;

  *template_tail = perm_tree_cons
    (current_function_decl, d, NULL_TREE);
  template_tail = &TREE_CHAIN (*template_tail);
mrs's avatar
mrs committed
2496
  TI_PENDING_TEMPLATE_FLAG (ti) = 1;
mrs's avatar
mrs committed
2497 2498
}

2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514

/* 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;
{
  if (fns == NULL_TREE)
    {
      cp_error ("non-template used as template");
      return error_mark_node;
    }

  if (arglist != NULL_TREE && !TREE_PERMANENT (arglist))
2515
    copy_to_permanent (arglist);
2516 2517 2518 2519 2520 2521 2522 2523

  return build_min (TEMPLATE_ID_EXPR,
		    TREE_TYPE (fns) 
		    ? TREE_TYPE (fns) : unknown_type_node, 
		    fns, arglist);  
}


mrs's avatar
mrs committed
2524 2525 2526 2527 2528 2529 2530 2531
/* 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
2532 2533 2534 2535 2536
   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
2537

mrs's avatar
mrs committed
2538
tree
2539
lookup_template_class (d1, arglist, in_decl, context)
mrs's avatar
mrs committed
2540 2541
     tree d1, arglist;
     tree in_decl;
2542
     tree context;
mrs's avatar
mrs committed
2543
{
2544
  tree template = NULL_TREE, parmlist;
mrs's avatar
mrs committed
2545
  char *mangled_name;
mrs's avatar
mrs committed
2546 2547 2548 2549
  tree id, t;

  if (TREE_CODE (d1) == IDENTIFIER_NODE)
    {
2550 2551 2552 2553 2554
      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
2555
	  template = IDENTIFIER_NAMESPACE_VALUE (d1); /* XXX */
2556 2557 2558
	  if (! template)
	    template = IDENTIFIER_CLASS_VALUE (d1);
	}
2559 2560
      if (template)
	context = DECL_CONTEXT (template);
mrs's avatar
mrs committed
2561
    }
mrs's avatar
mrs committed
2562 2563
  else if (TREE_CODE (d1) == TYPE_DECL && IS_AGGR_TYPE (TREE_TYPE (d1)))
    {
2564 2565
      if (CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (d1)) == NULL_TREE)
	return error_mark_node;
mrs's avatar
mrs committed
2566 2567 2568
      template = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (d1));
      d1 = DECL_NAME (template);
    }
mrs's avatar
mrs committed
2569 2570 2571 2572 2573
  else if (TREE_CODE_CLASS (TREE_CODE (d1)) == 't' && IS_AGGR_TYPE (d1))
    {
      template = CLASSTYPE_TI_TEMPLATE (d1);
      d1 = DECL_NAME (template);
    }
2574 2575 2576 2577 2578 2579 2580
  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
2581 2582
  else
    my_friendly_abort (272);
mrs's avatar
mrs committed
2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597

  /* 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;
  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;
    }

2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609
  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);

2610
      arglist2 = coerce_template_parms (parmlist, arglist, template, 1, 1, 0);
2611 2612 2613 2614 2615 2616 2617 2618 2619
      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;
    }
2620 2621 2622
  else if (PRIMARY_TEMPLATE_P (template)
	   || (TREE_CODE (TYPE_CONTEXT (TREE_TYPE (template))) 
	       == FUNCTION_DECL))
mrs's avatar
mrs committed
2623
    {
2624
      parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template);
mrs's avatar
mrs committed
2625

2626
      arglist = coerce_template_parms (parmlist, arglist, template,
2627
				       1, 1, 0);
mrs's avatar
mrs committed
2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656
      if (arglist == error_mark_node)
	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;
	    }
	}

2657
      /* FIXME avoid duplication.  */
mrs's avatar
mrs committed
2658
      mangled_name = mangle_class_name_for_template (IDENTIFIER_POINTER (d1),
2659 2660
						     parmlist,
						     arglist,
2661
						     context);
mrs's avatar
mrs committed
2662
      id = get_identifier (mangled_name);
mrs's avatar
mrs committed
2663
      IDENTIFIER_TEMPLATE (id) = d1;
mrs's avatar
mrs committed
2664

mrs's avatar
mrs committed
2665
      maybe_push_to_top_level (uses_template_parms (arglist));
mrs's avatar
mrs committed
2666
      t = xref_tag_from_type (TREE_TYPE (template), id, 1);
2667

2668
      if (context != NULL_TREE)
2669 2670 2671 2672 2673 2674
	{
	  /* 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);

2675 2676
	  TYPE_CONTEXT (t) = context;
	  DECL_CONTEXT (type_decl) = context;
2677 2678 2679 2680 2681
	  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
2682
      pop_from_top_level ();
mrs's avatar
mrs committed
2683
    }
mrs's avatar
mrs committed
2684
  else
mrs's avatar
mrs committed
2685
    {
2686
      tree type_ctx = TYPE_CONTEXT (TREE_TYPE (template));
2687
      tree args = tsubst (CLASSTYPE_TI_ARGS (type_ctx), arglist, in_decl);
2688 2689
      tree ctx = lookup_template_class (type_ctx, args,
					in_decl, NULL_TREE);
mrs's avatar
mrs committed
2690 2691
      id = d1;
      arglist = CLASSTYPE_TI_ARGS (ctx);
mrs's avatar
mrs committed
2692

mrs's avatar
mrs committed
2693
      if (TYPE_BEING_DEFINED (ctx) && ctx == current_class_type)
mrs's avatar
mrs committed
2694
	{
mrs's avatar
mrs committed
2695 2696
	  int save_temp = processing_template_decl;
	  processing_template_decl = 0;
mrs's avatar
mrs committed
2697
	  t = xref_tag_from_type (TREE_TYPE (template), id, 0);
mrs's avatar
mrs committed
2698
	  processing_template_decl = save_temp;
mrs's avatar
mrs committed
2699 2700 2701
	}
      else
	{
mrs's avatar
mrs committed
2702 2703
	  t = lookup_nested_type_by_name (ctx, id);
	  my_friendly_assert (t != NULL_TREE, 42);
mrs's avatar
mrs committed
2704
	}
mrs's avatar
mrs committed
2705 2706
    }

mrs's avatar
mrs committed
2707
  /* Seems to be wanted.  */
mrs's avatar
mrs committed
2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721
  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
2722
      /* We need to set this again after CLASSTYPE_TEMPLATE_INFO is set up.  */
mrs's avatar
mrs committed
2723
      DECL_ASSEMBLER_NAME (TYPE_MAIN_DECL (t)) = id;
2724
      /* if (! uses_template_parms (arglist)) */
mrs's avatar
mrs committed
2725 2726 2727 2728 2729 2730
	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
2731
	add_pending_template (t);
mrs's avatar
mrs committed
2732 2733
    }

mrs's avatar
mrs committed
2734
  return t;
mrs's avatar
mrs committed
2735 2736
}

mrs's avatar
mrs committed
2737
/* Should be defined in parse.h.  */
mrs's avatar
mrs committed
2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757
extern int yychar;

int
uses_template_parms (t)
     tree t;
{
  if (!t)
    return 0;
  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.  */
      return uses_template_parms (TREE_TYPE (t));

    case IDENTIFIER_NODE:
      if (!IDENTIFIER_TEMPLATE (t))
	return 0;
mrs's avatar
mrs committed
2758
      my_friendly_abort (42);
mrs's avatar
mrs committed
2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779

      /* aggregates of tree nodes */
    case TREE_VEC:
      {
	int i = TREE_VEC_LENGTH (t);
	while (i--)
	  if (uses_template_parms (TREE_VEC_ELT (t, i)))
	    return 1;
	return 0;
      }
    case TREE_LIST:
      if (uses_template_parms (TREE_PURPOSE (t))
	  || uses_template_parms (TREE_VALUE (t)))
	return 1;
      return uses_template_parms (TREE_CHAIN (t));

      /* constructed type nodes */
    case POINTER_TYPE:
    case REFERENCE_TYPE:
      return uses_template_parms (TREE_TYPE (t));
    case RECORD_TYPE:
mrs's avatar
mrs committed
2780 2781
      if (TYPE_PTRMEMFUNC_FLAG (t))
	return uses_template_parms (TYPE_PTRMEMFUNC_FN_TYPE (t));
mrs's avatar
mrs committed
2782
    case UNION_TYPE:
mrs's avatar
mrs committed
2783
      if (! CLASSTYPE_TEMPLATE_INFO (t))
mrs's avatar
mrs committed
2784
	return 0;
mrs's avatar
mrs committed
2785
      return uses_template_parms (TREE_VALUE (CLASSTYPE_TEMPLATE_INFO (t)));
mrs's avatar
mrs committed
2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798
    case FUNCTION_TYPE:
      if (uses_template_parms (TYPE_ARG_TYPES (t)))
	return 1;
      return uses_template_parms (TREE_TYPE (t));
    case ARRAY_TYPE:
      if (uses_template_parms (TYPE_DOMAIN (t)))
	return 1;
      return uses_template_parms (TREE_TYPE (t));
    case OFFSET_TYPE:
      if (uses_template_parms (TYPE_OFFSET_BASETYPE (t)))
	return 1;
      return uses_template_parms (TREE_TYPE (t));
    case METHOD_TYPE:
2799
      if (uses_template_parms (TYPE_METHOD_BASETYPE (t)))
mrs's avatar
mrs committed
2800 2801 2802 2803 2804 2805 2806
	return 1;
      if (uses_template_parms (TYPE_ARG_TYPES (t)))
	return 1;
      return uses_template_parms (TREE_TYPE (t));

      /* decl nodes */
    case TYPE_DECL:
mrs's avatar
mrs committed
2807 2808
      return uses_template_parms (TREE_TYPE (t));

2809 2810 2811 2812 2813 2814 2815 2816 2817
    case TEMPLATE_DECL:
      /* A template template parameter is encountered */
      if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
        /* We are parsing a template declaration */
        return 1;
      /* We are instantiating templates with template template
         parameter */
      return 0;
      
2818 2819 2820 2821 2822
    case CONST_DECL:
      if (uses_template_parms (DECL_INITIAL (t)))
	return 1;
      goto check_type_and_context;

mrs's avatar
mrs committed
2823
    case FUNCTION_DECL:
mrs's avatar
mrs committed
2824 2825 2826 2827
    case VAR_DECL:
      /* ??? What about FIELD_DECLs?  */
      if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
	  && uses_template_parms (DECL_TI_ARGS (t)))
mrs's avatar
mrs committed
2828 2829 2830
	return 1;
      /* fall through */
    case PARM_DECL:
2831
    check_type_and_context:
mrs's avatar
mrs committed
2832 2833
      if (uses_template_parms (TREE_TYPE (t)))
	return 1;
mrs's avatar
mrs committed
2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844
      if (DECL_CONTEXT (t) && uses_template_parms (DECL_CONTEXT (t)))
	return 1;
      return 0;

    case CALL_EXPR:
      return uses_template_parms (TREE_TYPE (t));
    case ADDR_EXPR:
      return uses_template_parms (TREE_OPERAND (t, 0));

      /* template parm nodes */
    case TEMPLATE_TYPE_PARM:
2845
    case TEMPLATE_TEMPLATE_PARM:
jason's avatar
jason committed
2846
    case TEMPLATE_PARM_INDEX:
mrs's avatar
mrs committed
2847 2848 2849 2850 2851 2852 2853 2854 2855
      return 1;

      /* simple type nodes */
    case INTEGER_TYPE:
      if (uses_template_parms (TYPE_MIN_VALUE (t)))
	return 1;
      return uses_template_parms (TYPE_MAX_VALUE (t));

    case REAL_TYPE:
mrs's avatar
mrs committed
2856
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
2857
    case VOID_TYPE:
mrs's avatar
mrs committed
2858
    case BOOLEAN_TYPE:
mrs's avatar
mrs committed
2859 2860
      return 0;

2861 2862 2863 2864 2865 2866 2867 2868 2869 2870
    case ENUMERAL_TYPE:
      {
	tree v;

	for (v = TYPE_VALUES (t); v != NULL_TREE; v = TREE_CHAIN (v))
	  if (uses_template_parms (TREE_VALUE (v)))
	    return 1;
      }
      return 0;

mrs's avatar
mrs committed
2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882
      /* 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
2883
    case LOOKUP_EXPR:
mrs's avatar
mrs committed
2884
    case TYPENAME_TYPE:
mrs's avatar
mrs committed
2885 2886
      return 1;

mrs's avatar
mrs committed
2887 2888 2889
    case SCOPE_REF:
      return uses_template_parms (TREE_OPERAND (t, 0));

mrs's avatar
mrs committed
2890 2891 2892
    case CONSTRUCTOR:
      if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
	return uses_template_parms (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
mrs's avatar
mrs committed
2893
      return uses_template_parms (TREE_OPERAND (t, 1));
mrs's avatar
mrs committed
2894

brendan's avatar
brendan committed
2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905
    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;

2906 2907 2908 2909
    case SIZEOF_EXPR:
    case ALIGNOF_EXPR:
      return uses_template_parms (TREE_OPERAND (t, 0));

mrs's avatar
mrs committed
2910 2911 2912 2913 2914
    default:
      switch (TREE_CODE_CLASS (TREE_CODE (t)))
	{
	case '1':
	case '2':
mrs's avatar
mrs committed
2915
	case 'e':
mrs's avatar
mrs committed
2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934
	case '<':
	  {
	    int i;
	    for (i = tree_code_length[(int) TREE_CODE (t)]; --i >= 0;)
	      if (uses_template_parms (TREE_OPERAND (t, i)))
		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;
    }
}

mrs's avatar
mrs committed
2935 2936 2937
static struct tinst_level *current_tinst_level = 0;
static struct tinst_level *free_tinst_level = 0;
static int tinst_depth = 0;
mrs's avatar
mrs committed
2938
extern int max_tinst_depth;
mrs's avatar
mrs committed
2939 2940 2941
#ifdef GATHER_STATISTICS
int depth_reached = 0;
#endif
mrs's avatar
mrs committed
2942

mrs's avatar
mrs committed
2943
static int
mrs's avatar
mrs committed
2944 2945
push_tinst_level (d)
     tree d;
mrs's avatar
mrs committed
2946 2947 2948
{
  struct tinst_level *new;

mrs's avatar
mrs committed
2949 2950
  if (tinst_depth >= max_tinst_depth)
    {
mrs's avatar
mrs committed
2951 2952 2953 2954
      struct tinst_level *p = current_tinst_level;
      int line = lineno;
      char *file = input_filename;

2955 2956 2957 2958 2959 2960
      /* 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;

mrs's avatar
mrs committed
2961 2962
      error ("template instantiation depth exceeds maximum of %d",
	     max_tinst_depth);
mrs's avatar
mrs committed
2963
      error (" (use -ftemplate-depth-NN to increase the maximum)");
mrs's avatar
mrs committed
2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
      cp_error ("  instantiating `%D'", d);

      for (; p; p = p->next)
	{
	  cp_error ("  instantiated from `%D'", p->decl);
	  lineno = p->line;
	  input_filename = p->file;
	}
      error ("  instantiated from here");

      lineno = line;
      input_filename = file;

mrs's avatar
mrs committed
2977 2978 2979
      return 0;
    }

mrs's avatar
mrs committed
2980 2981 2982 2983 2984 2985 2986 2987
  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
2988 2989 2990
  new->decl = d;
  new->line = lineno;
  new->file = input_filename;
mrs's avatar
mrs committed
2991 2992
  new->next = current_tinst_level;
  current_tinst_level = new;
mrs's avatar
mrs committed
2993

mrs's avatar
mrs committed
2994
  ++tinst_depth;
mrs's avatar
mrs committed
2995 2996 2997 2998 2999
#ifdef GATHER_STATISTICS
  if (tinst_depth > depth_reached)
    depth_reached = tinst_depth;
#endif

mrs's avatar
mrs committed
3000
  return 1;
mrs's avatar
mrs committed
3001 3002 3003 3004 3005 3006 3007 3008 3009 3010
}

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
3011
  --tinst_depth;
mrs's avatar
mrs committed
3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024
}

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
3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056

/* 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;
  
  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),
3057
						 args, NULL_TREE),
jason's avatar
jason committed
3058
				    tsubst (DECL_TI_ARGS (decl),
3059
					    args, NULL_TREE));
jason's avatar
jason committed
3060 3061 3062 3063 3064
      
      /* Temporarily remove the DECL_TEMPLATE_INFO so as not to
	 confuse tsubst.  */
      tinfo = DECL_TEMPLATE_INFO (decl);
      DECL_TEMPLATE_INFO (decl) = NULL_TREE;
3065
      new_friend = tsubst (decl, args, NULL_TREE);
jason's avatar
jason committed
3066 3067 3068 3069 3070 3071 3072 3073 3074
      DECL_TEMPLATE_INFO (decl) = tinfo;

      tmpl = determine_specialization (template_id,
				       new_friend,
				       &new_args,
				       0, 1);
      return instantiate_template (tmpl, new_args);
    }
    else
3075
      new_friend = tsubst (decl, args, NULL_TREE);
jason's avatar
jason committed
3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114
	
  /* 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;
  
  if (DECL_CONTEXT (new_friend) == NULL_TREE)
    {
      if (TREE_CODE (new_friend) == TEMPLATE_DECL)
	/* This declaration is a `primary' template.  */
	TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (new_friend))
	    = new_friend;

	new_friend = pushdecl_top_level (new_friend);
    }
  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;
    }

  return new_friend;
}


mrs's avatar
mrs committed
3115
tree
mrs's avatar
mrs committed
3116 3117
instantiate_class_template (type)
     tree type;
mrs's avatar
mrs committed
3118
{
mrs's avatar
mrs committed
3119
  tree template, template_info, args, pattern, t, *field_chain;
3120
  tree typedecl, outer_args;
mrs's avatar
mrs committed
3121

mrs's avatar
mrs committed
3122
  if (type == error_mark_node)
mrs's avatar
mrs committed
3123 3124
    return error_mark_node;

mrs's avatar
mrs committed
3125 3126 3127 3128 3129 3130 3131 3132
  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
3133

3134 3135
  if (DECL_TEMPLATE_INFO (template))
    {
3136
      outer_args = DECL_TI_ARGS (template);
3137 3138 3139
      while (DECL_TEMPLATE_INFO (template))
	template = DECL_TI_TEMPLATE (template);
    }
3140 3141
  else
    outer_args = NULL_TREE;
3142

mrs's avatar
mrs committed
3143
  t = most_specialized_class
3144
    (DECL_TEMPLATE_SPECIALIZATIONS (template), args, outer_args);
mrs's avatar
mrs committed
3145 3146 3147 3148 3149 3150 3151

  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))
	{
3152 3153
	  if (get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
				  args, outer_args))
mrs's avatar
mrs committed
3154 3155 3156 3157 3158 3159
	    {
	      cp_error_at ("%s %+#T", str, TREE_TYPE (t));
	      str = "               ";
	    }
	}
      TYPE_BEING_DEFINED (type) = 1;
mrs's avatar
mrs committed
3160
      return error_mark_node;
mrs's avatar
mrs committed
3161 3162 3163 3164 3165
    }
  else if (t)
    pattern = TREE_TYPE (t);
  else
    pattern = TREE_TYPE (template);
mrs's avatar
mrs committed
3166 3167

  if (TYPE_SIZE (pattern) == NULL_TREE)
mrs's avatar
mrs committed
3168
    return type;
mrs's avatar
mrs committed
3169

mrs's avatar
mrs committed
3170
  if (t)
3171 3172 3173
    args = get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
			       args, outer_args);

3174 3175 3176 3177 3178 3179 3180
  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;

mrs's avatar
mrs committed
3181 3182 3183 3184
  TYPE_BEING_DEFINED (type) = 1;

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

mrs's avatar
mrs committed
3186 3187 3188
  maybe_push_to_top_level (uses_template_parms (type));
  pushclass (type, 0);

3189 3190 3191
  if (outer_args)
    args = add_to_template_args (outer_args, args);

mrs's avatar
mrs committed
3192 3193 3194 3195 3196 3197 3198
  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)
3199 3200
	    = (! CLASSTYPE_INTERFACE_ONLY (type)
	       && CLASSTYPE_INTERFACE_KNOWN (type));
mrs's avatar
mrs committed
3201 3202 3203 3204 3205 3206 3207
	}
      else
	{
	  CLASSTYPE_INTERFACE_ONLY (type) = CLASSTYPE_INTERFACE_ONLY (pattern);
	  SET_CLASSTYPE_INTERFACE_UNKNOWN_X
	    (type, CLASSTYPE_INTERFACE_UNKNOWN (pattern));
	  CLASSTYPE_VTABLE_NEEDS_WRITING (type)
3208 3209
	    = (! CLASSTYPE_INTERFACE_ONLY (type)
	       && CLASSTYPE_INTERFACE_KNOWN (type));
mrs's avatar
mrs committed
3210 3211 3212
	}
    }
  else
mrs's avatar
mrs committed
3213
    {
mrs's avatar
mrs committed
3214 3215
      SET_CLASSTYPE_INTERFACE_UNKNOWN (type);
      CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
mrs's avatar
mrs committed
3216 3217
    }

mrs's avatar
mrs committed
3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243
  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_GETS_INIT_AGGR (type) = TYPE_GETS_INIT_AGGR (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);

3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258
  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
3259 3260 3261 3262 3263 3264 3265 3266 3267
  {
    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
3268
	bases = make_tree_vec (len);
mrs's avatar
mrs committed
3269 3270 3271 3272 3273
	for (i = 0; i < len; ++i)
	  {
	    tree elt;

	    TREE_VEC_ELT (bases, i) = elt
3274
	      = tsubst (TREE_VEC_ELT (pbases, i), args, NULL_TREE);
mrs's avatar
mrs committed
3275 3276
	    BINFO_INHERITANCE_CHAIN (elt) = binfo;

mrs's avatar
mrs committed
3277 3278 3279 3280
	    if (! IS_AGGR_TYPE (TREE_TYPE (elt)))
	      cp_error
		("base type `%T' of `%T' fails to be a struct or class type",
		 TREE_TYPE (elt), type);
3281
	    else if (TYPE_SIZE (complete_type (TREE_TYPE (elt))) == NULL_TREE)
mrs's avatar
mrs committed
3282 3283 3284
	      cp_error ("base class `%T' of `%T' has incomplete type",
			TREE_TYPE (elt), type);
	  }
mrs's avatar
mrs committed
3285 3286 3287
	/* Don't initialize this until the vector is filled out, or
	   lookups will crash.  */
	BINFO_BASETYPES (binfo) = bases;
mrs's avatar
mrs committed
3288 3289 3290 3291 3292 3293
      }
  }

  field_chain = &TYPE_FIELDS (type);

  for (t = CLASSTYPE_TAGS (pattern); t; t = TREE_CHAIN (t))
mrs's avatar
mrs committed
3294
    {
mrs's avatar
mrs committed
3295 3296
      tree tag = TREE_VALUE (t);

mrs's avatar
mrs committed
3297
      /* These will add themselves to CLASSTYPE_TAGS for the new type.  */
mrs's avatar
mrs committed
3298
      if (TREE_CODE (tag) == ENUMERAL_TYPE)
mrs's avatar
mrs committed
3299
	{
manfred's avatar
d  
manfred committed
3300
	  (void) tsubst_enum (tag, args, field_chain);
mrs's avatar
mrs committed
3301
	  while (*field_chain)
mrs's avatar
mrs committed
3302 3303 3304 3305
	    {
	      DECL_FIELD_CONTEXT (*field_chain) = type;
	      field_chain = &TREE_CHAIN (*field_chain);
	    }
mrs's avatar
mrs committed
3306
	}
mrs's avatar
mrs committed
3307
      else
3308
	tsubst (tag, args, NULL_TREE);
mrs's avatar
mrs committed
3309 3310
    }

mrs's avatar
mrs committed
3311 3312 3313 3314
  /* Don't replace enum constants here.  */
  for (t = TYPE_FIELDS (pattern); t; t = TREE_CHAIN (t))
    if (TREE_CODE (t) != CONST_DECL)
      {
3315
	tree r = tsubst (t, args, NULL_TREE);
mrs's avatar
mrs committed
3316 3317
	if (TREE_CODE (r) == VAR_DECL)
	  {
3318 3319
	    pending_statics = perm_tree_cons (NULL_TREE, r, pending_statics);
	    /* Perhaps we should do more of grokfield here.  */
mrs's avatar
mrs committed
3320 3321 3322 3323 3324 3325 3326 3327 3328
	    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
3329

mrs's avatar
mrs committed
3330
  TYPE_METHODS (type) = tsubst_chain (TYPE_METHODS (pattern), args);
mrs's avatar
mrs committed
3331 3332 3333 3334 3335 3336 3337
  for (t = TYPE_METHODS (type); t; t = TREE_CHAIN (t))
    {
      if (DECL_CONSTRUCTOR_P (t))
	grok_ctor_properties (type, t);
      else if (IDENTIFIER_OPNAME_P (DECL_NAME (t)))
	grok_op_properties (t, DECL_VIRTUAL_P (t), 0);
    }
mrs's avatar
mrs committed
3338

3339 3340 3341 3342 3343
  /* 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
3344
    {
3345
      tree friends;
jason's avatar
jason committed
3346

3347 3348 3349
      DECL_FRIENDLIST (typedecl)
	= tree_cons (TREE_PURPOSE (t), NULL_TREE, 
		     DECL_FRIENDLIST (typedecl));
jason's avatar
jason committed
3350

3351 3352 3353 3354 3355
      for (friends = TREE_VALUE (t);
	   friends != NULL_TREE;
	   friends = TREE_CHAIN (friends))
	{
	  if (TREE_PURPOSE (friends) == error_mark_node)
jason's avatar
jason committed
3356
	    {
3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368
	      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
3369 3370 3371

	    }
	}
3372
    }
mrs's avatar
mrs committed
3373

3374 3375
  t = CLASSTYPE_FRIEND_CLASSES (type)
    = tsubst (CLASSTYPE_FRIEND_CLASSES (pattern), args, NULL_TREE);
mrs's avatar
mrs committed
3376

3377 3378 3379
  /* This does injection for friend classes.  */
  for (; t; t = TREE_CHAIN (t))
    TREE_VALUE (t) = xref_tag_from_type (TREE_VALUE (t), NULL_TREE, 1);
mrs's avatar
mrs committed
3380

3381 3382 3383 3384
  /* This does injection for friend functions. */
  if (!processing_template_decl)
    {
      t = tsubst (DECL_TEMPLATE_INJECT (template), args, NULL_TREE);
mrs's avatar
mrs committed
3385

3386 3387 3388
      for (; t; t = TREE_CHAIN (t))
	{
	  tree d = TREE_VALUE (t);
mrs's avatar
mrs committed
3389

3390 3391 3392 3393 3394 3395
	  if (TREE_CODE (d) == TYPE_DECL)
	    /* Already injected.  */;
	  else
	    pushdecl (d);
	}
    } 
mrs's avatar
mrs committed
3396

3397 3398 3399 3400 3401 3402
  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
3403

3404 3405
  type = finish_struct_1 (type, 0);
  CLASSTYPE_GOT_SEMICOLON (type) = 1;
mrs's avatar
mrs committed
3406

3407 3408 3409
  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
3410

3411
 end:
mrs's avatar
mrs committed
3412 3413 3414 3415 3416 3417 3418
  TYPE_BEING_DEFINED (type) = 0;
  popclass (0);

  pop_from_top_level ();
  pop_tinst_level ();

  return type;
mrs's avatar
mrs committed
3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436
}

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
3437
tree 
mrs's avatar
mrs committed
3438 3439 3440 3441 3442
lookup_nested_type_by_name (ctype, name)
        tree ctype, name;
{
  tree t;

mrs's avatar
mrs committed
3443 3444
  complete_type (ctype);

mrs's avatar
mrs committed
3445 3446
  for (t = CLASSTYPE_TAGS (ctype); t; t = TREE_CHAIN (t))
    {
3447 3448 3449
      if (name == TREE_PURPOSE (t)
	  /* this catches typedef enum { foo } bar; */
	  || name == TYPE_IDENTIFIER (TREE_VALUE (t)))
mrs's avatar
mrs committed
3450 3451
	return TREE_VALUE (t);
    }
mrs's avatar
mrs committed
3452 3453 3454
  return NULL_TREE;
}

3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480
/* 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;
}

3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496
/* 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;
{
  if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
    return TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1 - is_spec);
  return args;
}
jason's avatar
jason committed
3497

3498
/* Take the tree structure T and replace template parameters used therein
3499 3500
   with the argument vector ARGS.  IN_DECL is an associated decl for
   diagnostics.
3501 3502 3503 3504

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

3505
tree
3506
tsubst (t, args, in_decl)
3507
     tree t, args;
mrs's avatar
mrs committed
3508 3509 3510 3511
     tree in_decl;
{
  tree type;

mrs's avatar
mrs committed
3512 3513 3514 3515
  if (t == NULL_TREE || t == error_mark_node
      || t == integer_type_node
      || t == void_type_node
      || t == char_type_node)
mrs's avatar
mrs committed
3516 3517 3518
    return t;

  type = TREE_TYPE (t);
mrs's avatar
mrs committed
3519 3520
  if (type == unknown_type_node)
    my_friendly_abort (42);
mrs's avatar
mrs committed
3521
  if (type && TREE_CODE (t) != FUNCTION_DECL
jason's avatar
jason committed
3522 3523
      && TREE_CODE (t) != TYPENAME_TYPE
      && TREE_CODE (t) != TEMPLATE_DECL)
3524
    type = tsubst (type, args, in_decl);
mrs's avatar
mrs committed
3525

mrs's avatar
mrs committed
3526 3527 3528 3529
  switch (TREE_CODE (t))
    {
    case RECORD_TYPE:
      if (TYPE_PTRMEMFUNC_P (t))
mrs's avatar
mrs committed
3530 3531
	{
	  tree r = build_ptrmemfunc_type
3532
	    (tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
3533 3534 3535 3536
	  return cp_build_type_variant (r, TYPE_READONLY (t),
					TYPE_VOLATILE (t));
	}

mrs's avatar
mrs committed
3537
      /* else fall through */
mrs's avatar
mrs committed
3538 3539 3540
    case UNION_TYPE:
      if (uses_template_parms (t))
	{
3541
	  tree argvec = tsubst (CLASSTYPE_TI_ARGS (t), args, in_decl);
3542 3543 3544
	  tree context;
	  tree r;

3545 3546
	  context = 
	    TYPE_CONTEXT (t) 
3547
	    ? tsubst (TYPE_CONTEXT (t), args, in_decl) : NULL_TREE;
3548 3549 3550

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

mrs's avatar
mrs committed
3551 3552 3553
	  return cp_build_type_variant (r, TYPE_READONLY (t),
					TYPE_VOLATILE (t));
	}
mrs's avatar
mrs committed
3554

mrs's avatar
mrs committed
3555
      /* else fall through */
mrs's avatar
mrs committed
3556 3557 3558 3559 3560
    case ERROR_MARK:
    case IDENTIFIER_NODE:
    case OP_IDENTIFIER:
    case VOID_TYPE:
    case REAL_TYPE:
mrs's avatar
mrs committed
3561
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
3562
    case BOOLEAN_TYPE:
mrs's avatar
mrs committed
3563 3564 3565 3566 3567
    case INTEGER_CST:
    case REAL_CST:
    case STRING_CST:
      return t;

mrs's avatar
mrs committed
3568 3569
    case ENUMERAL_TYPE:
      {
3570
	tree ctx = tsubst (TYPE_CONTEXT (t), args, in_decl);
mrs's avatar
mrs committed
3571 3572
	if (ctx == NULL_TREE)
	  return t;
mrs's avatar
mrs committed
3573 3574
	else if (ctx == current_function_decl)
	  return lookup_name (TYPE_IDENTIFIER (t), 1);
mrs's avatar
mrs committed
3575 3576 3577 3578
	else
	  return lookup_nested_type_by_name (ctx, TYPE_IDENTIFIER (t));
      }

mrs's avatar
mrs committed
3579 3580 3581 3582 3583 3584 3585
    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
3586 3587

      {
mrs's avatar
mrs committed
3588
	tree max = TREE_OPERAND (TYPE_MAX_VALUE (t), 0);
3589
	max = tsubst_expr (max, args, in_decl);
mrs's avatar
mrs committed
3590
	if (processing_template_decl)
mrs's avatar
mrs committed
3591 3592 3593
	  {
	    tree itype = make_node (INTEGER_TYPE);
	    TYPE_MIN_VALUE (itype) = size_zero_node;
mrs's avatar
mrs committed
3594 3595
	    TYPE_MAX_VALUE (itype) = build_min (MINUS_EXPR, sizetype, max,
						integer_one_node);
mrs's avatar
mrs committed
3596 3597
	    return itype;
	  }
mrs's avatar
mrs committed
3598 3599

	max = fold (build_binary_op (MINUS_EXPR, max, integer_one_node, 1));
mrs's avatar
mrs committed
3600 3601
	return build_index_2_type (size_zero_node, max);
      }
mrs's avatar
mrs committed
3602 3603

    case TEMPLATE_TYPE_PARM:
3604
    case TEMPLATE_TEMPLATE_PARM:
jason's avatar
jason committed
3605
    case TEMPLATE_PARM_INDEX:
mrs's avatar
mrs committed
3606
      {
3607 3608
	int idx;
	int level;
3609
	int levels;
jason's avatar
jason committed
3610
	tree r = NULL_TREE;
3611

3612 3613
	if (TREE_CODE (t) == TEMPLATE_TYPE_PARM
	    || TREE_CODE (t) == TEMPLATE_TEMPLATE_PARM)
3614 3615 3616 3617 3618 3619
	  {
	    idx = TEMPLATE_TYPE_IDX (t);
	    level = TEMPLATE_TYPE_LEVEL (t);
	  }
	else
	  {
jason's avatar
jason committed
3620 3621
	    idx = TEMPLATE_PARM_IDX (t);
	    level = TEMPLATE_PARM_LEVEL (t);
3622 3623
	  }

jason's avatar
jason committed
3624
	if (TREE_VEC_LENGTH (args) > 0)
3625 3626 3627 3628 3629
	  {
	    tree arg = NULL_TREE;

	    if (TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_VEC)
	      {
3630 3631
		levels = TREE_VEC_LENGTH (args);
		if (level <= levels)
3632 3633 3634
		  arg = TREE_VEC_ELT
		    (TREE_VEC_ELT (args, level - 1), idx);
	      }
3635 3636 3637 3638 3639 3640
	    else
	      {
		levels = 1;
		if (level == 1)
		  arg = TREE_VEC_ELT (args, idx);
	      }
3641 3642 3643 3644 3645 3646 3647

	    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));
3648 3649 3650 3651 3652 3653
		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
3654
			tree argvec = tsubst (CLASSTYPE_TI_ARGS (t),
3655
					      args, in_decl);
3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666
			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), 
3667 3668
						   argvec, in_decl, 
						   DECL_CONTEXT (arg));
3669 3670 3671 3672 3673 3674 3675
			return cp_build_type_variant (r, TYPE_READONLY (t),
						      TYPE_VOLATILE (t));
		      }
		    else
		      /* We are processing a template argument list.  */ 
		      return arg;
		  }
3676 3677 3678 3679 3680 3681 3682
		else
		  return arg;
	      }
	  }

	/* If we get here, we must have been looking at a parm for a
	   more deeply nested template.  */
jason's avatar
jason committed
3683 3684 3685 3686 3687 3688 3689 3690
	my_friendly_assert(level > 1, 0);
	
	/* Make a new version of this template parameter, but with a
	   lower level.  */
	switch (TREE_CODE (t))
	  {
	  case TEMPLATE_TYPE_PARM:
	  case TEMPLATE_TEMPLATE_PARM:
3691
	    r = copy_node (t);
jason's avatar
jason committed
3692 3693
	    TEMPLATE_TYPE_PARM_INDEX (r)
	      = reduce_template_parm_level (TEMPLATE_TYPE_PARM_INDEX (t),
3694
					    r, levels);
jason's avatar
jason committed
3695 3696 3697
	    TYPE_STUB_DECL (r) = TYPE_NAME (r) = TEMPLATE_TYPE_DECL (r);
	    TYPE_MAIN_VARIANT (r) = r;
	    TYPE_POINTER_TO (r) = NULL_TREE;
3698
	    TYPE_REFERENCE_TO (r) = NULL_TREE;
3699 3700 3701 3702 3703 3704 3705 3706

	    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
3707 3708 3709
	    break;

	  case TEMPLATE_PARM_INDEX:
3710
	    r = reduce_template_parm_level (t, TREE_TYPE (t), levels);
jason's avatar
jason committed
3711 3712 3713 3714 3715 3716 3717
	    break;
	   
	  default:
	    my_friendly_abort (0);
	  }

	return r;
mrs's avatar
mrs committed
3718
      }
mrs's avatar
mrs committed
3719

3720 3721 3722 3723 3724 3725 3726
    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
3727
	tree* new_parms;
3728
	tree spec;
3729

3730 3731 3732 3733 3734
	if (TREE_CODE (decl) == TYPE_DECL
	    && TREE_CODE (TREE_TYPE (decl)) == TEMPLATE_TEMPLATE_PARM)
	  /* There is no tsubst'ing to be done in a template template
	     parameter.  */
	  return t;
jason's avatar
jason committed
3735

3736
	/* We might already have an instance of this template. */
3737 3738 3739
	spec = retrieve_specialization (t, args);
	if (spec != NULL_TREE)
	  return spec;
3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750

	/* 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);
	DECL_CHAIN (tmpl) = NULL_TREE;
	TREE_CHAIN (tmpl) = NULL_TREE;
jason's avatar
jason committed
3751
	DECL_CONTEXT (tmpl) = tsubst (DECL_CONTEXT (t),
3752
				      args, in_decl);
jason's avatar
jason committed
3753
	DECL_CLASS_CONTEXT (tmpl) = tsubst (DECL_CLASS_CONTEXT (t),
3754
					    args, in_decl);
3755
	DECL_TEMPLATE_INFO (tmpl) = build_tree_list (t, args);
3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771

	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);
	  }

3772
	DECL_TEMPLATE_INSTANTIATIONS (tmpl) = NULL_TREE;
jason's avatar
jason committed
3773
	SET_DECL_IMPLICIT_INSTANTIATION (tmpl);
3774 3775 3776 3777

	/* 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
3778 3779
	for (new_parms = &DECL_TEMPLATE_PARMS (tmpl),
	       parms = DECL_TEMPLATE_PARMS (t);
3780
	     TREE_CHAIN (parms) != NULL_TREE;
jason's avatar
jason committed
3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795
	     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)
3796 3797
		  = build_tree_list (tsubst (default_value, args, in_decl),
				     tsubst (parm_decl, args, in_decl));
jason's avatar
jason committed
3798 3799 3800 3801 3802 3803 3804 3805 3806 3807
		  
	      }

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

3809 3810 3811
	if (PRIMARY_TEMPLATE_P (t))
	  TREE_TYPE (DECL_INNERMOST_TEMPLATE_PARMS (tmpl)) = tmpl;

3812
	/* We don't partially instantiate partial specializations.  */
3813 3814 3815
	if (TREE_CODE (decl) == TYPE_DECL)
	  return tmpl;

3816 3817 3818 3819 3820
	/* 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?  */ 
3821
	DECL_TEMPLATE_SPECIALIZATIONS (tmpl) = NULL_TREE;
3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861
	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;

3862
	    spec_args = tsubst (DECL_TI_ARGS (fn), args,
3863
				in_decl); 
3864
	    new_fn = tsubst (DECL_RESULT (fn), args,
3865 3866 3867 3868 3869 3870 3871 3872 3873
			     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);

3874 3875
	return tmpl;
      }
mrs's avatar
mrs committed
3876 3877 3878

    case FUNCTION_DECL:
      {
mrs's avatar
mrs committed
3879
	tree r = NULL_TREE;
3880
	tree ctx;
3881
	tree argvec;
jason's avatar
jason committed
3882
	tree tmpl = NULL_TREE;
mrs's avatar
mrs committed
3883 3884
	int member;

mrs's avatar
mrs committed
3885 3886 3887
	if (DECL_CONTEXT (t) != NULL_TREE
	    && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) == 't')
	  {
mrs's avatar
mrs committed
3888 3889 3890 3891
	    if (DECL_NAME (t) == constructor_name (DECL_CONTEXT (t)))
	      member = 2;
	    else
	      member = 1;
3892 3893
	    ctx = tsubst (DECL_CLASS_CONTEXT (t), args, t);
	    type = tsubst (type, args, in_decl);
mrs's avatar
mrs committed
3894 3895 3896 3897 3898
	  }
	else
	  {
	    member = 0;
	    ctx = NULL_TREE;
3899
	    type = tsubst (type, args, in_decl);
mrs's avatar
mrs committed
3900
	  }
mrs's avatar
mrs committed
3901

jason's avatar
jason committed
3902
	/* If we are instantiating a specialization, get the other args.  */
mrs's avatar
mrs committed
3903 3904
	if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
	  {
jason's avatar
jason committed
3905 3906 3907
	    tree spec;

	    tmpl = DECL_TI_TEMPLATE (t);
3908 3909

	    /* Start by getting the innermost args.  */
3910
	    argvec = tsubst (DECL_TI_ARGS (t), args, in_decl);
3911

3912 3913
	    if (DECL_TEMPLATE_INFO (tmpl))
	      argvec = complete_template_args (tmpl, argvec, 0);
mrs's avatar
mrs committed
3914

jason's avatar
jason committed
3915
	    /* Do we already have this instantiation?  */
3916
	    spec = retrieve_specialization (tmpl, argvec);
3917 3918
	    if (spec)
	      return spec;
mrs's avatar
mrs committed
3919 3920 3921 3922 3923
	  }

	/* 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
3924
           discrete model.  Instead, see add_maybe_template.  */
mrs's avatar
mrs committed
3925 3926 3927

	r = copy_node (t);
	copy_lang_decl (r);
3928
	DECL_USE_TEMPLATE (r) = 0;
mrs's avatar
mrs committed
3929 3930 3931
	TREE_TYPE (r) = type;

	DECL_CONTEXT (r)
3932
	  = tsubst (DECL_CONTEXT (t), args, t);
mrs's avatar
mrs committed
3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953
	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));
	  }

	if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (t)))
	  {
	    char *buf, *dbuf = build_overload_name (ctx, 1, 1);
	    int len = sizeof (DESTRUCTOR_DECL_PREFIX) - 1;
	    buf = (char *) alloca (strlen (dbuf)
				   + sizeof (DESTRUCTOR_DECL_PREFIX));
	    bcopy (DESTRUCTOR_DECL_PREFIX, buf, len);
	    buf[len] = '\0';
	    strcat (buf, dbuf);
	    DECL_ASSEMBLER_NAME (r) = get_identifier (buf);
mrs's avatar
mrs committed
3954
	  }
3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970
	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
3971
	       member function of a template class.  */
3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988
	    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
3989
		tree tparms; 
3990 3991 3992 3993
		tree targs;

		if (!DECL_TEMPLATE_SPECIALIZATION (tmpl)) 
		  {
3994 3995 3996 3997 3998 3999
		    /* 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.  */
4000 4001 4002 4003
		    tparms = DECL_TEMPLATE_PARMS (tmpl);
		    while (tparms && TREE_CHAIN (tparms) != NULL_TREE)
		      tparms = TREE_CHAIN (tparms);
		    
4004
		    targs = innermost_args (args, 0);
4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025
		  }
		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);
		  }
		    
4026 4027 4028 4029
		my_friendly_assert (tparms != NULL_TREE
				    && TREE_CODE (tparms) == TREE_LIST,
				    0);
		tparms = TREE_VALUE (tparms);
4030
		 
4031 4032 4033 4034 4035 4036 4037 4038 4039 4040
		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 
		  (DECL_NAME (r), arg_types, 
		   TREE_TYPE (TREE_TYPE (tmpl)),
4041
		   tparms, targs, member);
4042 4043
	      }
	  }
mrs's avatar
mrs committed
4044 4045 4046
	DECL_RTL (r) = 0;
	make_decl_rtl (r, NULL_PTR, 1);

4047
	DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args, t);
mrs's avatar
mrs committed
4048 4049 4050 4051 4052
	DECL_MAIN_VARIANT (r) = r;
	DECL_RESULT (r) = NULL_TREE;
	DECL_INITIAL (r) = NULL_TREE;

	TREE_STATIC (r) = 0;
4053
	TREE_PUBLIC (r) = TREE_PUBLIC (t);
mrs's avatar
mrs committed
4054 4055 4056 4057 4058
	DECL_EXTERNAL (r) = 1;
	DECL_INTERFACE_KNOWN (r) = 0;
	DECL_DEFER_OUTPUT (r) = 0;
	TREE_CHAIN (r) = NULL_TREE;
	DECL_CHAIN (r) = NULL_TREE;
4059
	DECL_PENDING_INLINE_INFO (r) = 0;
mrs's avatar
mrs committed
4060 4061 4062 4063 4064 4065 4066 4067

	if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
	  grok_op_properties (r, DECL_VIRTUAL_P (r), DECL_FRIEND_P (r));

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

4068 4069 4070 4071 4072 4073 4074
	    /* 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
4075 4076 4077 4078
	      SET_DECL_TEMPLATE_SPECIALIZATION (r);
	    else
	      SET_DECL_IMPLICIT_INSTANTIATION (r);

4079
	    register_specialization (r, tmpl, argvec);
mrs's avatar
mrs committed
4080 4081
	  }

mrs's avatar
mrs committed
4082 4083 4084 4085 4086 4087
	/* 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)
	  IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (r)) = r;

mrs's avatar
mrs committed
4088 4089 4090 4091 4092
	return r;
      }

    case PARM_DECL:
      {
mrs's avatar
mrs committed
4093 4094
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
mrs's avatar
mrs committed
4095
	DECL_INITIAL (r) = TREE_TYPE (r);
mrs's avatar
mrs committed
4096
	DECL_CONTEXT (r) = NULL_TREE;
kenner's avatar
kenner committed
4097 4098 4099 4100 4101 4102
#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
4103
	if (TREE_CHAIN (t))
4104
	  TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, TREE_CHAIN (t));
mrs's avatar
mrs committed
4105 4106 4107
	return r;
      }

mrs's avatar
mrs committed
4108 4109 4110 4111 4112 4113
    case FIELD_DECL:
      {
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
	copy_lang_decl (r);
#if 0
4114
	DECL_FIELD_CONTEXT (r) = tsubst (DECL_FIELD_CONTEXT (t), args, in_decl);
mrs's avatar
mrs committed
4115
#endif
4116
	DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args, in_decl);
mrs's avatar
mrs committed
4117 4118 4119 4120 4121 4122 4123 4124
	TREE_CHAIN (r) = NULL_TREE;
	return r;
      }

    case USING_DECL:
      {
	tree r = copy_node (t);
	DECL_INITIAL (r)
4125
	  = tsubst_copy (DECL_INITIAL (t), args, in_decl);
mrs's avatar
mrs committed
4126 4127 4128 4129 4130 4131 4132
	TREE_CHAIN (r) = NULL_TREE;
	return r;
      }

    case VAR_DECL:
      {
	tree r;
4133
	tree ctx = tsubst_copy (DECL_CONTEXT (t), args, in_decl);
mrs's avatar
mrs committed
4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151

	/* 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
4152 4153 4154 4155

	/* 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
4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169

	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);
4170
	    tree argvec = tsubst (DECL_TI_ARGS (t), args, in_decl);
mrs's avatar
mrs committed
4171 4172 4173 4174 4175 4176 4177 4178 4179 4180

	    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;
	return r;
      }

    case TYPE_DECL:
mrs's avatar
mrs committed
4181 4182 4183
      if (t == TYPE_NAME (TREE_TYPE (t)))
	return TYPE_NAME (type);

mrs's avatar
mrs committed
4184 4185 4186
      {
	tree r = copy_node (t);
	TREE_TYPE (r) = type;
mrs's avatar
mrs committed
4187
	DECL_CONTEXT (r) = current_class_type;
mrs's avatar
mrs committed
4188 4189 4190 4191
	TREE_CHAIN (r) = NULL_TREE;
	return r;
      }	  

mrs's avatar
mrs committed
4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205
    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)
4206
	  purpose = tsubst (purpose, args, in_decl);
mrs's avatar
mrs committed
4207 4208
	value = TREE_VALUE (t);
	if (value)
4209
	  value = tsubst (value, args, in_decl);
mrs's avatar
mrs committed
4210 4211
	chain = TREE_CHAIN (t);
	if (chain && chain != void_type_node)
4212
	  chain = tsubst (chain, args, in_decl);
mrs's avatar
mrs committed
4213 4214 4215 4216 4217 4218 4219 4220 4221 4222
	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
4223 4224
      if (type != NULL_TREE)
	{
4225 4226
	  /* A binfo node.  */

mrs's avatar
mrs committed
4227 4228 4229 4230 4231 4232
	  t = copy_node (t);

	  if (type == TREE_TYPE (t))
	    return t;

	  TREE_TYPE (t) = complete_type (type);
mrs's avatar
mrs committed
4233 4234 4235 4236 4237 4238 4239
	  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
4240 4241
	  return t;
	}
4242 4243

      /* Otherwise, a vector of template arguments.  */
mrs's avatar
mrs committed
4244 4245 4246
      {
	int len = TREE_VEC_LENGTH (t), need_new = 0, i;
	tree *elts = (tree *) alloca (len * sizeof (tree));
mrs's avatar
mrs committed
4247

4248
	bzero ((char *) elts, len * sizeof (tree));
mrs's avatar
mrs committed
4249 4250 4251

	for (i = 0; i < len; i++)
	  {
4252
	    elts[i] = maybe_fold_nontype_arg
4253
	      (tsubst_expr (TREE_VEC_ELT (t, i), args, in_decl));
4254

mrs's avatar
mrs committed
4255 4256 4257 4258 4259 4260 4261 4262 4263 4264
	    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];
mrs's avatar
mrs committed
4265
	
mrs's avatar
mrs committed
4266 4267 4268 4269 4270 4271 4272
	return t;
      }
    case POINTER_TYPE:
    case REFERENCE_TYPE:
      {
	tree r;
	enum tree_code code;
4273

mrs's avatar
mrs committed
4274 4275 4276 4277
	if (type == TREE_TYPE (t))
	  return t;

	code = TREE_CODE (t);
4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304
	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
4305 4306 4307
	  r = build_pointer_type (type);
	else
	  r = build_reference_type (type);
mrs's avatar
mrs committed
4308
	r = cp_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t));
4309

mrs's avatar
mrs committed
4310 4311 4312 4313
	/* Will this ever be needed for TYPE_..._TO values?  */
	layout_type (r);
	return r;
      }
mrs's avatar
mrs committed
4314 4315
    case OFFSET_TYPE:
      return build_offset_type
4316
	(tsubst (TYPE_OFFSET_BASETYPE (t), args, in_decl), type);
mrs's avatar
mrs committed
4317 4318 4319
    case FUNCTION_TYPE:
    case METHOD_TYPE:
      {
4320
	tree values = TYPE_ARG_TYPES (t);
mrs's avatar
mrs committed
4321
	tree context = TYPE_CONTEXT (t);
mrs's avatar
merging  
mrs committed
4322 4323
	tree raises = TYPE_RAISES_EXCEPTIONS (t);
	tree fntype;
mrs's avatar
mrs committed
4324 4325 4326

	/* Don't bother recursing if we know it won't change anything.	*/
	if (values != void_list_node)
mrs's avatar
mrs committed
4327 4328 4329 4330
	  {
	    /* This should probably be rewritten to use hash_tree_cons for
               the memory savings.  */
	    tree first = NULL_TREE;
4331
	    tree last = NULL_TREE;
mrs's avatar
mrs committed
4332 4333 4334 4335

	    for (; values && values != void_list_node;
		 values = TREE_CHAIN (values))
	      {
mrs's avatar
mrs committed
4336
		tree value = TYPE_MAIN_VARIANT (type_decays_to
4337
		  (tsubst (TREE_VALUE (values), args, in_decl)));
mrs's avatar
mrs committed
4338 4339 4340
		/* 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
4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354
		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
4355
	if (context)
4356
	  context = tsubst (context, args, in_decl);
mrs's avatar
mrs committed
4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369
	/* 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
4370
	    fntype = build_function_type (type, values);
mrs's avatar
mrs committed
4371 4372 4373 4374
	  }
	else if (context == NULL_TREE)
	  {
	    tree base = tsubst (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))),
4375
				args, in_decl);
mrs's avatar
merging  
mrs committed
4376 4377
	    fntype = build_cplus_method_type (base, type,
					      TREE_CHAIN (values));
mrs's avatar
mrs committed
4378 4379 4380
	  }
	else
	  {
mrs's avatar
merging  
mrs committed
4381 4382 4383 4384 4385 4386 4387
	    fntype = make_node (TREE_CODE (t));
	    TREE_TYPE (fntype) = type;
	    TYPE_CONTEXT (fntype) = context;
	    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
4388
	    if (TYPE_METHOD_BASETYPE (t))
mrs's avatar
merging  
mrs committed
4389
	      TYPE_METHOD_BASETYPE (fntype) = tsubst (TYPE_METHOD_BASETYPE (t),
4390
						      args, in_decl);
mrs's avatar
mrs committed
4391 4392 4393
	    /* Need to generate hash value.  */
	    my_friendly_abort (84);
	  }
mrs's avatar
merging  
mrs committed
4394 4395 4396 4397 4398
	fntype = build_type_variant (fntype,
				     TYPE_READONLY (t),
				     TYPE_VOLATILE (t));
	if (raises)
	  {
4399
	    raises = tsubst (raises, args, in_decl);
mrs's avatar
merging  
mrs committed
4400 4401 4402
	    fntype = build_exception_variant (fntype, raises);
	  }
	return fntype;
mrs's avatar
mrs committed
4403 4404 4405
      }
    case ARRAY_TYPE:
      {
4406
	tree domain = tsubst (TYPE_DOMAIN (t), args, in_decl);
mrs's avatar
mrs committed
4407 4408 4409 4410 4411 4412 4413 4414
	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
4415
    case MINUS_EXPR:
mrs's avatar
mrs committed
4416
      return fold (build (TREE_CODE (t), TREE_TYPE (t),
4417 4418
			  tsubst (TREE_OPERAND (t, 0), args, in_decl),
			  tsubst (TREE_OPERAND (t, 1), args, in_decl)));
mrs's avatar
mrs committed
4419 4420 4421 4422

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

mrs's avatar
mrs committed
4425 4426
    case TYPENAME_TYPE:
      {
4427
	tree ctx = tsubst (TYPE_CONTEXT (t), args, in_decl);
4428 4429
	tree f = tsubst_copy (TYPENAME_TYPE_FULLNAME (t), args, in_decl);
	f = make_typename_type (ctx, f);
mrs's avatar
mrs committed
4430 4431 4432 4433 4434 4435 4436
	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
4437
	(type, tsubst (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
4438 4439 4440
      
    case ADDR_EXPR:
      return make_reference_declarator
4441
	(type, tsubst (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
4442 4443 4444

    case ARRAY_REF:
      return build_parse_node
4445 4446
	(ARRAY_REF, tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_expr (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
4447 4448

    case CALL_EXPR:
mrs's avatar
merging  
mrs committed
4449
      return make_call_declarator
4450 4451
	(tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst (TREE_OPERAND (t, 1), args, in_decl),
mrs's avatar
merging  
mrs committed
4452
	 TREE_OPERAND (t, 2),
4453
	 tsubst (TREE_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
4454

mrs's avatar
mrs committed
4455 4456
    case SCOPE_REF:
      return build_parse_node
4457 4458
	(TREE_CODE (t), tsubst (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
4459

mrs's avatar
mrs committed
4460
    default:
mrs's avatar
mrs committed
4461
      sorry ("use of `%s' in template",
mrs's avatar
mrs committed
4462 4463 4464 4465 4466
	     tree_code_name [(int) TREE_CODE (t)]);
      return error_mark_node;
    }
}

mrs's avatar
mrs committed
4467 4468 4469 4470 4471 4472 4473 4474 4475 4476
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
4477
tree
mrs's avatar
mrs committed
4478
do_poplevel ()
mrs's avatar
mrs committed
4479
{
mrs's avatar
mrs committed
4480
  tree t;
4481
  int saved_warn_unused = 0;
mrs's avatar
mrs committed
4482

4483 4484 4485 4486 4487
  if (processing_template_decl)
    {
      saved_warn_unused = warn_unused;
      warn_unused = 0;
    }
4488
  expand_end_bindings (getdecls (), kept_level_p (), 0);
4489 4490
  if (processing_template_decl)
    warn_unused = saved_warn_unused;
mrs's avatar
mrs committed
4491 4492 4493 4494
  t = poplevel (kept_level_p (), 1, 0);
  pop_momentary ();
  return t;
}
mrs's avatar
mrs committed
4495

4496 4497 4498 4499
/* 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
4500
tree
4501
tsubst_copy (t, args, in_decl)
4502
     tree t, args;
mrs's avatar
mrs committed
4503 4504 4505
     tree in_decl;
{
  enum tree_code code;
mrs's avatar
mrs committed
4506

mrs's avatar
mrs committed
4507 4508 4509 4510
  if (t == NULL_TREE || t == error_mark_node)
    return t;

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

mrs's avatar
mrs committed
4512 4513 4514 4515 4516 4517 4518 4519 4520
  switch (code)
    {
    case PARM_DECL:
      return do_identifier (DECL_NAME (t), 0);

    case CONST_DECL:
    case FIELD_DECL:
      if (DECL_CONTEXT (t))
	{
4521 4522
	  tree ctx;
	  if (TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL)
mrs's avatar
mrs committed
4523
	    return lookup_name (DECL_NAME (t), 0);
4524 4525 4526

	  ctx = tsubst (DECL_CONTEXT (t), args, in_decl);
	  if (ctx != DECL_CONTEXT (t))
mrs's avatar
mrs committed
4527 4528 4529 4530 4531 4532 4533
	    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))
4534
	t = tsubst (t, args, in_decl);
mrs's avatar
mrs committed
4535 4536 4537
      mark_used (t);
      return t;

4538 4539
    case TEMPLATE_DECL:
      if (is_member_template (t))
4540
	return tsubst (t, args, in_decl);
4541 4542 4543
      else
	return t;

mrs's avatar
mrs committed
4544 4545 4546 4547 4548 4549 4550
#if 0
    case IDENTIFIER_NODE:
      return do_identifier (t, 0);
#endif
      
    case CAST_EXPR:
    case REINTERPRET_CAST_EXPR:
mrs's avatar
mrs committed
4551 4552 4553
    case CONST_CAST_EXPR:
    case STATIC_CAST_EXPR:
    case DYNAMIC_CAST_EXPR:
mrs's avatar
mrs committed
4554
      return build1
4555 4556
	(code, tsubst (TREE_TYPE (t), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
4557 4558 4559 4560 4561 4562 4563 4564

    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
4565
    case BIT_NOT_EXPR:
mrs's avatar
mrs committed
4566 4567 4568
    case ADDR_EXPR:
    case CONVERT_EXPR:      /* Unary + */
    case SIZEOF_EXPR:
4569
    case ALIGNOF_EXPR:
mrs's avatar
mrs committed
4570
    case ARROW_EXPR:
mrs's avatar
mrs committed
4571
    case THROW_EXPR:
mrs's avatar
mrs committed
4572
    case TYPEID_EXPR:
mrs's avatar
mrs committed
4573 4574
      return build1
	(code, NULL_TREE,
4575
	 tsubst_copy (TREE_OPERAND (t, 0), args, in_decl));
mrs's avatar
mrs committed
4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613

    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
4614 4615
	(code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
4616 4617 4618 4619

    case CALL_EXPR:
      {
	tree fn = TREE_OPERAND (t, 0);
jason's avatar
jason committed
4620
	if (is_overloaded_fn (fn))
4621
	  fn = tsubst_copy (get_first_fn (fn), args, in_decl);
mrs's avatar
mrs committed
4622
	else
jason's avatar
jason committed
4623
	  /* Sometimes FN is a LOOKUP_EXPR.  */
4624
	  fn = tsubst_copy (fn, args, in_decl);
mrs's avatar
mrs committed
4625
	return build_nt
4626
	  (code, fn, tsubst_copy (TREE_OPERAND (t, 1), args, in_decl),
mrs's avatar
mrs committed
4627 4628 4629 4630 4631 4632 4633 4634
	   NULL_TREE);
      }

    case METHOD_CALL_EXPR:
      {
	tree name = TREE_OPERAND (t, 0);
	if (TREE_CODE (name) == BIT_NOT_EXPR)
	  {
4635
	    name = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
mrs's avatar
mrs committed
4636
	    name = build1 (BIT_NOT_EXPR, NULL_TREE, TYPE_MAIN_VARIANT (name));
mrs's avatar
mrs committed
4637 4638 4639 4640
	  }
	else if (TREE_CODE (name) == SCOPE_REF
		 && TREE_CODE (TREE_OPERAND (name, 1)) == BIT_NOT_EXPR)
	  {
4641
	    tree base = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
mrs's avatar
mrs committed
4642
	    name = TREE_OPERAND (name, 1);
4643
	    name = tsubst_copy (TREE_OPERAND (name, 0), args, in_decl);
4644 4645 4646
	    if (TREE_CODE (name) != IDENTIFIER_NODE)
	      name = TYPE_MAIN_VARIANT (name);
	    name = build1 (BIT_NOT_EXPR, NULL_TREE, name);
mrs's avatar
mrs committed
4647 4648 4649
	    name = build_nt (SCOPE_REF, base, name);
	  }
	else
4650
	  name = tsubst_copy (TREE_OPERAND (t, 0), args, in_decl);
mrs's avatar
mrs committed
4651
	return build_nt
4652 4653
	  (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
4654 4655 4656
	   NULL_TREE);
      }

4657
    case BIND_EXPR:
mrs's avatar
mrs committed
4658 4659
    case COND_EXPR:
    case MODOP_EXPR:
4660 4661
      {
	tree r = build_nt
4662 4663 4664
	  (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));
4665 4666 4667 4668 4669 4670 4671 4672 4673 4674

	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.  */ 
	    tree rtl_exp = expand_start_stmt_expr();
4675
	    tree block = tsubst_expr (TREE_OPERAND (r, 1), args, in_decl);
4676 4677
	    rtl_exp = expand_end_stmt_expr (rtl_exp);
	    TREE_SIDE_EFFECTS (rtl_exp) = 1;
4678 4679 4680
	    r = build (BIND_EXPR, TREE_TYPE (rtl_exp), 
		       NULL_TREE, rtl_exp, block);
	    delete_block (block);
4681 4682 4683 4684
	  }

	return r;
      }
mrs's avatar
mrs committed
4685 4686 4687 4688

    case NEW_EXPR:
      {
	tree r = build_nt
4689 4690 4691
	(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
4692 4693 4694 4695 4696 4697 4698
	NEW_EXPR_USE_GLOBAL (r) = NEW_EXPR_USE_GLOBAL (t);
	return r;
      }

    case DELETE_EXPR:
      {
	tree r = build_nt
4699 4700
	(code, tsubst_copy (TREE_OPERAND (t, 0), args, in_decl),
	 tsubst_copy (TREE_OPERAND (t, 1), args, in_decl));
mrs's avatar
mrs committed
4701 4702 4703 4704 4705
	DELETE_EXPR_USE_GLOBAL (r) = DELETE_EXPR_USE_GLOBAL (t);
	DELETE_EXPR_USE_VEC (r) = DELETE_EXPR_USE_VEC (t);
	return r;
      }

4706 4707
    case TEMPLATE_ID_EXPR:
      {
4708
        /* Substituted template arguments */
4709
	tree targs = tsubst_copy (TREE_OPERAND (t, 1), args, in_decl);
4710 4711 4712 4713 4714
	tree chain;
	for (chain = targs; chain; chain = TREE_CHAIN (chain))
	  TREE_VALUE (chain) = maybe_fold_nontype_arg (TREE_VALUE (chain));

	return lookup_template_function
4715
	  (tsubst_copy (TREE_OPERAND (t, 0), args, in_decl), targs);
4716 4717
      }

mrs's avatar
mrs committed
4718 4719 4720 4721 4722 4723 4724 4725 4726
    case TREE_LIST:
      {
	tree purpose, value, chain;

	if (t == void_list_node)
	  return t;

	purpose = TREE_PURPOSE (t);
	if (purpose)
4727
	  purpose = tsubst_copy (purpose, args, in_decl);
mrs's avatar
mrs committed
4728 4729
	value = TREE_VALUE (t);
	if (value)
4730
	  value = tsubst_copy (value, args, in_decl);
mrs's avatar
mrs committed
4731 4732
	chain = TREE_CHAIN (t);
	if (chain && chain != void_type_node)
4733
	  chain = tsubst_copy (chain, args, in_decl);
mrs's avatar
mrs committed
4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745
	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:
4746
    case TEMPLATE_TEMPLATE_PARM:
jason's avatar
jason committed
4747
    case TEMPLATE_PARM_INDEX:
mrs's avatar
mrs committed
4748 4749 4750 4751 4752 4753 4754
    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
4755
    case TYPE_DECL:
4756
      return tsubst (t, args, in_decl);
mrs's avatar
mrs committed
4757

mrs's avatar
mrs committed
4758 4759 4760
    case IDENTIFIER_NODE:
      if (IDENTIFIER_TYPENAME_P (t))
	return build_typename_overload
4761
	  (tsubst (TREE_TYPE (t), args, in_decl));
mrs's avatar
mrs committed
4762 4763 4764
      else
	return t;

mrs's avatar
mrs committed
4765 4766
    case CONSTRUCTOR:
      return build
4767 4768
	(CONSTRUCTOR, tsubst (TREE_TYPE (t), args, in_decl), NULL_TREE,
	 tsubst_copy (CONSTRUCTOR_ELTS (t), args, in_decl));
mrs's avatar
mrs committed
4769

mrs's avatar
mrs committed
4770 4771 4772 4773 4774
    default:
      return t;
    }
}

4775 4776
/* Like tsubst_copy, but also does semantic processing and RTL expansion.  */

mrs's avatar
mrs committed
4777
tree
4778
tsubst_expr (t, args, in_decl)
4779
     tree t, args;
mrs's avatar
mrs committed
4780 4781 4782 4783 4784
     tree in_decl;
{
  if (t == NULL_TREE || t == error_mark_node)
    return t;

mrs's avatar
mrs committed
4785
  if (processing_template_decl)
4786
    return tsubst_copy (t, args, in_decl);
mrs's avatar
mrs committed
4787 4788

  switch (TREE_CODE (t))
mrs's avatar
mrs committed
4789
    {
mrs's avatar
mrs committed
4790 4791
    case RETURN_STMT:
      lineno = TREE_COMPLEXITY (t);
4792 4793
      finish_return_stmt (tsubst_expr (RETURN_EXPR (t),
				       args, in_decl));
mrs's avatar
mrs committed
4794 4795 4796 4797
      break;

    case EXPR_STMT:
      lineno = TREE_COMPLEXITY (t);
4798 4799
      finish_expr_stmt (tsubst_expr (EXPR_STMT_EXPR (t),
				     args, in_decl));
mrs's avatar
mrs committed
4800 4801 4802 4803 4804
      break;

    case DECL_STMT:
      {
	int i = suspend_momentary ();
mrs's avatar
mrs committed
4805
	tree dcl, init;
mrs's avatar
mrs committed
4806 4807 4808 4809

	lineno = TREE_COMPLEXITY (t);
	emit_line_note (input_filename, lineno);
	dcl = start_decl
4810 4811
	  (tsubst (TREE_OPERAND (t, 0), args, in_decl),
	   tsubst (TREE_OPERAND (t, 1), args, in_decl),
mrs's avatar
merging  
mrs committed
4812
	   TREE_OPERAND (t, 2) != 0);
4813
	init = tsubst_expr (TREE_OPERAND (t, 2), args, in_decl);
mrs's avatar
mrs committed
4814
	cp_finish_decl
mrs's avatar
mrs committed
4815
	  (dcl, init, NULL_TREE, 1, /*init ? LOOKUP_ONLYCONVERTING :*/ 0);
mrs's avatar
mrs committed
4816 4817 4818
	resume_momentary (i);
	return dcl;
      }
mrs's avatar
mrs committed
4819

mrs's avatar
mrs committed
4820 4821 4822 4823 4824
    case FOR_STMT:
      {
	tree tmp;
	lineno = TREE_COMPLEXITY (t);

4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835
	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
4836 4837
      }
      break;
mrs's avatar
mrs committed
4838

mrs's avatar
mrs committed
4839 4840 4841
    case WHILE_STMT:
      {
	lineno = TREE_COMPLEXITY (t);
4842 4843 4844 4845 4846 4847
	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
4848 4849
      }
      break;
mrs's avatar
mrs committed
4850

mrs's avatar
mrs committed
4851 4852 4853
    case DO_STMT:
      {
	lineno = TREE_COMPLEXITY (t);
4854 4855 4856 4857 4858 4859
	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
4860 4861
      }
      break;
mrs's avatar
mrs committed
4862

mrs's avatar
mrs committed
4863
    case IF_STMT:
mrs's avatar
mrs committed
4864
      {
mrs's avatar
mrs committed
4865 4866 4867
	tree tmp;

	lineno = TREE_COMPLEXITY (t);
4868 4869 4870 4871
	begin_if_stmt ();
	finish_if_stmt_cond (tsubst_expr (IF_COND (t),
					  args, in_decl),
			     NULL_TREE);
mrs's avatar
mrs committed
4872

4873
	if (tmp = THEN_CLAUSE (t), tmp)
mrs's avatar
mrs committed
4874
	  {
4875
	    tsubst_expr (tmp, args, in_decl);
4876
	    finish_then_clause (NULL_TREE);
mrs's avatar
mrs committed
4877 4878
	  }

4879 4880 4881 4882 4883 4884
	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
4885

4886
	finish_if_stmt ();
mrs's avatar
mrs committed
4887
      }
mrs's avatar
mrs committed
4888
      break;
mrs's avatar
mrs committed
4889

mrs's avatar
mrs committed
4890 4891
    case COMPOUND_STMT:
      {
4892
	tree substmt;
mrs's avatar
mrs committed
4893

mrs's avatar
mrs committed
4894
	lineno = TREE_COMPLEXITY (t);
4895 4896 4897 4898
	begin_compound_stmt (COMPOUND_STMT_NO_SCOPE (t));
	for (substmt = COMPOUND_BODY (t); 
	     substmt != NULL_TREE;
	     substmt = TREE_CHAIN (substmt))
4899
	  tsubst_expr (substmt, args, in_decl);
4900 4901
	return finish_compound_stmt (COMPOUND_STMT_NO_SCOPE (t), 
				     NULL_TREE);
mrs's avatar
mrs committed
4902 4903
      }
      break;
mrs's avatar
mrs committed
4904

mrs's avatar
mrs committed
4905 4906
    case BREAK_STMT:
      lineno = TREE_COMPLEXITY (t);
4907
      finish_break_stmt ();
mrs's avatar
mrs committed
4908
      break;
mrs's avatar
mrs committed
4909

mrs's avatar
mrs committed
4910 4911
    case CONTINUE_STMT:
      lineno = TREE_COMPLEXITY (t);
4912
      finish_continue_stmt ();
mrs's avatar
mrs committed
4913 4914
      break;

mrs's avatar
mrs committed
4915 4916 4917 4918 4919
    case SWITCH_STMT:
      {
	tree val, tmp;

	lineno = TREE_COMPLEXITY (t);
4920 4921 4922
	begin_switch_stmt ();
	val = tsubst_expr (SWITCH_COND (t), args, in_decl);
	finish_switch_cond (val);
mrs's avatar
mrs committed
4923 4924
	
	if (tmp = TREE_OPERAND (t, 1), tmp)
4925
	  tsubst_expr (tmp, args, in_decl);
mrs's avatar
mrs committed
4926

4927
	finish_switch_stmt (val, NULL_TREE);
mrs's avatar
mrs committed
4928 4929 4930 4931
      }
      break;

    case CASE_LABEL:
4932 4933
      finish_case_label (tsubst_expr (CASE_LOW (t), args, in_decl),
			 tsubst_expr (CASE_HIGH (t), args, in_decl));
mrs's avatar
mrs committed
4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944
      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);
4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955
      finish_goto_stmt (tsubst_expr (GOTO_DESTINATION (t),
				     args, in_decl));
      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
4956
      break;
mrs's avatar
mrs committed
4957 4958 4959

    case TRY_BLOCK:
      lineno = TREE_COMPLEXITY (t);
4960 4961 4962
      begin_try_block ();
      tsubst_expr (TRY_STMTS (t), args, in_decl);
      finish_try_block (NULL_TREE);
mrs's avatar
mrs committed
4963
      {
4964
	tree handler = TRY_HANDLERS (t);
mrs's avatar
mrs committed
4965
	for (; handler; handler = TREE_CHAIN (handler))
4966
	  tsubst_expr (handler, args, in_decl);
mrs's avatar
mrs committed
4967
      }
4968
      finish_handler_sequence (NULL_TREE);
mrs's avatar
mrs committed
4969 4970 4971 4972
      break;

    case HANDLER:
      lineno = TREE_COMPLEXITY (t);
4973 4974
      begin_handler ();
      if (HANDLER_PARMS (t))
mrs's avatar
mrs committed
4975
	{
4976
	  tree d = HANDLER_PARMS (t);
mrs's avatar
mrs committed
4977
	  expand_start_catch_block
4978 4979
	    (tsubst (TREE_OPERAND (d, 1), args, in_decl),
	     tsubst (TREE_OPERAND (d, 0), args, in_decl));
mrs's avatar
mrs committed
4980 4981 4982
	}
      else
	expand_start_catch_block (NULL_TREE, NULL_TREE);
4983 4984 4985
      finish_handler_parms (NULL_TREE);
      tsubst_expr (HANDLER_BODY (t), args, in_decl);
      finish_handler (NULL_TREE);
mrs's avatar
mrs committed
4986 4987
      break;

mrs's avatar
mrs committed
4988 4989 4990 4991
    case TAG_DEFN:
      lineno = TREE_COMPLEXITY (t);
      t = TREE_TYPE (t);
      if (TREE_CODE (t) == ENUMERAL_TYPE)
4992
	tsubst_enum (t, args, NULL);
mrs's avatar
mrs committed
4993 4994
      break;

mrs's avatar
mrs committed
4995
    default:
4996
      return build_expr_from_tree (tsubst_copy (t, args, in_decl));
mrs's avatar
mrs committed
4997 4998
    }
  return NULL_TREE;
mrs's avatar
mrs committed
4999 5000
}

mrs's avatar
mrs committed
5001 5002
tree
instantiate_template (tmpl, targ_ptr)
5003
     tree tmpl, targ_ptr;
mrs's avatar
mrs committed
5004
{
mrs's avatar
mrs committed
5005 5006 5007 5008 5009
  tree fndecl;
  int i, len;
  struct obstack *old_fmp_obstack;
  extern struct obstack *function_maybepermanent_obstack;

5010 5011
  my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 283);

jason's avatar
jason committed
5012 5013
  /* FIXME this won't work with member templates; we only have one level
     of args here.  */
5014 5015
  if (DECL_FUNCTION_TEMPLATE_P (tmpl))
    {
5016 5017
      /* Check to see if we already have this specialization.  */
      tree spec = retrieve_specialization (tmpl, targ_ptr);
5018
      
5019 5020
      if (spec != NULL_TREE)
	return spec;
5021 5022
    }

mrs's avatar
mrs committed
5023 5024 5025
  push_obstacks (&permanent_obstack, &permanent_obstack);
  old_fmp_obstack = function_maybepermanent_obstack;
  function_maybepermanent_obstack = &permanent_obstack;
mrs's avatar
mrs committed
5026

5027
  len = DECL_NTPARMS (tmpl);
mrs's avatar
mrs committed
5028

mrs's avatar
mrs committed
5029 5030
  i = len;
  while (i--)
mrs's avatar
mrs committed
5031
    {
5032
      tree t = TREE_VEC_ELT (targ_ptr, i);
mrs's avatar
mrs committed
5033 5034 5035
      if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
	{
	  tree nt = target_type (t);
mrs's avatar
mrs committed
5036
	  if (IS_AGGR_TYPE (nt) && decl_function_context (TYPE_MAIN_DECL (nt)))
mrs's avatar
mrs committed
5037 5038 5039 5040 5041 5042 5043
	    {
	      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;
	    }
	}
5044
      TREE_VEC_ELT (targ_ptr, i) = copy_to_permanent (t);
mrs's avatar
mrs committed
5045
    }
5046
  targ_ptr = copy_to_permanent (targ_ptr);
mrs's avatar
mrs committed
5047

mrs's avatar
mrs committed
5048
  /* substitute template parameters */
5049
  fndecl = tsubst (DECL_RESULT (tmpl), targ_ptr, tmpl);
mrs's avatar
mrs committed
5050

mrs's avatar
mrs committed
5051 5052 5053
  if (flag_external_templates)
    add_pending_template (fndecl);

mrs's avatar
mrs committed
5054 5055 5056
 out:
  function_maybepermanent_obstack = old_fmp_obstack;
  pop_obstacks ();
mrs's avatar
mrs committed
5057

mrs's avatar
mrs committed
5058
  return fndecl;
mrs's avatar
mrs committed
5059
}
mrs's avatar
mrs committed
5060 5061

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

void
mrs's avatar
mrs committed
5064 5065
overload_template_name (type)
     tree type;
mrs's avatar
mrs committed
5066
{
mrs's avatar
mrs committed
5067 5068
  tree id = DECL_NAME (CLASSTYPE_TI_TEMPLATE (type));
  tree decl;
mrs's avatar
mrs committed
5069

mrs's avatar
mrs committed
5070 5071 5072
  if (IDENTIFIER_CLASS_VALUE (id)
      && TREE_TYPE (IDENTIFIER_CLASS_VALUE (id)) == type)
    return;
mrs's avatar
mrs committed
5073

mrs's avatar
mrs committed
5074 5075 5076
  decl = build_decl (TYPE_DECL, id, type);
  SET_DECL_ARTIFICIAL (decl);
  pushdecl_class_level (decl);
mrs's avatar
mrs committed
5077 5078
}

5079

law's avatar
law committed
5080
/* Like type_unification but designed specially to handle conversion
5081 5082
   operators.  The EXTRA_FN_ARG, if any, is the type of an additional
   parameter to be added to the beginning of FN's parameter list.  */
5083 5084

int
5085 5086
fn_type_unification (fn, explicit_targs, targs, args, return_type,
		     strict, extra_fn_arg)
5087
     tree fn, explicit_targs, targs, args, return_type;
5088
     int strict;
5089
     tree extra_fn_arg;
5090
{
5091
  int i;
5092 5093 5094 5095 5096 5097 5098 5099 5100
  tree fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
  tree decl_arg_types = args;

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

  if (IDENTIFIER_TYPENAME_P (DECL_NAME (fn))) 
    {
      /* This is a template conversion operator.  Use the return types
         as well as the argument types.  */
5101
      fn_arg_types = scratch_tree_cons (NULL_TREE, 
5102 5103
					TREE_TYPE (TREE_TYPE (fn)),
					fn_arg_types);
5104
      decl_arg_types = scratch_tree_cons (NULL_TREE,
5105 5106
					  return_type,
					  decl_arg_types);
5107 5108
    }

5109 5110 5111 5112
  if (extra_fn_arg != NULL_TREE)
    fn_arg_types = scratch_tree_cons (NULL_TREE, extra_fn_arg,
				      fn_arg_types); 

5113 5114 5115 5116
  i = type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn), 
			&TREE_VEC_ELT (targs, 0), 
			fn_arg_types,
			decl_arg_types,
5117
			explicit_targs,
5118
			strict, 0);
5119 5120 5121 5122 5123

  return i;
}


mrs's avatar
mrs committed
5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141
/* 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.

   TPARMS[NTPARMS] is an array of template parameter types;
   TARGS[NTPARMS] is the array of template parameter values.  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.

   If SUBR is 1, we're being called recursively (to unify the arguments of
   a function or method parameter of a function template), so don't zero
mrs's avatar
mrs committed
5142 5143 5144 5145
   out targs and don't fail on an incomplete match.

   If STRICT is 1, the match must be exact (for casts of overloaded
   addresses, explicit instantiation, and more_specialized).  */
mrs's avatar
mrs committed
5146 5147

int
5148
type_unification (tparms, targs, parms, args, targs_in,
5149 5150
		  strict, allow_incomplete)
     tree tparms, *targs, parms, args, targs_in;
5151
     int strict, allow_incomplete;
5152 5153
{
  int ntparms = TREE_VEC_LENGTH (tparms);
5154
  tree arg;
5155 5156 5157 5158 5159
  int i;
  int r;

  bzero ((char *) targs, sizeof (tree) * ntparms);

5160 5161 5162 5163
  if (targs_in != NULL_TREE)
    {
      tree arg_vec;
      arg_vec = coerce_template_parms (tparms, targs_in, NULL_TREE, 0,
5164
				       0, 0);
5165 5166 5167

      if (arg_vec == error_mark_node)
	return 1;
5168

5169 5170 5171 5172 5173 5174 5175 5176 5177 5178
      for (i = 0; 
	   i < TREE_VEC_LENGTH (arg_vec) 
	     && TREE_VEC_ELT (arg_vec, i) != NULL_TREE; 
	   ++i)
	/* Insert the template argument.  It is encoded as the operands
	   of NOP_EXPRs so that unify can tell that it is an explicit
	   arguments.  */
	targs[i] = build1 (NOP_EXPR, NULL_TREE, TREE_VEC_ELT (arg_vec, i));
    }
  
5179
  r = type_unification_real (tparms, targs, parms, args, 0,
5180 5181
			     strict, allow_incomplete); 

5182 5183 5184
  for (i = 0, arg = targs_in; 
       arg != NULL_TREE; 
       arg = TREE_CHAIN (arg), ++i)
5185 5186 5187 5188 5189 5190 5191
    if (TREE_CODE (targs[i]) == NOP_EXPR)
      targs[i] = TREE_OPERAND (targs[i], 0);

  return r;
}


5192
static int
5193
type_unification_real (tparms, targs, parms, args, subr,
5194
		       strict, allow_incomplete)
mrs's avatar
mrs committed
5195
     tree tparms, *targs, parms, args;
5196
     int subr, strict, allow_incomplete;
mrs's avatar
mrs committed
5197 5198 5199 5200 5201 5202
{
  tree parm, arg;
  int i;
  int ntparms = TREE_VEC_LENGTH (tparms);

  my_friendly_assert (TREE_CODE (tparms) == TREE_VEC, 289);
5203 5204
  my_friendly_assert (parms == NULL_TREE 
		      || TREE_CODE (parms) == TREE_LIST, 290);
mrs's avatar
mrs committed
5205
  /* ARGS could be NULL (via a call from parse.y to
mrs's avatar
mrs committed
5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224
     build_x_function_call).  */
  if (args)
    my_friendly_assert (TREE_CODE (args) == TREE_LIST, 291);
  my_friendly_assert (ntparms > 0, 292);

  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
5225

5226 5227 5228 5229 5230
      /* 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
5231
	{
5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247
	  tree type;

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

	  if (strict)
	    {
	      if (comptypes (parm, type, 1))
		continue;
	    }
	  else
5248 5249 5250 5251
	    /* It might work; we shouldn't check now, because we might
	       get into infinite recursion.  Overload resolution will
	       handle it.  */
	    continue;
5252

mrs's avatar
mrs committed
5253 5254 5255
	  return 1;
	}
	
mrs's avatar
mrs committed
5256 5257 5258 5259 5260 5261 5262 5263 5264
#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);
mrs's avatar
mrs committed
5265 5266 5267 5268
	  if (TREE_CODE (arg) == TREE_LIST
	      && TREE_TYPE (arg) == unknown_type_node
	      && TREE_CODE (TREE_VALUE (arg)) == TEMPLATE_DECL)
	    {
5269
	      int ntparms;
mrs's avatar
mrs committed
5270 5271 5272 5273
	      tree *targs;

	      /* Have to back unify here */
	      arg = TREE_VALUE (arg);
5274
	      ntparms = DECL_NTPARMS (arg);
mrs's avatar
mrs committed
5275
	      targs = (tree *) alloca (sizeof (tree) * ntparms);
5276
	      parm = expr_tree_cons (NULL_TREE, parm, NULL_TREE);
5277 5278 5279 5280
	      return 
		type_unification (DECL_INNERMOST_TEMPLATE_PARMS (arg), 
				  targs,
				  TYPE_ARG_TYPES (TREE_TYPE (arg)),
5281
				  parm, NULL_TREE, strict,
5282
				  allow_incomplete); 
mrs's avatar
mrs committed
5283
	    }
mrs's avatar
mrs committed
5284 5285 5286
	  arg = TREE_TYPE (arg);
	}
#endif
5287 5288 5289 5290 5291 5292
      if (! flag_ansi && arg == TREE_TYPE (null_node))
	{
	  warning ("using type void* for NULL");
	  arg = ptr_type_node;
	}

mrs's avatar
mrs committed
5293
      if (! subr && TREE_CODE (arg) == REFERENCE_TYPE)
mrs's avatar
mrs committed
5294 5295
	arg = TREE_TYPE (arg);

mrs's avatar
mrs committed
5296
      if (! subr && TREE_CODE (parm) != REFERENCE_TYPE)
5297 5298 5299 5300 5301 5302 5303 5304 5305
	{
	  if (TREE_CODE (arg) == FUNCTION_TYPE
	      || TREE_CODE (arg) == METHOD_TYPE)
	    arg = build_pointer_type (arg);
	  else if (TREE_CODE (arg) == ARRAY_TYPE)
	    arg = build_pointer_type (TREE_TYPE (arg));
	  else
	    arg = TYPE_MAIN_VARIANT (arg);
	}
mrs's avatar
mrs committed
5306

5307
      switch (unify (tparms, targs, ntparms, parm, arg, strict))
mrs's avatar
mrs committed
5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327
	{
	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++)
      if (!targs[i])
	{
5328 5329
	  if (!allow_incomplete)
	    error ("incomplete type unification");
mrs's avatar
mrs committed
5330 5331 5332 5333 5334 5335
	  return 2;
	}
  return 0;
}

/* Tail recursion is your friend.  */
mrs's avatar
mrs committed
5336

mrs's avatar
mrs committed
5337
static int
5338
unify (tparms, targs, ntparms, parm, arg, strict)
mrs's avatar
mrs committed
5339
     tree tparms, *targs, parm, arg;
5340
     int ntparms, strict;
mrs's avatar
mrs committed
5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357
{
  int idx;

  /* 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;
  if (arg == parm)
    return 0;

5358 5359 5360 5361 5362 5363 5364
  /* We can't remove cv-quals when strict.  */
  if (strict && TREE_CODE (arg) == TREE_CODE (parm)
      && TREE_CODE_CLASS (TREE_CODE (arg)) == 't'
      && (TYPE_READONLY (arg) < TYPE_READONLY (parm)
	  || TYPE_VOLATILE (arg) < TYPE_VOLATILE (parm)))
    return 1;

mrs's avatar
mrs committed
5365 5366
  switch (TREE_CODE (parm))
    {
5367 5368 5369 5370 5371 5372
    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
5373 5374
    case TEMPLATE_TYPE_PARM:
      idx = TEMPLATE_TYPE_IDX (parm);
5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385
      /* Check for mixed types and values.  */
      if (TREE_CODE (TREE_VALUE (TREE_VEC_ELT (tparms, idx))) != TYPE_DECL)
	return 1;

      if (!strict && targs[idx] != NULL_TREE && 
	  TREE_CODE (targs[idx]) == NOP_EXPR)
	/* 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;

mrs's avatar
mrs committed
5386 5387 5388
      if (strict && (TYPE_READONLY (arg) < TYPE_READONLY (parm)
		     || TYPE_VOLATILE (arg) < TYPE_VOLATILE (parm)))
	return 1;
mrs's avatar
mrs committed
5389
#if 0
mrs's avatar
mrs committed
5390 5391 5392 5393 5394 5395 5396
      /* Template type parameters cannot contain cv-quals; i.e.
         template <class T> void f (T& a, T& b) will not generate
	 void f (const int& a, const int& b).  */
      if (TYPE_READONLY (arg) > TYPE_READONLY (parm)
	  || TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm))
	return 1;
      arg = TYPE_MAIN_VARIANT (arg);
mrs's avatar
mrs committed
5397 5398 5399 5400 5401 5402 5403
#else
      {
	int constp = TYPE_READONLY (arg) > TYPE_READONLY (parm);
	int volatilep = TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm);
	arg = cp_build_type_variant (arg, constp, volatilep);
      }
#endif
mrs's avatar
mrs committed
5404
      /* Simple cases: Value already set, does match or doesn't.  */
5405 5406 5407 5408
      if (targs[idx] == arg 
	  || (targs[idx] 
	      && TREE_CODE (targs[idx]) == NOP_EXPR 
	      && TREE_OPERAND (targs[idx], 0) == arg))
mrs's avatar
mrs committed
5409 5410 5411 5412 5413
	return 0;
      else if (targs[idx])
	return 1;
      targs[idx] = arg;
      return 0;
5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442

    case TEMPLATE_TEMPLATE_PARM:
      idx = TEMPLATE_TYPE_IDX (parm);
      /* Check for mixed types and values.  */
      if (TREE_CODE (TREE_VALUE (TREE_VEC_ELT (tparms, idx))) != TEMPLATE_DECL)
	return 1;

      if (!strict && targs[idx] != NULL_TREE && 
	  TREE_CODE (targs[idx]) == NOP_EXPR)
	/* 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;

      if (CLASSTYPE_TEMPLATE_INFO (parm))
	{
	  /* We arrive here when PARM does not involve template 
	     specialization.  */

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

	  {
	    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));
5443
	    int i;
5444 5445 5446 5447 5448 5449 5450 5451

	    /* 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 
		 template <class T, class Allcator = allocator> 
		   class vector.  */

5452
	    if (coerce_template_parms (argtmplvec, parmvec, parmtmpl, 1, 1, 0)
5453 5454 5455 5456 5457 5458 5459 5460 5461
		== error_mark_node)
	      return 1;
	  
	    /* 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
jason's avatar
jason committed
5462
		    && TREE_CODE (t) != TEMPLATE_PARM_INDEX)
5463 5464 5465 5466 5467
		  continue;

		/* This argument can be deduced.  */

		if (unify (tparms, targs, ntparms, t, 
5468
			   TREE_VEC_ELT (argvec, i), strict))
5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485
		  return 1;
	      }
	  }
	  arg = CLASSTYPE_TI_TEMPLATE (arg);
	}

      /* Simple cases: Value already set, does match or doesn't.  */
      if (targs[idx] == arg 
	  || (targs[idx] 
	      && TREE_CODE (targs[idx]) == NOP_EXPR 
	      && TREE_OPERAND (targs[idx], 0) == arg))
	return 0;
      else if (targs[idx])
	return 1;
      targs[idx] = arg;
      return 0;

jason's avatar
jason committed
5486 5487
    case TEMPLATE_PARM_INDEX:
      idx = TEMPLATE_PARM_IDX (parm);
mrs's avatar
mrs committed
5488
      if (targs[idx])
mrs's avatar
mrs committed
5489
	{
mrs's avatar
mrs committed
5490 5491 5492 5493 5494 5495 5496
	  int i = cp_tree_equal (targs[idx], arg);
	  if (i == 1)
	    return 0;
	  else if (i == 0)
	    return 1;
	  else
	    my_friendly_abort (42);
mrs's avatar
mrs committed
5497 5498 5499 5500 5501 5502
	}

      targs[idx] = copy_to_permanent (arg);
      return 0;

    case POINTER_TYPE:
mrs's avatar
mrs committed
5503 5504
      if (TREE_CODE (arg) == RECORD_TYPE && TYPE_PTRMEMFUNC_FLAG (arg))
	return unify (tparms, targs, ntparms, parm,
5505
		      TYPE_PTRMEMFUNC_FN_TYPE (arg), strict);
mrs's avatar
mrs committed
5506

mrs's avatar
mrs committed
5507 5508 5509
      if (TREE_CODE (arg) != POINTER_TYPE)
	return 1;
      return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
5510
		    strict);
mrs's avatar
mrs committed
5511 5512

    case REFERENCE_TYPE:
mrs's avatar
mrs committed
5513 5514
      if (TREE_CODE (arg) == REFERENCE_TYPE)
	arg = TREE_TYPE (arg);
mrs's avatar
mrs committed
5515
      return unify (tparms, targs, ntparms, TREE_TYPE (parm), arg,
5516
		    strict);
mrs's avatar
mrs committed
5517 5518 5519 5520

    case ARRAY_TYPE:
      if (TREE_CODE (arg) != ARRAY_TYPE)
	return 1;
5521 5522 5523 5524 5525
      if ((TYPE_DOMAIN (parm) == NULL_TREE)
	  != (TYPE_DOMAIN (arg) == NULL_TREE))
	return 1;
      if (TYPE_DOMAIN (parm) != NULL_TREE
	  && unify (tparms, targs, ntparms, TYPE_DOMAIN (parm),
5526
		    TYPE_DOMAIN (arg), strict) != 0)
mrs's avatar
mrs committed
5527 5528
	return 1;
      return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
5529
		    strict);
mrs's avatar
mrs committed
5530 5531

    case REAL_TYPE:
mrs's avatar
mrs committed
5532
    case COMPLEX_TYPE:
mrs's avatar
mrs committed
5533
    case INTEGER_TYPE:
brendan's avatar
brendan committed
5534
    case BOOLEAN_TYPE:
5535
    case VOID_TYPE:
mrs's avatar
mrs committed
5536 5537 5538 5539
      if (TREE_CODE (arg) != TREE_CODE (parm))
	return 1;

      if (TREE_CODE (parm) == INTEGER_TYPE)
mrs's avatar
mrs committed
5540 5541
	{
	  if (TYPE_MIN_VALUE (parm) && TYPE_MIN_VALUE (arg)
mrs's avatar
mrs committed
5542
	      && unify (tparms, targs, ntparms, TYPE_MIN_VALUE (parm),
5543
			TYPE_MIN_VALUE (arg), strict))
mrs's avatar
mrs committed
5544 5545
	    return 1;
	  if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg)
mrs's avatar
mrs committed
5546
	      && unify (tparms, targs, ntparms, TYPE_MAX_VALUE (parm),
5547
			TYPE_MAX_VALUE (arg), strict))
mrs's avatar
mrs committed
5548 5549
	    return 1;
	}
5550 5551 5552 5553
      else if (TREE_CODE (parm) == REAL_TYPE
	       && TYPE_MAIN_VARIANT (arg) != TYPE_MAIN_VARIANT (parm))
	return 1;

mrs's avatar
mrs committed
5554 5555 5556 5557 5558
      /* 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
5559
      /* Type INTEGER_CST can come from ordinary constant template args.  */
mrs's avatar
mrs committed
5560
    case INTEGER_CST:
mrs's avatar
mrs committed
5561 5562 5563
      while (TREE_CODE (arg) == NOP_EXPR)
	arg = TREE_OPERAND (arg, 0);

mrs's avatar
mrs committed
5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574
      if (TREE_CODE (arg) != INTEGER_CST)
	return 1;
      return !tree_int_cst_equal (parm, arg);

    case MINUS_EXPR:
      {
	tree t1, t2;
	t1 = TREE_OPERAND (parm, 0);
	t2 = TREE_OPERAND (parm, 1);
	return unify (tparms, targs, ntparms, t1,
		      fold (build (PLUS_EXPR, integer_type_node, arg, t2)),
5575
		      strict);
mrs's avatar
mrs committed
5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587
      }

    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--)
	  if (unify (tparms, targs, ntparms,
		     TREE_VEC_ELT (parm, i), TREE_VEC_ELT (arg, i),
5588
		     strict))
mrs's avatar
mrs committed
5589 5590 5591 5592 5593
	    return 1;
	return 0;
      }

    case RECORD_TYPE:
mrs's avatar
mrs committed
5594
      if (TYPE_PTRMEMFUNC_FLAG (parm))
mrs's avatar
mrs committed
5595
	return unify (tparms, targs, ntparms, TYPE_PTRMEMFUNC_FN_TYPE (parm),
5596
		      arg, strict);
mrs's avatar
mrs committed
5597

mrs's avatar
mrs committed
5598
      /* Allow trivial conversions.  */
mrs's avatar
mrs committed
5599
      if (TREE_CODE (arg) != RECORD_TYPE
mrs's avatar
mrs committed
5600 5601 5602
	  || TYPE_READONLY (parm) < TYPE_READONLY (arg)
	  || TYPE_VOLATILE (parm) < TYPE_VOLATILE (arg))
	return 1;
mrs's avatar
mrs committed
5603

mrs's avatar
mrs committed
5604
      if (CLASSTYPE_TEMPLATE_INFO (parm) && uses_template_parms (parm))
mrs's avatar
mrs committed
5605
	{
mrs's avatar
mrs committed
5606
	  tree t = NULL_TREE;
5607
	  if (! strict)
mrs's avatar
mrs committed
5608
	    t = get_template_base (CLASSTYPE_TI_TEMPLATE (parm), arg);
mrs's avatar
mrs committed
5609 5610 5611
	  else if
	    (CLASSTYPE_TEMPLATE_INFO (arg)
	     && CLASSTYPE_TI_TEMPLATE (parm) == CLASSTYPE_TI_TEMPLATE (arg))
mrs's avatar
mrs committed
5612 5613
	    t = arg;
	  if (! t || t == error_mark_node)
mrs's avatar
mrs committed
5614
	    return 1;
mrs's avatar
mrs committed
5615

mrs's avatar
mrs committed
5616
	  return unify (tparms, targs, ntparms, CLASSTYPE_TI_ARGS (parm),
5617
			CLASSTYPE_TI_ARGS (t), strict);
mrs's avatar
mrs committed
5618 5619 5620
	}
      else if (TYPE_MAIN_VARIANT (parm) != TYPE_MAIN_VARIANT (arg))
	return 1;
mrs's avatar
mrs committed
5621
      return 0;
mrs's avatar
mrs committed
5622 5623 5624 5625 5626 5627 5628 5629 5630 5631

    case METHOD_TYPE:
      if (TREE_CODE (arg) != METHOD_TYPE)
	return 1;
      goto check_args;

    case FUNCTION_TYPE:
      if (TREE_CODE (arg) != FUNCTION_TYPE)
	return 1;
     check_args:
mrs's avatar
mrs committed
5632
      if (unify (tparms, targs, ntparms, TREE_TYPE (parm),
5633
		 TREE_TYPE (arg), strict))
mrs's avatar
mrs committed
5634
	return 1;
5635
      return type_unification_real (tparms, targs, TYPE_ARG_TYPES (parm),
5636
				    TYPE_ARG_TYPES (arg), 1, 
5637
				    strict, 0);
mrs's avatar
mrs committed
5638 5639 5640 5641 5642

    case OFFSET_TYPE:
      if (TREE_CODE (arg) != OFFSET_TYPE)
	return 1;
      if (unify (tparms, targs, ntparms, TYPE_OFFSET_BASETYPE (parm),
5643
		 TYPE_OFFSET_BASETYPE (arg), strict))
mrs's avatar
mrs committed
5644 5645
	return 1;
      return unify (tparms, targs, ntparms, TREE_TYPE (parm),
5646
		    TREE_TYPE (arg), strict);
mrs's avatar
mrs committed
5647

jason's avatar
merge  
jason committed
5648 5649 5650 5651 5652
    case CONST_DECL:
      if (arg != decl_constant_value (parm))
	return 1;
      return 0;

5653 5654 5655 5656
    case TEMPLATE_DECL:
      /* Matched cases are handled by the ARG == PARM test above.  */
      return 1;

mrs's avatar
mrs committed
5657 5658 5659 5660 5661 5662 5663
    default:
      sorry ("use of `%s' in template type unification",
	     tree_code_name [(int) TREE_CODE (parm)]);
      return 1;
    }
}

mrs's avatar
mrs committed
5664
void
mrs's avatar
mrs committed
5665
mark_decl_instantiated (result, extern_p)
mrs's avatar
mrs committed
5666 5667 5668 5669 5670
     tree result;
     int extern_p;
{
  if (DECL_TEMPLATE_INSTANTIATION (result))
    SET_DECL_EXPLICIT_INSTANTIATION (result);
5671 5672 5673 5674 5675

  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
5676 5677 5678 5679 5680

  if (! extern_p)
    {
      DECL_INTERFACE_KNOWN (result) = 1;
      DECL_NOT_REALLY_EXTERN (result) = 1;
5681 5682 5683

      /* For WIN32 we also want to put explicit instantiations in
	 linkonce sections.  */
5684
      if (supports_one_only () && ! SUPPORTS_WEAK && TREE_PUBLIC (result))
5685
	make_decl_one_only (result);
mrs's avatar
mrs committed
5686
    }
mrs's avatar
mrs committed
5687 5688
  else if (TREE_CODE (result) == FUNCTION_DECL)
    mark_inline_for_output (result);
mrs's avatar
mrs committed
5689 5690
}

5691 5692
/* Given two function templates PAT1 and PAT2, and explicit template
   arguments EXPLICIT_ARGS return:
mrs's avatar
mrs committed
5693 5694 5695 5696 5697 5698

   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
5699 5700
more_specialized (pat1, pat2, explicit_args)
     tree pat1, pat2, explicit_args;
mrs's avatar
mrs committed
5701
{
5702
  tree targs;
mrs's avatar
mrs committed
5703
  int winner = 0;
mrs's avatar
mrs committed
5704

5705
  targs = get_bindings_overload (pat1, pat2, explicit_args);
mrs's avatar
mrs committed
5706 5707 5708 5709
  if (targs)
    {
      --winner;
    }
mrs's avatar
mrs committed
5710

5711
  targs = get_bindings_overload (pat2, pat1, explicit_args);
mrs's avatar
mrs committed
5712 5713 5714 5715
  if (targs)
    {
      ++winner;
    }
mrs's avatar
mrs committed
5716

mrs's avatar
mrs committed
5717 5718
  return winner;
}
mrs's avatar
mrs committed
5719

mrs's avatar
mrs committed
5720
/* Given two class template specialization list nodes PAT1 and PAT2, return:
mrs's avatar
mrs committed
5721

mrs's avatar
mrs committed
5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733
   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
5734 5735
    (TREE_VALUE (pat1), TREE_PURPOSE (pat1),
     TREE_PURPOSE (pat2), NULL_TREE);
mrs's avatar
mrs committed
5736 5737 5738 5739
  if (targs)
    --winner;

  targs = get_class_bindings
5740 5741
    (TREE_VALUE (pat2), TREE_PURPOSE (pat2),
     TREE_PURPOSE (pat1), NULL_TREE);
mrs's avatar
mrs committed
5742
  if (targs)
mrs's avatar
mrs committed
5743 5744 5745 5746
    ++winner;

  return winner;
}
mrs's avatar
mrs committed
5747 5748

/* Return the template arguments that will produce the function signature
5749
   DECL from the function template FN, with the explicit template
5750 5751
   arguments EXPLICIT_ARGS.  If CHECK_RETTYPE is 1, the return type must
   also match.  */
mrs's avatar
mrs committed
5752

5753 5754
static tree
get_bindings_real (fn, decl, explicit_args, check_rettype)
5755
     tree fn, decl, explicit_args;
5756
     int check_rettype;
mrs's avatar
mrs committed
5757
{
5758
  int ntparms = DECL_NTPARMS (fn);
5759
  tree targs = make_scratch_vec (ntparms);
5760 5761
  tree decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
  tree extra_fn_arg = NULL_TREE;
5762 5763
  int i;

5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783
  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);
    }

5784
  i = fn_type_unification (fn, explicit_args, targs, 
5785
			   decl_arg_types,
5786
			   TREE_TYPE (TREE_TYPE (decl)),
5787 5788
			   1,
			   extra_fn_arg);
5789

5790 5791 5792 5793
  if (i != 0)
    return NULL_TREE;

  if (check_rettype)
5794 5795
    {
      /* Check to see that the resulting return type is also OK.  */
5796 5797 5798
      tree t = tsubst (TREE_TYPE (TREE_TYPE (fn)),
		       complete_template_args (fn, targs, 1),
		       NULL_TREE);
5799

jason's avatar
jason committed
5800
      if (!comptypes (t, TREE_TYPE (TREE_TYPE (decl)), 1))
5801 5802 5803
	return NULL_TREE;
    }

5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822
  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
5823 5824
}

mrs's avatar
mrs committed
5825
static tree
5826 5827
get_class_bindings (tparms, parms, args, outer_args)
     tree tparms, parms, args, outer_args;
mrs's avatar
mrs committed
5828
{
5829
  int i, ntparms = TREE_VEC_LENGTH (tparms);
mrs's avatar
mrs committed
5830 5831
  tree vec = make_temp_vec (ntparms);

5832 5833 5834 5835 5836 5837
  if (outer_args)
    {
      tparms = tsubst (tparms, outer_args, NULL_TREE);
      parms = tsubst (parms, outer_args, NULL_TREE);
    }

mrs's avatar
mrs committed
5838 5839 5840
  for (i = 0; i < TREE_VEC_LENGTH (parms); ++i)
    {
      switch (unify (tparms, &TREE_VEC_ELT (vec, 0), ntparms,
5841
		     TREE_VEC_ELT (parms, i), TREE_VEC_ELT (args, i), 1))
mrs's avatar
mrs committed
5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857
	{
	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
5858 5859
   produce an instantiation matching DECL, given the explicit template
   arguments EXPLICIT_ARGS.  */
mrs's avatar
mrs committed
5860 5861

tree
5862 5863
most_specialized (fns, decl, explicit_args)
     tree fns, decl, explicit_args;
mrs's avatar
mrs committed
5864
{
5865
  tree fn, champ, args, *p;
mrs's avatar
mrs committed
5866 5867 5868 5869
  int fate;

  for (p = &fns; *p; )
    {
5870
      args = get_bindings (TREE_VALUE (*p), decl, explicit_args);
mrs's avatar
mrs committed
5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886
      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))
    {
5887
      fate = more_specialized (champ, TREE_VALUE (fn), explicit_args);
mrs's avatar
mrs committed
5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903
      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))
    {
5904
      fate = more_specialized (champ, TREE_VALUE (fn), explicit_args);
mrs's avatar
mrs committed
5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915
      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
5916 5917
most_specialized_class (specs, mainargs, outer_args)
     tree specs, mainargs, outer_args;
mrs's avatar
mrs committed
5918 5919 5920 5921 5922 5923
{
  tree list = NULL_TREE, t, args, champ;
  int fate;

  for (t = specs; t; t = TREE_CHAIN (t))
    {
5924 5925
      args = get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
				 mainargs, outer_args);
mrs's avatar
mrs committed
5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957
      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))
    {
5958
      fate = more_specialized_class (champ, t);
mrs's avatar
mrs committed
5959 5960 5961 5962 5963 5964 5965
      if (fate != 1)
	return error_mark_node;
    }

  return champ;
}

mrs's avatar
mrs committed
5966
/* called from the parser.  */
mrs's avatar
mrs committed
5967

mrs's avatar
mrs committed
5968
void
mrs's avatar
mrs committed
5969
do_decl_instantiation (declspecs, declarator, storage)
mrs's avatar
mrs committed
5970
     tree declspecs, declarator, storage;
mrs's avatar
mrs committed
5971
{
mrs's avatar
merging  
mrs committed
5972
  tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0, NULL_TREE);
mrs's avatar
mrs committed
5973
  tree result = NULL_TREE;
mrs's avatar
mrs committed
5974
  int extern_p = 0;
mrs's avatar
mrs committed
5975

mrs's avatar
mrs committed
5976 5977 5978 5979 5980 5981
  if (! DECL_LANG_SPECIFIC (decl))
    {
      cp_error ("explicit instantiation of non-template `%#D'", decl);
      return;
    }

mrs's avatar
mrs committed
5982
  /* If we've already seen this template instance, use it.  */
mrs's avatar
mrs committed
5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993
  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;
    }
5994 5995
  else if (DECL_TEMPLATE_INSTANTIATION (decl))
    result = decl;
5996

mrs's avatar
mrs committed
5997
  if (! result)
mrs's avatar
mrs committed
5998 5999 6000 6001
    {
      cp_error ("no matching template for `%D' found", decl);
      return;
    }
mrs's avatar
mrs committed
6002

mrs's avatar
mrs committed
6003 6004 6005 6006 6007 6008
  if (! DECL_TEMPLATE_INFO (result))
    {
      cp_pedwarn ("explicit instantiation of non-template `%#D'", result);
      return;
    }

mrs's avatar
mrs committed
6009 6010 6011
  if (flag_external_templates)
    return;

mrs's avatar
mrs committed
6012
  if (storage == NULL_TREE)
mrs's avatar
mrs committed
6013
    ;
mrs's avatar
mrs committed
6014 6015
  else if (storage == ridpointers[(int) RID_EXTERN])
    extern_p = 1;
mrs's avatar
mrs committed
6016 6017 6018
  else
    cp_error ("storage class `%D' applied to template instantiation",
	      storage);
mrs's avatar
mrs committed
6019 6020

  mark_decl_instantiated (result, extern_p);
mrs's avatar
mrs committed
6021
  repo_template_instantiated (result, extern_p);
mrs's avatar
mrs committed
6022 6023
  if (! extern_p)
    instantiate_decl (result);
mrs's avatar
mrs committed
6024 6025
}

mrs's avatar
mrs committed
6026 6027 6028 6029 6030 6031
void
mark_class_instantiated (t, extern_p)
     tree t;
     int extern_p;
{
  SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
6032 6033
  SET_CLASSTYPE_INTERFACE_KNOWN (t);
  CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
mrs's avatar
mrs committed
6034 6035 6036 6037 6038 6039 6040 6041
  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
6042

mrs's avatar
mrs committed
6043
void
6044 6045
do_type_instantiation (t, storage)
     tree t, storage;
mrs's avatar
mrs committed
6046
{
mrs's avatar
mrs committed
6047 6048
  int extern_p = 0;
  int nomem_p = 0;
mrs's avatar
mrs committed
6049 6050
  int static_p = 0;

6051 6052 6053 6054 6055 6056 6057 6058 6059
  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
6060
  complete_type (t);
mrs's avatar
mrs committed
6061

mrs's avatar
mrs committed
6062 6063
  /* With -fexternal-templates, explicit instantiations are treated the same
     as implicit ones.  */
mrs's avatar
mrs committed
6064 6065 6066
  if (flag_external_templates)
    return;

mrs's avatar
mrs committed
6067 6068 6069 6070 6071 6072 6073 6074
  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
6075 6076 6077
    /* OK */;
  else if (storage == ridpointers[(int) RID_INLINE])
    nomem_p = 1;
mrs's avatar
mrs committed
6078 6079
  else if (storage == ridpointers[(int) RID_EXTERN])
    extern_p = 1;
mrs's avatar
mrs committed
6080 6081
  else if (storage == ridpointers[(int) RID_STATIC])
    static_p = 1;
mrs's avatar
mrs committed
6082 6083 6084 6085 6086 6087 6088
  else
    {
      cp_error ("storage class `%D' applied to template instantiation",
		storage);
      extern_p = 0;
    }

mrs's avatar
mrs committed
6089
  /* We've already instantiated this.  */
mrs's avatar
mrs committed
6090 6091 6092
  if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && ! CLASSTYPE_INTERFACE_ONLY (t)
      && extern_p)
    return;
mrs's avatar
mrs committed
6093

mrs's avatar
mrs committed
6094
  if (! CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
mrs's avatar
mrs committed
6095 6096 6097 6098
    {
      mark_class_instantiated (t, extern_p);
      repo_template_instantiated (t, extern_p);
    }
mrs's avatar
mrs committed
6099 6100 6101 6102

  if (nomem_p)
    return;

mrs's avatar
mrs committed
6103
  {
mrs's avatar
mrs committed
6104
    tree tmp;
mrs's avatar
mrs committed
6105 6106 6107

    if (! static_p)
      for (tmp = TYPE_METHODS (t); tmp; tmp = TREE_CHAIN (tmp))
6108
	if (TREE_CODE (tmp) == FUNCTION_DECL
6109
	    && DECL_TEMPLATE_INSTANTIATION (tmp))
mrs's avatar
mrs committed
6110 6111 6112 6113 6114 6115 6116 6117 6118
	  {
	    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
6119
	{
mrs's avatar
mrs committed
6120
	  mark_decl_instantiated (tmp, extern_p);
mrs's avatar
mrs committed
6121
	  repo_template_instantiated (tmp, extern_p);
mrs's avatar
mrs committed
6122 6123
	  if (! extern_p)
	    instantiate_decl (tmp);
mrs's avatar
mrs committed
6124
	}
mrs's avatar
mrs committed
6125

mrs's avatar
mrs committed
6126
    for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp))
mrs's avatar
mrs committed
6127 6128
      if (IS_AGGR_TYPE (TREE_VALUE (tmp)))
	do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage);
mrs's avatar
mrs committed
6129
  }
mrs's avatar
mrs committed
6130
}
mrs's avatar
mrs committed
6131

jason's avatar
jason committed
6132 6133
/* Produce the definition of D, a _DECL generated from a template.  */

mrs's avatar
mrs committed
6134
tree
mrs's avatar
mrs committed
6135 6136
instantiate_decl (d)
     tree d;
mrs's avatar
mrs committed
6137
{
mrs's avatar
mrs committed
6138 6139 6140
  tree ti = DECL_TEMPLATE_INFO (d);
  tree tmpl = TI_TEMPLATE (ti);
  tree args = TI_ARGS (ti);
6141
  tree td, temp;
jason's avatar
jason committed
6142
  tree decl_pattern, code_pattern;
mrs's avatar
mrs committed
6143 6144 6145 6146
  tree save_ti;
  int nested = in_function_p ();
  int d_defined;
  int pattern_defined;
mrs's avatar
mrs committed
6147 6148
  int line = lineno;
  char *file = input_filename;
mrs's avatar
mrs committed
6149

jason's avatar
jason committed
6150 6151 6152 6153 6154 6155 6156 6157 6158
  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
6159
    td = DECL_TI_TEMPLATE (td);
6160

jason's avatar
jason committed
6161 6162 6163 6164 6165
  /* 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);
6166

mrs's avatar
mrs committed
6167 6168 6169
  if (TREE_CODE (d) == FUNCTION_DECL)
    {
      d_defined = (DECL_INITIAL (d) != NULL_TREE);
jason's avatar
jason committed
6170
      pattern_defined = (DECL_INITIAL (code_pattern) != NULL_TREE);
mrs's avatar
mrs committed
6171 6172 6173 6174
    }
  else
    {
      d_defined = ! DECL_IN_AGGR_P (d);
jason's avatar
jason committed
6175
      pattern_defined = ! DECL_IN_AGGR_P (code_pattern);
mrs's avatar
mrs committed
6176 6177 6178 6179
    }

  if (d_defined)
    return d;
mrs's avatar
mrs committed
6180

6181 6182
  if (TREE_CODE (d) == FUNCTION_DECL) 
    {
6183 6184 6185 6186 6187
      tree spec = retrieve_specialization (tmpl, args);
      
      if (spec != NULL_TREE 
	  && DECL_TEMPLATE_SPECIALIZATION (spec))
	return spec;
6188 6189
    }

mrs's avatar
mrs committed
6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200
  /* 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);

  /* We need to set up DECL_INITIAL regardless of pattern_defined if the
     variable is a static const initialized in the class body.  */
  if (TREE_CODE (d) == VAR_DECL
jason's avatar
jason committed
6201
      && ! DECL_INITIAL (d) && DECL_INITIAL (code_pattern))
mrs's avatar
mrs committed
6202 6203
    {
      pushclass (DECL_CONTEXT (d), 2);
jason's avatar
jason committed
6204
      DECL_INITIAL (d) = tsubst_expr (DECL_INITIAL (code_pattern), args,
6205
				      tmpl);
6206
      cp_finish_decl (d, DECL_INITIAL (d), NULL_TREE, 0, LOOKUP_NORMAL);
mrs's avatar
mrs committed
6207 6208 6209
    }

  if (pattern_defined)
mrs's avatar
mrs committed
6210 6211 6212 6213 6214 6215 6216 6217 6218 6219
    {
      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
6220
	  else if (DECL_INTERFACE_KNOWN (code_pattern))
mrs's avatar
mrs committed
6221 6222
	    {
	      DECL_INTERFACE_KNOWN (d) = 1;
jason's avatar
jason committed
6223
	      DECL_NOT_REALLY_EXTERN (d) = ! DECL_EXTERNAL (code_pattern);
mrs's avatar
mrs committed
6224 6225
	    }
	  else
jason's avatar
jason committed
6226
	    warn_if_unknown_interface (code_pattern);
mrs's avatar
mrs committed
6227 6228
	}

mrs's avatar
mrs committed
6229
      if (at_eof)
mrs's avatar
mrs committed
6230 6231 6232
	import_export_decl (d);
    }

6233 6234 6235 6236 6237 6238 6239
  /* 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;

  /* Defer all templates except inline functions used in another function.  */
mrs's avatar
mrs committed
6240
  if (! pattern_defined
6241 6242
      || (! (TREE_CODE (d) == FUNCTION_DECL && DECL_INLINE (d) && nested)
	  && ! at_eof))
mrs's avatar
mrs committed
6243 6244
    {
      add_pending_template (d);
mrs's avatar
mrs committed
6245
      goto out;
mrs's avatar
mrs committed
6246 6247
    }

mrs's avatar
mrs committed
6248 6249 6250
  lineno = DECL_SOURCE_LINE (d);
  input_filename = DECL_SOURCE_FILE (d);

mrs's avatar
mrs committed
6251
  /* Trick tsubst into giving us a new decl in case the template changed.  */
jason's avatar
jason committed
6252 6253
  save_ti = DECL_TEMPLATE_INFO (decl_pattern);
  DECL_TEMPLATE_INFO (decl_pattern) = NULL_TREE;
jason's avatar
comment  
jason committed
6254 6255
  /* decl_pattern has all but one level of template parms bound.  Only pass
     in that one level of args.  */
6256
  temp = innermost_args (args, DECL_TEMPLATE_SPECIALIZATION (decl_pattern));
6257
  td = tsubst (decl_pattern, temp, tmpl);
6258
  SET_DECL_IMPLICIT_INSTANTIATION (td);
jason's avatar
jason committed
6259
  DECL_TEMPLATE_INFO (decl_pattern) = save_ti;
mrs's avatar
mrs committed
6260

mrs's avatar
mrs committed
6261 6262
  /* And set up DECL_INITIAL, since tsubst doesn't.  */
  if (TREE_CODE (td) == VAR_DECL)
mrs's avatar
mrs committed
6263 6264
    {
      pushclass (DECL_CONTEXT (d), 2);
jason's avatar
jason committed
6265
      DECL_INITIAL (td) = tsubst_expr (DECL_INITIAL (code_pattern), args,
6266
				       tmpl);
mrs's avatar
mrs committed
6267 6268
      popclass (1);
    }
mrs's avatar
mrs committed
6269

mrs's avatar
mrs committed
6270
  if (TREE_CODE (d) == FUNCTION_DECL)
6271 6272 6273 6274 6275 6276 6277 6278 6279
    {
      /* Convince duplicate_decls to use the DECL_ARGUMENTS from the
	 new decl.  */ 
      DECL_INITIAL (td) = error_mark_node;

      if (DECL_TEMPLATE_SPECIALIZATION (td) && !DECL_TEMPLATE_INFO (td))
	/* Set up the information about what is being specialized. */
	DECL_TEMPLATE_INFO (td) = DECL_TEMPLATE_INFO (d);
    }
mrs's avatar
mrs committed
6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297
  duplicate_decls (td, d);
  if (TREE_CODE (d) == FUNCTION_DECL)
    DECL_INITIAL (td) = 0;

  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
6298
      tree t = DECL_SAVED_TREE (code_pattern);
mrs's avatar
mrs committed
6299

mrs's avatar
merging  
mrs committed
6300
      start_function (NULL_TREE, d, NULL_TREE, 1);
mrs's avatar
mrs committed
6301 6302
      store_parm_decls ();

mrs's avatar
mrs committed
6303 6304 6305 6306
      if (t && TREE_CODE (t) == RETURN_INIT)
	{
	  store_return_init
	    (TREE_OPERAND (t, 0),
6307
	     tsubst_expr (TREE_OPERAND (t, 1), args, tmpl));
mrs's avatar
mrs committed
6308 6309 6310
	  t = TREE_CHAIN (t);
	}

mrs's avatar
mrs committed
6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321
      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
6322
	 pair of curly braces of a function.  These are needed
mrs's avatar
mrs committed
6323 6324 6325 6326
	 for correct operation of dwarfout.c.  */
      keep_next_level ();

      my_friendly_assert (TREE_CODE (t) == COMPOUND_STMT, 42);
6327
      tsubst_expr (t, args, tmpl);
mrs's avatar
mrs committed
6328

mrs's avatar
mrs committed
6329 6330 6331
      finish_function (lineno, 0, nested);
    }

mrs's avatar
mrs committed
6332
out:
mrs's avatar
mrs committed
6333 6334 6335
  lineno = line;
  input_filename = file;

mrs's avatar
mrs committed
6336 6337
  pop_from_top_level ();
  pop_tinst_level ();
mrs's avatar
mrs committed
6338 6339 6340

  return d;
}
mrs's avatar
mrs committed
6341 6342 6343 6344 6345 6346 6347

tree
tsubst_chain (t, argvec)
     tree t, argvec;
{
  if (t)
    {
6348
      tree first = tsubst (t, argvec, NULL_TREE);
mrs's avatar
mrs committed
6349 6350 6351 6352
      tree last = first;

      for (t = TREE_CHAIN (t); t; t = TREE_CHAIN (t))
	{
6353
	  tree x = tsubst (t, argvec, NULL_TREE);
mrs's avatar
mrs committed
6354 6355 6356 6357 6358 6359 6360 6361 6362
	  TREE_CHAIN (last) = x;
	  last = x;
	}

      return first;
    }
  return NULL_TREE;
}

mrs's avatar
mrs committed
6363
static tree
mrs's avatar
mrs committed
6364 6365 6366 6367 6368 6369 6370 6371
tsubst_expr_values (t, argvec)
     tree t, argvec;
{
  tree first = NULL_TREE;
  tree *p = &first;

  for (; t; t = TREE_CHAIN (t))
    {
6372 6373
      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
6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387
      *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
6388

6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406

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
6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420
/* 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;

6421
  t = most_specialized (fns, d, NULL_TREE);
mrs's avatar
mrs committed
6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433
  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
6434 6435 6436 6437 6438

/* Instantiate an enumerated type.  Used by instantiate_class_template and
   tsubst_expr.  */

static tree
6439
tsubst_enum (tag, args, field_chain)
6440
     tree tag, args;
6441
     tree * field_chain;
mrs's avatar
mrs committed
6442
{
6443 6444 6445
  extern tree current_local_enum;
  tree prev_local_enum = current_local_enum;

mrs's avatar
mrs committed
6446 6447 6448 6449 6450 6451 6452
  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,
6453
						NULL_TREE));
mrs's avatar
mrs committed
6454 6455 6456 6457 6458 6459
      TREE_CHAIN (elt) = values;
      values = elt;
    }

  finish_enum (newtag, values);

6460
  if (NULL != field_chain)
6461
    *field_chain = grok_enum_decls (NULL_TREE);
6462 6463 6464

  current_local_enum = prev_local_enum;

mrs's avatar
mrs committed
6465 6466
  return newtag;
}