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