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