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