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