]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/cp/typeck2.c
parse.y (parse_scoped_id): New function.
[thirdparty/gcc.git] / gcc / cp / typeck2.c
1 /* Report error messages, build initializers, and perform
2 some front-end optimizations for C++ compiler.
3 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5 Hacked by Michael Tiemann (tiemann@cygnus.com)
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
23
24
25 /* This file is part of the C++ front end.
26 It contains routines to build C++ expressions given their operands,
27 including computing the types of the result, C and C++ specific error
28 checks, and some optimization.
29
30 There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
31 and to process initializations in declarations (since they work
32 like a strange sort of assignment). */
33
34 #include "config.h"
35 #include "system.h"
36 #include "tree.h"
37 #include "cp-tree.h"
38 #include "flags.h"
39 #include "toplev.h"
40 #include "output.h"
41 #include "diagnostic.h"
42
43 static tree process_init_constructor PARAMS ((tree, tree, tree *));
44
45 /* Print an error message stemming from an attempt to use
46 BASETYPE as a base class for TYPE. */
47
48 tree
49 error_not_base_type (basetype, type)
50 tree basetype, type;
51 {
52 if (TREE_CODE (basetype) == FUNCTION_DECL)
53 basetype = DECL_CONTEXT (basetype);
54 error ("type `%T' is not a base type for type `%T'", basetype, type);
55 return error_mark_node;
56 }
57
58 tree
59 binfo_or_else (base, type)
60 tree base, type;
61 {
62 tree binfo = lookup_base (type, base, ba_ignore, NULL);
63
64 if (binfo == error_mark_node)
65 return NULL_TREE;
66 else if (!binfo)
67 error_not_base_type (base, type);
68 return binfo;
69 }
70
71 /* According to ARM $7.1.6, "A `const' object may be initialized, but its
72 value may not be changed thereafter. Thus, we emit hard errors for these,
73 rather than just pedwarns. If `SOFT' is 1, then we just pedwarn. (For
74 example, conversions to references.) */
75
76 void
77 readonly_error (arg, string, soft)
78 tree arg;
79 const char *string;
80 int soft;
81 {
82 const char *fmt;
83 void (*fn) PARAMS ((const char *, ...));
84
85 if (soft)
86 fn = pedwarn;
87 else
88 fn = error;
89
90 if (TREE_CODE (arg) == COMPONENT_REF)
91 {
92 if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
93 fmt = "%s of data-member `%D' in read-only structure";
94 else
95 fmt = "%s of read-only data-member `%D'";
96 (*fn) (fmt, string, TREE_OPERAND (arg, 1));
97 }
98 else if (TREE_CODE (arg) == VAR_DECL)
99 {
100 if (DECL_LANG_SPECIFIC (arg)
101 && DECL_IN_AGGR_P (arg)
102 && !TREE_STATIC (arg))
103 fmt = "%s of constant field `%D'";
104 else
105 fmt = "%s of read-only variable `%D'";
106 (*fn) (fmt, string, arg);
107 }
108 else if (TREE_CODE (arg) == PARM_DECL)
109 (*fn) ("%s of read-only parameter `%D'", string, arg);
110 else if (TREE_CODE (arg) == INDIRECT_REF
111 && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REFERENCE_TYPE
112 && (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL
113 || TREE_CODE (TREE_OPERAND (arg, 0)) == PARM_DECL))
114 (*fn) ("%s of read-only reference `%D'", string, TREE_OPERAND (arg, 0));
115 else if (TREE_CODE (arg) == RESULT_DECL)
116 (*fn) ("%s of read-only named return value `%D'", string, arg);
117 else if (TREE_CODE (arg) == FUNCTION_DECL)
118 (*fn) ("%s of function `%D'", string, arg);
119 else
120 (*fn) ("%s of read-only location", string);
121 }
122
123 /* If TYPE has abstract virtual functions, issue an error about trying
124 to create an object of that type. DECL is the object declared, or
125 NULL_TREE if the declaration is unavailable. Returns 1 if an error
126 occurred; zero if all was well. */
127
128 int
129 abstract_virtuals_error (decl, type)
130 tree decl;
131 tree type;
132 {
133 tree u;
134 tree tu;
135
136 if (!CLASS_TYPE_P (type) || !CLASSTYPE_PURE_VIRTUALS (type))
137 return 0;
138
139 if (!TYPE_SIZE (type))
140 /* TYPE is being defined, and during that time
141 CLASSTYPE_PURE_VIRTUALS holds the inline friends. */
142 return 0;
143
144 u = CLASSTYPE_PURE_VIRTUALS (type);
145 if (decl)
146 {
147 if (TREE_CODE (decl) == RESULT_DECL)
148 return 0;
149
150 if (TREE_CODE (decl) == VAR_DECL)
151 error ("cannot declare variable `%D' to be of type `%T'",
152 decl, type);
153 else if (TREE_CODE (decl) == PARM_DECL)
154 error ("cannot declare parameter `%D' to be of type `%T'",
155 decl, type);
156 else if (TREE_CODE (decl) == FIELD_DECL)
157 error ("cannot declare field `%D' to be of type `%T'",
158 decl, type);
159 else if (TREE_CODE (decl) == FUNCTION_DECL
160 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
161 error ("invalid return type for member function `%#D'", decl);
162 else if (TREE_CODE (decl) == FUNCTION_DECL)
163 error ("invalid return type for function `%#D'", decl);
164 }
165 else
166 error ("cannot allocate an object of type `%T'", type);
167
168 /* Only go through this once. */
169 if (TREE_PURPOSE (u) == NULL_TREE)
170 {
171 TREE_PURPOSE (u) = error_mark_node;
172
173 error (" because the following virtual functions are abstract:");
174 for (tu = u; tu; tu = TREE_CHAIN (tu))
175 cp_error_at ("\t%#D", TREE_VALUE (tu));
176 }
177 else
178 error (" since type `%T' has abstract virtual functions", type);
179
180 return 1;
181 }
182
183 /* Print an error message for invalid use of an incomplete type.
184 VALUE is the expression that was used (or 0 if that isn't known)
185 and TYPE is the type that was invalid. If WARN_ONLY is nonzero, a
186 warning is printed, otherwise an error is printed. */
187
188 void
189 cxx_incomplete_type_diagnostic (value, type, warn_only)
190 tree value;
191 tree type;
192 int warn_only;
193 {
194 int decl = 0;
195 void (*p_msg) PARAMS ((const char *, ...));
196 void (*p_msg_at) PARAMS ((const char *, ...));
197
198 if (warn_only)
199 {
200 p_msg = warning;
201 p_msg_at = cp_warning_at;
202 }
203 else
204 {
205 p_msg = error;
206 p_msg_at = cp_error_at;
207 }
208
209 /* Avoid duplicate error message. */
210 if (TREE_CODE (type) == ERROR_MARK)
211 return;
212
213 if (value != 0 && (TREE_CODE (value) == VAR_DECL
214 || TREE_CODE (value) == PARM_DECL))
215 {
216 (*p_msg_at) ("`%D' has incomplete type", value);
217 decl = 1;
218 }
219 retry:
220 /* We must print an error message. Be clever about what it says. */
221
222 switch (TREE_CODE (type))
223 {
224 case RECORD_TYPE:
225 case UNION_TYPE:
226 case ENUMERAL_TYPE:
227 if (!decl)
228 (*p_msg) ("invalid use of undefined type `%#T'", type);
229 (*p_msg_at) ("forward declaration of `%#T'", type);
230 break;
231
232 case VOID_TYPE:
233 (*p_msg) ("invalid use of `%T'", type);
234 break;
235
236 case ARRAY_TYPE:
237 if (TYPE_DOMAIN (type))
238 {
239 type = TREE_TYPE (type);
240 goto retry;
241 }
242 (*p_msg) ("invalid use of array with unspecified bounds");
243 break;
244
245 case OFFSET_TYPE:
246 bad_member:
247 (*p_msg) ("invalid use of member (did you forget the `&' ?)");
248 break;
249
250 case TEMPLATE_TYPE_PARM:
251 (*p_msg) ("invalid use of template type parameter");
252 break;
253
254 case UNKNOWN_TYPE:
255 if (value && TREE_CODE (value) == COMPONENT_REF)
256 goto bad_member;
257 else if (value && TREE_CODE (value) == ADDR_EXPR)
258 (*p_msg) ("address of overloaded function with no contextual type information");
259 else if (value && TREE_CODE (value) == OVERLOAD)
260 (*p_msg) ("overloaded function with no contextual type information");
261 else
262 (*p_msg) ("insufficient contextual information to determine type");
263 break;
264
265 default:
266 abort ();
267 }
268 }
269
270 /* Backward-compatibility interface to incomplete_type_diagnostic;
271 required by ../tree.c. */
272 #undef cxx_incomplete_type_error
273 void
274 cxx_incomplete_type_error (value, type)
275 tree value;
276 tree type;
277 {
278 cxx_incomplete_type_diagnostic (value, type, 0);
279 }
280
281 \f
282 /* Perform appropriate conversions on the initial value of a variable,
283 store it in the declaration DECL,
284 and print any error messages that are appropriate.
285 If the init is invalid, store an ERROR_MARK.
286
287 C++: Note that INIT might be a TREE_LIST, which would mean that it is
288 a base class initializer for some aggregate type, hopefully compatible
289 with DECL. If INIT is a single element, and DECL is an aggregate
290 type, we silently convert INIT into a TREE_LIST, allowing a constructor
291 to be called.
292
293 If INIT is a TREE_LIST and there is no constructor, turn INIT
294 into a CONSTRUCTOR and use standard initialization techniques.
295 Perhaps a warning should be generated?
296
297 Returns value of initializer if initialization could not be
298 performed for static variable. In that case, caller must do
299 the storing. */
300
301 tree
302 store_init_value (decl, init)
303 tree decl, init;
304 {
305 register tree value, type;
306
307 /* If variable's type was invalidly declared, just ignore it. */
308
309 type = TREE_TYPE (decl);
310 if (TREE_CODE (type) == ERROR_MARK)
311 return NULL_TREE;
312
313 #if 0
314 /* This breaks arrays, and should not have any effect for other decls. */
315 /* Take care of C++ business up here. */
316 type = TYPE_MAIN_VARIANT (type);
317 #endif
318
319 if (IS_AGGR_TYPE (type))
320 {
321 if (! TYPE_HAS_TRIVIAL_INIT_REF (type)
322 && TREE_CODE (init) != CONSTRUCTOR)
323 abort ();
324
325 if (TREE_CODE (init) == TREE_LIST)
326 {
327 error ("constructor syntax used, but no constructor declared for type `%T'", type);
328 init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (init));
329 }
330 #if 0
331 if (TREE_CODE (init) == CONSTRUCTOR)
332 {
333 tree field;
334
335 /* Check that we're really an aggregate as ARM 8.4.1 defines it. */
336 if (CLASSTYPE_N_BASECLASSES (type))
337 cp_error_at ("initializer list construction invalid for derived class object `%D'", decl);
338 if (CLASSTYPE_VTBL_PTR (type))
339 cp_error_at ("initializer list construction invalid for polymorphic class object `%D'", decl);
340 if (TYPE_NEEDS_CONSTRUCTING (type))
341 {
342 cp_error_at ("initializer list construction invalid for `%D'", decl);
343 error ("due to the presence of a constructor");
344 }
345 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
346 if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
347 {
348 cp_error_at ("initializer list construction invalid for `%D'", decl);
349 cp_error_at ("due to non-public access of member `%D'", field);
350 }
351 for (field = TYPE_METHODS (type); field; field = TREE_CHAIN (field))
352 if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
353 {
354 cp_error_at ("initializer list construction invalid for `%D'", decl);
355 cp_error_at ("due to non-public access of member `%D'", field);
356 }
357 }
358 #endif
359 }
360 else if (TREE_CODE (init) == TREE_LIST
361 && TREE_TYPE (init) != unknown_type_node)
362 {
363 if (TREE_CODE (decl) == RESULT_DECL)
364 {
365 if (TREE_CHAIN (init))
366 {
367 warning ("comma expression used to initialize return value");
368 init = build_compound_expr (init);
369 }
370 else
371 init = TREE_VALUE (init);
372 }
373 else if (TREE_CODE (init) == TREE_LIST
374 && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
375 {
376 error ("cannot initialize arrays using this syntax");
377 return NULL_TREE;
378 }
379 else
380 {
381 /* We get here with code like `int a (2);' */
382
383 if (TREE_CHAIN (init) != NULL_TREE)
384 {
385 pedwarn ("initializer list being treated as compound expression");
386 init = build_compound_expr (init);
387 }
388 else
389 init = TREE_VALUE (init);
390 }
391 }
392
393 /* End of special C++ code. */
394
395 /* We might have already run this bracketed initializer through
396 digest_init. Don't do so again. */
397 if (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init)
398 && TREE_TYPE (init)
399 && TYPE_MAIN_VARIANT (TREE_TYPE (init)) == TYPE_MAIN_VARIANT (type))
400 value = init;
401 else
402 /* Digest the specified initializer into an expression. */
403 value = digest_init (type, init, (tree *) 0);
404
405 /* Store the expression if valid; else report error. */
406
407 if (TREE_CODE (value) == ERROR_MARK)
408 ;
409 /* Other code expects that initializers for objects of types that need
410 constructing never make it into DECL_INITIAL, and passes 'init' to
411 build_aggr_init without checking DECL_INITIAL. So just return. */
412 else if (TYPE_NEEDS_CONSTRUCTING (type))
413 return value;
414 else if (TREE_STATIC (decl)
415 && (! TREE_CONSTANT (value)
416 || ! initializer_constant_valid_p (value, TREE_TYPE (value))
417 #if 0
418 /* A STATIC PUBLIC int variable doesn't have to be
419 run time inited when doing pic. (mrs) */
420 /* Since ctors and dtors are the only things that can
421 reference vtables, and they are always written down
422 the vtable definition, we can leave the
423 vtables in initialized data space.
424 However, other initialized data cannot be initialized
425 this way. Instead a global file-level initializer
426 must do the job. */
427 || (flag_pic && !DECL_VIRTUAL_P (decl) && TREE_PUBLIC (decl))
428 #endif
429 ))
430
431 return value;
432 #if 0 /* No, that's C. jason 9/19/94 */
433 else
434 {
435 if (pedantic && TREE_CODE (value) == CONSTRUCTOR)
436 {
437 if (! TREE_CONSTANT (value) || ! TREE_STATIC (value))
438 pedwarn ("ISO C++ forbids non-constant aggregate initializer expressions");
439 }
440 }
441 #endif
442
443 /* Store the VALUE in DECL_INITIAL. If we're building a
444 statement-tree we will actually expand the initialization later
445 when we output this function. */
446 DECL_INITIAL (decl) = value;
447 return NULL_TREE;
448 }
449
450 /* Same as store_init_value, but used for known-to-be-valid static
451 initializers. Used to introduce a static initializer even in data
452 structures that may require dynamic initialization. */
453
454 tree
455 force_store_init_value (decl, init)
456 tree decl, init;
457 {
458 tree type = TREE_TYPE (decl);
459 int needs_constructing = TYPE_NEEDS_CONSTRUCTING (type);
460
461 TYPE_NEEDS_CONSTRUCTING (type) = 0;
462
463 init = store_init_value (decl, init);
464 if (init)
465 abort ();
466
467 TYPE_NEEDS_CONSTRUCTING (type) = needs_constructing;
468
469 return init;
470 }
471 \f
472 /* Digest the parser output INIT as an initializer for type TYPE.
473 Return a C expression of type TYPE to represent the initial value.
474
475 If TAIL is nonzero, it points to a variable holding a list of elements
476 of which INIT is the first. We update the list stored there by
477 removing from the head all the elements that we use.
478 Normally this is only one; we use more than one element only if
479 TYPE is an aggregate and INIT is not a constructor. */
480
481 tree
482 digest_init (type, init, tail)
483 tree type, init, *tail;
484 {
485 enum tree_code code = TREE_CODE (type);
486 tree element = NULL_TREE;
487 tree old_tail_contents = NULL_TREE;
488 /* Nonzero if INIT is a braced grouping, which comes in as a CONSTRUCTOR
489 tree node which has no TREE_TYPE. */
490 int raw_constructor;
491
492 /* By default, assume we use one element from a list.
493 We correct this later in the sole case where it is not true. */
494
495 if (tail)
496 {
497 old_tail_contents = *tail;
498 *tail = TREE_CHAIN (*tail);
499 }
500
501 if (init == error_mark_node || (TREE_CODE (init) == TREE_LIST
502 && TREE_VALUE (init) == error_mark_node))
503 return error_mark_node;
504
505 if (TREE_CODE (init) == ERROR_MARK)
506 /* __PRETTY_FUNCTION__'s initializer is a bogus expression inside
507 a template function. This gets substituted during instantiation. */
508 return init;
509
510 /* We must strip the outermost array type when completing the type,
511 because the its bounds might be incomplete at the moment. */
512 if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE
513 ? TREE_TYPE (type) : type, NULL_TREE))
514 return error_mark_node;
515
516 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
517 if (TREE_CODE (init) == NON_LVALUE_EXPR)
518 init = TREE_OPERAND (init, 0);
519
520 if (TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == type)
521 return init;
522
523 raw_constructor = TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == 0;
524
525 if (raw_constructor
526 && CONSTRUCTOR_ELTS (init) != 0
527 && TREE_CHAIN (CONSTRUCTOR_ELTS (init)) == 0)
528 {
529 element = TREE_VALUE (CONSTRUCTOR_ELTS (init));
530 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
531 if (element && TREE_CODE (element) == NON_LVALUE_EXPR)
532 element = TREE_OPERAND (element, 0);
533 if (element == error_mark_node)
534 return element;
535 }
536
537 /* Initialization of an array of chars from a string constant
538 optionally enclosed in braces. */
539
540 if (code == ARRAY_TYPE)
541 {
542 tree typ1;
543
544 if (TREE_CODE (init) == TREE_LIST)
545 {
546 error ("initializing array with parameter list");
547 return error_mark_node;
548 }
549
550 typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
551 if (char_type_p (typ1)
552 && ((init && TREE_CODE (init) == STRING_CST)
553 || (element && TREE_CODE (element) == STRING_CST)))
554 {
555 tree string = element ? element : init;
556
557 if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string)))
558 != char_type_node)
559 && TYPE_PRECISION (typ1) == BITS_PER_UNIT)
560 {
561 error ("char-array initialized from wide string");
562 return error_mark_node;
563 }
564 if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string)))
565 == char_type_node)
566 && TYPE_PRECISION (typ1) != BITS_PER_UNIT)
567 {
568 error ("int-array initialized from non-wide string");
569 return error_mark_node;
570 }
571
572 TREE_TYPE (string) = type;
573 if (TYPE_DOMAIN (type) != 0
574 && TREE_CONSTANT (TYPE_SIZE (type)))
575 {
576 register int size
577 = TREE_INT_CST_LOW (TYPE_SIZE (type));
578 size = (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
579 /* In C it is ok to subtract 1 from the length of the string
580 because it's ok to ignore the terminating null char that is
581 counted in the length of the constant, but in C++ this would
582 be invalid. */
583 if (size < TREE_STRING_LENGTH (string))
584 pedwarn ("initializer-string for array of chars is too long");
585 }
586 return string;
587 }
588 }
589
590 /* Handle scalar types, including conversions,
591 and signature pointers and references. */
592
593 if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE
594 || code == ENUMERAL_TYPE || code == REFERENCE_TYPE
595 || code == BOOLEAN_TYPE || code == COMPLEX_TYPE
596 || TYPE_PTRMEMFUNC_P (type))
597 {
598 if (raw_constructor)
599 {
600 if (element == 0)
601 {
602 error ("initializer for scalar variable requires one element");
603 return error_mark_node;
604 }
605 init = element;
606 }
607 while (TREE_CODE (init) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (init))
608 {
609 pedwarn ("braces around scalar initializer for `%T'", type);
610 init = CONSTRUCTOR_ELTS (init);
611 if (TREE_CHAIN (init))
612 pedwarn ("ignoring extra initializers for `%T'", type);
613 init = TREE_VALUE (init);
614 }
615
616 return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
617 "initialization", NULL_TREE, 0);
618 }
619
620 /* Come here only for records and arrays (and unions with constructors). */
621
622 if (COMPLETE_TYPE_P (type) && ! TREE_CONSTANT (TYPE_SIZE (type)))
623 {
624 error ("variable-sized object of type `%T' may not be initialized",
625 type);
626 return error_mark_node;
627 }
628
629 if (code == ARRAY_TYPE || code == VECTOR_TYPE || IS_AGGR_TYPE_CODE (code))
630 {
631 if (raw_constructor && TYPE_NON_AGGREGATE_CLASS (type)
632 && TREE_HAS_CONSTRUCTOR (init))
633 {
634 error ("subobject of type `%T' must be initialized by constructor, not by `%E'",
635 type, init);
636 return error_mark_node;
637 }
638 else if (raw_constructor)
639 return process_init_constructor (type, init, (tree *)0);
640 else if (can_convert_arg (type, TREE_TYPE (init), init)
641 || TYPE_NON_AGGREGATE_CLASS (type))
642 /* These are never initialized from multiple constructor elements. */;
643 else if (tail != 0)
644 {
645 *tail = old_tail_contents;
646 return process_init_constructor (type, 0, tail);
647 }
648
649 if (code != ARRAY_TYPE)
650 {
651 int flags = LOOKUP_NORMAL;
652 /* Initialization from { } is copy-initialization. */
653 if (tail)
654 flags |= LOOKUP_ONLYCONVERTING;
655
656 return convert_for_initialization (NULL_TREE, type, init, flags,
657 "initialization", NULL_TREE, 0);
658 }
659 }
660
661 error ("invalid initializer");
662 return error_mark_node;
663 }
664 \f
665 /* Process a constructor for a variable of type TYPE.
666 The constructor elements may be specified either with INIT or with ELTS,
667 only one of which should be non-null.
668
669 If INIT is specified, it is a CONSTRUCTOR node which is specifically
670 and solely for initializing this datum.
671
672 If ELTS is specified, it is the address of a variable containing
673 a list of expressions. We take as many elements as we need
674 from the head of the list and update the list.
675
676 In the resulting constructor, TREE_CONSTANT is set if all elts are
677 constant, and TREE_STATIC is set if, in addition, all elts are simple enough
678 constants that the assembler and linker can compute them. */
679
680 static tree
681 process_init_constructor (type, init, elts)
682 tree type, init, *elts;
683 {
684 register tree tail;
685 /* List of the elements of the result constructor,
686 in reverse order. */
687 register tree members = NULL;
688 register tree next1;
689 tree result;
690 int allconstant = 1;
691 int allsimple = 1;
692 int erroneous = 0;
693
694 /* Make TAIL be the list of elements to use for the initialization,
695 no matter how the data was given to us. */
696
697 if (elts)
698 {
699 if (warn_missing_braces)
700 warning ("aggregate has a partly bracketed initializer");
701 tail = *elts;
702 }
703 else
704 tail = CONSTRUCTOR_ELTS (init);
705
706 /* Gobble as many elements as needed, and make a constructor or initial value
707 for each element of this aggregate. Chain them together in result.
708 If there are too few, use 0 for each scalar ultimate component. */
709
710 if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == VECTOR_TYPE)
711 {
712 register long len;
713 register int i;
714
715 if (TREE_CODE (type) == ARRAY_TYPE)
716 {
717 tree domain = TYPE_DOMAIN (type);
718 if (domain)
719 len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain))
720 - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain))
721 + 1);
722 else
723 len = -1; /* Take as many as there are */
724 }
725 else
726 {
727 /* Vectors are like simple fixed-size arrays. */
728 len = TYPE_VECTOR_SUBPARTS (type);
729 }
730
731 for (i = 0; len < 0 || i < len; i++)
732 {
733 if (tail)
734 {
735 if (TREE_PURPOSE (tail)
736 && (TREE_CODE (TREE_PURPOSE (tail)) != INTEGER_CST
737 || compare_tree_int (TREE_PURPOSE (tail), i) != 0))
738 sorry ("non-trivial labeled initializers");
739
740 if (TREE_VALUE (tail) != 0)
741 {
742 tree tail1 = tail;
743 next1 = digest_init (TREE_TYPE (type),
744 TREE_VALUE (tail), &tail1);
745 if (next1 == error_mark_node)
746 return next1;
747 my_friendly_assert
748 (same_type_ignoring_top_level_qualifiers_p
749 (TREE_TYPE (type), TREE_TYPE (next1)),
750 981123);
751 my_friendly_assert (tail1 == 0
752 || TREE_CODE (tail1) == TREE_LIST, 319);
753 if (tail == tail1 && len < 0)
754 {
755 error ("non-empty initializer for array of empty elements");
756 /* Just ignore what we were supposed to use. */
757 tail1 = NULL_TREE;
758 }
759 tail = tail1;
760 }
761 else
762 {
763 next1 = error_mark_node;
764 tail = TREE_CHAIN (tail);
765 }
766 }
767 else if (len < 0)
768 /* We're done. */
769 break;
770 else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (type)))
771 {
772 /* If this type needs constructors run for
773 default-initialization, we can't rely on the backend to do it
774 for us, so build up TARGET_EXPRs. If the type in question is
775 a class, just build one up; if it's an array, recurse. */
776
777 if (IS_AGGR_TYPE (TREE_TYPE (type)))
778 next1 = build_functional_cast (TREE_TYPE (type), NULL_TREE);
779 else
780 next1 = build (CONSTRUCTOR, NULL_TREE, NULL_TREE, NULL_TREE);
781 next1 = digest_init (TREE_TYPE (type), next1, 0);
782 }
783 else if (! zero_init_p (TREE_TYPE (type)))
784 next1 = build_forced_zero_init (TREE_TYPE (type));
785 else
786 /* The default zero-initialization is fine for us; don't
787 add anything to the CONSTRUCTOR. */
788 break;
789
790 if (next1 == error_mark_node)
791 erroneous = 1;
792 else if (!TREE_CONSTANT (next1))
793 allconstant = 0;
794 else if (! initializer_constant_valid_p (next1, TREE_TYPE (next1)))
795 allsimple = 0;
796 members = tree_cons (size_int (i), next1, members);
797 }
798 }
799 else if (TREE_CODE (type) == RECORD_TYPE)
800 {
801 register tree field;
802
803 if (tail)
804 {
805 if (TYPE_USES_VIRTUAL_BASECLASSES (type))
806 {
807 sorry ("initializer list for object of class with virtual base classes");
808 return error_mark_node;
809 }
810
811 if (TYPE_BINFO_BASETYPES (type))
812 {
813 sorry ("initializer list for object of class with base classes");
814 return error_mark_node;
815 }
816
817 if (TYPE_POLYMORPHIC_P (type))
818 {
819 sorry ("initializer list for object using virtual functions");
820 return error_mark_node;
821 }
822 }
823
824 for (field = TYPE_FIELDS (type); field;
825 field = TREE_CHAIN (field))
826 {
827 if (! DECL_NAME (field) && DECL_C_BIT_FIELD (field))
828 {
829 members = tree_cons (field, integer_zero_node, members);
830 continue;
831 }
832
833 if (TREE_CODE (field) != FIELD_DECL)
834 continue;
835
836 if (tail)
837 {
838 if (TREE_PURPOSE (tail)
839 && TREE_PURPOSE (tail) != field
840 && TREE_PURPOSE (tail) != DECL_NAME (field))
841 sorry ("non-trivial labeled initializers");
842
843 if (TREE_VALUE (tail) != 0)
844 {
845 tree tail1 = tail;
846
847 next1 = digest_init (TREE_TYPE (field),
848 TREE_VALUE (tail), &tail1);
849 my_friendly_assert (tail1 == 0
850 || TREE_CODE (tail1) == TREE_LIST, 320);
851 tail = tail1;
852 }
853 else
854 {
855 next1 = error_mark_node;
856 tail = TREE_CHAIN (tail);
857 }
858 }
859 else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field)))
860 {
861 /* If this type needs constructors run for
862 default-initialization, we can't rely on the backend to do it
863 for us, so build up TARGET_EXPRs. If the type in question is
864 a class, just build one up; if it's an array, recurse. */
865
866 if (IS_AGGR_TYPE (TREE_TYPE (field)))
867 next1 = build_functional_cast (TREE_TYPE (field),
868 NULL_TREE);
869 else
870 {
871 next1 = build (CONSTRUCTOR, NULL_TREE, NULL_TREE,
872 NULL_TREE);
873 if (init)
874 TREE_HAS_CONSTRUCTOR (next1)
875 = TREE_HAS_CONSTRUCTOR (init);
876 }
877 next1 = digest_init (TREE_TYPE (field), next1, 0);
878
879 /* Warn when some struct elements are implicitly initialized. */
880 if (extra_warnings
881 && (!init || TREE_HAS_CONSTRUCTOR (init)))
882 warning ("missing initializer for member `%D'", field);
883 }
884 else
885 {
886 if (TREE_READONLY (field))
887 error ("uninitialized const member `%D'", field);
888 else if (TYPE_LANG_SPECIFIC (TREE_TYPE (field))
889 && CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field)))
890 error ("member `%D' with uninitialized const fields",
891 field);
892 else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
893 error ("member `%D' is uninitialized reference", field);
894
895 /* Warn when some struct elements are implicitly initialized
896 to zero. */
897 if (extra_warnings
898 && (!init || TREE_HAS_CONSTRUCTOR (init)))
899 warning ("missing initializer for member `%D'", field);
900
901 if (! zero_init_p (TREE_TYPE (field)))
902 next1 = build_forced_zero_init (TREE_TYPE (field));
903 else
904 /* The default zero-initialization is fine for us; don't
905 add anything to the CONSTRUCTOR. */
906 continue;
907 }
908
909 if (next1 == error_mark_node)
910 erroneous = 1;
911 else if (!TREE_CONSTANT (next1))
912 allconstant = 0;
913 else if (! initializer_constant_valid_p (next1, TREE_TYPE (next1)))
914 allsimple = 0;
915 members = tree_cons (field, next1, members);
916 }
917 }
918 else if (TREE_CODE (type) == UNION_TYPE
919 /* If the initializer was empty, use default zero initialization. */
920 && tail)
921 {
922 register tree field = TYPE_FIELDS (type);
923
924 /* Find the first named field. ANSI decided in September 1990
925 that only named fields count here. */
926 while (field && (DECL_NAME (field) == 0
927 || TREE_CODE (field) != FIELD_DECL))
928 field = TREE_CHAIN (field);
929
930 /* If this element specifies a field, initialize via that field. */
931 if (TREE_PURPOSE (tail) != NULL_TREE)
932 {
933 int win = 0;
934
935 if (TREE_CODE (TREE_PURPOSE (tail)) == FIELD_DECL)
936 /* Handle the case of a call by build_c_cast. */
937 field = TREE_PURPOSE (tail), win = 1;
938 else if (TREE_CODE (TREE_PURPOSE (tail)) != IDENTIFIER_NODE)
939 error ("index value instead of field name in union initializer");
940 else
941 {
942 tree temp;
943 for (temp = TYPE_FIELDS (type);
944 temp;
945 temp = TREE_CHAIN (temp))
946 if (DECL_NAME (temp) == TREE_PURPOSE (tail))
947 break;
948 if (temp)
949 field = temp, win = 1;
950 else
951 error ("no field `%D' in union being initialized",
952 TREE_PURPOSE (tail));
953 }
954 if (!win)
955 TREE_VALUE (tail) = error_mark_node;
956 }
957 else if (field == 0)
958 {
959 error ("union `%T' with no named members cannot be initialized",
960 type);
961 TREE_VALUE (tail) = error_mark_node;
962 }
963
964 if (TREE_VALUE (tail) != 0)
965 {
966 tree tail1 = tail;
967
968 next1 = digest_init (TREE_TYPE (field),
969 TREE_VALUE (tail), &tail1);
970 if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST)
971 abort ();
972 tail = tail1;
973 }
974 else
975 {
976 next1 = error_mark_node;
977 tail = TREE_CHAIN (tail);
978 }
979
980 if (next1 == error_mark_node)
981 erroneous = 1;
982 else if (!TREE_CONSTANT (next1))
983 allconstant = 0;
984 else if (initializer_constant_valid_p (next1, TREE_TYPE (next1)) == 0)
985 allsimple = 0;
986 members = tree_cons (field, next1, members);
987 }
988
989 /* If arguments were specified as a list, just remove the ones we used. */
990 if (elts)
991 *elts = tail;
992 /* If arguments were specified as a constructor,
993 complain unless we used all the elements of the constructor. */
994 else if (tail)
995 pedwarn ("excess elements in aggregate initializer");
996
997 if (erroneous)
998 return error_mark_node;
999
1000 result = build (CONSTRUCTOR, type, NULL_TREE, nreverse (members));
1001 if (init)
1002 TREE_HAS_CONSTRUCTOR (result) = TREE_HAS_CONSTRUCTOR (init);
1003 if (allconstant) TREE_CONSTANT (result) = 1;
1004 if (allconstant && allsimple) TREE_STATIC (result) = 1;
1005 return result;
1006 }
1007 \f
1008 /* Given a structure or union value DATUM, construct and return
1009 the structure or union component which results from narrowing
1010 that value to the base specified in BASETYPE. For example, given the
1011 hierarchy
1012
1013 class L { int ii; };
1014 class A : L { ... };
1015 class B : L { ... };
1016 class C : A, B { ... };
1017
1018 and the declaration
1019
1020 C x;
1021
1022 then the expression
1023
1024 x.A::ii refers to the ii member of the L part of
1025 the A part of the C object named by X. In this case,
1026 DATUM would be x, and BASETYPE would be A.
1027
1028 I used to think that this was nonconformant, that the standard specified
1029 that first we look up ii in A, then convert x to an L& and pull out the
1030 ii part. But in fact, it does say that we convert x to an A&; A here
1031 is known as the "naming class". (jason 2000-12-19)
1032
1033 BINFO_P points to a variable initialized either to NULL_TREE or to the
1034 binfo for the specific base subobject we want to convert to. */
1035
1036 tree
1037 build_scoped_ref (datum, basetype, binfo_p)
1038 tree datum;
1039 tree basetype;
1040 tree *binfo_p;
1041 {
1042 tree binfo;
1043
1044 if (datum == error_mark_node)
1045 return error_mark_node;
1046 if (*binfo_p)
1047 binfo = *binfo_p;
1048 else
1049 binfo = lookup_base (TREE_TYPE (datum), basetype, ba_check, NULL);
1050
1051 if (!binfo || binfo == error_mark_node)
1052 {
1053 *binfo_p = NULL_TREE;
1054 if (!binfo)
1055 error_not_base_type (basetype, TREE_TYPE (datum));
1056 return error_mark_node;
1057 }
1058
1059 *binfo_p = binfo;
1060 return build_base_path (PLUS_EXPR, datum, binfo, 1);
1061 }
1062
1063 /* Build a reference to an object specified by the C++ `->' operator.
1064 Usually this just involves dereferencing the object, but if the
1065 `->' operator is overloaded, then such overloads must be
1066 performed until an object which does not have the `->' operator
1067 overloaded is found. An error is reported when circular pointer
1068 delegation is detected. */
1069
1070 tree
1071 build_x_arrow (datum)
1072 tree datum;
1073 {
1074 tree types_memoized = NULL_TREE;
1075 register tree rval = datum;
1076 tree type = TREE_TYPE (rval);
1077 tree last_rval = NULL_TREE;
1078
1079 if (type == error_mark_node)
1080 return error_mark_node;
1081
1082 if (processing_template_decl)
1083 return build_min_nt (ARROW_EXPR, rval);
1084
1085 if (TREE_CODE (rval) == OFFSET_REF)
1086 {
1087 rval = resolve_offset_ref (datum);
1088 type = TREE_TYPE (rval);
1089 }
1090
1091 if (TREE_CODE (type) == REFERENCE_TYPE)
1092 {
1093 rval = convert_from_reference (rval);
1094 type = TREE_TYPE (rval);
1095 }
1096
1097 if (IS_AGGR_TYPE (type))
1098 {
1099 while ((rval = build_opfncall (COMPONENT_REF, LOOKUP_NORMAL, rval,
1100 NULL_TREE, NULL_TREE)))
1101 {
1102 if (rval == error_mark_node)
1103 return error_mark_node;
1104
1105 if (value_member (TREE_TYPE (rval), types_memoized))
1106 {
1107 error ("circular pointer delegation detected");
1108 return error_mark_node;
1109 }
1110 else
1111 {
1112 types_memoized = tree_cons (NULL_TREE, TREE_TYPE (rval),
1113 types_memoized);
1114 }
1115 last_rval = rval;
1116 }
1117
1118 if (last_rval == NULL_TREE)
1119 {
1120 error ("base operand of `->' has non-pointer type `%T'", type);
1121 return error_mark_node;
1122 }
1123
1124 if (TREE_CODE (TREE_TYPE (last_rval)) == REFERENCE_TYPE)
1125 last_rval = convert_from_reference (last_rval);
1126 }
1127 else
1128 last_rval = default_conversion (rval);
1129
1130 if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE)
1131 return build_indirect_ref (last_rval, NULL);
1132
1133 if (types_memoized)
1134 error ("result of `operator->()' yields non-pointer result");
1135 else
1136 error ("base operand of `->' is not a pointer");
1137 return error_mark_node;
1138 }
1139
1140 /* Make an expression to refer to the COMPONENT field of
1141 structure or union value DATUM. COMPONENT is an arbitrary
1142 expression. DATUM has not already been checked out to be of
1143 aggregate type.
1144
1145 For C++, COMPONENT may be a TREE_LIST. This happens when we must
1146 return an object of member type to a method of the current class,
1147 but there is not yet enough typing information to know which one.
1148 As a special case, if there is only one method by that name,
1149 it is returned. Otherwise we return an expression which other
1150 routines will have to know how to deal with later. */
1151
1152 tree
1153 build_m_component_ref (datum, component)
1154 tree datum, component;
1155 {
1156 tree type;
1157 tree objtype;
1158 tree field_type;
1159 int type_quals;
1160 tree binfo;
1161
1162 if (processing_template_decl)
1163 return build_min_nt (DOTSTAR_EXPR, datum, component);
1164
1165 datum = decay_conversion (datum);
1166
1167 if (datum == error_mark_node || component == error_mark_node)
1168 return error_mark_node;
1169
1170 objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
1171
1172 if (TYPE_PTRMEMFUNC_P (TREE_TYPE (component)))
1173 {
1174 type = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (component)));
1175 field_type = type;
1176 }
1177 else if (TYPE_PTRMEM_P (TREE_TYPE (component)))
1178 {
1179 type = TREE_TYPE (TREE_TYPE (component));
1180 field_type = TREE_TYPE (type);
1181
1182 /* Compute the type of the field, as described in [expr.ref]. */
1183 type_quals = TYPE_UNQUALIFIED;
1184 if (TREE_CODE (field_type) == REFERENCE_TYPE)
1185 /* The standard says that the type of the result should be the
1186 type referred to by the reference. But for now, at least,
1187 we do the conversion from reference type later. */
1188 ;
1189 else
1190 {
1191 type_quals = (cp_type_quals (field_type)
1192 | cp_type_quals (TREE_TYPE (datum)));
1193
1194 /* There's no such thing as a mutable pointer-to-member, so
1195 we don't need to deal with that here like we do in
1196 build_component_ref. */
1197 field_type = cp_build_qualified_type (field_type, type_quals);
1198 }
1199 }
1200 else
1201 {
1202 error ("`%E' cannot be used as a member pointer, since it is of type `%T'",
1203 component, TREE_TYPE (component));
1204 return error_mark_node;
1205 }
1206
1207 if (! IS_AGGR_TYPE (objtype))
1208 {
1209 error ("cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'",
1210 component, datum, objtype);
1211 return error_mark_node;
1212 }
1213
1214 binfo = lookup_base (objtype, TYPE_METHOD_BASETYPE (type),
1215 ba_check, NULL);
1216 if (!binfo)
1217 {
1218 error ("member type `%T::' incompatible with object type `%T'",
1219 TYPE_METHOD_BASETYPE (type), objtype);
1220 return error_mark_node;
1221 }
1222 else if (binfo == error_mark_node)
1223 return error_mark_node;
1224
1225 component = build (OFFSET_REF, field_type, datum, component);
1226 if (TREE_CODE (type) == OFFSET_TYPE)
1227 component = resolve_offset_ref (component);
1228 return component;
1229 }
1230
1231 /* Return a tree node for the expression TYPENAME '(' PARMS ')'. */
1232
1233 tree
1234 build_functional_cast (exp, parms)
1235 tree exp;
1236 tree parms;
1237 {
1238 /* This is either a call to a constructor,
1239 or a C cast in C++'s `functional' notation. */
1240 tree type;
1241
1242 if (exp == error_mark_node || parms == error_mark_node)
1243 return error_mark_node;
1244
1245 if (TREE_CODE (exp) == IDENTIFIER_NODE)
1246 {
1247 if (IDENTIFIER_HAS_TYPE_VALUE (exp))
1248 /* Either an enum or an aggregate type. */
1249 type = IDENTIFIER_TYPE_VALUE (exp);
1250 else
1251 {
1252 type = lookup_name (exp, 1);
1253 if (!type || TREE_CODE (type) != TYPE_DECL)
1254 {
1255 error ("`%T' fails to be a typedef or built-in type", exp);
1256 return error_mark_node;
1257 }
1258 type = TREE_TYPE (type);
1259 }
1260 }
1261 else if (TREE_CODE (exp) == TYPE_DECL)
1262 type = TREE_TYPE (exp);
1263 else
1264 type = exp;
1265
1266 if (processing_template_decl)
1267 return build_min (CAST_EXPR, type, parms);
1268
1269 if (! IS_AGGR_TYPE (type))
1270 {
1271 /* this must build a C cast */
1272 if (parms == NULL_TREE)
1273 parms = integer_zero_node;
1274 else
1275 {
1276 if (TREE_CHAIN (parms) != NULL_TREE)
1277 pedwarn ("initializer list being treated as compound expression");
1278 parms = build_compound_expr (parms);
1279 }
1280
1281 return build_c_cast (type, parms);
1282 }
1283
1284 /* Prepare to evaluate as a call to a constructor. If this expression
1285 is actually used, for example,
1286
1287 return X (arg1, arg2, ...);
1288
1289 then the slot being initialized will be filled in. */
1290
1291 if (!complete_type_or_else (type, NULL_TREE))
1292 return error_mark_node;
1293 if (abstract_virtuals_error (NULL_TREE, type))
1294 return error_mark_node;
1295
1296 if (parms && TREE_CHAIN (parms) == NULL_TREE)
1297 return build_c_cast (type, TREE_VALUE (parms));
1298
1299 /* We need to zero-initialize POD types. Let's do that for everything
1300 that doesn't need a constructor. */
1301 if (parms == NULL_TREE && !TYPE_NEEDS_CONSTRUCTING (type)
1302 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
1303 {
1304 exp = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
1305 return get_target_expr (exp);
1306 }
1307
1308 exp = build_method_call (NULL_TREE, complete_ctor_identifier, parms,
1309 TYPE_BINFO (type), LOOKUP_NORMAL);
1310
1311 if (exp == error_mark_node)
1312 return error_mark_node;
1313
1314 return build_cplus_new (type, exp);
1315 }
1316 \f
1317
1318 /* Complain about defining new types in inappropriate places. We give an
1319 exception for C-style casts, to accommodate GNU C stylings. */
1320
1321 void
1322 check_for_new_type (string, inptree)
1323 const char *string;
1324 flagged_type_tree inptree;
1325 {
1326 if (inptree.new_type_flag
1327 && (pedantic || strcmp (string, "cast") != 0))
1328 pedwarn ("ISO C++ forbids defining types within %s", string);
1329 }
1330
1331 /* Add new exception specifier SPEC, to the LIST we currently have.
1332 If it's already in LIST then do nothing.
1333 Moan if it's bad and we're allowed to. COMPLAIN < 0 means we
1334 know what we're doing. */
1335
1336 tree
1337 add_exception_specifier (list, spec, complain)
1338 tree list, spec;
1339 int complain;
1340 {
1341 int ok;
1342 tree core = spec;
1343 int is_ptr;
1344
1345 if (spec == error_mark_node)
1346 return list;
1347
1348 my_friendly_assert (spec && (!list || TREE_VALUE (list)), 19990317);
1349
1350 /* [except.spec] 1, type in an exception specifier shall not be
1351 incomplete, or pointer or ref to incomplete other than pointer
1352 to cv void. */
1353 is_ptr = TREE_CODE (core) == POINTER_TYPE;
1354 if (is_ptr || TREE_CODE (core) == REFERENCE_TYPE)
1355 core = TREE_TYPE (core);
1356 if (complain < 0)
1357 ok = 1;
1358 else if (VOID_TYPE_P (core))
1359 ok = is_ptr;
1360 else if (TREE_CODE (core) == TEMPLATE_TYPE_PARM)
1361 ok = 1;
1362 else if (processing_template_decl)
1363 ok = 1;
1364 else
1365 ok = COMPLETE_TYPE_P (complete_type (core));
1366
1367 if (ok)
1368 {
1369 tree probe;
1370
1371 for (probe = list; probe; probe = TREE_CHAIN (probe))
1372 if (same_type_p (TREE_VALUE (probe), spec))
1373 break;
1374 if (!probe)
1375 list = tree_cons (NULL_TREE, spec, list);
1376 }
1377 else if (complain)
1378 cxx_incomplete_type_error (NULL_TREE, core);
1379 return list;
1380 }
1381
1382 /* Combine the two exceptions specifier lists LIST and ADD, and return
1383 their union. */
1384
1385 tree
1386 merge_exception_specifiers (list, add)
1387 tree list, add;
1388 {
1389 if (!list || !add)
1390 return NULL_TREE;
1391 else if (!TREE_VALUE (list))
1392 return add;
1393 else if (!TREE_VALUE (add))
1394 return list;
1395 else
1396 {
1397 tree orig_list = list;
1398
1399 for (; add; add = TREE_CHAIN (add))
1400 {
1401 tree spec = TREE_VALUE (add);
1402 tree probe;
1403
1404 for (probe = orig_list; probe; probe = TREE_CHAIN (probe))
1405 if (same_type_p (TREE_VALUE (probe), spec))
1406 break;
1407 if (!probe)
1408 {
1409 spec = build_tree_list (NULL_TREE, spec);
1410 TREE_CHAIN (spec) = list;
1411 list = spec;
1412 }
1413 }
1414 }
1415 return list;
1416 }