]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/pt.c
h8300.c: Include obstack.h.
[gcc.git] / gcc / cp / pt.c
1 /* Handle parameterized types (templates) for GNU C++.
2 Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
3 Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
4 Rewritten by Jason Merrill (jason@cygnus.com).
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /* Known bugs or deficiencies include:
24 * templates for class static data don't work (methods only)
25 * duplicated method templates can crash the compiler
26 * interface/impl data is taken from file defining the template
27 * all methods must be provided in header files; can't use a source
28 file that contains only the method templates and "just win"
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 #include "output.h"
42 #include "defaults.h"
43
44 extern struct obstack permanent_obstack;
45
46 extern int lineno;
47 extern char *input_filename;
48 struct pending_inline *pending_template_expansions;
49
50 tree current_template_parms;
51 HOST_WIDE_INT processing_template_decl;
52
53 tree pending_templates;
54 static tree *template_tail = &pending_templates;
55
56 int minimal_parse_mode;
57
58 #define obstack_chunk_alloc xmalloc
59 #define obstack_chunk_free free
60
61 static int unify ();
62
63 void pop_template_decls ();
64
65 tree classtype_mangled_name ();
66 static char * mangle_class_name_for_template ();
67 tree tsubst_expr_values ();
68
69 /* We've got a template header coming up; push to a new level for storing
70 the parms. */
71
72 void
73 begin_template_parm_list ()
74 {
75 pushlevel (0);
76 declare_pseudo_global_level ();
77 }
78
79 /* Process information from new template parameter NEXT and append it to the
80 LIST being built. */
81 tree
82 process_template_parm (list, next)
83 tree list, next;
84 {
85 tree parm;
86 tree decl = 0;
87 tree defval;
88 int is_type, idx;
89 parm = next;
90 my_friendly_assert (TREE_CODE (parm) == TREE_LIST, 259);
91 defval = TREE_PURPOSE (parm);
92 parm = TREE_VALUE (parm);
93 is_type = TREE_PURPOSE (parm) == class_type_node;
94
95 if (list)
96 {
97 tree p = TREE_VALUE (tree_last (list));
98
99 if (TREE_CODE (p) == TYPE_DECL)
100 idx = TEMPLATE_TYPE_IDX (TREE_TYPE (p));
101 else
102 idx = TEMPLATE_CONST_IDX (DECL_INITIAL (p));
103 ++idx;
104 }
105 else
106 idx = 0;
107
108 if (!is_type)
109 {
110 tree tinfo = 0;
111 my_friendly_assert (TREE_CODE (TREE_PURPOSE (parm)) == TREE_LIST, 260);
112 /* is a const-param */
113 parm = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm),
114 PARM, 0, NULL_TREE, NULL_TREE);
115 /* A template parameter is not modifiable. */
116 TREE_READONLY (parm) = 1;
117 if (IS_AGGR_TYPE (TREE_TYPE (parm))
118 && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM)
119 {
120 cp_error ("`%#T' is not a valid type for a template constant parameter",
121 TREE_TYPE (parm));
122 if (DECL_NAME (parm) == NULL_TREE)
123 error (" a template type parameter must begin with `class' or `typename'");
124 TREE_TYPE (parm) = void_type_node;
125 }
126 tinfo = make_node (TEMPLATE_CONST_PARM);
127 my_friendly_assert (TREE_PERMANENT (tinfo), 260.5);
128 if (TREE_PERMANENT (parm) == 0)
129 {
130 parm = copy_node (parm);
131 TREE_PERMANENT (parm) = 1;
132 }
133 TREE_TYPE (tinfo) = TREE_TYPE (parm);
134 decl = build_decl (CONST_DECL, DECL_NAME (parm), TREE_TYPE (parm));
135 DECL_INITIAL (decl) = tinfo;
136 DECL_INITIAL (parm) = tinfo;
137 TEMPLATE_CONST_SET_INFO (tinfo, idx, processing_template_decl + 1);
138 }
139 else
140 {
141 tree t = make_lang_type (TEMPLATE_TYPE_PARM);
142 CLASSTYPE_GOT_SEMICOLON (t) = 1;
143 decl = build_decl (TYPE_DECL, TREE_VALUE (parm), t);
144 TYPE_MAIN_DECL (t) = decl;
145 parm = decl;
146 TEMPLATE_TYPE_SET_INFO (t, idx, processing_template_decl + 1);
147 }
148 SET_DECL_ARTIFICIAL (decl);
149 pushdecl (decl);
150 parm = build_tree_list (defval, parm);
151 return chainon (list, parm);
152 }
153
154 /* The end of a template parameter list has been reached. Process the
155 tree list into a parameter vector, converting each parameter into a more
156 useful form. Type parameters are saved as IDENTIFIER_NODEs, and others
157 as PARM_DECLs. */
158
159 tree
160 end_template_parm_list (parms)
161 tree parms;
162 {
163 int nparms;
164 tree parm;
165 tree saved_parmlist = make_tree_vec (list_length (parms));
166
167 ++processing_template_decl;
168 current_template_parms
169 = tree_cons (build_int_2 (0, processing_template_decl),
170 saved_parmlist, current_template_parms);
171
172 for (parm = parms, nparms = 0; parm; parm = TREE_CHAIN (parm), nparms++)
173 TREE_VEC_ELT (saved_parmlist, nparms) = parm;
174
175 return saved_parmlist;
176 }
177
178 /* end_template_decl is called after a template declaration is seen. */
179
180 void
181 end_template_decl ()
182 {
183 /* This matches the pushlevel in begin_template_parm_list. */
184 poplevel (0, 0, 0);
185
186 --processing_template_decl;
187 current_template_parms = TREE_CHAIN (current_template_parms);
188 (void) get_pending_sizes (); /* Why? */
189 }
190
191 void
192 push_template_decl (decl)
193 tree decl;
194 {
195 tree header = current_template_parms;
196 tree tmpl;
197 tree args = NULL_TREE;
198 tree info;
199 tree ctx = DECL_CONTEXT (decl) ? DECL_CONTEXT (decl) : current_class_type;
200 int primary = 0;
201
202 /* Kludge! */
203 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_FRIEND_P (decl)
204 && DECL_CLASS_CONTEXT (decl))
205 ;
206 /* Note that this template is a "primary template" */
207 else if (! ctx || ! CLASSTYPE_TEMPLATE_INFO (ctx)
208 /* || (processing_template_decl > CLASSTYPE_TEMPLATE_LEVEL (ctx)) */)
209 primary = 1;
210
211 while (header)
212 {
213 tree a = copy_node (TREE_VALUE (header));
214 int i = TREE_VEC_LENGTH (a);
215 TREE_TYPE (a) = NULL_TREE;
216 while (i--)
217 {
218 tree t = TREE_VALUE (TREE_VEC_ELT (a, i));
219 if (TREE_CODE (t) == TYPE_DECL)
220 t = TREE_TYPE (t);
221 else
222 t = DECL_INITIAL (t);
223 TREE_VEC_ELT (a, i) = t;
224 }
225 args = tree_cons (TREE_PURPOSE (header), a, args);
226 header = TREE_CHAIN (header);
227 }
228 args = nreverse (args);
229 args = TREE_VALUE (args);
230
231 if (! ctx || TYPE_BEING_DEFINED (ctx))
232 {
233 tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE);
234 DECL_TEMPLATE_PARMS (tmpl) = TREE_VALUE (current_template_parms);
235 DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl);
236 }
237 else
238 {
239 if (TREE_CODE (decl) == TYPE_DECL)
240 tmpl = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl));
241 else if (! DECL_TEMPLATE_INFO (decl))
242 {
243 cp_error ("template definition of non-template `%#D'", decl);
244 return;
245 }
246 else
247 tmpl = DECL_TI_TEMPLATE (decl);
248 }
249
250 DECL_TEMPLATE_RESULT (tmpl) = decl;
251 TREE_TYPE (tmpl) = TREE_TYPE (decl);
252
253 if (! ctx)
254 tmpl = pushdecl_top_level (tmpl);
255
256 if (primary)
257 TREE_TYPE (DECL_TEMPLATE_PARMS (tmpl)) = tmpl;
258
259 info = perm_tree_cons (tmpl, args, NULL_TREE);
260
261 if (TREE_CODE (decl) == TYPE_DECL)
262 {
263 CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (tmpl)) = info;
264 DECL_NAME (decl) = classtype_mangled_name (TREE_TYPE (decl));
265 }
266 else if (! DECL_LANG_SPECIFIC (decl))
267 cp_error ("template declaration of `%#D'", decl);
268 else
269 DECL_TEMPLATE_INFO (decl) = info;
270 }
271
272 tree tsubst PROTO ((tree, tree*, int, tree));
273
274 /* Convert all template arguments to their appropriate types, and return
275 a vector containing the resulting values. If any error occurs, return
276 error_mark_node. */
277 static tree
278 coerce_template_parms (parms, arglist, in_decl)
279 tree parms, arglist;
280 tree in_decl;
281 {
282 int nparms, nargs, i, lost = 0;
283 tree vec;
284
285 if (arglist == NULL_TREE)
286 nargs = 0;
287 else if (TREE_CODE (arglist) == TREE_VEC)
288 nargs = TREE_VEC_LENGTH (arglist);
289 else
290 nargs = list_length (arglist);
291
292 nparms = TREE_VEC_LENGTH (parms);
293
294 if (nargs > nparms
295 || (nargs < nparms
296 && TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
297 {
298 error ("incorrect number of parameters (%d, should be %d)",
299 nargs, nparms);
300 if (in_decl)
301 cp_error_at ("in template expansion for decl `%D'", in_decl);
302 return error_mark_node;
303 }
304
305 if (arglist && TREE_CODE (arglist) == TREE_VEC)
306 vec = copy_node (arglist);
307 else
308 {
309 vec = make_tree_vec (nparms);
310 for (i = 0; i < nparms; i++)
311 {
312 tree arg;
313
314 if (arglist)
315 {
316 arg = arglist;
317 arglist = TREE_CHAIN (arglist);
318
319 if (arg == error_mark_node)
320 lost++;
321 else
322 arg = TREE_VALUE (arg);
323 }
324 else
325 arg = tsubst (TREE_PURPOSE (TREE_VEC_ELT (parms, i)),
326 &TREE_VEC_ELT (vec, 0), i, in_decl);
327
328 TREE_VEC_ELT (vec, i) = arg;
329 }
330 }
331 for (i = 0; i < nparms; i++)
332 {
333 tree arg = TREE_VEC_ELT (vec, i);
334 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
335 tree val = 0;
336 int is_type, requires_type;
337
338 is_type = TREE_CODE_CLASS (TREE_CODE (arg)) == 't';
339 requires_type = TREE_CODE (parm) == TYPE_DECL;
340
341 if (requires_type && ! is_type && TREE_CODE (arg) == SCOPE_REF
342 && TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM)
343 {
344 cp_pedwarn ("to refer to a type member of a template parameter,");
345 cp_pedwarn (" use `typename %E'", arg);
346 arg = make_typename_type (TREE_OPERAND (arg, 0),
347 TREE_OPERAND (arg, 1));
348 is_type = 1;
349 }
350 if (is_type != requires_type)
351 {
352 if (in_decl)
353 {
354 cp_error ("type/value mismatch at argument %d in template parameter list for `%D'",
355 i, in_decl);
356 if (is_type)
357 cp_error (" expected a constant of type `%T', got `%T'",
358 TREE_TYPE (parm), arg);
359 else
360 cp_error (" expected a type, got `%E'", arg);
361 }
362 lost++;
363 TREE_VEC_ELT (vec, i) = error_mark_node;
364 continue;
365 }
366 if (is_type)
367 {
368 val = groktypename (arg);
369 if (! current_template_parms)
370 {
371 tree t = target_type (val);
372 if (IS_AGGR_TYPE (t)
373 && decl_function_context (TYPE_MAIN_DECL (t)))
374 {
375 cp_error ("type `%T' composed from a local class is not a valid template-argument", val);
376 return error_mark_node;
377 }
378 }
379 }
380 else
381 {
382 tree t = tsubst (TREE_TYPE (parm), &TREE_VEC_ELT (vec, 0),
383 TREE_VEC_LENGTH (vec), in_decl);
384 if (current_template_parms)
385 val = arg;
386 else
387 val = digest_init (t, arg, (tree *) 0);
388
389 if (val == error_mark_node || current_template_parms)
390 ;
391
392 /* 14.2: Other template-arguments must be constant-expressions,
393 addresses of objects or functions with external linkage, or of
394 static class members. */
395 else if (!TREE_CONSTANT (val))
396 {
397 cp_error ("non-const `%E' cannot be used as template argument",
398 arg);
399 val = error_mark_node;
400 }
401 else if (POINTER_TYPE_P (TREE_TYPE (val))
402 && ! integer_zerop (val)
403 && TREE_CODE (TREE_TYPE (TREE_TYPE (val))) != OFFSET_TYPE
404 && TREE_CODE (TREE_TYPE (TREE_TYPE (val))) != METHOD_TYPE)
405 {
406 t = val;
407 STRIP_NOPS (t);
408 if (TREE_CODE (t) == ADDR_EXPR)
409 {
410 tree a = TREE_OPERAND (t, 0);
411 STRIP_NOPS (a);
412 if (TREE_CODE (a) == STRING_CST)
413 {
414 cp_error ("string literal %E is not a valid template argument", a);
415 error ("because it is the address of an object with static linkage");
416 val = error_mark_node;
417 }
418 else if (TREE_CODE (a) != VAR_DECL
419 && TREE_CODE (a) != FUNCTION_DECL)
420 goto bad;
421 else if (! DECL_PUBLIC (a))
422 {
423 cp_error ("address of non-extern `%E' cannot be used as template argument", a);
424 val = error_mark_node;
425 }
426 }
427 else
428 {
429 bad:
430 cp_error ("`%E' is not a valid template argument", t);
431 error ("it must be %s%s with external linkage",
432 TREE_CODE (TREE_TYPE (val)) == POINTER_TYPE
433 ? "a pointer to " : "",
434 TREE_CODE (TREE_TYPE (TREE_TYPE (val))) == FUNCTION_TYPE
435 ? "a function" : "an object");
436 val = error_mark_node;
437 }
438 }
439 }
440
441 if (val == error_mark_node)
442 lost++;
443
444 TREE_VEC_ELT (vec, i) = val;
445 }
446 if (lost)
447 return error_mark_node;
448 return vec;
449 }
450
451 int
452 comp_template_args (oldargs, newargs)
453 tree oldargs, newargs;
454 {
455 int i;
456
457 for (i = 0; i < TREE_VEC_LENGTH (oldargs); ++i)
458 {
459 tree nt = TREE_VEC_ELT (newargs, i);
460 tree ot = TREE_VEC_ELT (oldargs, i);
461
462 if (nt == ot)
463 continue;
464 if (TREE_CODE (nt) != TREE_CODE (ot))
465 return 0;
466 if (TREE_CODE_CLASS (TREE_CODE (ot)) == 't')
467 {
468 if (comptypes (ot, nt, 1))
469 continue;
470 }
471 else if (cp_tree_equal (ot, nt) > 0)
472 continue;
473 return 0;
474 }
475 return 1;
476 }
477
478 /* Given class template name and parameter list, produce a user-friendly name
479 for the instantiation. */
480 static char *
481 mangle_class_name_for_template (name, parms, arglist)
482 char *name;
483 tree parms, arglist;
484 {
485 static struct obstack scratch_obstack;
486 static char *scratch_firstobj;
487 int i, nparms;
488
489 if (!scratch_firstobj)
490 gcc_obstack_init (&scratch_obstack);
491 else
492 obstack_free (&scratch_obstack, scratch_firstobj);
493 scratch_firstobj = obstack_alloc (&scratch_obstack, 1);
494
495 #if 0
496 #define buflen sizeof(buf)
497 #define check if (bufp >= buf+buflen-1) goto too_long
498 #define ccat(c) *bufp++=(c); check
499 #define advance bufp+=strlen(bufp); check
500 #define cat(s) strncpy(bufp, s, buf+buflen-bufp-1); advance
501 #else
502 #define check
503 #define ccat(c) obstack_1grow (&scratch_obstack, (c));
504 #define advance
505 #define cat(s) obstack_grow (&scratch_obstack, (s), strlen (s))
506 #endif
507
508 cat (name);
509 ccat ('<');
510 nparms = TREE_VEC_LENGTH (parms);
511 my_friendly_assert (nparms == TREE_VEC_LENGTH (arglist), 268);
512 for (i = 0; i < nparms; i++)
513 {
514 tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
515 tree arg = TREE_VEC_ELT (arglist, i);
516
517 if (i)
518 ccat (',');
519
520 if (TREE_CODE (parm) == TYPE_DECL)
521 {
522 cat (type_as_string (arg, 0));
523 continue;
524 }
525 else
526 my_friendly_assert (TREE_CODE (parm) == PARM_DECL, 269);
527
528 if (TREE_CODE (arg) == TREE_LIST)
529 {
530 /* New list cell was built because old chain link was in
531 use. */
532 my_friendly_assert (TREE_PURPOSE (arg) == NULL_TREE, 270);
533 arg = TREE_VALUE (arg);
534 }
535 /* No need to check arglist against parmlist here; we did that
536 in coerce_template_parms, called from lookup_template_class. */
537 cat (expr_as_string (arg, 0));
538 }
539 {
540 char *bufp = obstack_next_free (&scratch_obstack);
541 int offset = 0;
542 while (bufp[offset - 1] == ' ')
543 offset--;
544 obstack_blank_fast (&scratch_obstack, offset);
545
546 /* B<C<char> >, not B<C<char>> */
547 if (bufp[offset - 1] == '>')
548 ccat (' ');
549 }
550 ccat ('>');
551 ccat ('\0');
552 return (char *) obstack_base (&scratch_obstack);
553
554 #if 0
555 too_long:
556 #endif
557 fatal ("out of (preallocated) string space creating template instantiation name");
558 /* NOTREACHED */
559 return NULL;
560 }
561
562 tree
563 classtype_mangled_name (t)
564 tree t;
565 {
566 if (CLASSTYPE_TEMPLATE_INFO (t)
567 && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)))
568 {
569 tree name = DECL_NAME (CLASSTYPE_TI_TEMPLATE (t));
570 char *mangled_name = mangle_class_name_for_template
571 (IDENTIFIER_POINTER (name),
572 DECL_TEMPLATE_PARMS (CLASSTYPE_TI_TEMPLATE (t)),
573 CLASSTYPE_TI_ARGS (t));
574 tree id = get_identifier (mangled_name);
575 IDENTIFIER_TEMPLATE (id) = name;
576 return id;
577 }
578 else
579 return TYPE_IDENTIFIER (t);
580 }
581
582 static void
583 add_pending_template (d)
584 tree d;
585 {
586 if (TREE_LANG_FLAG_0 (DECL_TEMPLATE_INFO (d)))
587 return;
588
589 *template_tail = perm_tree_cons
590 (current_function_decl, d, NULL_TREE);
591 template_tail = &TREE_CHAIN (*template_tail);
592 TREE_LANG_FLAG_0 (DECL_TEMPLATE_INFO (d)) = 1;
593 }
594
595 /* Given an IDENTIFIER_NODE (type TEMPLATE_DECL) and a chain of
596 parameters, find the desired type.
597
598 D1 is the PTYPENAME terminal, and ARGLIST is the list of arguments.
599 Since ARGLIST is build on the decl_obstack, we must copy it here
600 to keep it from being reclaimed when the decl storage is reclaimed.
601
602 IN_DECL, if non-NULL, is the template declaration we are trying to
603 instantiate. */
604 tree
605 lookup_template_class (d1, arglist, in_decl)
606 tree d1, arglist;
607 tree in_decl;
608 {
609 tree template, parmlist;
610 char *mangled_name;
611 tree id, t;
612 tree code_type_node;
613
614 if (TREE_CODE (d1) == IDENTIFIER_NODE)
615 {
616 template = IDENTIFIER_GLOBAL_VALUE (d1); /* XXX */
617 if (! template)
618 template = IDENTIFIER_CLASS_VALUE (d1);
619 }
620 else if (TREE_CODE (d1) == TYPE_DECL && IS_AGGR_TYPE (TREE_TYPE (d1)))
621 {
622 template = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (d1));
623 d1 = DECL_NAME (template);
624 }
625 else if (TREE_CODE_CLASS (TREE_CODE (d1)) == 't' && IS_AGGR_TYPE (d1))
626 {
627 template = CLASSTYPE_TI_TEMPLATE (d1);
628 d1 = DECL_NAME (template);
629 }
630 else
631 my_friendly_abort (272);
632
633 /* With something like `template <class T> class X class X { ... };'
634 we could end up with D1 having nothing but an IDENTIFIER_LOCAL_VALUE.
635 We don't want to do that, but we have to deal with the situation, so
636 let's give them some syntax errors to chew on instead of a crash. */
637 if (! template)
638 return error_mark_node;
639 if (TREE_CODE (template) != TEMPLATE_DECL)
640 {
641 cp_error ("non-template type `%T' used as a template", d1);
642 if (in_decl)
643 cp_error_at ("for template declaration `%D'", in_decl);
644 return error_mark_node;
645 }
646
647 if (PRIMARY_TEMPLATE_P (template))
648 {
649 parmlist = DECL_TEMPLATE_PARMS (template);
650
651 arglist = coerce_template_parms (parmlist, arglist, template);
652 if (arglist == error_mark_node)
653 return error_mark_node;
654 if (uses_template_parms (arglist))
655 {
656 tree found;
657 if (comp_template_args
658 (CLASSTYPE_TI_ARGS (TREE_TYPE (template)), arglist))
659 found = TREE_TYPE (template);
660 else
661 {
662 for (found = DECL_TEMPLATE_INSTANTIATIONS (template);
663 found; found = TREE_CHAIN (found))
664 {
665 if (TI_USES_TEMPLATE_PARMS (found)
666 && comp_template_args (TREE_PURPOSE (found), arglist))
667 break;
668 }
669 if (found)
670 found = TREE_VALUE (found);
671 }
672
673 if (found)
674 {
675 if (can_free (&permanent_obstack, arglist))
676 obstack_free (&permanent_obstack, arglist);
677 return found;
678 }
679 }
680
681 mangled_name = mangle_class_name_for_template (IDENTIFIER_POINTER (d1),
682 parmlist, arglist);
683 id = get_identifier (mangled_name);
684 IDENTIFIER_TEMPLATE (id) = d1;
685
686 maybe_push_to_top_level (uses_template_parms (arglist));
687 t = xref_tag_from_type (TREE_TYPE (template), id, 1);
688 pop_from_top_level ();
689 }
690 else
691 {
692 tree ctx = lookup_template_class (TYPE_CONTEXT (TREE_TYPE (template)),
693 arglist, in_decl);
694 id = d1;
695 arglist = CLASSTYPE_TI_ARGS (ctx);
696
697 if (TYPE_BEING_DEFINED (ctx) && ctx == current_class_type)
698 {
699 tree save_parms = current_template_parms;
700 current_template_parms = NULL_TREE;
701 t = xref_tag_from_type (TREE_TYPE (template), id, 0);
702 current_template_parms = save_parms;
703 }
704 else
705 {
706 t = lookup_nested_type_by_name (ctx, id);
707 my_friendly_assert (t != NULL_TREE, 42);
708 }
709 }
710
711 /* Seems to be wanted. */
712 CLASSTYPE_GOT_SEMICOLON (t) = 1;
713
714 if (! CLASSTYPE_TEMPLATE_INFO (t))
715 {
716 arglist = copy_to_permanent (arglist);
717 CLASSTYPE_TEMPLATE_INFO (t)
718 = perm_tree_cons (template, arglist, NULL_TREE);
719 DECL_TEMPLATE_INSTANTIATIONS (template) = perm_tree_cons
720 (arglist, t, DECL_TEMPLATE_INSTANTIATIONS (template));
721 TI_USES_TEMPLATE_PARMS (DECL_TEMPLATE_INSTANTIATIONS (template))
722 = uses_template_parms (arglist);
723
724 SET_CLASSTYPE_IMPLICIT_INSTANTIATION (t);
725
726 /* We need to set this again after CLASSTYPE_TEMPLATE_INFO is set up. */
727 DECL_ASSEMBLER_NAME (TYPE_MAIN_DECL (t)) = id;
728 if (! uses_template_parms (arglist))
729 DECL_ASSEMBLER_NAME (TYPE_MAIN_DECL (t))
730 = get_identifier (build_overload_name (t, 1, 1));
731
732 if (flag_external_templates && ! uses_template_parms (arglist)
733 && CLASSTYPE_INTERFACE_KNOWN (TREE_TYPE (template))
734 && ! CLASSTYPE_INTERFACE_ONLY (TREE_TYPE (template)))
735 {
736 tree d;
737
738 instantiate_class_template (t);
739
740 for (d = TYPE_METHODS (t); d; d = TREE_CHAIN (d))
741 add_pending_template (d);
742 }
743 }
744
745 return t;
746 }
747 \f
748 /* Should be defined in parse.h. */
749 extern int yychar;
750
751 int
752 uses_template_parms (t)
753 tree t;
754 {
755 if (!t)
756 return 0;
757 switch (TREE_CODE (t))
758 {
759 case INDIRECT_REF:
760 case COMPONENT_REF:
761 /* We assume that the object must be instantiated in order to build
762 the COMPONENT_REF, so we test only whether the type of the
763 COMPONENT_REF uses template parms. */
764 return uses_template_parms (TREE_TYPE (t));
765
766 case IDENTIFIER_NODE:
767 if (!IDENTIFIER_TEMPLATE (t))
768 return 0;
769 my_friendly_abort (42);
770
771 /* aggregates of tree nodes */
772 case TREE_VEC:
773 {
774 int i = TREE_VEC_LENGTH (t);
775 while (i--)
776 if (uses_template_parms (TREE_VEC_ELT (t, i)))
777 return 1;
778 return 0;
779 }
780 case TREE_LIST:
781 if (uses_template_parms (TREE_PURPOSE (t))
782 || uses_template_parms (TREE_VALUE (t)))
783 return 1;
784 return uses_template_parms (TREE_CHAIN (t));
785
786 /* constructed type nodes */
787 case POINTER_TYPE:
788 case REFERENCE_TYPE:
789 return uses_template_parms (TREE_TYPE (t));
790 case RECORD_TYPE:
791 if (TYPE_PTRMEMFUNC_FLAG (t))
792 return uses_template_parms (TYPE_PTRMEMFUNC_FN_TYPE (t));
793 case UNION_TYPE:
794 if (! CLASSTYPE_TEMPLATE_INFO (t))
795 return 0;
796 return uses_template_parms (TREE_VALUE (CLASSTYPE_TEMPLATE_INFO (t)));
797 case FUNCTION_TYPE:
798 if (uses_template_parms (TYPE_ARG_TYPES (t)))
799 return 1;
800 return uses_template_parms (TREE_TYPE (t));
801 case ARRAY_TYPE:
802 if (uses_template_parms (TYPE_DOMAIN (t)))
803 return 1;
804 return uses_template_parms (TREE_TYPE (t));
805 case OFFSET_TYPE:
806 if (uses_template_parms (TYPE_OFFSET_BASETYPE (t)))
807 return 1;
808 return uses_template_parms (TREE_TYPE (t));
809 case METHOD_TYPE:
810 if (uses_template_parms (TYPE_METHOD_BASETYPE (t)))
811 return 1;
812 if (uses_template_parms (TYPE_ARG_TYPES (t)))
813 return 1;
814 return uses_template_parms (TREE_TYPE (t));
815
816 /* decl nodes */
817 case TYPE_DECL:
818 return uses_template_parms (TREE_TYPE (t));
819
820 case FUNCTION_DECL:
821 case VAR_DECL:
822 /* ??? What about FIELD_DECLs? */
823 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)
824 && uses_template_parms (DECL_TI_ARGS (t)))
825 return 1;
826 /* fall through */
827 case CONST_DECL:
828 case PARM_DECL:
829 if (uses_template_parms (TREE_TYPE (t)))
830 return 1;
831 if (DECL_CONTEXT (t) && uses_template_parms (DECL_CONTEXT (t)))
832 return 1;
833 return 0;
834
835 case CALL_EXPR:
836 return uses_template_parms (TREE_TYPE (t));
837 case ADDR_EXPR:
838 return uses_template_parms (TREE_OPERAND (t, 0));
839
840 /* template parm nodes */
841 case TEMPLATE_TYPE_PARM:
842 case TEMPLATE_CONST_PARM:
843 return 1;
844
845 /* simple type nodes */
846 case INTEGER_TYPE:
847 if (uses_template_parms (TYPE_MIN_VALUE (t)))
848 return 1;
849 return uses_template_parms (TYPE_MAX_VALUE (t));
850
851 case REAL_TYPE:
852 case VOID_TYPE:
853 case ENUMERAL_TYPE:
854 case BOOLEAN_TYPE:
855 return 0;
856
857 /* constants */
858 case INTEGER_CST:
859 case REAL_CST:
860 case STRING_CST:
861 return 0;
862
863 case ERROR_MARK:
864 /* Non-error_mark_node ERROR_MARKs are bad things. */
865 my_friendly_assert (t == error_mark_node, 274);
866 /* NOTREACHED */
867 return 0;
868
869 case LOOKUP_EXPR:
870 case TYPENAME_TYPE:
871 return 1;
872
873 case CONSTRUCTOR:
874 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
875 return uses_template_parms (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t)));
876 /* else fall through */
877
878 default:
879 switch (TREE_CODE_CLASS (TREE_CODE (t)))
880 {
881 case '1':
882 case '2':
883 case 'e':
884 case '<':
885 {
886 int i;
887 for (i = tree_code_length[(int) TREE_CODE (t)]; --i >= 0;)
888 if (uses_template_parms (TREE_OPERAND (t, i)))
889 return 1;
890 return 0;
891 }
892 default:
893 break;
894 }
895 sorry ("testing %s for template parms",
896 tree_code_name [(int) TREE_CODE (t)]);
897 my_friendly_abort (82);
898 /* NOTREACHED */
899 return 0;
900 }
901 }
902
903 static struct tinst_level *current_tinst_level = 0;
904 static struct tinst_level *free_tinst_level = 0;
905 static int tinst_depth = 0;
906 int max_tinst_depth = 17;
907 #ifdef GATHER_STATISTICS
908 int depth_reached = 0;
909 #endif
910
911 int
912 push_tinst_level (d)
913 tree d;
914 {
915 struct tinst_level *new;
916
917 if (tinst_depth >= max_tinst_depth)
918 {
919 struct tinst_level *p = current_tinst_level;
920 int line = lineno;
921 char *file = input_filename;
922
923 error ("template instantiation depth exceeds maximum of %d",
924 max_tinst_depth);
925 cp_error (" instantiating `%D'", d);
926
927 for (; p; p = p->next)
928 {
929 cp_error (" instantiated from `%D'", p->decl);
930 lineno = p->line;
931 input_filename = p->file;
932 }
933 error (" instantiated from here");
934
935 lineno = line;
936 input_filename = file;
937
938 return 0;
939 }
940
941 if (free_tinst_level)
942 {
943 new = free_tinst_level;
944 free_tinst_level = new->next;
945 }
946 else
947 new = (struct tinst_level *) xmalloc (sizeof (struct tinst_level));
948
949 new->decl = d;
950 new->line = lineno;
951 new->file = input_filename;
952 new->next = current_tinst_level;
953 current_tinst_level = new;
954
955 ++tinst_depth;
956 #ifdef GATHER_STATISTICS
957 if (tinst_depth > depth_reached)
958 depth_reached = tinst_depth;
959 #endif
960
961 return 1;
962 }
963
964 void
965 pop_tinst_level ()
966 {
967 struct tinst_level *old = current_tinst_level;
968
969 current_tinst_level = old->next;
970 old->next = free_tinst_level;
971 free_tinst_level = old;
972 --tinst_depth;
973 }
974
975 struct tinst_level *
976 tinst_for_decl ()
977 {
978 struct tinst_level *p = current_tinst_level;
979
980 if (p)
981 for (; p->next ; p = p->next )
982 ;
983 return p;
984 }
985
986 tree
987 instantiate_class_template (type)
988 tree type;
989 {
990 tree template, template_info, args, pattern, t, *field_chain;
991
992 if (type == error_mark_node)
993 return error_mark_node;
994
995 template_info = CLASSTYPE_TEMPLATE_INFO (type);
996
997 if (TYPE_BEING_DEFINED (type) || TYPE_SIZE (type))
998 return type;
999
1000 template = TI_TEMPLATE (template_info);
1001 my_friendly_assert (TREE_CODE (template) == TEMPLATE_DECL, 279);
1002 args = TI_ARGS (template_info);
1003 pattern = TREE_TYPE (template);
1004
1005 if (TYPE_SIZE (pattern) == NULL_TREE)
1006 return type;
1007
1008 TYPE_BEING_DEFINED (type) = 1;
1009
1010 if (! push_tinst_level (type))
1011 return type;
1012
1013 maybe_push_to_top_level (uses_template_parms (type));
1014 pushclass (type, 0);
1015
1016 if (flag_external_templates)
1017 {
1018 if (flag_alt_external_templates)
1019 {
1020 CLASSTYPE_INTERFACE_ONLY (type) = interface_only;
1021 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (type, interface_unknown);
1022 CLASSTYPE_VTABLE_NEEDS_WRITING (type)
1023 = ! CLASSTYPE_INTERFACE_ONLY (type)
1024 && CLASSTYPE_INTERFACE_KNOWN (type);
1025 }
1026 else
1027 {
1028 CLASSTYPE_INTERFACE_ONLY (type) = CLASSTYPE_INTERFACE_ONLY (pattern);
1029 SET_CLASSTYPE_INTERFACE_UNKNOWN_X
1030 (type, CLASSTYPE_INTERFACE_UNKNOWN (pattern));
1031 CLASSTYPE_VTABLE_NEEDS_WRITING (type)
1032 = ! CLASSTYPE_INTERFACE_ONLY (type)
1033 && CLASSTYPE_INTERFACE_KNOWN (type);
1034 }
1035 }
1036 else
1037 {
1038 SET_CLASSTYPE_INTERFACE_UNKNOWN (type);
1039 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
1040 }
1041
1042 {
1043 tree binfo = TYPE_BINFO (type);
1044 tree pbases = TYPE_BINFO_BASETYPES (pattern);
1045
1046 if (pbases)
1047 {
1048 tree bases;
1049 int i;
1050 int len = TREE_VEC_LENGTH (pbases);
1051 BINFO_BASETYPES (binfo) = bases = make_tree_vec (len);
1052 for (i = 0; i < len; ++i)
1053 {
1054 tree elt;
1055
1056 TREE_VEC_ELT (bases, i) = elt
1057 = tsubst (TREE_VEC_ELT (pbases, i), &TREE_VEC_ELT (args, 0),
1058 TREE_VEC_LENGTH (args), NULL_TREE);
1059 BINFO_INHERITANCE_CHAIN (elt) = binfo;
1060
1061 if (! uses_template_parms (type) &&
1062 TYPE_SIZE (complete_type (TREE_TYPE (elt))) == NULL_TREE)
1063 cp_error ("base class `%T' of `%T' has incomplete type",
1064 TREE_TYPE (elt), type);
1065 }
1066 }
1067 }
1068
1069 CLASSTYPE_LOCAL_TYPEDECLS (type) = CLASSTYPE_LOCAL_TYPEDECLS (pattern);
1070
1071 field_chain = &TYPE_FIELDS (type);
1072
1073 for (t = CLASSTYPE_TAGS (pattern); t; t = TREE_CHAIN (t))
1074 {
1075 tree name = TREE_PURPOSE (t);
1076 tree tag = TREE_VALUE (t);
1077 tree newtag;
1078
1079 /* These will add themselves to CLASSTYPE_TAGS for the new type. */
1080 if (TREE_CODE (tag) == ENUMERAL_TYPE)
1081 newtag = start_enum (name);
1082 else
1083 newtag = tsubst (tag, &TREE_VEC_ELT (args, 0),
1084 TREE_VEC_LENGTH (args), NULL_TREE);
1085
1086 if (TREE_CODE (tag) == ENUMERAL_TYPE)
1087 {
1088 tree e, values = NULL_TREE, *last = &values;
1089
1090 for (e = TYPE_VALUES (tag); e; e = TREE_CHAIN (e))
1091 {
1092 tree elt = build_enumerator
1093 (TREE_PURPOSE (e),
1094 tsubst_expr (TREE_VALUE (e), &TREE_VEC_ELT (args, 0),
1095 TREE_VEC_LENGTH (args), NULL_TREE));
1096 DECL_FIELD_CONTEXT (TREE_VALUE (elt)) = type;
1097 *last = elt;
1098 last = &TREE_CHAIN (elt);
1099 }
1100
1101 finish_enum (newtag, values);
1102
1103 *field_chain = grok_enum_decls (newtag, NULL_TREE);
1104 while (*field_chain)
1105 field_chain = &TREE_CHAIN (*field_chain);
1106 }
1107 }
1108
1109 /* Don't replace enum constants here. */
1110 for (t = TYPE_FIELDS (pattern); t; t = TREE_CHAIN (t))
1111 if (TREE_CODE (t) != CONST_DECL)
1112 {
1113 tree r = tsubst (t, &TREE_VEC_ELT (args, 0),
1114 TREE_VEC_LENGTH (args), NULL_TREE);
1115 if (TREE_CODE (r) == VAR_DECL)
1116 {
1117 if (! uses_template_parms (r))
1118 pending_statics = perm_tree_cons (NULL_TREE, r, pending_statics);
1119 /* Perhaps I should do more of grokfield here. */
1120 start_decl_1 (r);
1121 DECL_IN_AGGR_P (r) = 1;
1122 DECL_EXTERNAL (r) = 1;
1123 cp_finish_decl (r, DECL_INITIAL (r), NULL_TREE, 0, 0);
1124 }
1125
1126 *field_chain = r;
1127 field_chain = &TREE_CHAIN (r);
1128 }
1129
1130 TYPE_METHODS (type) = tsubst_chain (TYPE_METHODS (pattern), args);
1131
1132 DECL_FRIENDLIST (TYPE_MAIN_DECL (type))
1133 = tsubst (DECL_FRIENDLIST (TYPE_MAIN_DECL (pattern)),
1134 &TREE_VEC_ELT (args, 0), TREE_VEC_LENGTH (args), NULL_TREE);
1135
1136 {
1137 tree d = CLASSTYPE_FRIEND_CLASSES (type) =
1138 tsubst (CLASSTYPE_FRIEND_CLASSES (pattern), &TREE_VEC_ELT (args, 0),
1139 TREE_VEC_LENGTH (args), NULL_TREE);
1140
1141 /* This does injection for friend classes. */
1142 for (; d; d = TREE_CHAIN (d))
1143 TREE_VALUE (d) = xref_tag_from_type (TREE_VALUE (d), NULL_TREE, 1);
1144
1145 d = tsubst (DECL_TEMPLATE_INJECT (template), &TREE_VEC_ELT (args, 0),
1146 TREE_VEC_LENGTH (args), NULL_TREE);
1147
1148 for (; d; d = TREE_CHAIN (d))
1149 {
1150 tree t = TREE_VALUE (d);
1151
1152 if (TREE_CODE (t) == TYPE_DECL)
1153 /* Already injected. */;
1154 else
1155 pushdecl (t);
1156 }
1157 }
1158
1159 TYPE_HAS_CONSTRUCTOR (type) = TYPE_HAS_CONSTRUCTOR (pattern);
1160 TYPE_HAS_DESTRUCTOR (type) = TYPE_HAS_DESTRUCTOR (pattern);
1161 TYPE_HAS_ASSIGNMENT (type) = TYPE_HAS_ASSIGNMENT (pattern);
1162 TYPE_OVERLOADS_CALL_EXPR (type) = TYPE_OVERLOADS_CALL_EXPR (pattern);
1163 TYPE_OVERLOADS_ARRAY_REF (type) = TYPE_OVERLOADS_ARRAY_REF (pattern);
1164 TYPE_OVERLOADS_ARROW (type) = TYPE_OVERLOADS_ARROW (pattern);
1165 TYPE_GETS_NEW (type) = TYPE_GETS_NEW (pattern);
1166 TYPE_GETS_DELETE (type) = TYPE_GETS_DELETE (pattern);
1167 TYPE_VEC_DELETE_TAKES_SIZE (type) = TYPE_VEC_DELETE_TAKES_SIZE (pattern);
1168 TYPE_HAS_ASSIGN_REF (type) = TYPE_HAS_ASSIGN_REF (pattern);
1169 TYPE_HAS_CONST_ASSIGN_REF (type) = TYPE_HAS_CONST_ASSIGN_REF (pattern);
1170 TYPE_HAS_ABSTRACT_ASSIGN_REF (type) = TYPE_HAS_ABSTRACT_ASSIGN_REF (pattern);
1171 TYPE_HAS_INIT_REF (type) = TYPE_HAS_INIT_REF (pattern);
1172 TYPE_HAS_CONST_INIT_REF (type) = TYPE_HAS_CONST_INIT_REF (pattern);
1173 TYPE_GETS_INIT_AGGR (type) = TYPE_GETS_INIT_AGGR (pattern);
1174 TYPE_HAS_DEFAULT_CONSTRUCTOR (type) = TYPE_HAS_DEFAULT_CONSTRUCTOR (pattern);
1175 TYPE_HAS_CONVERSION (type) = TYPE_HAS_CONVERSION (pattern);
1176 TYPE_USES_COMPLEX_INHERITANCE (type)
1177 = TYPE_USES_COMPLEX_INHERITANCE (pattern);
1178 TYPE_USES_VIRTUAL_BASECLASSES (type)
1179 = TYPE_USES_VIRTUAL_BASECLASSES (pattern);
1180
1181 if (! uses_template_parms (type))
1182 {
1183 tree tmp;
1184 for (tmp = TYPE_FIELDS (type); tmp; tmp = TREE_CHAIN (tmp))
1185 if (TREE_CODE (tmp) == FIELD_DECL
1186 && TREE_CODE (DECL_NAME (tmp)) != SCOPE_REF)
1187 require_complete_type (tmp);
1188
1189 /* XXX handle attributes */
1190 type = finish_struct_1 (type, NULL_TREE, 0);
1191 }
1192 else
1193 {
1194 TYPE_SIZE (type) = integer_zero_node;
1195 CLASSTYPE_METHOD_VEC (type)
1196 = finish_struct_methods (type, TYPE_METHODS (type), 1);
1197 }
1198
1199 TYPE_BEING_DEFINED (type) = 0;
1200 popclass (0);
1201
1202 pop_from_top_level ();
1203 pop_tinst_level ();
1204
1205 return type;
1206 }
1207
1208 static int
1209 list_eq (t1, t2)
1210 tree t1, t2;
1211 {
1212 if (t1 == NULL_TREE)
1213 return t2 == NULL_TREE;
1214 if (t2 == NULL_TREE)
1215 return 0;
1216 /* Don't care if one declares its arg const and the other doesn't -- the
1217 main variant of the arg type is all that matters. */
1218 if (TYPE_MAIN_VARIANT (TREE_VALUE (t1))
1219 != TYPE_MAIN_VARIANT (TREE_VALUE (t2)))
1220 return 0;
1221 return list_eq (TREE_CHAIN (t1), TREE_CHAIN (t2));
1222 }
1223
1224 tree
1225 lookup_nested_type_by_name (ctype, name)
1226 tree ctype, name;
1227 {
1228 tree t;
1229
1230 complete_type (ctype);
1231
1232 for (t = CLASSTYPE_TAGS (ctype); t; t = TREE_CHAIN (t))
1233 {
1234 if (name == TREE_PURPOSE (t))
1235 return TREE_VALUE (t);
1236 }
1237 return NULL_TREE;
1238 }
1239
1240 tree
1241 tsubst (t, args, nargs, in_decl)
1242 tree t, *args;
1243 int nargs;
1244 tree in_decl;
1245 {
1246 tree type;
1247
1248 if (t == NULL_TREE || t == error_mark_node
1249 || t == integer_type_node
1250 || t == void_type_node
1251 || t == char_type_node)
1252 return t;
1253
1254 type = TREE_TYPE (t);
1255 if (type == unknown_type_node)
1256 my_friendly_abort (42);
1257 if (type && TREE_CODE (t) != FUNCTION_DECL)
1258 type = tsubst (type, args, nargs, in_decl);
1259
1260 switch (TREE_CODE (t))
1261 {
1262 case RECORD_TYPE:
1263 if (TYPE_PTRMEMFUNC_P (t))
1264 {
1265 tree r = build_ptrmemfunc_type
1266 (tsubst (TYPE_PTRMEMFUNC_FN_TYPE (t), args, nargs, in_decl));
1267 return cp_build_type_variant (r, TYPE_READONLY (t),
1268 TYPE_VOLATILE (t));
1269 }
1270
1271 /* else fall through */
1272 case UNION_TYPE:
1273 if (uses_template_parms (t))
1274 {
1275 tree argvec = tsubst (CLASSTYPE_TI_ARGS (t), args, nargs, in_decl);
1276 tree r = lookup_template_class (t, argvec, in_decl);
1277 return cp_build_type_variant (r, TYPE_READONLY (t),
1278 TYPE_VOLATILE (t));
1279 }
1280
1281 /* else fall through */
1282 case ERROR_MARK:
1283 case IDENTIFIER_NODE:
1284 case OP_IDENTIFIER:
1285 case VOID_TYPE:
1286 case REAL_TYPE:
1287 case BOOLEAN_TYPE:
1288 case INTEGER_CST:
1289 case REAL_CST:
1290 case STRING_CST:
1291 return t;
1292
1293 case ENUMERAL_TYPE:
1294 {
1295 tree ctx = tsubst (TYPE_CONTEXT (t), args, nargs, in_decl);
1296 if (ctx == NULL_TREE)
1297 return t;
1298 else
1299 return lookup_nested_type_by_name (ctx, TYPE_IDENTIFIER (t));
1300 }
1301
1302 case INTEGER_TYPE:
1303 if (t == integer_type_node)
1304 return t;
1305
1306 if (TREE_CODE (TYPE_MIN_VALUE (t)) == INTEGER_CST
1307 && TREE_CODE (TYPE_MAX_VALUE (t)) == INTEGER_CST)
1308 return t;
1309
1310 {
1311 tree max = tsubst_expr (TYPE_MAX_VALUE (t), args, nargs, in_decl);
1312 if (current_template_parms)
1313 {
1314 tree itype = make_node (INTEGER_TYPE);
1315 TYPE_MIN_VALUE (itype) = size_zero_node;
1316 TYPE_MAX_VALUE (itype) = max;
1317 return itype;
1318 }
1319 return build_index_2_type (size_zero_node, max);
1320 }
1321
1322 case TEMPLATE_TYPE_PARM:
1323 {
1324 tree arg = args[TEMPLATE_TYPE_IDX (t)];
1325 return cp_build_type_variant
1326 (arg, TYPE_READONLY (arg) || TYPE_READONLY (t),
1327 TYPE_VOLATILE (arg) || TYPE_VOLATILE (t));
1328 }
1329
1330 case TEMPLATE_CONST_PARM:
1331 return args[TEMPLATE_CONST_IDX (t)];
1332
1333 case FUNCTION_DECL:
1334 {
1335 tree r = NULL_TREE;
1336 tree arg_types, ctx;
1337
1338 int member;
1339
1340 if (DECL_CONTEXT (t) != NULL_TREE
1341 && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (t))) == 't')
1342 {
1343 if (DECL_NAME (t) == constructor_name (DECL_CONTEXT (t)))
1344 member = 2;
1345 else
1346 member = 1;
1347 ctx = tsubst (DECL_CLASS_CONTEXT (t), args, nargs, t);
1348 type = tsubst (type, args, nargs, in_decl);
1349 }
1350 else
1351 {
1352 member = 0;
1353 ctx = NULL_TREE;
1354 type = tsubst (type, args, nargs, in_decl);
1355 }
1356
1357 if (type == TREE_TYPE (t)
1358 && (! member || ctx == DECL_CLASS_CONTEXT (t)))
1359 return t;
1360
1361 /* Do we already have this instantiation? */
1362 if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
1363 {
1364 tree tmpl = TREE_PURPOSE (DECL_TEMPLATE_INFO (t));
1365 tree decls = DECL_TEMPLATE_INSTANTIATIONS (tmpl);
1366
1367 for (; decls; decls = TREE_CHAIN (decls))
1368 if (TREE_TYPE (TREE_VALUE (decls)) == type
1369 && DECL_CLASS_CONTEXT (TREE_VALUE (decls)) == ctx)
1370 return TREE_VALUE (decls);
1371 }
1372
1373 /* We do NOT check for matching decls pushed separately at this
1374 point, as they may not represent instantiations of this
1375 template, and in any case are considered separate under the
1376 discrete model. */
1377
1378 r = copy_node (t);
1379 copy_lang_decl (r);
1380 TREE_TYPE (r) = type;
1381
1382 DECL_CONTEXT (r)
1383 = tsubst (DECL_CONTEXT (t), args, nargs, t);
1384 DECL_CLASS_CONTEXT (r) = ctx;
1385
1386 if (member && !strncmp (OPERATOR_TYPENAME_FORMAT,
1387 IDENTIFIER_POINTER (DECL_NAME (r)),
1388 sizeof (OPERATOR_TYPENAME_FORMAT) - 1))
1389 {
1390 /* Type-conversion operator. Reconstruct the name, in
1391 case it's the name of one of the template's parameters. */
1392 DECL_NAME (r) = build_typename_overload (TREE_TYPE (type));
1393 }
1394
1395 arg_types = TYPE_VALUES (type);
1396
1397 if (member && TREE_CODE (type) == FUNCTION_TYPE)
1398 arg_types = hash_tree_chain
1399 (build_pointer_type (DECL_CONTEXT (r)), arg_types);
1400
1401 if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (t)))
1402 {
1403 char *buf, *dbuf = build_overload_name (ctx, 1, 1);
1404 int len = sizeof (DESTRUCTOR_DECL_PREFIX) - 1;
1405 buf = (char *) alloca (strlen (dbuf)
1406 + sizeof (DESTRUCTOR_DECL_PREFIX));
1407 bcopy (DESTRUCTOR_DECL_PREFIX, buf, len);
1408 buf[len] = '\0';
1409 strcat (buf, dbuf);
1410 DECL_ASSEMBLER_NAME (r) = get_identifier (buf);
1411 }
1412 else
1413 DECL_ASSEMBLER_NAME (r)
1414 = build_decl_overload (DECL_NAME (r), arg_types, member);
1415 DECL_RTL (r) = 0;
1416 make_decl_rtl (r, NULL_PTR, 1);
1417
1418 DECL_ARGUMENTS (r) = tsubst (DECL_ARGUMENTS (t), args, nargs, t);
1419 DECL_MAIN_VARIANT (r) = r;
1420 DECL_RESULT (r) = NULL_TREE;
1421 DECL_INITIAL (r) = NULL_TREE;
1422
1423 TREE_STATIC (r) = 0;
1424 TREE_PUBLIC (r) = 1;
1425 DECL_EXTERNAL (r) = 1;
1426 DECL_INTERFACE_KNOWN (r) = 0;
1427 DECL_DEFER_OUTPUT (r) = 0;
1428 TREE_CHAIN (r) = NULL_TREE;
1429 DECL_CHAIN (r) = NULL_TREE;
1430
1431 if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
1432 grok_op_properties (r, DECL_VIRTUAL_P (r), DECL_FRIEND_P (r));
1433
1434 /* Look for matching decls for the moment. */
1435 if (! member)
1436 {
1437 tree decls = lookup_name_nonclass (DECL_NAME (t));
1438 tree d = NULL_TREE;
1439
1440 if (decls == NULL_TREE)
1441 /* no match */;
1442 else if (is_overloaded_fn (decls))
1443 for (decls = get_first_fn (decls); decls;
1444 decls = DECL_CHAIN (decls))
1445 {
1446 if (TREE_CODE (decls) == FUNCTION_DECL
1447 && TREE_TYPE (decls) == type)
1448 {
1449 d = decls;
1450 break;
1451 }
1452 }
1453
1454 if (d)
1455 {
1456 int dcl_only = ! DECL_INITIAL (d);
1457 if (dcl_only)
1458 DECL_INITIAL (r) = error_mark_node;
1459 duplicate_decls (r, d);
1460 r = d;
1461 if (dcl_only)
1462 DECL_INITIAL (r) = 0;
1463 }
1464 }
1465
1466 if (DECL_TEMPLATE_INFO (t) != NULL_TREE)
1467 {
1468 tree tmpl = DECL_TI_TEMPLATE (t);
1469 tree *declsp = &DECL_TEMPLATE_INSTANTIATIONS (tmpl);
1470 tree argvec = tsubst (TREE_VALUE (DECL_TEMPLATE_INFO (t)),
1471 args, nargs, in_decl);
1472
1473 DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE);
1474 *declsp = perm_tree_cons (argvec, r, *declsp);
1475
1476 /* If we have a preexisting version of this function, don't expand
1477 the template version, use the other instead. */
1478 if (TREE_STATIC (r) || DECL_TEMPLATE_SPECIALIZATION (r))
1479 SET_DECL_TEMPLATE_SPECIALIZATION (r);
1480 else
1481 SET_DECL_IMPLICIT_INSTANTIATION (r);
1482
1483 DECL_TEMPLATE_INSTANTIATIONS (tmpl) =
1484 tree_cons (argvec, r, DECL_TEMPLATE_INSTANTIATIONS (tmpl));
1485 }
1486
1487 return r;
1488 }
1489
1490 case PARM_DECL:
1491 {
1492 tree r = copy_node (t);
1493 TREE_TYPE (r) = type;
1494 DECL_INITIAL (r) = TREE_TYPE (r);
1495 DECL_CONTEXT (r) = NULL_TREE;
1496 #ifdef PROMOTE_PROTOTYPES
1497 if ((TREE_CODE (type) == INTEGER_TYPE
1498 || TREE_CODE (type) == ENUMERAL_TYPE)
1499 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
1500 DECL_ARG_TYPE (r) = integer_type_node;
1501 #endif
1502 if (TREE_CHAIN (t))
1503 TREE_CHAIN (r) = tsubst (TREE_CHAIN (t), args, nargs, TREE_CHAIN (t));
1504 return r;
1505 }
1506
1507 case FIELD_DECL:
1508 {
1509 tree r = copy_node (t);
1510 TREE_TYPE (r) = type;
1511 copy_lang_decl (r);
1512 #if 0
1513 DECL_FIELD_CONTEXT (r) = tsubst (DECL_FIELD_CONTEXT (t), args, nargs, in_decl);
1514 #endif
1515 DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args, nargs, in_decl);
1516 TREE_CHAIN (r) = NULL_TREE;
1517 return r;
1518 }
1519
1520 case USING_DECL:
1521 {
1522 tree r = copy_node (t);
1523 DECL_INITIAL (r)
1524 = tsubst_copy (DECL_INITIAL (t), args, nargs, in_decl);
1525 TREE_CHAIN (r) = NULL_TREE;
1526 return r;
1527 }
1528
1529 case VAR_DECL:
1530 {
1531 tree r;
1532 tree ctx = tsubst_copy (DECL_CONTEXT (t), args, nargs, in_decl);
1533
1534 /* Do we already have this instantiation? */
1535 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
1536 {
1537 tree tmpl = DECL_TI_TEMPLATE (t);
1538 tree decls = DECL_TEMPLATE_INSTANTIATIONS (tmpl);
1539
1540 for (; decls; decls = TREE_CHAIN (decls))
1541 if (DECL_CONTEXT (TREE_VALUE (decls)) == ctx)
1542 return TREE_VALUE (decls);
1543 }
1544
1545 r = copy_node (t);
1546 TREE_TYPE (r) = type;
1547 DECL_CONTEXT (r) = ctx;
1548 if (TREE_STATIC (r))
1549 DECL_ASSEMBLER_NAME (r)
1550 = build_static_name (DECL_CONTEXT (r), DECL_NAME (r));
1551 DECL_INITIAL (r) = tsubst_expr
1552 (DECL_INITIAL (t), args, nargs, in_decl);
1553
1554 DECL_RTL (r) = 0;
1555 DECL_SIZE (r) = 0;
1556
1557 if (DECL_LANG_SPECIFIC (r))
1558 {
1559 copy_lang_decl (r);
1560 DECL_CLASS_CONTEXT (r) = DECL_CONTEXT (r);
1561 }
1562
1563 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
1564 {
1565 tree tmpl = DECL_TI_TEMPLATE (t);
1566 tree *declsp = &DECL_TEMPLATE_INSTANTIATIONS (tmpl);
1567 tree argvec = tsubst (TREE_VALUE (DECL_TEMPLATE_INFO (t)),
1568 args, nargs, in_decl);
1569
1570 DECL_TEMPLATE_INFO (r) = perm_tree_cons (tmpl, argvec, NULL_TREE);
1571 *declsp = perm_tree_cons (argvec, r, *declsp);
1572 SET_DECL_IMPLICIT_INSTANTIATION (r);
1573 }
1574 TREE_CHAIN (r) = NULL_TREE;
1575 return r;
1576 }
1577
1578 case TYPE_DECL:
1579 {
1580 tree r = copy_node (t);
1581 TREE_TYPE (r) = type;
1582 DECL_CONTEXT (r) = current_class_type;
1583 TREE_CHAIN (r) = NULL_TREE;
1584 return r;
1585 }
1586
1587 case TREE_LIST:
1588 {
1589 tree purpose, value, chain, result;
1590 int via_public, via_virtual, via_protected;
1591
1592 if (t == void_list_node)
1593 return t;
1594
1595 via_public = TREE_VIA_PUBLIC (t);
1596 via_protected = TREE_VIA_PROTECTED (t);
1597 via_virtual = TREE_VIA_VIRTUAL (t);
1598
1599 purpose = TREE_PURPOSE (t);
1600 if (purpose)
1601 purpose = tsubst (purpose, args, nargs, in_decl);
1602 value = TREE_VALUE (t);
1603 if (value)
1604 value = tsubst (value, args, nargs, in_decl);
1605 chain = TREE_CHAIN (t);
1606 if (chain && chain != void_type_node)
1607 chain = tsubst (chain, args, nargs, in_decl);
1608 if (purpose == TREE_PURPOSE (t)
1609 && value == TREE_VALUE (t)
1610 && chain == TREE_CHAIN (t))
1611 return t;
1612 result = hash_tree_cons (via_public, via_virtual, via_protected,
1613 purpose, value, chain);
1614 TREE_PARMLIST (result) = TREE_PARMLIST (t);
1615 return result;
1616 }
1617 case TREE_VEC:
1618 if (type != NULL_TREE)
1619 {
1620 t = copy_node (t);
1621
1622 if (type == TREE_TYPE (t))
1623 return t;
1624
1625 TREE_TYPE (t) = complete_type (type);
1626 BINFO_VTABLE (t) = TYPE_BINFO_VTABLE (type);
1627 BINFO_VIRTUALS (t) = TYPE_BINFO_VIRTUALS (type);
1628 if (TYPE_BINFO_BASETYPES (type) != NULL_TREE)
1629 BINFO_BASETYPES (t) = copy_node (TYPE_BINFO_BASETYPES (type));
1630
1631 return t;
1632 }
1633 {
1634 int len = TREE_VEC_LENGTH (t), need_new = 0, i;
1635 tree *elts = (tree *) alloca (len * sizeof (tree));
1636
1637 bzero ((char *) elts, len * sizeof (tree));
1638
1639 for (i = 0; i < len; i++)
1640 {
1641 elts[i] = tsubst_expr (TREE_VEC_ELT (t, i), args, nargs, in_decl);
1642 if (elts[i] != TREE_VEC_ELT (t, i))
1643 need_new = 1;
1644 }
1645
1646 if (!need_new)
1647 return t;
1648
1649 t = make_tree_vec (len);
1650 for (i = 0; i < len; i++)
1651 TREE_VEC_ELT (t, i) = elts[i];
1652
1653 return t;
1654 }
1655 case POINTER_TYPE:
1656 case REFERENCE_TYPE:
1657 {
1658 tree r;
1659 enum tree_code code;
1660 if (type == TREE_TYPE (t))
1661 return t;
1662
1663 code = TREE_CODE (t);
1664 if (code == POINTER_TYPE)
1665 r = build_pointer_type (type);
1666 else
1667 r = build_reference_type (type);
1668 r = cp_build_type_variant (r, TYPE_READONLY (t), TYPE_VOLATILE (t));
1669 /* Will this ever be needed for TYPE_..._TO values? */
1670 layout_type (r);
1671 return r;
1672 }
1673 case OFFSET_TYPE:
1674 return build_offset_type
1675 (tsubst (TYPE_OFFSET_BASETYPE (t), args, nargs, in_decl), type);
1676 case FUNCTION_TYPE:
1677 case METHOD_TYPE:
1678 {
1679 tree values = TYPE_ARG_TYPES (t);
1680 tree context = TYPE_CONTEXT (t);
1681 tree new_value;
1682
1683 /* Don't bother recursing if we know it won't change anything. */
1684 if (values != void_list_node)
1685 {
1686 /* This should probably be rewritten to use hash_tree_cons for
1687 the memory savings. */
1688 tree first = NULL_TREE;
1689 tree last;
1690
1691 for (; values && values != void_list_node;
1692 values = TREE_CHAIN (values))
1693 {
1694 tree value
1695 = tsubst (TREE_VALUE (values), args, nargs, in_decl);
1696 tree purpose = tsubst_expr (TREE_PURPOSE (values),
1697 args, nargs, in_decl);
1698 tree x = build_tree_list (purpose, value);
1699
1700 if (first)
1701 TREE_CHAIN (last) = x;
1702 else
1703 first = x;
1704 last = x;
1705 }
1706
1707 if (values == void_list_node)
1708 TREE_CHAIN (last) = void_list_node;
1709
1710 values = first;
1711 }
1712 if (context)
1713 context = tsubst (context, args, nargs, in_decl);
1714 /* Could also optimize cases where return value and
1715 values have common elements (e.g., T min(const &T, const T&). */
1716
1717 /* If the above parameters haven't changed, just return the type. */
1718 if (type == TREE_TYPE (t)
1719 && values == TYPE_VALUES (t)
1720 && context == TYPE_CONTEXT (t))
1721 return t;
1722
1723 /* Construct a new type node and return it. */
1724 if (TREE_CODE (t) == FUNCTION_TYPE
1725 && context == NULL_TREE)
1726 {
1727 new_value = build_function_type (type, values);
1728 }
1729 else if (context == NULL_TREE)
1730 {
1731 tree base = tsubst (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))),
1732 args, nargs, in_decl);
1733 new_value = build_cplus_method_type (base, type,
1734 TREE_CHAIN (values));
1735 }
1736 else
1737 {
1738 new_value = make_node (TREE_CODE (t));
1739 TREE_TYPE (new_value) = type;
1740 TYPE_CONTEXT (new_value) = context;
1741 TYPE_VALUES (new_value) = values;
1742 TYPE_SIZE (new_value) = TYPE_SIZE (t);
1743 TYPE_ALIGN (new_value) = TYPE_ALIGN (t);
1744 TYPE_MODE (new_value) = TYPE_MODE (t);
1745 if (TYPE_METHOD_BASETYPE (t))
1746 TYPE_METHOD_BASETYPE (new_value) = tsubst (TYPE_METHOD_BASETYPE (t),
1747 args, nargs, in_decl);
1748 /* Need to generate hash value. */
1749 my_friendly_abort (84);
1750 }
1751 new_value = build_type_variant (new_value,
1752 TYPE_READONLY (t),
1753 TYPE_VOLATILE (t));
1754 return new_value;
1755 }
1756 case ARRAY_TYPE:
1757 {
1758 tree domain = tsubst (TYPE_DOMAIN (t), args, nargs, in_decl);
1759 tree r;
1760 if (type == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
1761 return t;
1762 r = build_cplus_array_type (type, domain);
1763 return r;
1764 }
1765
1766 case PLUS_EXPR:
1767 case MINUS_EXPR:
1768 return fold (build (TREE_CODE (t), TREE_TYPE (t),
1769 tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
1770 tsubst (TREE_OPERAND (t, 1), args, nargs, in_decl)));
1771
1772 case NEGATE_EXPR:
1773 case NOP_EXPR:
1774 return fold (build1 (TREE_CODE (t), TREE_TYPE (t),
1775 tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl)));
1776
1777 case TYPENAME_TYPE:
1778 {
1779 tree ctx = tsubst (TYPE_CONTEXT (t), args, nargs, in_decl);
1780 tree f = make_typename_type (ctx, TYPE_IDENTIFIER (t));
1781 return cp_build_type_variant
1782 (f, TYPE_READONLY (f) || TYPE_READONLY (t),
1783 TYPE_VOLATILE (f) || TYPE_VOLATILE (t));
1784 }
1785
1786 case INDIRECT_REF:
1787 return make_pointer_declarator
1788 (type, tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl));
1789
1790 case ADDR_EXPR:
1791 return make_reference_declarator
1792 (type, tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl));
1793
1794 case ARRAY_REF:
1795 return build_parse_node
1796 (ARRAY_REF, tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
1797 tsubst_expr (TREE_OPERAND (t, 1), args, nargs, in_decl));
1798
1799 case CALL_EXPR:
1800 return build_parse_node
1801 (CALL_EXPR, tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
1802 tsubst (TREE_OPERAND (t, 1), args, nargs, in_decl), 0);
1803
1804 case SCOPE_REF:
1805 return build_parse_node
1806 (TREE_CODE (t), tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
1807 tsubst (TREE_OPERAND (t, 1), args, nargs, in_decl));
1808
1809 default:
1810 sorry ("use of `%s' in template",
1811 tree_code_name [(int) TREE_CODE (t)]);
1812 return error_mark_node;
1813 }
1814 }
1815
1816 void
1817 do_pushlevel ()
1818 {
1819 emit_line_note (input_filename, lineno);
1820 pushlevel (0);
1821 clear_last_expr ();
1822 push_momentary ();
1823 expand_start_bindings (0);
1824 }
1825
1826 tree
1827 do_poplevel ()
1828 {
1829 tree t;
1830
1831 expand_end_bindings (getdecls (), kept_level_p (), 1);
1832 t = poplevel (kept_level_p (), 1, 0);
1833 pop_momentary ();
1834 return t;
1835 }
1836
1837 tree
1838 tsubst_copy (t, args, nargs, in_decl)
1839 tree t, *args;
1840 int nargs;
1841 tree in_decl;
1842 {
1843 enum tree_code code;
1844
1845 if (t == NULL_TREE || t == error_mark_node)
1846 return t;
1847
1848 code = TREE_CODE (t);
1849
1850 switch (code)
1851 {
1852 case PARM_DECL:
1853 return do_identifier (DECL_NAME (t), 0);
1854
1855 case CONST_DECL:
1856 case FIELD_DECL:
1857 if (DECL_CONTEXT (t))
1858 {
1859 tree ctx = tsubst (DECL_CONTEXT (t), args, nargs, in_decl);
1860 if (ctx != DECL_CONTEXT (t))
1861 return lookup_field (ctx, DECL_NAME (t), 0, 0);
1862 }
1863 return t;
1864
1865 case VAR_DECL:
1866 case FUNCTION_DECL:
1867 if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t))
1868 t = tsubst (t, args, nargs, in_decl);
1869 mark_used (t);
1870 return t;
1871
1872 #if 0
1873 case IDENTIFIER_NODE:
1874 return do_identifier (t, 0);
1875 #endif
1876
1877 case CAST_EXPR:
1878 case REINTERPRET_CAST_EXPR:
1879 return build1
1880 (code, tsubst (TREE_TYPE (t), args, nargs, in_decl),
1881 tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl));
1882
1883 case INDIRECT_REF:
1884 case PREDECREMENT_EXPR:
1885 case PREINCREMENT_EXPR:
1886 case POSTDECREMENT_EXPR:
1887 case POSTINCREMENT_EXPR:
1888 case NEGATE_EXPR:
1889 case TRUTH_NOT_EXPR:
1890 case ADDR_EXPR:
1891 case CONVERT_EXPR: /* Unary + */
1892 case SIZEOF_EXPR:
1893 case ARROW_EXPR:
1894 case THROW_EXPR:
1895 return build1
1896 (code, NULL_TREE,
1897 tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl));
1898
1899 case PLUS_EXPR:
1900 case MINUS_EXPR:
1901 case MULT_EXPR:
1902 case TRUNC_DIV_EXPR:
1903 case CEIL_DIV_EXPR:
1904 case FLOOR_DIV_EXPR:
1905 case ROUND_DIV_EXPR:
1906 case EXACT_DIV_EXPR:
1907 case BIT_AND_EXPR:
1908 case BIT_ANDTC_EXPR:
1909 case BIT_IOR_EXPR:
1910 case BIT_XOR_EXPR:
1911 case TRUNC_MOD_EXPR:
1912 case FLOOR_MOD_EXPR:
1913 case TRUTH_ANDIF_EXPR:
1914 case TRUTH_ORIF_EXPR:
1915 case TRUTH_AND_EXPR:
1916 case TRUTH_OR_EXPR:
1917 case RSHIFT_EXPR:
1918 case LSHIFT_EXPR:
1919 case RROTATE_EXPR:
1920 case LROTATE_EXPR:
1921 case EQ_EXPR:
1922 case NE_EXPR:
1923 case MAX_EXPR:
1924 case MIN_EXPR:
1925 case LE_EXPR:
1926 case GE_EXPR:
1927 case LT_EXPR:
1928 case GT_EXPR:
1929 case COMPONENT_REF:
1930 case ARRAY_REF:
1931 case COMPOUND_EXPR:
1932 case SCOPE_REF:
1933 case DOTSTAR_EXPR:
1934 case MEMBER_REF:
1935 return build_nt
1936 (code, tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl),
1937 tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl));
1938
1939 case CALL_EXPR:
1940 {
1941 tree fn = TREE_OPERAND (t, 0);
1942 if (really_overloaded_fn (fn))
1943 fn = tsubst_copy (TREE_VALUE (fn), args, nargs, in_decl);
1944 else
1945 fn = tsubst_copy (fn, args, nargs, in_decl);
1946 return build_nt
1947 (code, fn, tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl),
1948 NULL_TREE);
1949 }
1950
1951 case METHOD_CALL_EXPR:
1952 {
1953 tree name = TREE_OPERAND (t, 0);
1954 if (TREE_CODE (name) == BIT_NOT_EXPR)
1955 {
1956 name = tsubst_copy (TREE_OPERAND (name, 0), args, nargs, in_decl);
1957 name = build1 (BIT_NOT_EXPR, NULL_TREE, TYPE_MAIN_VARIANT (name));
1958 }
1959 else if (TREE_CODE (name) == SCOPE_REF
1960 && TREE_CODE (TREE_OPERAND (name, 1)) == BIT_NOT_EXPR)
1961 {
1962 tree base = tsubst_copy (TREE_OPERAND (name, 0), args, nargs, in_decl);
1963 name = TREE_OPERAND (name, 1);
1964 name = tsubst_copy (TREE_OPERAND (name, 0), args, nargs, in_decl);
1965 name = build1 (BIT_NOT_EXPR, NULL_TREE, TYPE_MAIN_VARIANT (name));
1966 name = build_nt (SCOPE_REF, base, name);
1967 }
1968 else
1969 name = tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl);
1970 return build_nt
1971 (code, name, tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl),
1972 tsubst_copy (TREE_OPERAND (t, 2), args, nargs, in_decl),
1973 NULL_TREE);
1974 }
1975
1976 case COND_EXPR:
1977 case MODOP_EXPR:
1978 return build_nt
1979 (code, tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl),
1980 tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl),
1981 tsubst_copy (TREE_OPERAND (t, 2), args, nargs, in_decl));
1982
1983 case NEW_EXPR:
1984 {
1985 tree r = build_nt
1986 (code, tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl),
1987 tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl),
1988 tsubst_copy (TREE_OPERAND (t, 2), args, nargs, in_decl));
1989 NEW_EXPR_USE_GLOBAL (r) = NEW_EXPR_USE_GLOBAL (t);
1990 return r;
1991 }
1992
1993 case DELETE_EXPR:
1994 {
1995 tree r = build_nt
1996 (code, tsubst_copy (TREE_OPERAND (t, 0), args, nargs, in_decl),
1997 tsubst_copy (TREE_OPERAND (t, 1), args, nargs, in_decl));
1998 DELETE_EXPR_USE_GLOBAL (r) = DELETE_EXPR_USE_GLOBAL (t);
1999 DELETE_EXPR_USE_VEC (r) = DELETE_EXPR_USE_VEC (t);
2000 return r;
2001 }
2002
2003 case TREE_LIST:
2004 {
2005 tree purpose, value, chain;
2006
2007 if (t == void_list_node)
2008 return t;
2009
2010 purpose = TREE_PURPOSE (t);
2011 if (purpose)
2012 purpose = tsubst_copy (purpose, args, nargs, in_decl);
2013 value = TREE_VALUE (t);
2014 if (value)
2015 value = tsubst_copy (value, args, nargs, in_decl);
2016 chain = TREE_CHAIN (t);
2017 if (chain && chain != void_type_node)
2018 chain = tsubst_copy (chain, args, nargs, in_decl);
2019 if (purpose == TREE_PURPOSE (t)
2020 && value == TREE_VALUE (t)
2021 && chain == TREE_CHAIN (t))
2022 return t;
2023 return tree_cons (purpose, value, chain);
2024 }
2025
2026 case RECORD_TYPE:
2027 case UNION_TYPE:
2028 case ENUMERAL_TYPE:
2029 case INTEGER_TYPE:
2030 case TEMPLATE_TYPE_PARM:
2031 case TEMPLATE_CONST_PARM:
2032 case POINTER_TYPE:
2033 case REFERENCE_TYPE:
2034 case OFFSET_TYPE:
2035 case FUNCTION_TYPE:
2036 case METHOD_TYPE:
2037 case ARRAY_TYPE:
2038 case TYPENAME_TYPE:
2039 return tsubst (t, args, nargs, in_decl);
2040
2041 default:
2042 return t;
2043 }
2044 }
2045
2046 tree
2047 tsubst_expr (t, args, nargs, in_decl)
2048 tree t, *args;
2049 int nargs;
2050 tree in_decl;
2051 {
2052 if (t == NULL_TREE || t == error_mark_node)
2053 return t;
2054
2055 if (current_template_parms)
2056 return tsubst_copy (t, args, nargs, in_decl);
2057
2058 switch (TREE_CODE (t))
2059 {
2060 case RETURN_STMT:
2061 lineno = TREE_COMPLEXITY (t);
2062 emit_line_note (input_filename, lineno);
2063 c_expand_return
2064 (tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl));
2065 finish_stmt ();
2066 break;
2067
2068 case EXPR_STMT:
2069 lineno = TREE_COMPLEXITY (t);
2070 emit_line_note (input_filename, lineno);
2071 t = tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl);
2072 /* Do default conversion if safe and possibly important,
2073 in case within ({...}). */
2074 if ((TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE && lvalue_p (t))
2075 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
2076 t = default_conversion (t);
2077 cplus_expand_expr_stmt (t);
2078 clear_momentary ();
2079 finish_stmt ();
2080 break;
2081
2082 case DECL_STMT:
2083 {
2084 int i = suspend_momentary ();
2085 tree dcl, init;
2086
2087 lineno = TREE_COMPLEXITY (t);
2088 emit_line_note (input_filename, lineno);
2089 dcl = start_decl
2090 (tsubst (TREE_OPERAND (t, 0), args, nargs, in_decl),
2091 tsubst (TREE_OPERAND (t, 1), args, nargs, in_decl),
2092 TREE_OPERAND (t, 3) != 0,
2093 tsubst (TREE_OPERAND (t, 2), args, nargs, in_decl));
2094 init = tsubst_expr (TREE_OPERAND (t, 3), args, nargs, in_decl);
2095 cp_finish_decl
2096 (dcl, init, NULL_TREE, 1, init ? LOOKUP_ONLYCONVERTING : 0);
2097 resume_momentary (i);
2098 return dcl;
2099 }
2100
2101 case FOR_STMT:
2102 {
2103 tree tmp;
2104 int init_scope = (flag_new_for_scope > 0 && TREE_OPERAND (t, 0)
2105 && TREE_CODE (TREE_OPERAND (t, 0)) == DECL_STMT);
2106 int cond_scope = (TREE_OPERAND (t, 1)
2107 && TREE_CODE (TREE_OPERAND (t, 1)) == DECL_STMT);
2108
2109 lineno = TREE_COMPLEXITY (t);
2110 emit_line_note (input_filename, lineno);
2111 if (init_scope)
2112 do_pushlevel ();
2113 for (tmp = TREE_OPERAND (t, 0); tmp; tmp = TREE_CHAIN (tmp))
2114 tsubst_expr (tmp, args, nargs, in_decl);
2115 emit_nop ();
2116 emit_line_note (input_filename, lineno);
2117 expand_start_loop_continue_elsewhere (1);
2118
2119 if (cond_scope)
2120 do_pushlevel ();
2121 tmp = tsubst_expr (TREE_OPERAND (t, 1), args, nargs, in_decl);
2122 emit_line_note (input_filename, lineno);
2123 if (tmp)
2124 expand_exit_loop_if_false (0, condition_conversion (tmp));
2125
2126 if (! cond_scope)
2127 do_pushlevel ();
2128 tsubst_expr (TREE_OPERAND (t, 3), args, nargs, in_decl);
2129 do_poplevel ();
2130
2131 emit_line_note (input_filename, lineno);
2132 expand_loop_continue_here ();
2133 tmp = tsubst_expr (TREE_OPERAND (t, 2), args, nargs, in_decl);
2134 if (tmp)
2135 cplus_expand_expr_stmt (tmp);
2136
2137 expand_end_loop ();
2138 if (init_scope)
2139 do_poplevel ();
2140 finish_stmt ();
2141 }
2142 break;
2143
2144 case WHILE_STMT:
2145 {
2146 tree cond;
2147
2148 lineno = TREE_COMPLEXITY (t);
2149 emit_nop ();
2150 emit_line_note (input_filename, lineno);
2151 expand_start_loop (1);
2152
2153 cond = TREE_OPERAND (t, 0);
2154 if (TREE_CODE (cond) == DECL_STMT)
2155 do_pushlevel ();
2156 cond = tsubst_expr (cond, args, nargs, in_decl);
2157 emit_line_note (input_filename, lineno);
2158 expand_exit_loop_if_false (0, condition_conversion (cond));
2159
2160 if (TREE_CODE (TREE_OPERAND (t, 0)) != DECL_STMT)
2161 do_pushlevel ();
2162 tsubst_expr (TREE_OPERAND (t, 1), args, nargs, in_decl);
2163 do_poplevel ();
2164
2165 expand_end_loop ();
2166 finish_stmt ();
2167 }
2168 break;
2169
2170 case DO_STMT:
2171 {
2172 tree cond;
2173
2174 lineno = TREE_COMPLEXITY (t);
2175 emit_nop ();
2176 emit_line_note (input_filename, lineno);
2177 expand_start_loop_continue_elsewhere (1);
2178
2179 tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl);
2180 expand_loop_continue_here ();
2181
2182 cond = tsubst_expr (TREE_OPERAND (t, 1), args, nargs, in_decl);
2183 emit_line_note (input_filename, lineno);
2184 expand_exit_loop_if_false (0, condition_conversion (cond));
2185 expand_end_loop ();
2186
2187 clear_momentary ();
2188 finish_stmt ();
2189 }
2190 break;
2191
2192 case IF_STMT:
2193 {
2194 tree tmp;
2195 int cond_scope = (TREE_CODE (TREE_OPERAND (t, 0)) == DECL_STMT);
2196
2197 lineno = TREE_COMPLEXITY (t);
2198 if (cond_scope)
2199 do_pushlevel ();
2200 tmp = tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl);
2201 emit_line_note (input_filename, lineno);
2202 expand_start_cond (condition_conversion (tmp), 0);
2203
2204 if (tmp = TREE_OPERAND (t, 1), tmp)
2205 tsubst_expr (tmp, args, nargs, in_decl);
2206
2207 if (tmp = TREE_OPERAND (t, 2), tmp)
2208 {
2209 expand_start_else ();
2210 tsubst_expr (tmp, args, nargs, in_decl);
2211 }
2212
2213 expand_end_cond ();
2214
2215 if (cond_scope)
2216 do_poplevel ();
2217
2218 finish_stmt ();
2219 }
2220 break;
2221
2222 case COMPOUND_STMT:
2223 {
2224 tree substmt = TREE_OPERAND (t, 0);
2225
2226 lineno = TREE_COMPLEXITY (t);
2227
2228 if (COMPOUND_STMT_NO_SCOPE (t) == 0)
2229 do_pushlevel ();
2230
2231 for (; substmt; substmt = TREE_CHAIN (substmt))
2232 tsubst_expr (substmt, args, nargs, in_decl);
2233
2234 if (COMPOUND_STMT_NO_SCOPE (t) == 0)
2235 do_poplevel ();
2236 }
2237 break;
2238
2239 case BREAK_STMT:
2240 lineno = TREE_COMPLEXITY (t);
2241 emit_line_note (input_filename, lineno);
2242 if (! expand_exit_something ())
2243 error ("break statement not within loop or switch");
2244 break;
2245
2246 case SWITCH_STMT:
2247 {
2248 tree val, tmp;
2249 int cond_scope = (TREE_CODE (TREE_OPERAND (t, 0)) == DECL_STMT);
2250
2251 lineno = TREE_COMPLEXITY (t);
2252 if (cond_scope)
2253 do_pushlevel ();
2254 val = tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl);
2255 emit_line_note (input_filename, lineno);
2256 c_expand_start_case (val);
2257 push_switch ();
2258
2259 if (tmp = TREE_OPERAND (t, 1), tmp)
2260 tsubst_expr (tmp, args, nargs, in_decl);
2261
2262 expand_end_case (val);
2263 pop_switch ();
2264
2265 if (cond_scope)
2266 do_poplevel ();
2267
2268 finish_stmt ();
2269 }
2270 break;
2271
2272 case CASE_LABEL:
2273 do_case (tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl),
2274 tsubst_expr (TREE_OPERAND (t, 1), args, nargs, in_decl));
2275 break;
2276
2277 case LABEL_DECL:
2278 t = define_label (DECL_SOURCE_FILE (t), DECL_SOURCE_LINE (t),
2279 DECL_NAME (t));
2280 if (t)
2281 expand_label (t);
2282 break;
2283
2284 case GOTO_STMT:
2285 lineno = TREE_COMPLEXITY (t);
2286 emit_line_note (input_filename, lineno);
2287 if (TREE_CODE (TREE_OPERAND (t, 0)) == IDENTIFIER_NODE)
2288 {
2289 tree decl = lookup_label (TREE_OPERAND (t, 0));
2290 TREE_USED (decl) = 1;
2291 expand_goto (decl);
2292 }
2293 else
2294 expand_computed_goto
2295 (tsubst_expr (TREE_OPERAND (t, 0), args, nargs, in_decl));
2296 break;
2297
2298 default:
2299 return build_expr_from_tree (tsubst_copy (t, args, nargs, in_decl));
2300 }
2301 return NULL_TREE;
2302 }
2303
2304 tree
2305 instantiate_template (tmpl, targ_ptr)
2306 tree tmpl, *targ_ptr;
2307 {
2308 tree fndecl;
2309 int i, len;
2310 struct obstack *old_fmp_obstack;
2311 extern struct obstack *function_maybepermanent_obstack;
2312
2313 push_obstacks (&permanent_obstack, &permanent_obstack);
2314 old_fmp_obstack = function_maybepermanent_obstack;
2315 function_maybepermanent_obstack = &permanent_obstack;
2316
2317 my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 283);
2318 len = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (tmpl));
2319
2320 i = len;
2321 while (i--)
2322 {
2323 tree t = targ_ptr [i];
2324 if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
2325 {
2326 tree nt = target_type (t);
2327 if (IS_AGGR_TYPE (nt) && decl_function_context (TYPE_MAIN_DECL (nt)))
2328 {
2329 cp_error ("type `%T' composed from a local class is not a valid template-argument", t);
2330 cp_error (" trying to instantiate `%D'", tmpl);
2331 fndecl = error_mark_node;
2332 goto out;
2333 }
2334 }
2335 targ_ptr[i] = copy_to_permanent (t);
2336 }
2337
2338 /* substitute template parameters */
2339 fndecl = tsubst (DECL_RESULT (tmpl), targ_ptr, len, tmpl);
2340
2341 out:
2342 function_maybepermanent_obstack = old_fmp_obstack;
2343 pop_obstacks ();
2344
2345 return fndecl;
2346 }
2347
2348 /* Push the name of the class template into the scope of the instantiation. */
2349
2350 void
2351 overload_template_name (type)
2352 tree type;
2353 {
2354 tree id = DECL_NAME (CLASSTYPE_TI_TEMPLATE (type));
2355 tree decl;
2356
2357 if (IDENTIFIER_CLASS_VALUE (id)
2358 && TREE_TYPE (IDENTIFIER_CLASS_VALUE (id)) == type)
2359 return;
2360
2361 decl = build_decl (TYPE_DECL, id, type);
2362 SET_DECL_ARTIFICIAL (decl);
2363 pushdecl_class_level (decl);
2364 }
2365
2366 /* Type unification.
2367
2368 We have a function template signature with one or more references to
2369 template parameters, and a parameter list we wish to fit to this
2370 template. If possible, produce a list of parameters for the template
2371 which will cause it to fit the supplied parameter list.
2372
2373 Return zero for success, 2 for an incomplete match that doesn't resolve
2374 all the types, and 1 for complete failure. An error message will be
2375 printed only for an incomplete match.
2376
2377 TPARMS[NTPARMS] is an array of template parameter types;
2378 TARGS[NTPARMS] is the array of template parameter values. PARMS is
2379 the function template's signature (using TEMPLATE_PARM_IDX nodes),
2380 and ARGS is the argument list we're trying to match against it.
2381
2382 If SUBR is 1, we're being called recursively (to unify the arguments of
2383 a function or method parameter of a function template), so don't zero
2384 out targs and don't fail on an incomplete match. */
2385
2386 int
2387 type_unification (tparms, targs, parms, args, nsubsts, subr)
2388 tree tparms, *targs, parms, args;
2389 int *nsubsts, subr;
2390 {
2391 tree parm, arg;
2392 int i;
2393 int ntparms = TREE_VEC_LENGTH (tparms);
2394
2395 my_friendly_assert (TREE_CODE (tparms) == TREE_VEC, 289);
2396 my_friendly_assert (TREE_CODE (parms) == TREE_LIST, 290);
2397 /* ARGS could be NULL (via a call from parse.y to
2398 build_x_function_call). */
2399 if (args)
2400 my_friendly_assert (TREE_CODE (args) == TREE_LIST, 291);
2401 my_friendly_assert (ntparms > 0, 292);
2402
2403 if (!subr)
2404 bzero ((char *) targs, sizeof (tree) * ntparms);
2405
2406 while (parms
2407 && parms != void_list_node
2408 && args
2409 && args != void_list_node)
2410 {
2411 parm = TREE_VALUE (parms);
2412 parms = TREE_CHAIN (parms);
2413 arg = TREE_VALUE (args);
2414 args = TREE_CHAIN (args);
2415
2416 if (arg == error_mark_node)
2417 return 1;
2418 if (arg == unknown_type_node)
2419 return 1;
2420
2421 if (! uses_template_parms (parm)
2422 && TREE_CODE_CLASS (TREE_CODE (arg)) != 't')
2423 {
2424 if (can_convert_arg (parm, TREE_TYPE (arg), arg))
2425 continue;
2426 return 1;
2427 }
2428
2429 #if 0
2430 if (TREE_CODE (arg) == VAR_DECL)
2431 arg = TREE_TYPE (arg);
2432 else if (TREE_CODE_CLASS (TREE_CODE (arg)) == 'e')
2433 arg = TREE_TYPE (arg);
2434 #else
2435 if (TREE_CODE_CLASS (TREE_CODE (arg)) != 't')
2436 {
2437 my_friendly_assert (TREE_TYPE (arg) != NULL_TREE, 293);
2438 if (TREE_CODE (arg) == TREE_LIST
2439 && TREE_TYPE (arg) == unknown_type_node
2440 && TREE_CODE (TREE_VALUE (arg)) == TEMPLATE_DECL)
2441 {
2442 int nsubsts, ntparms;
2443 tree *targs;
2444
2445 /* Have to back unify here */
2446 arg = TREE_VALUE (arg);
2447 nsubsts = 0;
2448 ntparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (arg));
2449 targs = (tree *) alloca (sizeof (tree) * ntparms);
2450 parm = tree_cons (NULL_TREE, parm, NULL_TREE);
2451 return type_unification (DECL_TEMPLATE_PARMS (arg), targs,
2452 TYPE_ARG_TYPES (TREE_TYPE (arg)),
2453 parm, &nsubsts, 0);
2454 }
2455 arg = TREE_TYPE (arg);
2456 }
2457 #endif
2458 if (TREE_CODE (arg) == REFERENCE_TYPE)
2459 arg = TREE_TYPE (arg);
2460
2461 if (TREE_CODE (parm) != REFERENCE_TYPE)
2462 {
2463 if (TREE_CODE (arg) == FUNCTION_TYPE
2464 || TREE_CODE (arg) == METHOD_TYPE)
2465 arg = build_pointer_type (arg);
2466 else if (TREE_CODE (arg) == ARRAY_TYPE)
2467 arg = build_pointer_type (TREE_TYPE (arg));
2468 else
2469 arg = TYPE_MAIN_VARIANT (arg);
2470 }
2471
2472 switch (unify (tparms, targs, ntparms, parm, arg, nsubsts))
2473 {
2474 case 0:
2475 break;
2476 case 1:
2477 return 1;
2478 }
2479 }
2480 /* Fail if we've reached the end of the parm list, and more args
2481 are present, and the parm list isn't variadic. */
2482 if (args && args != void_list_node && parms == void_list_node)
2483 return 1;
2484 /* Fail if parms are left and they don't have default values. */
2485 if (parms
2486 && parms != void_list_node
2487 && TREE_PURPOSE (parms) == NULL_TREE)
2488 return 1;
2489 if (!subr)
2490 for (i = 0; i < ntparms; i++)
2491 if (!targs[i])
2492 {
2493 error ("incomplete type unification");
2494 return 2;
2495 }
2496 return 0;
2497 }
2498
2499 /* Tail recursion is your friend. */
2500 static int
2501 unify (tparms, targs, ntparms, parm, arg, nsubsts)
2502 tree tparms, *targs, parm, arg;
2503 int *nsubsts, ntparms;
2504 {
2505 int idx;
2506
2507 /* I don't think this will do the right thing with respect to types.
2508 But the only case I've seen it in so far has been array bounds, where
2509 signedness is the only information lost, and I think that will be
2510 okay. */
2511 while (TREE_CODE (parm) == NOP_EXPR)
2512 parm = TREE_OPERAND (parm, 0);
2513
2514 if (arg == error_mark_node)
2515 return 1;
2516 if (arg == unknown_type_node)
2517 return 1;
2518 if (arg == parm)
2519 return 0;
2520
2521 switch (TREE_CODE (parm))
2522 {
2523 case TEMPLATE_TYPE_PARM:
2524 (*nsubsts)++;
2525 idx = TEMPLATE_TYPE_IDX (parm);
2526 #if 0
2527 /* Template type parameters cannot contain cv-quals; i.e.
2528 template <class T> void f (T& a, T& b) will not generate
2529 void f (const int& a, const int& b). */
2530 if (TYPE_READONLY (arg) > TYPE_READONLY (parm)
2531 || TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm))
2532 return 1;
2533 arg = TYPE_MAIN_VARIANT (arg);
2534 #else
2535 {
2536 int constp = TYPE_READONLY (arg) > TYPE_READONLY (parm);
2537 int volatilep = TYPE_VOLATILE (arg) > TYPE_VOLATILE (parm);
2538 arg = cp_build_type_variant (arg, constp, volatilep);
2539 }
2540 #endif
2541 /* Simple cases: Value already set, does match or doesn't. */
2542 if (targs[idx] == arg)
2543 return 0;
2544 else if (targs[idx])
2545 return 1;
2546 /* Check for mixed types and values. */
2547 if (TREE_CODE (TREE_VALUE (TREE_VEC_ELT (tparms, idx))) != TYPE_DECL)
2548 return 1;
2549 targs[idx] = arg;
2550 return 0;
2551 case TEMPLATE_CONST_PARM:
2552 (*nsubsts)++;
2553 idx = TEMPLATE_CONST_IDX (parm);
2554 if (targs[idx] == arg)
2555 return 0;
2556 else if (targs[idx])
2557 {
2558 tree t = targs[idx];
2559 if (TREE_CODE (t) == TREE_CODE (arg))
2560 switch (TREE_CODE (arg))
2561 {
2562 case INTEGER_CST:
2563 if (tree_int_cst_equal (t, arg))
2564 return 0;
2565 break;
2566 case REAL_CST:
2567 if (REAL_VALUES_EQUAL (TREE_REAL_CST (t), TREE_REAL_CST (arg)))
2568 return 0;
2569 break;
2570 /* STRING_CST values are not valid template const parms. */
2571 default:
2572 ;
2573 }
2574 my_friendly_abort (87);
2575 return 1;
2576 }
2577 /* else if (typeof arg != tparms[idx])
2578 return 1;*/
2579
2580 targs[idx] = copy_to_permanent (arg);
2581 return 0;
2582
2583 case POINTER_TYPE:
2584 if (TREE_CODE (arg) != POINTER_TYPE)
2585 return 1;
2586 return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
2587 nsubsts);
2588
2589 case REFERENCE_TYPE:
2590 if (TREE_CODE (arg) == REFERENCE_TYPE)
2591 arg = TREE_TYPE (arg);
2592 return unify (tparms, targs, ntparms, TREE_TYPE (parm), arg, nsubsts);
2593
2594 case ARRAY_TYPE:
2595 if (TREE_CODE (arg) != ARRAY_TYPE)
2596 return 1;
2597 if (unify (tparms, targs, ntparms, TYPE_DOMAIN (parm), TYPE_DOMAIN (arg),
2598 nsubsts) != 0)
2599 return 1;
2600 return unify (tparms, targs, ntparms, TREE_TYPE (parm), TREE_TYPE (arg),
2601 nsubsts);
2602
2603 case REAL_TYPE:
2604 case INTEGER_TYPE:
2605 if (TREE_CODE (arg) != TREE_CODE (parm))
2606 return 1;
2607
2608 if (TREE_CODE (parm) == INTEGER_TYPE)
2609 {
2610 if (TYPE_MIN_VALUE (parm) && TYPE_MIN_VALUE (arg)
2611 && unify (tparms, targs, ntparms,
2612 TYPE_MIN_VALUE (parm), TYPE_MIN_VALUE (arg), nsubsts))
2613 return 1;
2614 if (TYPE_MAX_VALUE (parm) && TYPE_MAX_VALUE (arg)
2615 && unify (tparms, targs, ntparms,
2616 TYPE_MAX_VALUE (parm), TYPE_MAX_VALUE (arg), nsubsts))
2617 return 1;
2618 }
2619 /* As far as unification is concerned, this wins. Later checks
2620 will invalidate it if necessary. */
2621 return 0;
2622
2623 /* Types INTEGER_CST and MINUS_EXPR can come from array bounds. */
2624 case INTEGER_CST:
2625 if (TREE_CODE (arg) != INTEGER_CST)
2626 return 1;
2627 return !tree_int_cst_equal (parm, arg);
2628
2629 case MINUS_EXPR:
2630 {
2631 tree t1, t2;
2632 t1 = TREE_OPERAND (parm, 0);
2633 t2 = TREE_OPERAND (parm, 1);
2634 return unify (tparms, targs, ntparms, t1,
2635 fold (build (PLUS_EXPR, integer_type_node, arg, t2)),
2636 nsubsts);
2637 }
2638
2639 case TREE_VEC:
2640 {
2641 int i;
2642 if (TREE_CODE (arg) != TREE_VEC)
2643 return 1;
2644 if (TREE_VEC_LENGTH (parm) != TREE_VEC_LENGTH (arg))
2645 return 1;
2646 for (i = TREE_VEC_LENGTH (parm) - 1; i >= 0; i--)
2647 if (unify (tparms, targs, ntparms,
2648 TREE_VEC_ELT (parm, i), TREE_VEC_ELT (arg, i),
2649 nsubsts))
2650 return 1;
2651 return 0;
2652 }
2653
2654 case RECORD_TYPE:
2655 if (TYPE_PTRMEMFUNC_FLAG (parm))
2656 return unify (tparms, targs, ntparms, TYPE_PTRMEMFUNC_FN_TYPE (parm),
2657 arg, nsubsts);
2658
2659 /* Allow trivial conversions. */
2660 if (TREE_CODE (arg) != RECORD_TYPE
2661 || TYPE_READONLY (parm) < TYPE_READONLY (arg)
2662 || TYPE_VOLATILE (parm) < TYPE_VOLATILE (arg))
2663 return 1;
2664
2665 if (CLASSTYPE_TEMPLATE_INFO (parm) && CLASSTYPE_TEMPLATE_INFO (arg)
2666 && uses_template_parms (parm))
2667 {
2668 if (CLASSTYPE_TI_TEMPLATE (parm) != CLASSTYPE_TI_TEMPLATE (arg))
2669 return 1;
2670 return unify (tparms, targs, ntparms, CLASSTYPE_TI_ARGS (parm),
2671 CLASSTYPE_TI_ARGS (arg), nsubsts);
2672 }
2673 else if (TYPE_MAIN_VARIANT (parm) != TYPE_MAIN_VARIANT (arg))
2674 return 1;
2675 return 0;
2676
2677 case METHOD_TYPE:
2678 if (TREE_CODE (arg) != METHOD_TYPE)
2679 return 1;
2680 goto check_args;
2681
2682 case FUNCTION_TYPE:
2683 if (TREE_CODE (arg) != FUNCTION_TYPE)
2684 return 1;
2685 check_args:
2686 if (unify (tparms, targs, ntparms, TREE_TYPE (parm),
2687 TREE_TYPE (arg), nsubsts))
2688 return 1;
2689 return type_unification (tparms, targs, TYPE_ARG_TYPES (parm),
2690 TYPE_ARG_TYPES (arg), nsubsts, 1);
2691
2692 case OFFSET_TYPE:
2693 if (TREE_CODE (arg) != OFFSET_TYPE)
2694 return 1;
2695 if (unify (tparms, targs, ntparms, TYPE_OFFSET_BASETYPE (parm),
2696 TYPE_OFFSET_BASETYPE (arg), nsubsts))
2697 return 1;
2698 return unify (tparms, targs, ntparms, TREE_TYPE (parm),
2699 TREE_TYPE (arg), nsubsts);
2700
2701 default:
2702 sorry ("use of `%s' in template type unification",
2703 tree_code_name [(int) TREE_CODE (parm)]);
2704 return 1;
2705 }
2706 }
2707 \f
2708 void
2709 mark_decl_instantiated (result, extern_p)
2710 tree result;
2711 int extern_p;
2712 {
2713 if (DECL_TEMPLATE_INSTANTIATION (result))
2714 SET_DECL_EXPLICIT_INSTANTIATION (result);
2715 TREE_PUBLIC (result) = 1;
2716
2717 if (! extern_p)
2718 {
2719 DECL_INTERFACE_KNOWN (result) = 1;
2720 DECL_NOT_REALLY_EXTERN (result) = 1;
2721 }
2722 }
2723
2724 /* called from the parser. */
2725 void
2726 do_function_instantiation (declspecs, declarator, storage)
2727 tree declspecs, declarator, storage;
2728 {
2729 tree decl = grokdeclarator (declarator, declspecs, NORMAL, 0,
2730 NULL_TREE, NULL_TREE);
2731 tree name;
2732 tree fn;
2733 tree result = NULL_TREE;
2734 int extern_p = 0;
2735
2736 if (! DECL_LANG_SPECIFIC (decl))
2737 {
2738 cp_error ("explicit instantiation of non-template `%#D'", decl);
2739 return;
2740 }
2741
2742 /* If we've already seen this template instance, use it. */
2743 if (DECL_FUNCTION_MEMBER_P (decl))
2744 {
2745 if (DECL_TEMPLATE_INSTANTIATION (decl))
2746 result = decl;
2747 else if (name = DECL_ASSEMBLER_NAME (decl),
2748 fn = IDENTIFIER_GLOBAL_VALUE (name),
2749 fn && DECL_TEMPLATE_INSTANTIATION (fn))
2750 result = fn;
2751 }
2752 else if (name = DECL_NAME (decl), fn = IDENTIFIER_GLOBAL_VALUE (name), fn)
2753 {
2754 for (fn = get_first_fn (fn); fn; fn = DECL_CHAIN (fn))
2755 if (decls_match (fn, decl)
2756 && DECL_DEFER_OUTPUT (fn))
2757 {
2758 result = fn;
2759 break;
2760 }
2761 else if (TREE_CODE (fn) == TEMPLATE_DECL)
2762 {
2763 int ntparms = TREE_VEC_LENGTH (DECL_TEMPLATE_PARMS (fn));
2764 tree *targs = (tree *) malloc (sizeof (tree) * ntparms);
2765 int i, dummy = 0;
2766 i = type_unification (DECL_TEMPLATE_PARMS (fn), targs,
2767 TYPE_ARG_TYPES (TREE_TYPE (fn)),
2768 TYPE_ARG_TYPES (TREE_TYPE (decl)),
2769 &dummy, 0);
2770 if (i == 0)
2771 {
2772 if (result)
2773 cp_error ("ambiguous template instantiation for `%D' requested", decl);
2774 else
2775 result = instantiate_template (fn, targs);
2776 }
2777 free (targs);
2778 }
2779 }
2780 if (! result)
2781 {
2782 cp_error ("no matching template for `%D' found", decl);
2783 return;
2784 }
2785
2786 if (flag_external_templates)
2787 return;
2788
2789 if (storage == NULL_TREE)
2790 ;
2791 else if (storage == ridpointers[(int) RID_EXTERN])
2792 extern_p = 1;
2793 else
2794 cp_error ("storage class `%D' applied to template instantiation",
2795 storage);
2796
2797 mark_decl_instantiated (result, extern_p);
2798 repo_template_instantiated (result, extern_p);
2799 if (! extern_p)
2800 instantiate_decl (result);
2801 }
2802
2803 void
2804 mark_class_instantiated (t, extern_p)
2805 tree t;
2806 int extern_p;
2807 {
2808 SET_CLASSTYPE_EXPLICIT_INSTANTIATION (t);
2809 SET_CLASSTYPE_INTERFACE_KNOWN (t);
2810 CLASSTYPE_INTERFACE_ONLY (t) = extern_p;
2811 CLASSTYPE_VTABLE_NEEDS_WRITING (t) = ! extern_p;
2812 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (t)) = extern_p;
2813 if (! extern_p)
2814 {
2815 CLASSTYPE_DEBUG_REQUESTED (t) = 1;
2816 rest_of_type_compilation (t, 1);
2817 }
2818 }
2819
2820 void
2821 do_type_instantiation (name, storage)
2822 tree name, storage;
2823 {
2824 tree t = TREE_TYPE (name);
2825 int extern_p = 0;
2826 int nomem_p = 0;
2827 int static_p = 0;
2828
2829 complete_type (t);
2830
2831 /* With -fexternal-templates, explicit instantiations are treated the same
2832 as implicit ones. */
2833 if (flag_external_templates)
2834 return;
2835
2836 if (TYPE_SIZE (t) == NULL_TREE)
2837 {
2838 cp_error ("explicit instantiation of `%#T' before definition of template",
2839 t);
2840 return;
2841 }
2842
2843 if (storage == NULL_TREE)
2844 /* OK */;
2845 else if (storage == ridpointers[(int) RID_INLINE])
2846 nomem_p = 1;
2847 else if (storage == ridpointers[(int) RID_EXTERN])
2848 extern_p = 1;
2849 else if (storage == ridpointers[(int) RID_STATIC])
2850 static_p = 1;
2851 else
2852 {
2853 cp_error ("storage class `%D' applied to template instantiation",
2854 storage);
2855 extern_p = 0;
2856 }
2857
2858 /* We've already instantiated this. */
2859 if (CLASSTYPE_EXPLICIT_INSTANTIATION (t) && ! CLASSTYPE_INTERFACE_ONLY (t)
2860 && extern_p)
2861 return;
2862
2863 if (! CLASSTYPE_TEMPLATE_SPECIALIZATION (t))
2864 {
2865 mark_class_instantiated (t, extern_p);
2866 repo_template_instantiated (t, extern_p);
2867 }
2868
2869 if (nomem_p)
2870 return;
2871
2872 {
2873 tree tmp;
2874
2875 if (! static_p)
2876 for (tmp = TYPE_METHODS (t); tmp; tmp = TREE_CHAIN (tmp))
2877 if (DECL_TEMPLATE_INSTANTIATION (tmp))
2878 {
2879 mark_decl_instantiated (tmp, extern_p);
2880 repo_template_instantiated (tmp, extern_p);
2881 if (! extern_p)
2882 instantiate_decl (tmp);
2883 }
2884
2885 for (tmp = TYPE_FIELDS (t); tmp; tmp = TREE_CHAIN (tmp))
2886 if (TREE_CODE (tmp) == VAR_DECL && DECL_TEMPLATE_INSTANTIATION (tmp))
2887 {
2888 mark_decl_instantiated (tmp, extern_p);
2889 repo_template_instantiated (tmp, extern_p);
2890 if (! extern_p)
2891 instantiate_decl (tmp);
2892 }
2893
2894 for (tmp = CLASSTYPE_TAGS (t); tmp; tmp = TREE_CHAIN (tmp))
2895 if (IS_AGGR_TYPE (TREE_VALUE (tmp)))
2896 do_type_instantiation (TYPE_MAIN_DECL (TREE_VALUE (tmp)), storage);
2897 }
2898 }
2899
2900 tree
2901 instantiate_decl (d)
2902 tree d;
2903 {
2904 tree ti = DECL_TEMPLATE_INFO (d);
2905 tree tmpl = TI_TEMPLATE (ti);
2906 tree args = TI_ARGS (ti);
2907 tree td;
2908 tree pattern = DECL_TEMPLATE_RESULT (tmpl);
2909 tree save_ti;
2910 int nested = in_function_p ();
2911 int d_defined;
2912 int pattern_defined;
2913
2914 if (TREE_CODE (d) == FUNCTION_DECL)
2915 {
2916 d_defined = (DECL_INITIAL (d) != NULL_TREE);
2917 pattern_defined = (DECL_INITIAL (pattern) != NULL_TREE);
2918 }
2919 else
2920 {
2921 d_defined = ! DECL_IN_AGGR_P (d);
2922 pattern_defined = ! DECL_IN_AGGR_P (pattern);
2923 }
2924
2925 if (d_defined)
2926 return d;
2927 else if (pattern_defined)
2928 {
2929 repo_template_used (d);
2930
2931 if (flag_external_templates && ! DECL_INTERFACE_KNOWN (d))
2932 {
2933 if (flag_alt_external_templates)
2934 {
2935 if (interface_unknown)
2936 warn_if_unknown_interface (d);
2937 }
2938 else if (DECL_INTERFACE_KNOWN (pattern))
2939 {
2940 DECL_INTERFACE_KNOWN (d) = 1;
2941 DECL_NOT_REALLY_EXTERN (d) = ! DECL_EXTERNAL (pattern);
2942 }
2943 else
2944 warn_if_unknown_interface (pattern);
2945 }
2946
2947 if (at_eof && ! DECL_INLINE (d))
2948 import_export_decl (d);
2949 }
2950
2951 if (! pattern_defined
2952 || (TREE_CODE (d) == FUNCTION_DECL && ! DECL_INLINE (d)
2953 && (! DECL_INTERFACE_KNOWN (d)
2954 || ! DECL_NOT_REALLY_EXTERN (d)))
2955 /* Kludge: if we compile a constructor in the middle of processing a
2956 toplevel declaration, we blow away the declspecs in
2957 temp_decl_obstack when we call permanent_allocation in
2958 finish_function. So don't compile it yet. */
2959 || (TREE_CODE (d) == FUNCTION_DECL && ! nested && ! at_eof))
2960 {
2961 add_pending_template (d);
2962 return d;
2963 }
2964
2965 if (! push_tinst_level (d))
2966 return d;
2967
2968 if (TREE_CODE (d) == FUNCTION_DECL && nested)
2969 push_cp_function_context (NULL_TREE);
2970 push_to_top_level ();
2971
2972 /* Trick tsubst into giving us a new decl in case the template changed. */
2973 save_ti = DECL_TEMPLATE_INFO (pattern);
2974 DECL_TEMPLATE_INFO (pattern) = NULL_TREE;
2975 td = tsubst (pattern, &TREE_VEC_ELT (args, 0), TREE_VEC_LENGTH (args), tmpl);
2976 DECL_TEMPLATE_INFO (pattern) = save_ti;
2977
2978 /* Convince duplicate_decls to use the DECL_ARGUMENTS from the new decl. */
2979 if (TREE_CODE (d) == FUNCTION_DECL)
2980 DECL_INITIAL (td) = error_mark_node;
2981 duplicate_decls (td, d);
2982 if (TREE_CODE (d) == FUNCTION_DECL)
2983 DECL_INITIAL (td) = 0;
2984
2985 if (TREE_CODE (d) == VAR_DECL)
2986 {
2987 DECL_IN_AGGR_P (d) = 0;
2988 if (DECL_INTERFACE_KNOWN (d))
2989 DECL_EXTERNAL (d) = ! DECL_NOT_REALLY_EXTERN (d);
2990 else
2991 {
2992 DECL_EXTERNAL (d) = 1;
2993 DECL_NOT_REALLY_EXTERN (d) = 1;
2994 }
2995 cp_finish_decl (d, DECL_INITIAL (d), NULL_TREE, 0, 0);
2996 }
2997 else if (TREE_CODE (d) == FUNCTION_DECL)
2998 {
2999 tree t = DECL_SAVED_TREE (pattern);
3000 int line = lineno;
3001 char *file = input_filename;
3002
3003 lineno = DECL_SOURCE_LINE (d);
3004 input_filename = DECL_SOURCE_FILE (d);
3005
3006 start_function (NULL_TREE, d, NULL_TREE, NULL_TREE, 1);
3007 store_parm_decls ();
3008
3009 if (t && TREE_CODE (t) == RETURN_INIT)
3010 {
3011 store_return_init
3012 (TREE_OPERAND (t, 0),
3013 tsubst_expr (TREE_OPERAND (t, 1), &TREE_VEC_ELT (args, 0),
3014 TREE_VEC_LENGTH (args), tmpl));
3015 t = TREE_CHAIN (t);
3016 }
3017
3018 if (t && TREE_CODE (t) == CTOR_INITIALIZER)
3019 {
3020 current_member_init_list
3021 = tsubst_expr_values (TREE_OPERAND (t, 0), args);
3022 current_base_init_list
3023 = tsubst_expr_values (TREE_OPERAND (t, 1), args);
3024 t = TREE_CHAIN (t);
3025 }
3026
3027 setup_vtbl_ptr ();
3028 /* Always keep the BLOCK node associated with the outermost
3029 pair of curley braces of a function. These are needed
3030 for correct operation of dwarfout.c. */
3031 keep_next_level ();
3032
3033 my_friendly_assert (TREE_CODE (t) == COMPOUND_STMT, 42);
3034 tsubst_expr (t, &TREE_VEC_ELT (args, 0),
3035 TREE_VEC_LENGTH (args), tmpl);
3036
3037 finish_function (lineno, 0, nested);
3038
3039 lineno = line;
3040 input_filename = file;
3041 }
3042
3043 pop_from_top_level ();
3044 if (TREE_CODE (d) == FUNCTION_DECL && nested)
3045 pop_cp_function_context (NULL_TREE);
3046 pop_tinst_level ();
3047
3048 return d;
3049 }
3050
3051 tree
3052 tsubst_chain (t, argvec)
3053 tree t, argvec;
3054 {
3055 if (t)
3056 {
3057 tree first = tsubst (t, &TREE_VEC_ELT (argvec, 0),
3058 TREE_VEC_LENGTH (argvec), NULL_TREE);
3059 tree last = first;
3060
3061 for (t = TREE_CHAIN (t); t; t = TREE_CHAIN (t))
3062 {
3063 tree x = tsubst (t, &TREE_VEC_ELT (argvec, 0),
3064 TREE_VEC_LENGTH (argvec), NULL_TREE);
3065 TREE_CHAIN (last) = x;
3066 last = x;
3067 }
3068
3069 return first;
3070 }
3071 return NULL_TREE;
3072 }
3073
3074 tree
3075 tsubst_expr_values (t, argvec)
3076 tree t, argvec;
3077 {
3078 tree first = NULL_TREE;
3079 tree *p = &first;
3080
3081 for (; t; t = TREE_CHAIN (t))
3082 {
3083 tree pur = tsubst_copy (TREE_PURPOSE (t), &TREE_VEC_ELT (argvec, 0),
3084 TREE_VEC_LENGTH (argvec), NULL_TREE);
3085 tree val = tsubst_expr (TREE_VALUE (t), &TREE_VEC_ELT (argvec, 0),
3086 TREE_VEC_LENGTH (argvec), NULL_TREE);
3087 *p = build_tree_list (pur, val);
3088 p = &TREE_CHAIN (*p);
3089 }
3090 return first;
3091 }
3092
3093 tree last_tree;
3094
3095 void
3096 add_tree (t)
3097 tree t;
3098 {
3099 last_tree = TREE_CHAIN (last_tree) = t;
3100 }
This page took 0.177299 seconds and 6 git commands to generate.