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