50th Cygnus<->FSF merge
[gcc.git] / gcc / cp / pt.c
1 /* Handle parameterized types (templates) for GNU C++.
2 Copyright (C) 1992, 1993 Free Software Foundation, Inc.
3 Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 /* Known bugs or deficiencies include:
22 * templates for class static data don't work (methods only)
23 * duplicated method templates can crash the compiler
24 * interface/impl data is taken from file defining the template
25 * all methods must be provided in header files; can't use a source
26 file that contains only the method templates and "just win"
27 * method templates must be seen before the expansion of the
28 class template is done
29 */
30
31 #include "config.h"
32 #include <stdio.h>
33 #include "obstack.h"
34
35 #include "tree.h"
36 #include "flags.h"
37 #include "cp-tree.h"
38 #include "decl.h"
39 #include "parse.h"
40 #include "lex.h"
41
42 extern struct obstack permanent_obstack;
43 extern tree grokdeclarator ();
44
45 extern int lineno;
46 extern char *input_filename;
47 struct pending_inline *pending_template_expansions;
48
49 int processing_template_decl;
50 int processing_template_defn;
51
52 #define obstack_chunk_alloc xmalloc
53 #define obstack_chunk_free free
54
55 static int unify ();
56 static void add_pending_template ();
57
58 void overload_template_name (), pop_template_decls ();
59
60 /* We've got a template header coming up; set obstacks up to save the
61 nodes created permanently. (There might be cases with nested templates
62 where we don't have to do this, but they aren't implemented, and it
63 probably wouldn't be worth the effort.) */
64 void
65 begin_template_parm_list ()
66 {
67 pushlevel (0);
68 push_obstacks (&permanent_obstack, &permanent_obstack);
69 pushlevel (0);
70 }
71
72 /* Process information from new template parameter NEXT and append it to the
73 LIST being built. The rules for use of a template parameter type name
74 by later parameters are not well-defined for us just yet. However, the
75 only way to avoid having to parse expressions of unknown complexity (and
76 with tokens of unknown types) is to disallow it completely. So for now,
77 that is what is assumed. */
78 tree
79 process_template_parm (list, next)
80 tree list, next;
81 {
82 tree parm;
83 tree decl = 0;
84 tree defval;
85 int is_type;
86 parm = next;
87 my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259);
88 defval = TREE_PURPOSE (parm);
89 parm = TREE_VALUE (parm);
90 is_type = TREE_PURPOSE (parm) == class_type_node;
91 if (!is_type)
92 {
93 tree tinfo = 0;
94 my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260);
95 /* is a const-param */
96 parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm),
97 PARM, 0, NULL_TREE);
98 /* A template parameter is not modifiable. */
99 TREE_READONLY (parm) = 1;
100 if (IS_AGGR_TYPE (TREE_TYPE (parm)))
101 {
102 sorry ("aggregate template parameter types");
103 TREE_TYPE (parm) = void_type_node;
104 }
105 tinfo = make_node (TEMPLATE_CONST_PARM);
106 my_friendly_assert (TREE_PERMANENT (tinfo), 260.5);
107 if (TREE_PERMANENT (parm) == 0)
108 {
109 parm = copy_node (parm);
110 TREE_PERMANENT (parm) = 1;
111 }
112 TREE_TYPE (tinfo) = TREE_TYPE (parm);
113 decl = build_decl (CONST_DECL, DECL_NAME (parm), TREE_TYPE (parm));
114 DECL_INITIAL (decl) = tinfo;
115 DECL_INITIAL (parm) = tinfo;
116 }
117 else
118 {
119 tree t = make_node (TEMPLATE_TYPE_PARM);
120 decl = build_decl (TYPE_DECL, TREE_VALUE (parm), t);
121 TYPE_MAIN_DECL (t) = decl;
122 parm = decl;
123 if (defval)
124 {
125 if (IDENTIFIER_HAS_TYPE_VALUE (defval))
126 defval = IDENTIFIER_TYPE_VALUE (defval);
127 else
128 defval = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (defval));
129 }
130 }
131 pushdecl (decl);
132 parm = build_tree_list (defval, parm);
133 return chainon (list, parm);
134 }
135
136 /* The end of a template parameter list has been reached. Process the
137 tree list into a parameter vector, converting each parameter into a more
138 useful form. Type parameters are saved as IDENTIFIER_NODEs, and others
139 as PARM_DECLs. */
140
141 tree
142 end_template_parm_list (parms)
143 tree parms;
144 {
145 int nparms = 0;
146 int saw_default = 0;
147 tree saved_parmlist;
148 tree parm;
149 for (parm = parms; parm; parm = TREE_CHAIN (parm))
150 nparms++;
151 saved_parmlist = make_tree_vec (nparms);
152
153 for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++)
154 {
155 tree p = TREE_VALUE (parm);
156 if (TREE_PURPOSE (parm))
157 saw_default = 1;
158 else if (saw_default)
159 {
160 error ("if a default argument is given for one template parameter");
161 error ("default arguments must be given for all subsequent");
162 error ("parameters as well");
163 }
164
165 if (TREE_CODE (p) == TYPE_DECL)
166 {
167 tree t = TREE_TYPE (p);
168 TEMPLATE_TYPE_SET_INFO (t, saved_parmlist, nparms);
169 }
170 else
171 {
172 tree tinfo = DECL_INITIAL (p);
173 DECL_INITIAL (p) = NULL_TREE;
174 TEMPLATE_CONST_SET_INFO (tinfo, saved_parmlist, nparms);
175 }
176 TREE_VEC_ELT (saved_parmlist, nparms) = parm;
177 }
178 set_current_level_tags_transparency (1);
179 processing_template_decl++;
180 return saved_parmlist;
181 }
182
183 /* end_template_decl is called after a template declaration is seen.
184 D1 is template header; D2 is class_head_sans_basetype or a
185 TEMPLATE_DECL with its DECL_RESULT field set. */
186 void
187 end_template_decl (d1, d2, is_class, defn)
188 tree d1, d2, is_class;
189 int defn;
190 {
191 tree decl;
192 struct template_info *tmpl;
193
194 tmpl = (struct template_info *) obstack_alloc (&permanent_obstack,
195 sizeof (struct template_info));
196 tmpl->text = 0;
197 tmpl->length = 0;
198 tmpl->aggr = is_class;
199
200 /* cloned from reinit_parse_for_template */
201 tmpl->filename = input_filename;
202 tmpl->lineno = lineno;
203 tmpl->parm_vec = d1; /* [eichin:19911015.2306EST] */
204
205 if (d2 == NULL_TREE || d2 == error_mark_node)
206 {
207 decl = 0;
208 goto lose;
209 }
210
211 if (is_class)
212 {
213 decl = build_lang_decl (TEMPLATE_DECL, d2, NULL_TREE);
214 GNU_xref_decl (current_function_decl, decl);
215 }
216 else
217 {
218 if (TREE_CODE (d2) == TEMPLATE_DECL)
219 decl = d2;
220 else
221 {
222 /* Class destructor templates and operator templates are
223 slipping past as non-template nodes. Process them here, since
224 I haven't figured out where to catch them earlier. I could
225 go do that, but it's a choice between getting that done and
226 staying only N months behind schedule. Sorry.... */
227 enum tree_code code;
228 my_friendly_assert (TREE_CODE (d2) == CALL_EXPR, 263);
229 code = TREE_CODE (TREE_OPERAND (d2, 0));
230 my_friendly_assert (code == BIT_NOT_EXPR
231 || code == OP_IDENTIFIER
232 || code == SCOPE_REF, 264);
233 d2 = grokdeclarator (d2, NULL_TREE, MEMFUNCDEF, 0, NULL_TREE);
234 decl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (d2),
235 TREE_TYPE (d2));
236 DECL_TEMPLATE_RESULT (decl) = d2;
237 DECL_CONTEXT (decl) = DECL_CONTEXT (d2);
238 DECL_CLASS_CONTEXT (decl) = DECL_CLASS_CONTEXT (d2);
239 DECL_NAME (decl) = DECL_NAME (d2);
240 TREE_TYPE (decl) = TREE_TYPE (d2);
241 if (interface_unknown && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl))
242 warn_if_unknown_interface ();
243 TREE_PUBLIC (decl) = TREE_PUBLIC (d2) = flag_external_templates && !interface_unknown;
244 DECL_EXTERNAL (decl) = (DECL_EXTERNAL (d2)
245 && !(DECL_CLASS_CONTEXT (d2)
246 && !DECL_THIS_EXTERN (d2)));
247 }
248
249 /* All routines creating TEMPLATE_DECL nodes should now be using
250 build_lang_decl, which will have set this up already. */
251 my_friendly_assert (DECL_LANG_SPECIFIC (decl) != 0, 265);
252
253 /* @@ Somewhere, permanent allocation isn't being used. */
254 if (! DECL_TEMPLATE_IS_CLASS (decl)
255 && TREE_CODE (DECL_TEMPLATE_RESULT (decl)) == FUNCTION_DECL)
256 {
257 tree result = DECL_TEMPLATE_RESULT (decl);
258 /* Will do nothing if allocation was already permanent. */
259 DECL_ARGUMENTS (result) = copy_to_permanent (DECL_ARGUMENTS (result));
260 }
261
262 /* If this is for a method, there's an extra binding level here. */
263 if (DECL_CONTEXT (DECL_TEMPLATE_RESULT (decl)) != NULL_TREE)
264 {
265 /* @@ Find out where this should be getting set! */
266 tree r = DECL_TEMPLATE_RESULT (decl);
267 if (DECL_LANG_SPECIFIC (r) && DECL_CLASS_CONTEXT (r) == NULL_TREE)
268 DECL_CLASS_CONTEXT (r) = DECL_CONTEXT (r);
269 }
270 }
271 DECL_TEMPLATE_INFO (decl) = tmpl;
272 DECL_TEMPLATE_PARMS (decl) = d1;
273
274 /* So that duplicate_decls can do the right thing. */
275 if (defn)
276 DECL_INITIAL (decl) = error_mark_node;
277
278 /* If context of decl is non-null (i.e., method template), add it
279 to the appropriate class template, and pop the binding levels. */
280 if (! is_class && DECL_CONTEXT (DECL_TEMPLATE_RESULT (decl)) != NULL_TREE)
281 {
282 tree ctx = DECL_CONTEXT (DECL_TEMPLATE_RESULT (decl));
283 tree tmpl, t;
284 my_friendly_assert (TREE_CODE (ctx) == UNINSTANTIATED_P_TYPE, 266);
285 tmpl = UPT_TEMPLATE (ctx);
286 for (t = DECL_TEMPLATE_MEMBERS (tmpl); t; t = TREE_CHAIN (t))
287 if (TREE_PURPOSE (t) == DECL_NAME (decl)
288 && duplicate_decls (decl, TREE_VALUE (t)))
289 goto already_there;
290 DECL_TEMPLATE_MEMBERS (tmpl) =
291 perm_tree_cons (DECL_NAME (decl), decl, DECL_TEMPLATE_MEMBERS (tmpl));
292 already_there:
293 poplevel (0, 0, 0);
294 poplevel (0, 0, 0);
295 }
296 /* Otherwise, go back to top level first, and push the template decl
297 again there. */
298 else
299 {
300 poplevel (0, 0, 0);
301 poplevel (0, 0, 0);
302 pushdecl (decl);
303 }
304 lose:
305 #if 0 /* It happens sometimes, with syntactic or semantic errors.
306
307 One specific case:
308 template <class A, int X, int Y> class Foo { ... };
309 template <class A, int X, int y> Foo<X,Y>::method (Foo& x) { ... }
310 Note the missing "A" in the class containing "method". */
311 my_friendly_assert (global_bindings_p (), 267);
312 #else
313 while (! global_bindings_p ())
314 poplevel (0, 0, 0);
315 #endif
316 pop_obstacks ();
317 processing_template_decl--;
318 (void) get_pending_sizes ();
319 }
320
321 /* If TYPE contains a template parm type, then substitute that type
322 with its actual type that is found in TVEC. */
323 static void
324 grok_template_type (tvec, type)
325 tree tvec;
326 tree* type;
327 {
328 switch (TREE_CODE (*type))
329 {
330 case TEMPLATE_TYPE_PARM:
331 if (*type != TYPE_MAIN_VARIANT (*type))
332 {
333 /* we are here for cases like const T* etc. */
334 grok_template_type (tvec, &TYPE_MAIN_VARIANT (*type));
335 *type = cp_build_type_variant (TYPE_MAIN_VARIANT (*type),
336 TYPE_READONLY (*type),
337 TYPE_VOLATILE (*type));
338 }
339 else
340 *type = TREE_VEC_ELT (tvec, TEMPLATE_TYPE_IDX (*type));
341 return;
342 case POINTER_TYPE:
343 case REFERENCE_TYPE:
344 grok_template_type (tvec, &TREE_TYPE (*type));
345 return;
346 case FUNCTION_TYPE:
347 {
348 tree p;
349
350 /* take care of function's return type first */
351 grok_template_type (tvec, &TREE_TYPE (*type));
352
353 /* take care of function's arguments */
354 for (p = TYPE_ARG_TYPES (*type); p; p = TREE_CHAIN (p))
355 grok_template_type (tvec, &TREE_VALUE (p));
356 return;
357 }
358 default:
359 break;
360 }
361 return;
362 }
363
364 /* Convert all template arguments to their appropriate types, and return
365 a vector containing the resulting values. If any error occurs, return
366 error_mark_node. */
367 static tree
368 coerce_template_parms (parms, arglist, in_decl)
369 tree parms, arglist;
370 tree in_decl;
371 {
372 int nparms, nargs, i, lost = 0;
373 tree vec;
374
375 if (arglist == NULL_TREE)
376 nargs = 0;
377 else if (TREE_CODE (arglist) == TREE_VEC)
378 nargs = TREE_VEC_LENGTH (arglist);
379 else
380 nargs = list_length (arglist);
381
382 nparms = TREE_VEC_LENGTH (parms);
383
384 if (nargs > nparms
385 || (nargs < nparms
386 && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
387 {
388 error ("incorrect number of parameters (%d, should be %d)",
389 nargs, nparms);
390 if (in_decl)
391 cp_error_at ("in template expansion for decl `%D'", in_decl);
392 return error_mark_node;
393 }
394
395 if (arglist && TREE_CODE (arglist) == TREE_VEC)
396 vec = copy_node (arglist);
397 else
398 {
399 vec = make_tree_vec (nparms);
400 for (i = 0; i < nparms; i++)
401 {
402 tree arg;
403
404 if (arglist)
405 {
406 arg = arglist;
407 arglist = TREE_CHAIN (arglist);
408
409 if (arg == error_mark_node)
410 lost++;
411 else
412 arg = TREE_VALUE (arg);
413 }
414 else
415 arg = TREE_PURPOSE (TREE_VEC_ELT (parms, i));
416
417 TREE_VEC_ELT (vec, i) = arg;
418 }
419 }
420 for (i = 0; i < nparms; i++)
421 {
422 tree arg = TREE_VEC_ELT (vec, i);
423 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
424 tree val = 0;
425 int is_type, requires_type;
426
427 is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't';
428 requires_type = TREE_CODE (parm) == TYPE_DECL;
429 if (is_type != requires_type)
430 {
431 if (in_decl)
432 cp_error ("type/value mismatch in template parameter list for `%D'",
433 in_decl);
434 lost++;
435 TREE_VEC_ELT (vec, i) = error_mark_node;
436 continue;
437 }
438 if (is_type)
439 val = groktypename (arg);
440 else if (TREE_CODE (arg) == STRING_CST)
441 {
442 cp_error ("string literal %E is not a valid template argument", arg);
443 error ("because it is the address of an object with static linkage");
444 val = error_mark_node;
445 }
446 else
447 {
448 grok_template_type (vec, &TREE_TYPE (parm));
449 val = digest_init (TREE_TYPE (parm), arg, (tree *) 0);
450
451 if (val == error_mark_node)
452 ;
453
454 /* 14.2: Other template-arguments must be constant-expressions,
455 addresses of objects or functions with external linkage, or of
456 static class members. */
457 else if (!TREE_CONSTANT (val))
458 {
459 cp_error ("non-const `%E' cannot be used as template argument",
460 arg);
461 val = error_mark_node;
462 }
463 else if (TREE_CODE (val) == ADDR_EXPR)
464 {
465 tree a = TREE_OPERAND (val, 0);
466 if ((TREE_CODE (a) == VAR_DECL
467 || TREE_CODE (a) == FUNCTION_DECL)
468 && ! DECL_PUBLIC (a))
469 {
470 cp_error ("address of non-extern `%E' cannot be used as template argument", a);
471 val = error_mark_node;
472 }
473 }
474 }
475
476 if (val == error_mark_node)
477 lost++;
478
479 TREE_VEC_ELT (vec, i) = val;
480 }
481 if (lost)
482 return error_mark_node;
483 return vec;
484 }
485
486 /* Given class template name and parameter list, produce a user-friendly name
487 for the instantiation. */
488 static char *
489 mangle_class_name_for_template (name, parms, arglist)
490 char *name;
491 tree parms, arglist;
492 {
493 static struct obstack scratch_obstack;
494 static char *scratch_firstobj;
495 int i, nparms;
496
497 if (!scratch_firstobj)
498 {
499 gcc_obstack_init (&scratch_obstack);
500 scratch_firstobj = obstack_alloc (&scratch_obstack, 1);
501 }
502 else
503 obstack_free (&scratch_obstack, scratch_firstobj);
504
505 #if 0
506 #define buflen sizeof(buf)
507 #define check if (bufp >= buf+buflen-1) goto too_long
508 #define ccat(c) *bufp++=(c); check
509 #define advance bufp+=strlen(bufp); check
510 #define cat(s) strncpy(bufp, s, buf+buflen-bufp-1); advance
511 #else
512 #define check
513 #define ccat(c) obstack_1grow (&scratch_obstack, (c));
514 #define advance
515 #define cat(s) obstack_grow (&scratch_obstack, (s), strlen (s))
516 #endif
517
518 cat (name);
519 ccat ('<');
520 nparms = TREE_VEC_LENGTH (parms);
521 my_friendly_assert (nparms == TREE_VEC_LENGTH (arglist), 268);
522 for (i = 0; i < nparms; i++)
523 {
524 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
525 tree arg = TREE_VEC_ELT (arglist, i);
526
527 if (i)
528 ccat (',');
529
530 if (TREE_CODE (parm) == TYPE_DECL)
531 {
532 cat (type_as_string (arg, 0));
533 continue;
534 }
535 else
536 my_friendly_assert (TREE_CODE (parm) == PARM_DECL, 269);
537
538 if (TREE_CODE (arg) == TREE_LIST)
539 {
540 /* New list cell was built because old chain link was in
541 use. */
542 my_friendly_assert (TREE_PURPOSE (arg) == NULL_TREE, 270);
543 arg = TREE_VALUE (arg);
544 }
545 /* No need to check arglist against parmlist here; we did that
546 in coerce_template_parms, called from lookup_template_class. */
547 cat (expr_as_string (arg, 0));
548 }
549 {
550 char *bufp = obstack_next_free (&scratch_obstack);
551 int offset = 0;
552 while (bufp[offset - 1] == ' ')
553 offset--;
554 obstack_blank_fast (&scratch_obstack, offset);
555
556 /* B<C<char> >, not B<C<char>> */
557 if (bufp[offset - 1] == '>')
558 ccat (' ');
559 }
560 ccat ('>');
561 ccat ('\0');
562 return (char *) obstack_base (&scratch_obstack);
563
564 #if 0
565 too_long:
566 #endif
567 fatal ("out of (preallocated) string space creating template instantiation name");
568 /* NOTREACHED */
569 return NULL;
570 }
571
572 /* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of
573 parameters, find the desired type.
574
575 D1 is the PTYPENAME terminal, and ARGLIST is the list of arguments.
576 Since ARGLIST is build on the decl_obstack, we must copy it here
577 to keep it from being reclaimed when the decl storage is reclaimed.
578
579 IN_DECL, if non-NULL, is the template declaration we are trying to
580 instantiate. */
581 tree
582 lookup_template_class (d1, arglist, in_decl)
583 tree d1, arglist;
584 tree in_decl;
585 {
586 tree template, parmlist;
587 char *mangled_name;
588 tree id;
589
590 my_friendly_assert (TREE_CODE (d1) == IDENTIFIER_NODE, 272);
591 template = IDENTIFIER_GLOBAL_VALUE (d1); /* XXX */
592 if (! template)
593 template = IDENTIFIER_CLASS_VALUE (d1);
594 /* With something like `template <class T> class X class X { ... };'
595 we could end up with D1 having nothing but an IDENTIFIER_LOCAL_VALUE.
596 We don't want to do that, but we have to deal with the situation, so
597 let's give them some syntax errors to chew on instead of a crash. */
598 if (! template)
599 return error_mark_node;
600 if (TREE_CODE (template) != TEMPLATE_DECL)
601 {
602 cp_error ("non-template type `%T' used as a template", d1);
603 if (in_decl)
604 cp_error_at ("for template declaration `%D'", in_decl);
605 return error_mark_node;
606 }
607 parmlist = DECL_TEMPLATE_PARMS (template);
608
609 arglist = coerce_template_parms (parmlist, arglist, template);
610 if (arglist == error_mark_node)
611 return error_mark_node;
612 if (uses_template_parms (arglist))
613 {
614 tree t = make_lang_type (UNINSTANTIATED_P_TYPE);
615 tree d;
616 id = make_anon_name ();
617 d = build_decl (TYPE_DECL, id, t);
618 TYPE_NAME (t) = d;
619 TYPE_VALUES (t) = build_tree_list (template, arglist);
620 pushdecl_top_level (d);
621 }
622 else
623 {
624 mangled_name = mangle_class_name_for_template (IDENTIFIER_POINTER (d1),
625 parmlist, arglist);
626 id = get_identifier (mangled_name);
627 }
628 if (!IDENTIFIER_TEMPLATE (id))
629 {
630 arglist = copy_to_permanent (arglist);
631 IDENTIFIER_TEMPLATE (id) = perm_tree_cons (template, arglist, NULL_TREE);
632 }
633 return id;
634 }
635 \f
636 void
637 push_template_decls (parmlist, arglist, class_level)
638 tree parmlist, arglist;
639 int class_level;
640 {
641 int i, nparms;
642
643 /* Don't want to push values into global context. */
644 if (!class_level)
645 {
646 pushlevel (1);
647 declare_pseudo_global_level ();
648 }
649
650 nparms = TREE_VEC_LENGTH (parmlist);
651
652 for (i = 0; i < nparms; i++)
653 {
654 int requires_type, is_type;
655 tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i));
656 tree arg = TREE_VEC_ELT (arglist, i);
657 tree decl = 0;
658
659 requires_type = TREE_CODE (parm) == TYPE_DECL;
660 is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't';
661 if (is_type)
662 {
663 /* add typename to namespace */
664 if (!requires_type)
665 {
666 error ("template use error: type provided where value needed");
667 continue;
668 }
669 decl = arg;
670 my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (decl)) == 't', 273);
671 decl = build_decl (TYPE_DECL, DECL_NAME (parm), decl);
672 }
673 else
674 {
675 /* add const decl to namespace */
676 tree val;
677 if (requires_type)
678 {
679 error ("template use error: value provided where type needed");
680 continue;
681 }
682 val = digest_init (TREE_TYPE (parm), arg, (tree *) 0);
683 if (val != error_mark_node)
684 {
685 decl = build_decl (CONST_DECL, DECL_NAME (parm),
686 TREE_TYPE (parm));
687 DECL_INITIAL (decl) = val;
688 TREE_READONLY (decl) = 1;
689 }
690 }
691 if (decl != 0)
692 {
693 layout_decl (decl, 0);
694 if (class_level)
695 pushdecl_class_level (decl);
696 else
697 pushdecl (decl);
698 }
699 }
700 }
701
702 void
703 pop_template_decls (parmlist, arglist, class_level)
704 tree parmlist, arglist;
705 int class_level;
706 {
707 if (!class_level)
708 poplevel (0, 0, 0);
709 }
710 \f
711 /* Should be defined in parse.h. */
712 extern int yychar;
713
714 int
715 uses_template_parms (t)
716 tree t;
717 {
718 if (!t)
719 return 0;
720 switch (TREE_CODE (t))
721 {
722 case INDIRECT_REF:
723 case COMPONENT_REF:
724 /* We assume that the object must be instantiated in order to build
725 the COMPONENT_REF, so we test only whether the type of the
726 COMPONENT_REF uses template parms. */
727 return uses_template_parms (TREE_TYPE (t));
728
729 case IDENTIFIER_NODE:
730 if (!IDENTIFIER_TEMPLATE (t))
731 return 0;
732 return uses_template_parms (TREE_VALUE (IDENTIFIER_TEMPLATE (t)));
733
734 /* aggregates of tree nodes */
735 case TREE_VEC:
736 {
737 int i = TREE_VEC_LENGTH (t);
738 while (i--)
739 if (uses_template_parms (TREE_VEC_ELT (t, i)))
740 return 1;
741 return 0;
742 }
743 case TREE_LIST:
744 if (uses_template_parms (TREE_PURPOSE (t))
745 || uses_template_parms (TREE_VALUE (t)))
746 return 1;
747 return uses_template_parms (TREE_CHAIN (t));
748
749 /* constructed type nodes */
750 case POINTER_TYPE:
751 case REFERENCE_TYPE:
752 return uses_template_parms (TREE_TYPE (t));
753 case RECORD_TYPE:
754 case UNION_TYPE:
755 if (!TYPE_NAME (t))
756 return 0;
757 if (!TYPE_IDENTIFIER (t))
758 return 0;
759 return uses_template_parms (TYPE_IDENTIFIER (t));
760 case FUNCTION_TYPE:
761 if (uses_template_parms (TYPE_ARG_TYPES (t)))
762 return 1;
763 return uses_template_parms (TREE_TYPE (t));
764 case ARRAY_TYPE:
765 if (uses_template_parms (TYPE_DOMAIN (t)))
766 return 1;
767 return uses_template_parms (TREE_TYPE (t));
768 case OFFSET_TYPE:
769 if (uses_template_parms (TYPE_OFFSET_BASETYPE (t)))
770 return 1;
771 return uses_template_parms (TREE_TYPE (t));
772 case METHOD_TYPE:
773 if (uses_template_parms (TYPE_OFFSET_BASETYPE (t)))
774 return 1;
775 if (uses_template_parms (TYPE_ARG_TYPES (t)))
776 return 1;
777 return uses_template_parms (TREE_TYPE (t));
778
779 /* decl nodes */
780 case TYPE_DECL:
781 return uses_template_parms (DECL_NAME (t));
782 case FUNCTION_DECL:
783 if (uses_template_parms (TREE_TYPE (t)))
784 return 1;
785 /* fall through */
786 case VAR_DECL:
787 case PARM_DECL:
788 /* ??? What about FIELD_DECLs? */
789 /* The type of a decl can't use template parms if the name of the
790 variable doesn't, because it's impossible to resolve them. So
791 ignore the type field for now. */
792 if (DECL_CONTEXT (t) && uses_template_parms (DECL_CONTEXT (t)))
793 return 1;
794 if (uses_template_parms (TREE_TYPE (t)))
795 {
796 error ("template parms used where they can't be resolved");
797 }
798 return 0;
799
800 case CALL_EXPR:
801 return uses_template_parms (TREE_TYPE (t));
802 case ADDR_EXPR:
803 return uses_template_parms (TREE_OPERAND (t, 0));
804
805 /* template parm nodes */
806 case TEMPLATE_TYPE_PARM:
807 case TEMPLATE_CONST_PARM:
808 return 1;
809
810 /* simple type nodes */
811 case INTEGER_TYPE:
812 if (uses_template_parms (TYPE_MIN_VALUE (t)))
813 return 1;
814 return uses_template_parms (TYPE_MAX_VALUE (t));
815
816 case REAL_TYPE:
817 case VOID_TYPE:
818 case ENUMERAL_TYPE:
819 case BOOLEAN_TYPE:
820 return 0;
821
822 /* constants */
823 case INTEGER_CST:
824 case REAL_CST:
825 case STRING_CST:
826 return 0;
827
828 case ERROR_MARK:
829 /* Non-error_mark_node ERROR_MARKs are bad things. */
830 my_friendly_assert (t == error_mark_node, 274);
831 /* NOTREACHED */
832 return 0;
833
834 case UNINSTANTIATED_P_TYPE:
835 return 1;
836
837 case CONSTRUCTOR:
838 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
839 return uses_template_parms (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
840 /* else fall through */
841
842 default:
843 switch (TREE_CODE_CLASS (TREE_CODE (t)))
844 {
845 case '1':
846 case '2':
847 case '3':
848 case '<':
849 {
850 int i;
851 for (i = tree_code_length[(int) TREE_CODE (t)]; --i >= 0;)
852 if (uses_template_parms (TREE_OPERAND (t, i)))
853 return 1;
854 return 0;
855 }
856 default:
857 break;
858 }
859 sorry ("testing %s for template parms",
860 tree_code_name [(int) TREE_CODE (t)]);
861 my_friendly_abort (82);
862 /* NOTREACHED */
863 return 0;
864 }
865 }
866
867 void
868 instantiate_member_templates (classname)
869 tree classname;
870 {
871 tree t;
872 tree id = classname;
873 tree members = DECL_TEMPLATE_MEMBERS (TREE_PURPOSE (IDENTIFIER_TEMPLATE (id)));
874
875 for (t = members; t; t = TREE_CHAIN (t))
876 {
877 tree parmvec, type, classparms, tdecl, t2;
878 int nparms, xxx = 0, i;
879
880 my_friendly_assert (TREE_VALUE (t) != NULL_TREE, 275);
881 my_friendly_assert (TREE_CODE (TREE_VALUE (t)) == TEMPLATE_DECL, 276);
882 /* @@ Should verify that class parm list is a list of
883 distinct template parameters, and covers all the template
884 parameters. */
885 tdecl = TREE_VALUE (t);
886 type = DECL_CONTEXT (DECL_TEMPLATE_RESULT (tdecl));
887 classparms = UPT_PARMS (type);
888 nparms = TREE_VEC_LENGTH (classparms);
889 parmvec = make_tree_vec (nparms);
890 for (i = 0; i < nparms; i++)
891 TREE_VEC_ELT (parmvec, i) = NULL_TREE;
892 switch (unify (DECL_TEMPLATE_PARMS (tdecl),
893 &TREE_VEC_ELT (parmvec, 0), nparms,
894 type, IDENTIFIER_TYPE_VALUE (classname),
895 &xxx))
896 {
897 case 0:
898 /* Success -- well, no inconsistency, at least. */
899 for (i = 0; i < nparms; i++)
900 if (TREE_VEC_ELT (parmvec, i) == NULL_TREE)
901 goto failure;
902 t2 = instantiate_template (tdecl,
903 &TREE_VEC_ELT (parmvec, 0));
904 type = IDENTIFIER_TYPE_VALUE (id);
905 my_friendly_assert (type != 0, 277);
906 break;
907 case 1:
908 /* Failure. */
909 failure:
910 cp_error_at ("type unification error instantiating `%D'", tdecl);
911 cp_error ("while instantiating members of `%T'", classname);
912
913 continue /* loop of members */;
914 default:
915 /* Eek, a bug. */
916 my_friendly_abort (83);
917 }
918 }
919 }
920
921 struct tinst_level *current_tinst_level = 0;
922 struct tinst_level *free_tinst_level = 0;
923
924 void
925 push_tinst_level (name)
926 tree name;
927 {
928 struct tinst_level *new;
929 tree global = IDENTIFIER_GLOBAL_VALUE (name);
930
931 if (free_tinst_level)
932 {
933 new = free_tinst_level;
934 free_tinst_level = new->next;
935 }
936 else
937 new = (struct tinst_level *) xmalloc (sizeof (struct tinst_level));
938
939 new->classname = name;
940 if (global)
941 {
942 new->line = DECL_SOURCE_LINE (global);
943 new->file = DECL_SOURCE_FILE (global);
944 }
945 else
946 {
947 new->line = lineno;
948 new->file = input_filename;
949 }
950 new->next = current_tinst_level;
951 current_tinst_level = new;
952 }
953
954 void
955 pop_tinst_level ()
956 {
957 struct tinst_level *old = current_tinst_level;
958
959 current_tinst_level = old->next;
960 old->next = free_tinst_level;
961 free_tinst_level = old;
962 }
963
964 struct tinst_level *
965 tinst_for_decl ()
966 {
967 struct tinst_level *p = current_tinst_level;
968
969 if (p)
970 for (; p->next ; p = p->next )
971 ;
972 return p;
973 }
974
975 tree
976 instantiate_class_template (classname, setup_parse)
977 tree classname;
978 int setup_parse;
979 {
980 struct template_info *template_info;
981 tree template, t1;
982
983 if (classname == error_mark_node)
984 return error_mark_node;
985
986 my_friendly_assert (TREE_CODE (classname) == IDENTIFIER_NODE, 278);
987 template = IDENTIFIER_TEMPLATE (classname);
988
989 if (IDENTIFIER_HAS_TYPE_VALUE (classname))
990 {
991 tree type = IDENTIFIER_TYPE_VALUE (classname);
992 if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
993 return type;
994 if (TYPE_BEING_DEFINED (type)
995 || TYPE_SIZE (type)
996 || CLASSTYPE_USE_TEMPLATE (type) != 0)
997 return type;
998 }
999
1000 /* If IDENTIFIER_LOCAL_VALUE is already set on this template classname
1001 (it's something like `foo<int>'), that means we're already working on
1002 the instantiation for it. Normally, a classname comes in with nothing
1003 but its IDENTIFIER_TEMPLATE slot set. If we were to try to instantiate
1004 this again, we'd get a redeclaration error. Since we're already working
1005 on it, we'll pass back this classname's TYPE_DECL (it's the value of
1006 the classname's IDENTIFIER_LOCAL_VALUE). Only do this if we're setting
1007 things up for the parser, though---if we're just trying to instantiate
1008 it (e.g., via tsubst) we can trip up cuz it may not have an
1009 IDENTIFIER_TYPE_VALUE when it will need one. */
1010 if (setup_parse && IDENTIFIER_LOCAL_VALUE (classname))
1011 return IDENTIFIER_LOCAL_VALUE (classname);
1012
1013 if (uses_template_parms (classname))
1014 {
1015 if (!TREE_TYPE (classname))
1016 {
1017 tree t = make_lang_type (RECORD_TYPE);
1018 tree d = build_decl (TYPE_DECL, classname, t);
1019 DECL_NAME (d) = classname;
1020 TYPE_NAME (t) = d;
1021 pushdecl (d);
1022 }
1023 return NULL_TREE;
1024 }
1025
1026 t1 = TREE_PURPOSE (template);
1027 my_friendly_assert (TREE_CODE (t1) == TEMPLATE_DECL, 279);
1028
1029 /* If a template is declared but not defined, accept it; don't crash.
1030 Later uses requiring the definition will be flagged as errors by
1031 other code. Thanks to niklas@appli.se for this bug fix. */
1032 if (DECL_TEMPLATE_INFO (t1)->text == 0)
1033 setup_parse = 0;
1034
1035 push_to_top_level ();
1036 template_info = DECL_TEMPLATE_INFO (t1);
1037 if (setup_parse)
1038 {
1039 push_tinst_level (classname);
1040 push_template_decls (DECL_TEMPLATE_PARMS (TREE_PURPOSE (template)),
1041 TREE_VALUE (template), 0);
1042 set_current_level_tags_transparency (1);
1043 feed_input (template_info->text, template_info->length, (struct obstack *)0);
1044 lineno = template_info->lineno;
1045 input_filename = template_info->filename;
1046 /* Get interface/implementation back in sync. */
1047 extract_interface_info ();
1048 overload_template_name (classname, 0);
1049 /* Kludge so that we don't get screwed by our own base classes. */
1050 TYPE_BEING_DEFINED (TREE_TYPE (classname)) = 1;
1051 yychar = PRE_PARSED_CLASS_DECL;
1052 yylval.ttype = classname;
1053 processing_template_defn++;
1054 if (!flag_external_templates)
1055 interface_unknown++;
1056 }
1057 else
1058 {
1059 tree t, decl, id, tmpl;
1060
1061 id = classname;
1062 tmpl = TREE_PURPOSE (IDENTIFIER_TEMPLATE (id));
1063 t = xref_tag (DECL_TEMPLATE_INFO (tmpl)->aggr, id, NULL_TREE, 0);
1064 my_friendly_assert (TREE_CODE (t) == RECORD_TYPE
1065 || TREE_CODE (t) == UNION_TYPE, 280);
1066
1067 /* Now, put a copy of the decl in global scope, to avoid
1068 * recursive expansion. */
1069 decl = IDENTIFIER_LOCAL_VALUE (id);
1070 if (!decl)
1071 decl = IDENTIFIER_CLASS_VALUE (id);
1072 if (decl)
1073 {
1074 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 281);
1075 /* We'd better make sure we're on the permanent obstack or else
1076 * we'll get a "friendly" abort 124 in pushdecl. Perhaps a
1077 * copy_to_permanent would be sufficient here, but then a
1078 * sharing problem might occur. I don't know -- niklas@appli.se */
1079 push_obstacks (&permanent_obstack, &permanent_obstack);
1080 pushdecl_top_level (copy_node (decl));
1081 pop_obstacks ();
1082 }
1083 pop_from_top_level ();
1084 }
1085
1086 return NULL_TREE;
1087 }
1088
1089 static int
1090 list_eq (t1, t2)
1091 tree t1, t2;
1092 {
1093 if (t1 == NULL_TREE)
1094 return t2 == NULL_TREE;
1095 if (t2 == NULL_TREE)
1096 return 0;
1097 /* Don't care if one declares its arg const and the other doesn't -- the
1098 main variant of the arg type is all that matters. */
1099 if (TYPE_MAIN_VARIANT (TREE_VALUE (t1))
1100 != TYPE_MAIN_VARIANT (TREE_VALUE (t2)))
1101 return 0;
1102 return list_eq (TREE_CHAIN (t1), TREE_CHAIN (t2));
1103 }
1104
1105 static tree
1106 lookup_nested_type_by_name (ctype, name)
1107 tree ctype, name;
1108 {
1109 tree t;
1110
1111 for (t = CLASSTYPE_TAGS (ctype); t; t = TREE_CHAIN (t))
1112 {
1113 if (name == TREE_PURPOSE (t))
1114 return TREE_VALUE (t);
1115 }
1116 return NULL_TREE;
1117 }
1118
1119 static tree
1120 search_nested_type_in_tmpl (tmpl, type)
1121 tree tmpl, type;
1122 {
1123 tree t;
1124
1125 if (tmpl == NULL || TYPE_CONTEXT(type) == NULL)
1126 return tmpl;
1127 t = search_nested_type_in_tmpl (tmpl, TYPE_CONTEXT(type));
1128 if (t == NULL) return t;
1129 t = lookup_nested_type_by_name(t, DECL_NAME(TYPE_NAME(type)));
1130 return t;
1131 }
1132
1133 static tree
1134 tsubst (t, args, nargs, in_decl)
1135 tree t, *args;
1136 int nargs;
1137 tree in_decl;
1138 {
1139 tree type;
1140
1141 if (t == NULL_TREE || t == error_mark_node)
1142 return t;
1143
1144 type = TREE_TYPE (t);
1145 if (type
1146 /* Minor optimization.
1147 ?? Are these really the most frequent cases? Is the savings
1148 significant? */
1149 && type != integer_type_node
1150 && type != void_type_node
1151 && type != char_type_node)
1152 type = cp_build_type_variant (tsubst (type, args, nargs, in_decl),
1153 TYPE_READONLY (type),
1154 TYPE_VOLATILE (type));
1155 switch (TREE_CODE (t))
1156 {
1157 case RECORD_TYPE:
1158 if (TYPE_PTRMEMFUNC_P (t))
1159 return build_ptrmemfunc_type
1160 (tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, nargs, in_decl));
1161
1162 /* else fall through */
1163
1164 case ERROR_MARK:
1165 case IDENTIFIER_NODE:
1166 case OP_IDENTIFIER:
1167 case VOID_TYPE:
1168 case REAL_TYPE:
1169 case ENUMERAL_TYPE:
1170 case BOOLEAN_TYPE:
1171 case INTEGER_CST:
1172 case REAL_CST:
1173 case STRING_CST:
1174 case UNION_TYPE:
1175 return t;
1176
1177 case INTEGER_TYPE:
1178 if (t == integer_type_node)
1179 return t;
1180
1181 if (TREE_CODE (TYPE_MIN_VALUE (t)) == INTEGER_CST
1182 && TREE_CODE (TYPE_MAX_VALUE (t)) == INTEGER_CST)
1183 return t;
1184 return build_index_2_type
1185 (tsubst (TYPE_MIN_VALUE (t), args, nargs, in_decl),
1186 tsubst (TYPE_MAX_VALUE (t), args, nargs, in_decl));
1187
1188 case TEMPLATE_TYPE_PARM:
1189 {
1190 tree arg = args[TEMPLATE_TYPE_IDX (t)];
1191 return cp_build_type_variant
1192 (arg, TYPE_READONLY (arg) || TYPE_READONLY (t),
1193 TYPE_VOLATILE (arg) || TYPE_VOLATILE (t));
1194 }
1195
1196 case TEMPLATE_CONST_PARM:
1197 return args[TEMPLATE_CONST_IDX (t)];
1198
1199 case FUNCTION_DECL:
1200 {
1201 tree r;
1202 tree fnargs, result;
1203
1204 if (type == TREE_TYPE (t)
1205 && (DECL_CONTEXT (t) == NULL_TREE
1206 || TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) != 't'))
1207 return t;
1208 fnargs = tsubst (DECL_ARGUMENTS (t), args, nargs, t);
1209 result = tsubst (DECL_RESULT (t), args, nargs, t);
1210 if (DECL_CONTEXT (t) != NULL_TREE
1211 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) == 't')
1212 {
1213 /* Look it up in that class, and return the decl node there,
1214 instead of creating a new one. */
1215 tree ctx, methods, name, method;
1216 int n_methods;
1217 int i, found = 0;
1218
1219 name = DECL_NAME (t);
1220 ctx = tsubst (DECL_CONTEXT (t), args, nargs, t);
1221 methods = CLASSTYPE_METHOD_VEC (ctx);
1222 if (methods == NULL_TREE)
1223 /* No methods at all -- no way this one can match. */
1224 goto no_match;
1225 n_methods = TREE_VEC_LENGTH (methods);
1226
1227 r = NULL_TREE;
1228
1229 if (!strncmp (OPERATOR_TYPENAME_FORMAT,
1230 IDENTIFIER_POINTER (name),
1231 sizeof (OPERATOR_TYPENAME_FORMAT) - 1))
1232 {
1233 /* Type-conversion operator. Reconstruct the name, in
1234 case it's the name of one of the template's parameters. */
1235 name = build_typename_overload (TREE_TYPE (type));
1236 }
1237
1238 if (DECL_CONTEXT (t) != NULL_TREE
1239 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) == 't'
1240 && constructor_name (DECL_CONTEXT (t)) == DECL_NAME (t))
1241 name = constructor_name (ctx);
1242 #if 0
1243 fprintf (stderr, "\nfor function %s in class %s:\n",
1244 IDENTIFIER_POINTER (name),
1245 IDENTIFIER_POINTER (TYPE_IDENTIFIER (ctx)));
1246 #endif
1247 for (i = 0; i < n_methods; i++)
1248 {
1249 int pass;
1250
1251 method = TREE_VEC_ELT (methods, i);
1252 if (method == NULL_TREE || DECL_NAME (method) != name)
1253 continue;
1254
1255 pass = 0;
1256 maybe_error:
1257 for (; method; method = DECL_CHAIN (method))
1258 {
1259 my_friendly_assert (TREE_CODE (method) == FUNCTION_DECL,
1260 282);
1261 if (! comptypes (type, TREE_TYPE (method), 1))
1262 {
1263 tree mtype = TREE_TYPE (method);
1264 tree t1, t2;
1265
1266 /* Keep looking for a method that matches
1267 perfectly. This takes care of the problem
1268 where destructors (which have implicit int args)
1269 look like constructors which have an int arg. */
1270 if (pass == 0)
1271 continue;
1272
1273 t1 = TYPE_ARG_TYPES (mtype);
1274 t2 = TYPE_ARG_TYPES (type);
1275 if (TREE_CODE (mtype) == FUNCTION_TYPE)
1276 t2 = TREE_CHAIN (t2);
1277
1278 if (list_eq (t1, t2))
1279 {
1280 if (TREE_CODE (mtype) == FUNCTION_TYPE)
1281 {
1282 tree newtype;
1283 newtype = build_function_type (TREE_TYPE (type),
1284 TYPE_ARG_TYPES (type));
1285 newtype = build_type_variant (newtype,
1286 TYPE_READONLY (type),
1287 TYPE_VOLATILE (type));
1288 type = newtype;
1289 if (TREE_TYPE (type) != TREE_TYPE (mtype))
1290 goto maybe_bad_return_type;
1291 }
1292 else if (TYPE_METHOD_BASETYPE (mtype)
1293 == TYPE_METHOD_BASETYPE (type))
1294 {
1295 /* Types didn't match, but arg types and
1296 `this' do match, so the return type is
1297 all that should be messing it up. */
1298 maybe_bad_return_type:
1299 if (TREE_TYPE (type) != TREE_TYPE (mtype))
1300 error ("inconsistent return types for method `%s' in class `%s'",
1301 IDENTIFIER_POINTER (name),
1302 IDENTIFIER_POINTER (TYPE_IDENTIFIER (ctx)));
1303 }
1304 r = method;
1305 break;
1306 }
1307 found = 1;
1308 continue;
1309 }
1310 #if 0
1311 fprintf (stderr, "\tfound %s\n\n",
1312 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method)));
1313 #endif
1314 if (DECL_ARTIFICIAL (method))
1315 {
1316 cp_error ("template for method `%D' which has default implementation in class `%T'", name, ctx);
1317 if (in_decl)
1318 cp_error_at ("in attempt to instantiate `%D' declared at this point in file", in_decl);
1319 return error_mark_node;
1320 }
1321
1322 if (DECL_ARGUMENTS (method)
1323 && ! TREE_PERMANENT (DECL_ARGUMENTS (method)))
1324 /* @@ Is this early enough? Might we want to do
1325 this instead while processing the expansion? */
1326 DECL_ARGUMENTS (method)
1327 = tsubst (DECL_ARGUMENTS (t), args, nargs, t);
1328 r = method;
1329 break;
1330 }
1331 if (r == NULL_TREE && pass == 0)
1332 {
1333 pass = 1;
1334 method = TREE_VEC_ELT (methods, i);
1335 goto maybe_error;
1336 }
1337 }
1338 if (r == NULL_TREE)
1339 {
1340 no_match:
1341 cp_error
1342 (found
1343 ? "template for method `%D' doesn't match any in class `%T'"
1344 : "method `%D' not found in class `%T'", name, ctx);
1345 if (in_decl)
1346 cp_error_at ("in attempt to instantiate `%D' declared at this point in file", in_decl);
1347 return error_mark_node;
1348 }
1349 }
1350 else
1351 {
1352 r = DECL_NAME (t);
1353 {
1354 tree decls;
1355 int got_it = 0;
1356
1357 decls = lookup_name_nonclass (r);
1358 if (decls == NULL_TREE)
1359 /* no match */;
1360 else if (TREE_CODE (decls) == TREE_LIST)
1361 for (decls = TREE_VALUE (decls); decls ;
1362 decls = DECL_CHAIN (decls))
1363 {
1364 if (TREE_CODE (decls) == FUNCTION_DECL
1365 && TREE_TYPE (decls) == type)
1366 {
1367 got_it = 1;
1368 r = decls;
1369 break;
1370 }
1371 }
1372 else
1373 {
1374 tree val = decls;
1375 decls = NULL_TREE;
1376 if (TREE_CODE (val) == FUNCTION_DECL
1377 && TREE_TYPE (val) == type)
1378 {
1379 got_it = 1;
1380 r = val;
1381 }
1382 }
1383
1384 if (!got_it)
1385 {
1386 tree a = build_decl_overload (r, TYPE_VALUES (type),
1387 DECL_CONTEXT (t) != NULL_TREE);
1388 r = build_lang_decl (FUNCTION_DECL, r, type);
1389 DECL_ASSEMBLER_NAME (r) = a;
1390 }
1391 else if (DECL_INLINE (r) && DECL_SAVED_INSNS (r))
1392 {
1393 /* This overrides the template version, use it. */
1394 return r;
1395 }
1396 }
1397 }
1398 TREE_PUBLIC (r) = 1;
1399 DECL_EXTERNAL (r) = 1;
1400 TREE_STATIC (r) = 0;
1401 DECL_INTERFACE_KNOWN (r) = 0;
1402 DECL_INLINE (r) = DECL_INLINE (t);
1403 {
1404 #if 0 /* Maybe later. -jason */
1405 struct tinst_level *til = tinst_for_decl();
1406
1407 /* should always be true under new approach */
1408 if (til)
1409 {
1410 DECL_SOURCE_FILE (r) = til->file;
1411 DECL_SOURCE_LINE (r) = til->line;
1412 }
1413 else
1414 #endif
1415 {
1416 DECL_SOURCE_FILE (r) = DECL_SOURCE_FILE (t);
1417 DECL_SOURCE_LINE (r) = DECL_SOURCE_LINE (t);
1418 }
1419 }
1420 DECL_CLASS_CONTEXT (r) = tsubst (DECL_CLASS_CONTEXT (t), args, nargs, t);
1421 make_decl_rtl (r, NULL_PTR, 1);
1422 DECL_ARGUMENTS (r) = fnargs;
1423 DECL_RESULT (r) = result;
1424 #if 0
1425 if (DECL_CONTEXT (t) == NULL_TREE
1426 || TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) != 't')
1427 push_overloaded_decl_top_level (r, 0);
1428 #endif
1429 return r;
1430 }
1431
1432 case PARM_DECL:
1433 {
1434 tree r;
1435 r = build_decl (PARM_DECL, DECL_NAME (t), type);
1436 DECL_INITIAL (r) = TREE_TYPE (r);
1437 if (TREE_CHAIN (t))
1438 TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, nargs, TREE_CHAIN (t));
1439 return r;
1440 }
1441
1442 case TREE_LIST:
1443 {
1444 tree purpose, value, chain, result;
1445 int via_public, via_virtual, via_protected;
1446
1447 if (t == void_list_node)
1448 return t;
1449
1450 via_public = TREE_VIA_PUBLIC (t);
1451 via_protected = TREE_VIA_PROTECTED (t);
1452 via_virtual = TREE_VIA_VIRTUAL (t);
1453
1454 purpose = TREE_PURPOSE (t);
1455 if (purpose)
1456 purpose = tsubst (purpose, args, nargs, in_decl);
1457 value = TREE_VALUE (t);
1458 if (value)
1459 value = tsubst (value, args, nargs, in_decl);
1460 chain = TREE_CHAIN (t);
1461 if (chain && chain != void_type_node)
1462 chain = tsubst (chain, args, nargs, in_decl);
1463 if (purpose == TREE_PURPOSE (t)
1464 && value == TREE_VALUE (t)
1465 && chain == TREE_CHAIN (t))
1466 return t;
1467 result = hash_tree_cons (via_public, via_virtual, via_protected,
1468 purpose, value, chain);
1469 TREE_PARMLIST (result) = TREE_PARMLIST (t);
1470 return result;
1471 }
1472 case TREE_VEC:
1473 {
1474 int len = TREE_VEC_LENGTH (t), need_new = 0, i;
1475 tree *elts = (tree *) alloca (len * sizeof (tree));
1476 bzero ((char *) elts, len * sizeof (tree));
1477
1478 for (i = 0; i < len; i++)
1479 {
1480 elts[i] = tsubst (TREE_VEC_ELT (t, i), args, nargs, in_decl);
1481 if (elts[i] != TREE_VEC_ELT (t, i))
1482 need_new = 1;
1483 }
1484
1485 if (!need_new)
1486 return t;
1487
1488 t = make_tree_vec (len);
1489 for (i = 0; i < len; i++)
1490 TREE_VEC_ELT (t, i) = elts[i];
1491 return t;
1492 }
1493 case POINTER_TYPE:
1494 case REFERENCE_TYPE:
1495 {
1496 tree r;
1497 enum tree_code code;
1498 if (type == TREE_TYPE (t))
1499 return t;
1500
1501 code = TREE_CODE (t);
1502 if (code == POINTER_TYPE)
1503 r = build_pointer_type (type);
1504 else
1505 r = build_reference_type (type);
1506 r = cp_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t));
1507 /* Will this ever be needed for TYPE_..._TO values? */
1508 layout_type (r);
1509 return r;
1510 }
1511 case OFFSET_TYPE:
1512 return build_offset_type
1513 (tsubst (TYPE_OFFSET_BASETYPE (t), args, nargs, in_decl), type);
1514 case FUNCTION_TYPE:
1515 case METHOD_TYPE:
1516 {
1517 tree values = TYPE_VALUES (t); /* same as TYPE_ARG_TYPES */
1518 tree context = TYPE_CONTEXT (t);
1519 tree new_value;
1520
1521 /* Don't bother recursing if we know it won't change anything. */
1522 if (values != void_list_node)
1523 values = tsubst (values, args, nargs, in_decl);
1524 if (context)
1525 context = tsubst (context, args, nargs, in_decl);
1526 /* Could also optimize cases where return value and
1527 values have common elements (e.g., T min(const &T, const T&). */
1528
1529 /* If the above parameters haven't changed, just return the type. */
1530 if (type == TREE_TYPE (t)
1531 && values == TYPE_VALUES (t)
1532 && context == TYPE_CONTEXT (t))
1533 return t;
1534
1535 /* Construct a new type node and return it. */
1536 if (TREE_CODE (t) == FUNCTION_TYPE
1537 && context == NULL_TREE)
1538 {
1539 new_value = build_function_type (type, values);
1540 }
1541 else if (context == NULL_TREE)
1542 {
1543 tree base = tsubst (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))),
1544 args, nargs, in_decl);
1545 new_value = build_cplus_method_type (base, type,
1546 TREE_CHAIN (values));
1547 }
1548 else
1549 {
1550 new_value = make_node (TREE_CODE (t));
1551 TREE_TYPE (new_value) = type;
1552 TYPE_CONTEXT (new_value) = context;
1553 TYPE_VALUES (new_value) = values;
1554 TYPE_SIZE (new_value) = TYPE_SIZE (t);
1555 TYPE_ALIGN (new_value) = TYPE_ALIGN (t);
1556 TYPE_MODE (new_value) = TYPE_MODE (t);
1557 if (TYPE_METHOD_BASETYPE (t))
1558 TYPE_METHOD_BASETYPE (new_value) = tsubst (TYPE_METHOD_BASETYPE (t),
1559 args, nargs, in_decl);
1560 /* Need to generate hash value. */
1561 my_friendly_abort (84);
1562 }
1563 new_value = build_type_variant (new_value,
1564 TYPE_READONLY (t),
1565 TYPE_VOLATILE (t));
1566 return new_value;
1567 }
1568 case ARRAY_TYPE:
1569 {
1570 tree domain = tsubst (TYPE_DOMAIN (t), args, nargs, in_decl);
1571 tree r;
1572 if (type == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
1573 return t;
1574 r = build_cplus_array_type (type, domain);
1575 return r;
1576 }
1577
1578 case UNINSTANTIATED_P_TYPE:
1579 {
1580 int nparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (UPT_TEMPLATE (t)));
1581 tree argvec = make_tree_vec (nparms);
1582 tree parmvec = UPT_PARMS (t);
1583 int i;
1584 tree id, rt;
1585 for (i = 0; i < nparms; i++)
1586 TREE_VEC_ELT (argvec, i) = tsubst (TREE_VEC_ELT (parmvec, i),
1587 args, nargs, in_decl);
1588 id = lookup_template_class (DECL_NAME (UPT_TEMPLATE (t)), argvec, NULL_TREE);
1589 if (! IDENTIFIER_HAS_TYPE_VALUE (id)) {
1590 instantiate_class_template(id, 0);
1591 /* set up pending_classes */
1592 add_pending_template (id);
1593
1594 TYPE_MAIN_VARIANT (IDENTIFIER_TYPE_VALUE (id)) =
1595 IDENTIFIER_TYPE_VALUE (id);
1596 }
1597 rt = IDENTIFIER_TYPE_VALUE (id);
1598
1599 /* kung: this part handles nested type in template definition */
1600
1601 if ( !ANON_AGGRNAME_P (DECL_NAME(TYPE_NAME(t))))
1602 {
1603 rt = search_nested_type_in_tmpl (rt, t);
1604 }
1605
1606 return build_type_variant (rt, TYPE_READONLY (t), TYPE_VOLATILE (t));
1607 }
1608
1609 case MINUS_EXPR:
1610 case PLUS_EXPR:
1611 return fold (build (TREE_CODE (t), TREE_TYPE (t),
1612 tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
1613 tsubst (TREE_OPERAND (t, 1), args, nargs, in_decl)));
1614
1615 case NEGATE_EXPR:
1616 case NOP_EXPR:
1617 return fold (build1 (TREE_CODE (t), TREE_TYPE (t),
1618 tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl)));
1619
1620 default:
1621 sorry ("use of `%s' in function template",
1622 tree_code_name [(int) TREE_CODE (t)]);
1623 return error_mark_node;
1624 }
1625 }
1626
1627 tree
1628 instantiate_template (tmpl, targ_ptr)
1629 tree tmpl, *targ_ptr;
1630 {
1631 tree targs, fndecl;
1632 int i, len;
1633 struct pending_inline *p;
1634 struct template_info *t;
1635 struct obstack *old_fmp_obstack;
1636 extern struct obstack *function_maybepermanent_obstack;
1637
1638 push_obstacks (&permanent_obstack, &permanent_obstack);
1639 old_fmp_obstack = function_maybepermanent_obstack;
1640 function_maybepermanent_obstack = &permanent_obstack;
1641
1642 my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 283);
1643 len = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (tmpl));
1644
1645 for (fndecl = DECL_TEMPLATE_INSTANTIATIONS (tmpl);
1646 fndecl; fndecl = TREE_CHAIN (fndecl))
1647 {
1648 tree *t1 = &TREE_VEC_ELT (TREE_PURPOSE (fndecl), 0);
1649 for (i = len - 1; i >= 0; i--)
1650 if (t1[i] != targ_ptr[i])
1651 goto no_match;
1652
1653 /* Here, we have a match. */
1654 fndecl = TREE_VALUE (fndecl);
1655 goto exit;
1656
1657 no_match:
1658 ;
1659 }
1660
1661 targs = make_tree_vec (len);
1662 i = len;
1663 while (i--)
1664 TREE_VEC_ELT (targs, i) = targ_ptr[i];
1665
1666 /* substitute template parameters */
1667 fndecl = tsubst (DECL_RESULT (tmpl), targ_ptr,
1668 TREE_VEC_LENGTH (targs), tmpl);
1669
1670 if (fndecl == error_mark_node)
1671 goto exit;
1672
1673 /* If it's a static member fn in the template, we need to change it
1674 into a FUNCTION_TYPE and chop off its this pointer. */
1675 if (TREE_CODE (TREE_TYPE (DECL_RESULT (tmpl))) == METHOD_TYPE
1676 && DECL_STATIC_FUNCTION_P (fndecl))
1677 {
1678 tree olddecl = DECL_RESULT (tmpl);
1679 revert_static_member_fn (&DECL_RESULT (tmpl), NULL, NULL);
1680 /* Chop off the this pointer that grokclassfn so kindly added
1681 for us (it didn't know yet if the fn was static or not). */
1682 DECL_ARGUMENTS (olddecl) = TREE_CHAIN (DECL_ARGUMENTS (olddecl));
1683 DECL_ARGUMENTS (fndecl) = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
1684 }
1685
1686 t = DECL_TEMPLATE_INFO (tmpl);
1687
1688 /* If we have a preexisting version of this function, don't expand
1689 the template version, use the other instead. */
1690 if (DECL_INLINE (fndecl) && DECL_SAVED_INSNS (fndecl))
1691 {
1692 SET_DECL_TEMPLATE_SPECIALIZATION (fndecl);
1693 p = (struct pending_inline *)0;
1694 }
1695 else if (t->text)
1696 {
1697 SET_DECL_IMPLICIT_INSTANTIATION (fndecl);
1698 p = (struct pending_inline *) permalloc (sizeof (struct pending_inline));
1699 p->parm_vec = t->parm_vec;
1700 p->bindings = targs;
1701 p->can_free = 0;
1702 p->deja_vu = 0;
1703 p->buf = t->text;
1704 p->len = t->length;
1705 p->fndecl = fndecl;
1706 {
1707 int l = lineno;
1708 char * f = input_filename;
1709
1710 lineno = p->lineno = t->lineno;
1711 input_filename = p->filename = t->filename;
1712
1713 extract_interface_info ();
1714
1715 if (interface_unknown && flag_external_templates)
1716 {
1717 if (DECL_CLASS_CONTEXT (fndecl)
1718 && CLASSTYPE_INTERFACE_KNOWN (DECL_CLASS_CONTEXT (fndecl)))
1719 {
1720 interface_unknown = 0;
1721 interface_only
1722 = CLASSTYPE_INTERFACE_ONLY (DECL_CLASS_CONTEXT (fndecl));
1723 }
1724 else if (! DECL_IN_SYSTEM_HEADER (tmpl))
1725 warn_if_unknown_interface ();
1726 }
1727
1728 if (interface_unknown || ! flag_external_templates)
1729 p->interface = 1; /* unknown */
1730 else
1731 p->interface = interface_only ? 0 : 2;
1732
1733 lineno = l;
1734 input_filename = f;
1735
1736 extract_interface_info ();
1737 }
1738 }
1739 else
1740 p = (struct pending_inline *)0;
1741
1742 DECL_TEMPLATE_INSTANTIATIONS (tmpl) =
1743 tree_cons (targs, fndecl, DECL_TEMPLATE_INSTANTIATIONS (tmpl));
1744
1745 if (p == (struct pending_inline *)0)
1746 {
1747 /* do nothing */
1748 }
1749 else if (DECL_INLINE (fndecl))
1750 {
1751 DECL_PENDING_INLINE_INFO (fndecl) = p;
1752 p->next = pending_inlines;
1753 pending_inlines = p;
1754 }
1755 else
1756 {
1757 p->next = pending_template_expansions;
1758 pending_template_expansions = p;
1759 }
1760 exit:
1761 function_maybepermanent_obstack = old_fmp_obstack;
1762 pop_obstacks ();
1763
1764 return fndecl;
1765 }
1766
1767 /* classlevel should now never be true. jason 4/12/94 */
1768 void
1769 undo_template_name_overload (id, classlevel)
1770 tree id;
1771 int classlevel;
1772 {
1773 tree template;
1774
1775 template = IDENTIFIER_TEMPLATE (id);
1776 if (!template)
1777 return;
1778
1779 #if 0 /* not yet, should get fixed properly later */
1780 poplevel (0, 0, 0);
1781 #endif
1782 #if 1 /* XXX */
1783 /* This was a botch... See `overload_template_name' just below. */
1784 if (!classlevel)
1785 poplevel (0, 0, 0);
1786 #endif
1787 }
1788
1789 /* classlevel should now never be true. jason 4/12/94 */
1790 void
1791 overload_template_name (id, classlevel)
1792 tree id;
1793 int classlevel;
1794 {
1795 tree template, t, decl;
1796 struct template_info *tinfo;
1797
1798 my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 284);
1799 template = IDENTIFIER_TEMPLATE (id);
1800 if (!template)
1801 return;
1802
1803 template = TREE_PURPOSE (template);
1804 tinfo = DECL_TEMPLATE_INFO (template);
1805 template = DECL_NAME (template);
1806 my_friendly_assert (template != NULL_TREE, 285);
1807
1808 #if 1 /* XXX */
1809 /* This was a botch... names of templates do not get their own private
1810 scopes. Rather, they should go into the binding level already created
1811 by push_template_decls. Except that there isn't one of those for
1812 specializations. */
1813 if (!classlevel)
1814 {
1815 pushlevel (1);
1816 declare_pseudo_global_level ();
1817 }
1818 #endif
1819
1820 t = xref_tag (tinfo->aggr, id, NULL_TREE, 0);
1821 my_friendly_assert (TREE_CODE (t) == RECORD_TYPE
1822 || TREE_CODE (t) == UNION_TYPE
1823 || TREE_CODE (t) == UNINSTANTIATED_P_TYPE, 286);
1824
1825 decl = build_decl (TYPE_DECL, template, t);
1826 SET_DECL_ARTIFICIAL (decl);
1827
1828 #if 0 /* fix this later */
1829 /* We don't want to call here if the work has already been done. */
1830 t = (classlevel
1831 ? IDENTIFIER_CLASS_VALUE (template)
1832 : IDENTIFIER_LOCAL_VALUE (template));
1833 if (t
1834 && TREE_CODE (t) == TYPE_DECL
1835 && TREE_TYPE (t) == t)
1836 my_friendly_abort (85);
1837 #endif
1838
1839 if (classlevel)
1840 pushdecl_class_level (decl);
1841 else
1842 pushdecl (decl);
1843
1844 #if 0 /* This seems bogus to me; if it isn't, explain why. (jason) */
1845 /* Fake this for now, just to make dwarfout.c happy. It will have to
1846 be done in a proper way later on. */
1847 DECL_CONTEXT (decl) = t;
1848 #endif
1849 }
1850
1851 /* NAME is the IDENTIFIER value of a PRE_PARSED_CLASS_DECL. */
1852 void
1853 end_template_instantiation (name)
1854 tree name;
1855 {
1856 extern struct pending_input *to_be_restored;
1857 tree t, decl;
1858
1859 processing_template_defn--;
1860 if (!flag_external_templates)
1861 interface_unknown--;
1862
1863 /* Restore the old parser input state. */
1864 if (yychar == YYEMPTY)
1865 yychar = yylex ();
1866 if (yychar != END_OF_SAVED_INPUT)
1867 error ("parse error at end of class template");
1868 else
1869 {
1870 restore_pending_input (to_be_restored);
1871 to_be_restored = 0;
1872 }
1873
1874 /* Our declarations didn't get stored in the global slot, since
1875 there was a (supposedly tags-transparent) scope in between. */
1876 t = IDENTIFIER_TYPE_VALUE (name);
1877 my_friendly_assert (t != NULL_TREE
1878 && TREE_CODE_CLASS (TREE_CODE (t)) == 't',
1879 287);
1880 SET_CLASSTYPE_IMPLICIT_INSTANTIATION (t);
1881 /* Make methods of template classes static, unless
1882 -fexternal-templates is given. */
1883 if (!flag_external_templates)
1884 SET_CLASSTYPE_INTERFACE_UNKNOWN (t);
1885 decl = IDENTIFIER_GLOBAL_VALUE (name);
1886 my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 288);
1887
1888 undo_template_name_overload (name, 0);
1889 t = IDENTIFIER_TEMPLATE (name);
1890 pop_template_decls (DECL_TEMPLATE_PARMS (TREE_PURPOSE (t)), TREE_VALUE (t),
1891 0);
1892 /* This will fix up the type-value field. */
1893 pushdecl (decl);
1894 pop_from_top_level ();
1895
1896 #ifdef DWARF_DEBUGGING_INFO
1897 if (write_symbols == DWARF_DEBUG && TREE_CODE (decl) == TYPE_DECL)
1898 {
1899 /* We just completed the definition of a new file-scope type,
1900 so we can go ahead and output debug-info for it now. */
1901 TYPE_STUB_DECL (TREE_TYPE (decl)) = decl;
1902 rest_of_type_compilation (TREE_TYPE (decl), 1);
1903 }
1904 #endif /* DWARF_DEBUGGING_INFO */
1905
1906 /* Restore interface/implementation settings. */
1907 extract_interface_info ();
1908 }
1909 \f
1910 /* Store away the text of an template. */
1911
1912 void
1913 reinit_parse_for_template (yychar, d1, d2)
1914 int yychar;
1915 tree d1, d2;
1916 {
1917 struct template_info *template_info;
1918 extern struct obstack inline_text_obstack; /* see comment in lex.c */
1919
1920 if (d2 == NULL_TREE || d2 == error_mark_node)
1921 {
1922 lose:
1923 /* @@ Should use temp obstack, and discard results. */
1924 reinit_parse_for_block (yychar, &inline_text_obstack, 1);
1925 return;
1926 }
1927
1928 if (TREE_CODE (d2) == IDENTIFIER_NODE)
1929 d2 = IDENTIFIER_GLOBAL_VALUE (d2);
1930 if (!d2)
1931 goto lose;
1932 template_info = DECL_TEMPLATE_INFO (d2);
1933 if (!template_info)
1934 {
1935 template_info = (struct template_info *) permalloc (sizeof (struct template_info));
1936 bzero ((char *) template_info, sizeof (struct template_info));
1937 DECL_TEMPLATE_INFO (d2) = template_info;
1938 }
1939 template_info->filename = input_filename;
1940 template_info->lineno = lineno;
1941 reinit_parse_for_block (yychar, &inline_text_obstack, 1);
1942 template_info->text = obstack_base (&inline_text_obstack);
1943 template_info->length = obstack_object_size (&inline_text_obstack);
1944 obstack_finish (&inline_text_obstack);
1945 template_info->parm_vec = d1;
1946 }
1947
1948 /* Type unification.
1949
1950 We have a function template signature with one or more references to
1951 template parameters, and a parameter list we wish to fit to this
1952 template. If possible, produce a list of parameters for the template
1953 which will cause it to fit the supplied parameter list.
1954
1955 Return zero for success, 2 for an incomplete match that doesn't resolve
1956 all the types, and 1 for complete failure. An error message will be
1957 printed only for an incomplete match.
1958
1959 TPARMS[NTPARMS] is an array of template parameter types;
1960 TARGS[NTPARMS] is the array of template parameter values. PARMS is
1961 the function template's signature (using TEMPLATE_PARM_IDX nodes),
1962 and ARGS is the argument list we're trying to match against it.
1963
1964 If SUBR is 1, we're being called recursively (to unify the arguments of
1965 a function or method parameter of a function template), so don't zero
1966 out targs and don't fail on an incomplete match. */
1967
1968 int
1969 type_unification (tparms, targs, parms, args, nsubsts, subr)
1970 tree tparms, *targs, parms, args;
1971 int *nsubsts, subr;
1972 {
1973 tree parm, arg;
1974 int i;
1975 int ntparms = TREE_VEC_LENGTH (tparms);
1976
1977 my_friendly_assert (TREE_CODE (tparms) == TREE_VEC, 289);
1978 my_friendly_assert (TREE_CODE (parms) == TREE_LIST, 290);
1979 /* ARGS could be NULL (via a call from parse.y to
1980 build_x_function_call). */
1981 if (args)
1982 my_friendly_assert (TREE_CODE (args) == TREE_LIST, 291);
1983 my_friendly_assert (ntparms > 0, 292);
1984
1985 if (!subr)
1986 bzero ((char *) targs, sizeof (tree) * ntparms);
1987
1988 while (parms
1989 && parms != void_list_node
1990 && args
1991 && args != void_list_node)
1992 {
1993 parm = TREE_VALUE (parms);
1994 parms = TREE_CHAIN (parms);
1995 arg = TREE_VALUE (args);
1996 args = TREE_CHAIN (args);
1997
1998 if (arg == error_mark_node)
1999 return 1;
2000 if (arg == unknown_type_node)
2001 return 1;
2002 #if 0
2003 if (TREE_CODE (arg) == VAR_DECL)
2004 arg = TREE_TYPE (arg);
2005 else if (TREE_CODE_CLASS (TREE_CODE (arg)) == 'e')
2006 arg = TREE_TYPE (arg);
2007 #else
2008 if (TREE_CODE_CLASS (TREE_CODE (arg)) != 't')
2009 {
2010 my_friendly_assert (TREE_TYPE (arg) != NULL_TREE, 293);
2011 arg = TREE_TYPE (arg);
2012 }
2013 #endif
2014 if (TREE_CODE (arg) == REFERENCE_TYPE)
2015 arg = TREE_TYPE (arg);
2016
2017 if (TREE_CODE (parm) != REFERENCE_TYPE)
2018 {
2019 if (TREE_CODE (arg) == FUNCTION_TYPE
2020 || TREE_CODE (arg) == METHOD_TYPE)
2021 arg = build_pointer_type (arg);
2022 else if (TREE_CODE (arg) == ARRAY_TYPE)
2023 arg = build_pointer_type (TREE_TYPE (arg));
2024 else
2025 arg = TYPE_MAIN_VARIANT (arg);
2026 }
2027
2028 switch (unify (tparms, targs, ntparms, parm, arg, nsubsts))
2029 {
2030 case 0:
2031 break;
2032 case 1:
2033 return 1;
2034 }
2035 }
2036 /* Fail if we've reached the end of the parm list, and more args
2037 are present, and the parm list isn't variadic. */
2038 if (args && args != void_list_node && parms == void_list_node)
2039 return 1;
2040 /* Fail if parms are left and they don't have default values. */
2041 if (parms
2042 && parms != void_list_node
2043 && TREE_PURPOSE (parms) == NULL_TREE)
2044 return 1;
2045 if (!subr)
2046 for (i = 0; i < ntparms; i++)
2047 if (!targs[i])
2048 {
2049 error ("incomplete type unification");
2050 return 2;
2051 }
2052 return 0;
2053 }
2054
2055 /* Tail recursion is your friend. */
2056 static int
2057 unify (tparms, targs, ntparms, parm, arg, nsubsts)
2058 tree tparms, *targs, parm, arg;
2059 int *nsubsts, ntparms;
2060 {
2061 int idx;
2062
2063 /* I don't think this will do the right thing with respect to types.
2064 But the only case I've seen it in so far has been array bounds, where
2065 signedness is the only information lost, and I think that will be
2066 okay. */
2067 while (TREE_CODE (parm) == NOP_EXPR)
2068 parm = TREE_OPERAND (parm, 0);
2069
2070 if (arg == error_mark_node)
2071 return 1;
2072 if (arg == unknown_type_node)
2073 return 1;
2074 if (arg == parm)
2075 return 0;
2076
2077 switch (TREE_CODE (parm))
2078 {
2079 case TEMPLATE_TYPE_PARM:
2080 (*nsubsts)++;
2081 if (TEMPLATE_TYPE_TPARMLIST (parm) != tparms)
2082 {
2083 error ("mixed template headers?!");
2084 my_friendly_abort (86);
2085 return 1;
2086 }
2087 idx = TEMPLATE_TYPE_IDX (parm);
2088 #if 0
2089 /* Template type parameters cannot contain cv-quals; i.e.
2090 template <class T> void f (T& a, T& b) will not generate
2091 void f (const int& a, const int& b). */
2092 if (TYPE_READONLY (arg) > TYPE_READONLY (parm)
2093 || TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm))
2094 return 1;
2095 arg = TYPE_MAIN_VARIANT (arg);
2096 #else
2097 {
2098 int constp = TYPE_READONLY (arg) > TYPE_READONLY (parm);
2099 int volatilep = TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm);
2100 arg = cp_build_type_variant (arg, constp, volatilep);
2101 }
2102 #endif
2103 /* Simple cases: Value already set, does match or doesn't. */
2104 if (targs[idx] == arg)
2105 return 0;
2106 else if (targs[idx])
2107 return 1;
2108 /* Check for mixed types and values. */
2109 if (TREE_CODE (TREE_VALUE (TREE_VEC_ELT (tparms, idx))) != TYPE_DECL)
2110 return 1;
2111 targs[idx] = arg;
2112 return 0;
2113 case TEMPLATE_CONST_PARM:
2114 (*nsubsts)++;
2115 idx = TEMPLATE_CONST_IDX (parm);
2116 if (targs[idx] == arg)
2117 return 0;
2118 else if (targs[idx])
2119 {
2120 tree t = targs[idx];
2121 if (TREE_CODE (t) == TREE_CODE (arg))
2122 switch (TREE_CODE (arg))
2123 {
2124 case INTEGER_CST:
2125 if (tree_int_cst_equal (t, arg))
2126 return 0;
2127 break;
2128 case REAL_CST:
2129 if (REAL_VALUES_EQUAL (TREE_REAL_CST (t), TREE_REAL_CST (arg)))
2130 return 0;
2131 break;
2132 /* STRING_CST values are not valid template const parms. */
2133 default:
2134 ;
2135 }
2136 my_friendly_abort (87);
2137 return 1;
2138 }
2139 /* else if (typeof arg != tparms[idx])
2140 return 1;*/
2141
2142 targs[idx] = copy_to_permanent (arg);
2143 return 0;
2144
2145 case POINTER_TYPE:
2146 if (TREE_CODE (arg) != POINTER_TYPE)
2147 return 1;
2148 return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
2149 nsubsts);
2150
2151 case REFERENCE_TYPE:
2152 return unify (tparms, targs, ntparms, TREE_TYPE (parm), arg, nsubsts);
2153
2154 case ARRAY_TYPE:
2155 if (TREE_CODE (arg) != ARRAY_TYPE)
2156 return 1;
2157 if (unify (tparms, targs, ntparms, TYPE_DOMAIN (parm), TYPE_DOMAIN (arg),
2158 nsubsts) != 0)
2159 return 1;
2160 return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
2161 nsubsts);
2162
2163 case REAL_TYPE:
2164 case INTEGER_TYPE:
2165 if (TREE_CODE (arg) != TREE_CODE (parm))
2166 return 1;
2167
2168 if (TREE_CODE (parm) == INTEGER_TYPE)
2169 {
2170 if (TYPE_MIN_VALUE (parm) && TYPE_MIN_VALUE (arg)
2171 && unify (tparms, targs, ntparms,
2172 TYPE_MIN_VALUE (parm), TYPE_MIN_VALUE (arg), nsubsts))
2173 return 1;
2174 if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg)
2175 && unify (tparms, targs, ntparms,
2176 TYPE_MAX_VALUE (parm), TYPE_MAX_VALUE (arg), nsubsts))
2177 return 1;
2178 }
2179 /* As far as unification is concerned, this wins. Later checks
2180 will invalidate it if necessary. */
2181 return 0;
2182
2183 /* Types INTEGER_CST and MINUS_EXPR can come from array bounds. */
2184 case INTEGER_CST:
2185 if (TREE_CODE (arg) != INTEGER_CST)
2186 return 1;
2187 return !tree_int_cst_equal (parm, arg);
2188
2189 case MINUS_EXPR:
2190 {
2191 tree t1, t2;
2192 t1 = TREE_OPERAND (parm, 0);
2193 t2 = TREE_OPERAND (parm, 1);
2194 if (TREE_CODE (t1) != TEMPLATE_CONST_PARM)
2195 return 1;
2196 return unify (tparms, targs, ntparms, t1,
2197 fold (build (PLUS_EXPR, integer_type_node, arg, t2)),
2198 nsubsts);
2199 }
2200
2201 case TREE_VEC:
2202 {
2203 int i;
2204 if (TREE_CODE (arg) != TREE_VEC)
2205 return 1;
2206 if (TREE_VEC_LENGTH (parm) != TREE_VEC_LENGTH (arg))
2207 return 1;
2208 for (i = TREE_VEC_LENGTH (parm) - 1; i >= 0; i--)
2209 if (unify (tparms, targs, ntparms,
2210 TREE_VEC_ELT (parm, i), TREE_VEC_ELT (arg, i),
2211 nsubsts))
2212 return 1;
2213 return 0;
2214 }
2215
2216 case UNINSTANTIATED_P_TYPE:
2217 {
2218 tree a;
2219 /* Unification of something that is not a class fails. */
2220 if (! IS_AGGR_TYPE (arg))
2221 return 1;
2222 a = IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (arg));
2223 if (a && UPT_TEMPLATE (parm) == TREE_PURPOSE (a))
2224 return unify (tparms, targs, ntparms, UPT_PARMS (parm),
2225 TREE_VALUE (a), nsubsts);
2226 /* FIXME: Should check base conversions here. */
2227 return 1;
2228 }
2229
2230 case RECORD_TYPE:
2231 if (TYPE_PTRMEMFUNC_FLAG (parm))
2232 return unify (tparms, targs, ntparms, TYPE_PTRMEMFUNC_FN_TYPE (parm),
2233 arg, nsubsts);
2234
2235 /* Allow trivial conversions. */
2236 if (TYPE_MAIN_VARIANT (parm) != TYPE_MAIN_VARIANT (arg)
2237 || TYPE_READONLY (parm) < TYPE_READONLY (arg)
2238 || TYPE_VOLATILE (parm) < TYPE_VOLATILE (arg))
2239 return 1;
2240 return 0;
2241
2242 case METHOD_TYPE:
2243 if (TREE_CODE (arg) != METHOD_TYPE)
2244 return 1;
2245 goto check_args;
2246
2247 case FUNCTION_TYPE:
2248 if (TREE_CODE (arg) != FUNCTION_TYPE)
2249 return 1;
2250 check_args:
2251 return type_unification (tparms, targs, TYPE_ARG_TYPES (parm),
2252 TYPE_ARG_TYPES (arg), nsubsts, 1);
2253
2254 case OFFSET_TYPE:
2255 if (TREE_CODE (arg) != OFFSET_TYPE)
2256 return 1;
2257 if (unify (tparms, targs, ntparms, TYPE_OFFSET_BASETYPE (parm),
2258 TYPE_OFFSET_BASETYPE (arg), nsubsts))
2259 return 1;
2260 return unify (tparms, targs, ntparms, TREE_TYPE (parm),
2261 TREE_TYPE (arg), nsubsts);
2262
2263 default:
2264 sorry ("use of `%s' in template type unification",
2265 tree_code_name [(int) TREE_CODE (parm)]);
2266 return 1;
2267 }
2268 }
2269
2270 \f
2271 #undef DEBUG
2272
2273 int
2274 do_pending_expansions ()
2275 {
2276 struct pending_inline *i, *new_list = 0;
2277
2278 if (!pending_template_expansions)
2279 return 0;
2280
2281 #ifdef DEBUG
2282 fprintf (stderr, "\n\n\t\t IN DO_PENDING_EXPANSIONS\n\n");
2283 #endif
2284
2285 i = pending_template_expansions;
2286 while (i)
2287 {
2288 tree context;
2289
2290 struct pending_inline *next = i->next;
2291 tree t = i->fndecl;
2292
2293 int decision = 0;
2294 #define DECIDE(N) do {decision=(N); goto decided;} while(0)
2295
2296 my_friendly_assert (TREE_CODE (t) == FUNCTION_DECL
2297 || TREE_CODE (t) == VAR_DECL, 294);
2298 if (TREE_ASM_WRITTEN (t))
2299 DECIDE (0);
2300
2301 if (DECL_EXPLICIT_INSTANTIATION (t))
2302 DECIDE (! DECL_EXTERNAL (t));
2303 else if (! flag_implicit_templates)
2304 DECIDE (0);
2305
2306 if (i->interface == 1)
2307 /* OK, it was an implicit instantiation. */
2308 TREE_PUBLIC (t) = 0;
2309
2310 /* If it's a method, let the class type decide it.
2311 @@ What if the method template is in a separate file?
2312 Maybe both file contexts should be taken into account?
2313 Maybe only do this if i->interface == 1 (unknown)? */
2314 context = DECL_CONTEXT (t);
2315 if (context != NULL_TREE
2316 && TREE_CODE_CLASS (TREE_CODE (context)) == 't')
2317 {
2318 /* I'm interested in the context of this version of the function,
2319 not the original virtual declaration. */
2320 context = DECL_CLASS_CONTEXT (t);
2321
2322 /* If `unknown', we might want a static copy.
2323 If `implementation', we want a global one.
2324 If `interface', ext ref. */
2325 if (CLASSTYPE_INTERFACE_KNOWN (context))
2326 DECIDE (!CLASSTYPE_INTERFACE_ONLY (context));
2327 #if 0 /* This doesn't get us stuff needed only by the file initializer. */
2328 DECIDE (TREE_USED (t));
2329 #else /* This compiles too much stuff, but that's probably better in
2330 most cases than never compiling the stuff we need. */
2331 DECIDE (1);
2332 #endif
2333 }
2334
2335 if (i->interface == 1)
2336 DECIDE (TREE_USED (t));
2337 else
2338 DECIDE (i->interface);
2339
2340 decided:
2341 #ifdef DEBUG
2342 print_node_brief (stderr, decision ? "yes: " : "no: ", t, 0);
2343 fprintf (stderr, "\t%s\n",
2344 (DECL_ASSEMBLER_NAME (t)
2345 ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t))
2346 : ""));
2347 #endif
2348 if (decision)
2349 {
2350 i->next = pending_inlines;
2351 pending_inlines = i;
2352 }
2353 else
2354 {
2355 i->next = new_list;
2356 new_list = i;
2357 }
2358 i = next;
2359 }
2360 pending_template_expansions = new_list;
2361 if (!pending_inlines)
2362 return 0;
2363 do_pending_inlines ();
2364 return 1;
2365 }
2366
2367 \f
2368 struct pending_template {
2369 struct pending_template *next;
2370 tree id;
2371 };
2372
2373 static struct pending_template* pending_templates;
2374
2375 void
2376 do_pending_templates ()
2377 {
2378 struct pending_template* t;
2379
2380 for ( t = pending_templates; t; t = t->next)
2381 {
2382 instantiate_class_template (t->id, 1);
2383 }
2384
2385 for ( t = pending_templates; t; t = pending_templates)
2386 {
2387 pending_templates = t->next;
2388 free(t);
2389 }
2390 }
2391
2392 static void
2393 add_pending_template (pt)
2394 tree pt;
2395 {
2396 struct pending_template *p;
2397
2398 p = (struct pending_template *) malloc (sizeof (struct pending_template));
2399 p->next = pending_templates;
2400 pending_templates = p;
2401 p->id = pt;
2402 }
2403
2404 /* called from the parser. */
2405 void
2406 do_function_instantiation (declspecs, declarator, storage)
2407 tree declspecs, declarator, storage;
2408 {
2409 tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0, 0);
2410 tree name = DECL_NAME (decl);
2411 tree fn = IDENTIFIER_GLOBAL_VALUE (name);
2412 tree result = NULL_TREE;
2413 if (fn)
2414 {
2415 for (fn = get_first_fn (fn); fn; fn = DECL_CHAIN (fn))
2416 if (TREE_CODE (fn) == TEMPLATE_DECL)
2417 {
2418 int ntparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (fn));
2419 tree *targs = (tree *) malloc (sizeof (tree) * ntparms);
2420 int i, dummy;
2421 i = type_unification (DECL_TEMPLATE_PARMS (fn), targs,
2422 TYPE_ARG_TYPES (TREE_TYPE (fn)),
2423 TYPE_ARG_TYPES (TREE_TYPE (decl)),
2424 &dummy, 0);
2425 if (i == 0)
2426 {
2427 if (result)
2428 cp_error ("ambiguous template instantiation for `%D' requested", decl);
2429 else
2430 result = instantiate_template (fn, targs);
2431 }
2432 }
2433 }
2434 if (! result)
2435 cp_error ("no matching template for `%D' found", decl);
2436
2437 if (flag_external_templates)
2438 return;
2439
2440 SET_DECL_EXPLICIT_INSTANTIATION (result);
2441 TREE_PUBLIC (result) = 1;
2442
2443 if (storage == NULL_TREE)
2444 {
2445 DECL_INTERFACE_KNOWN (result) = 1;
2446 DECL_EXTERNAL (result) = 0;
2447 TREE_STATIC (result) = 1;
2448 }
2449 else if (storage == ridpointers[(int) RID_EXTERN])
2450 ;
2451 else
2452 cp_error ("storage class `%D' applied to template instantiation",
2453 storage);
2454 }
2455
2456 void
2457 do_type_instantiation (name, storage)
2458 tree name, storage;
2459 {
2460 tree t = TREE_TYPE (name);
2461 int extern_p;
2462
2463 /* With -fexternal-templates, explicit instantiations are treated the same
2464 as implicit ones. */
2465 if (flag_external_templates)
2466 return;
2467
2468 if (TYPE_SIZE (t) == NULL_TREE)
2469 {
2470 cp_error ("explicit instantiation of `%#T' before definition of template",
2471 t);
2472 return;
2473 }
2474
2475 if (storage == NULL_TREE)
2476 extern_p = 0;
2477 else if (storage == ridpointers[(int) RID_EXTERN])
2478 extern_p = 1;
2479 else
2480 {
2481 cp_error ("storage class `%D' applied to template instantiation",
2482 storage);
2483 extern_p = 0;
2484 }
2485
2486 /* We've already instantiated this. */
2487 if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && ! CLASSTYPE_INTERFACE_ONLY (t))
2488 {
2489 if (! extern_p)
2490 cp_pedwarn ("multiple explicit instantiation of `%#T'", t);
2491 return;
2492 }
2493
2494 if (! CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
2495 {
2496 SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
2497 SET_CLASSTYPE_INTERFACE_KNOWN (t);
2498 CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
2499 CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p;
2500 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p;
2501 if (! extern_p)
2502 {
2503 CLASSTYPE_DEBUG_REQUESTED (t) = 1;
2504 rest_of_type_compilation (t, 1);
2505 }
2506 }
2507
2508 {
2509 tree tmp;
2510 /* Classes nested in template classes currently don't have an
2511 IDENTIFIER_TEMPLATE--their out-of-line members are handled
2512 by the enclosing template class. Note that there are name
2513 conflict bugs with this approach. */
2514 tmp = TYPE_IDENTIFIER (t);
2515 if (IDENTIFIER_TEMPLATE (tmp))
2516 instantiate_member_templates (tmp);
2517
2518 /* this should really be done by instantiate_member_templates */
2519 tmp = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (t), 0);
2520 for (; tmp; tmp = TREE_CHAIN (tmp))
2521 {
2522 if (DECL_TEMPLATE_SPECIALIZATION (tmp)
2523 || (DECL_USE_TEMPLATE (tmp) == 0
2524 && CLASSTYPE_TEMPLATE_SPECIALIZATION (t)))
2525 continue;
2526
2527 SET_DECL_EXPLICIT_INSTANTIATION (tmp);
2528 TREE_PUBLIC (tmp) = 1;
2529 if (! extern_p)
2530 {
2531 DECL_INTERFACE_KNOWN (tmp) = 1;
2532 DECL_EXTERNAL (tmp) = 0;
2533 TREE_STATIC (tmp) = 1;
2534 }
2535 }
2536
2537 #if 0
2538 for (tmp = TYPE_FIELDS (t); tmp; tmp = TREE_CHAIN (tmp))
2539 {
2540 if (TREE_CODE (tmp) == VAR_DECL)
2541 /* eventually do something */;
2542 }
2543 #endif
2544
2545 for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp))
2546 if (IS_AGGR_TYPE (TREE_VALUE (tmp)))
2547 do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage);
2548 }
2549 }
2550
2551 tree
2552 create_nested_upt (scope, name)
2553 tree scope, name;
2554 {
2555 tree t = make_lang_type (UNINSTANTIATED_P_TYPE);
2556 tree d = build_decl (TYPE_DECL, name, t);
2557
2558 TYPE_NAME (t) = d;
2559 TYPE_VALUES (t) = TYPE_VALUES (scope);
2560 TYPE_CONTEXT (t) = scope;
2561
2562 pushdecl (d);
2563 return d;
2564 }