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