OSDN Git Service

fix
[pf3gnuchains/gcc-fork.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 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "tm.h"
35 #include "tree.h"
36 #include "cp-tree.h"
37 #include "flags.h"
38 #include "toplev.h"
39 #include "output.h"
40 #include "diagnostic.h"
41
42 static tree process_init_constructor (tree, tree, tree *);
43
44 /* Print an error message stemming from an attempt to use
45    BASETYPE as a base class for TYPE.  */
46
47 tree
48 error_not_base_type (tree basetype, tree type)
49 {
50   if (TREE_CODE (basetype) == FUNCTION_DECL)
51     basetype = DECL_CONTEXT (basetype);
52   error ("type `%T' is not a base type for type `%T'", basetype, type);
53   return error_mark_node;
54 }
55
56 tree
57 binfo_or_else (tree base, tree type)
58 {
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;
66 }
67
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.)  */
72
73 void
74 readonly_error (tree arg, const char* string, int soft)
75 {
76   const char *fmt;
77   void (*fn) (const char *, ...);
78
79   if (soft)
80     fn = pedwarn;
81   else
82     fn = error;
83
84   if (TREE_CODE (arg) == COMPONENT_REF)
85     {
86       if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
87         fmt = "%s of data-member `%D' in read-only structure";
88       else
89         fmt = "%s of read-only data-member `%D'";
90       (*fn) (fmt, string, TREE_OPERAND (arg, 1));
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))
97         fmt = "%s of constant field `%D'";
98       else
99         fmt = "%s of read-only variable `%D'";
100       (*fn) (fmt, string, arg);
101     }
102   else if (TREE_CODE (arg) == PARM_DECL)
103     (*fn) ("%s of read-only parameter `%D'", string, arg);
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))
108     (*fn) ("%s of read-only reference `%D'", string, TREE_OPERAND (arg, 0));
109   else if (TREE_CODE (arg) == RESULT_DECL)
110     (*fn) ("%s of read-only named return value `%D'", string, arg);
111   else if (TREE_CODE (arg) == FUNCTION_DECL)
112     (*fn) ("%s of function `%D'", string, arg);
113   else
114     (*fn) ("%s of read-only location", string);
115 }
116
117 /* If TYPE has abstract virtual functions, issue an error about trying
118    to create an object of that type.  DECL is the object declared, or
119    NULL_TREE if the declaration is unavailable.  Returns 1 if an error
120    occurred; zero if all was well.  */
121
122 int
123 abstract_virtuals_error (tree decl, tree type)
124 {
125   tree u;
126   tree tu;
127
128   if (!CLASS_TYPE_P (type) || !CLASSTYPE_PURE_VIRTUALS (type))
129     return 0;
130
131   if (!TYPE_SIZE (type))
132     /* TYPE is being defined, and during that time
133        CLASSTYPE_PURE_VIRTUALS holds the inline friends.  */
134     return 0;
135
136   if (dependent_type_p (type))
137     /* For a dependent type, we do not yet know which functions are pure
138        virtuals.  */
139     return 0;
140
141   u = CLASSTYPE_PURE_VIRTUALS (type);
142   if (decl)
143     {
144       if (TREE_CODE (decl) == RESULT_DECL)
145         return 0;
146
147       if (TREE_CODE (decl) == VAR_DECL)
148         cp_error_at ("cannot declare variable `%+D' to be of abstract "
149                      "type `%T'", decl, type);
150       else if (TREE_CODE (decl) == PARM_DECL)
151         cp_error_at ("cannot declare parameter `%+D' to be of abstract "
152                      "type `%T'", decl, type);
153       else if (TREE_CODE (decl) == FIELD_DECL)
154         cp_error_at ("cannot declare field `%+D' to be of abstract "
155                      "type `%T'", decl, type);
156       else if (TREE_CODE (decl) == FUNCTION_DECL
157                && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
158         cp_error_at ("invalid abstract return type for member function `%+#D'",
159                      decl);
160       else if (TREE_CODE (decl) == FUNCTION_DECL)
161         cp_error_at ("invalid abstract return type for function `%+#D'", 
162                      decl);
163       else
164         cp_error_at ("invalid abstract type for `%+D'", decl);
165     }
166   else
167     error ("cannot allocate an object of abstract 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       inform ("%J  because the following virtual functions are pure "
175               "within `%T':", TYPE_MAIN_DECL (type), type);
176
177       for (tu = u; tu; tu = TREE_CHAIN (tu))
178         inform ("%J\t%#D", TREE_VALUE (tu), TREE_VALUE (tu));
179     }
180   else
181     inform ("%J  since type `%T' has pure virtual functions", 
182             TYPE_MAIN_DECL (type), type);
183
184   return 1;
185 }
186
187 /* Print an error message for invalid use of an incomplete type.
188    VALUE is the expression that was used (or 0 if that isn't known)
189    and TYPE is the type that was invalid.  DIAG_TYPE indicates the
190    type of diagnostic:  0 for an error, 1 for a warning, 2 for a
191    pedwarn.  */
192
193 void
194 cxx_incomplete_type_diagnostic (tree value, tree type, int diag_type)
195 {
196   int decl = 0;
197   void (*p_msg) (const char *, ...);
198   void (*p_msg_at) (const char *, ...);
199
200   if (diag_type == 1)
201     {
202       p_msg = warning;
203       p_msg_at = cp_warning_at;
204     }
205   else if (diag_type == 2)
206     {
207       p_msg = pedwarn;
208       p_msg_at = cp_pedwarn_at;
209     }
210   else
211     {
212       p_msg = error;
213       p_msg_at = cp_error_at;
214     }
215   
216   /* Avoid duplicate error message.  */
217   if (TREE_CODE (type) == ERROR_MARK)
218     return;
219
220   if (value != 0 && (TREE_CODE (value) == VAR_DECL
221                      || TREE_CODE (value) == PARM_DECL
222                      || TREE_CODE (value) == FIELD_DECL))
223     {
224       (*p_msg_at) ("`%D' has incomplete type", value);
225       decl = 1;
226     }
227 retry:
228   /* We must print an error message.  Be clever about what it says.  */
229
230   switch (TREE_CODE (type))
231     {
232     case RECORD_TYPE:
233     case UNION_TYPE:
234     case ENUMERAL_TYPE:
235       if (!decl)
236         (*p_msg) ("invalid use of undefined type `%#T'", type);
237       if (!TYPE_TEMPLATE_INFO (type))
238         (*p_msg_at) ("forward declaration of `%#T'", type);
239       else
240         (*p_msg_at) ("declaration of `%#T'", type);
241       break;
242
243     case VOID_TYPE:
244       (*p_msg) ("invalid use of `%T'", type);
245       break;
246
247     case ARRAY_TYPE:
248       if (TYPE_DOMAIN (type))
249         {
250           type = TREE_TYPE (type);
251           goto retry;
252         }
253       (*p_msg) ("invalid use of array with unspecified bounds");
254       break;
255
256     case OFFSET_TYPE:
257     bad_member:
258       (*p_msg) ("invalid use of member (did you forget the `&' ?)");
259       break;
260
261     case TEMPLATE_TYPE_PARM:
262       (*p_msg) ("invalid use of template type parameter");
263       break;
264
265     case UNKNOWN_TYPE:
266       if (value && TREE_CODE (value) == COMPONENT_REF)
267         goto bad_member;
268       else if (value && TREE_CODE (value) == ADDR_EXPR)
269         (*p_msg) ("address of overloaded function with no contextual type information");
270       else if (value && TREE_CODE (value) == OVERLOAD)
271         (*p_msg) ("overloaded function with no contextual type information");
272       else
273         (*p_msg) ("insufficient contextual information to determine type");
274       break;
275     
276     default:
277       abort ();
278     }
279 }
280
281 /* Backward-compatibility interface to incomplete_type_diagnostic;
282    required by ../tree.c.  */
283 #undef cxx_incomplete_type_error
284 void
285 cxx_incomplete_type_error (tree value, tree type)
286 {
287   cxx_incomplete_type_diagnostic (value, type, 0);
288 }
289
290 \f
291 /* The recursive part of split_nonconstant_init.  DEST is an lvalue
292    expression to which INIT should be assigned.  INIT is a CONSTRUCTOR.  */
293
294 static void
295 split_nonconstant_init_1 (tree dest, tree init)
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                              NULL_TREE, NULL_TREE);
325               else
326                 sub = build (COMPONENT_REF, inner_type, dest, field_index,
327                              NULL_TREE);
328
329               split_nonconstant_init_1 (sub, value);
330             }
331           else if (!initializer_constant_valid_p (value, inner_type))
332             {
333               *pelt = TREE_CHAIN (elt);
334
335               if (array_type_p)
336                 sub = build (ARRAY_REF, inner_type, dest, field_index,
337                              NULL_TREE, NULL_TREE);
338               else
339                 sub = build (COMPONENT_REF, inner_type, dest, field_index,
340                              NULL_TREE);
341
342               code = build (MODIFY_EXPR, inner_type, sub, value);
343               code = build_stmt (EXPR_STMT, code);
344               add_stmt (code);
345               continue;
346             }
347
348           pelt = &TREE_CHAIN (elt);
349         }
350       break;
351
352     case VECTOR_TYPE:
353       if (!initializer_constant_valid_p (init, type))
354         {
355           CONSTRUCTOR_ELTS (init) = NULL;
356           code = build (MODIFY_EXPR, type, dest, init);
357           code = build_stmt (EXPR_STMT, code);
358           add_stmt (code);
359         }
360       break;
361
362     default:
363       abort ();
364     }
365 }
366
367 /* A subroutine of store_init_value.  Splits non-constant static 
368    initializer INIT into a constant part and generates code to
369    perform the non-constant part of the initialization to DEST.
370    Returns the code for the runtime init.  */
371
372 static tree
373 split_nonconstant_init (tree dest, tree init)
374 {
375   tree code;
376
377   if (TREE_CODE (init) == CONSTRUCTOR)
378     {
379       code = push_stmt_list ();
380       split_nonconstant_init_1 (dest, init);
381       code = pop_stmt_list (code);
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)
1001     {
1002       TREE_CONSTANT (result) = 1;
1003       TREE_INVARIANT (result) = 1;
1004       if (allsimple)
1005         TREE_STATIC (result) = 1;
1006     }
1007   return result;
1008 }
1009 \f
1010 /* Given a structure or union value DATUM, construct and return
1011    the structure or union component which results from narrowing
1012    that value to the base specified in BASETYPE.  For example, given the
1013    hierarchy
1014
1015    class L { int ii; };
1016    class A : L { ... };
1017    class B : L { ... };
1018    class C : A, B { ... };
1019
1020    and the declaration
1021
1022    C x;
1023
1024    then the expression
1025
1026    x.A::ii refers to the ii member of the L part of
1027    the A part of the C object named by X.  In this case,
1028    DATUM would be x, and BASETYPE would be A.
1029
1030    I used to think that this was nonconformant, that the standard specified
1031    that first we look up ii in A, then convert x to an L& and pull out the
1032    ii part.  But in fact, it does say that we convert x to an A&; A here
1033    is known as the "naming class".  (jason 2000-12-19)
1034
1035    BINFO_P points to a variable initialized either to NULL_TREE or to the
1036    binfo for the specific base subobject we want to convert to.  */
1037
1038 tree
1039 build_scoped_ref (tree datum, tree basetype, tree* binfo_p)
1040 {
1041   tree binfo;
1042
1043   if (datum == error_mark_node)
1044     return error_mark_node;
1045   if (*binfo_p)
1046     binfo = *binfo_p;
1047   else
1048     binfo = lookup_base (TREE_TYPE (datum), basetype, ba_check, NULL);
1049
1050   if (!binfo || binfo == error_mark_node)
1051     {
1052       *binfo_p = NULL_TREE;
1053       if (!binfo)
1054         error_not_base_type (basetype, TREE_TYPE (datum));
1055       return error_mark_node;
1056     }
1057
1058   *binfo_p = binfo;
1059   return build_base_path (PLUS_EXPR, datum, binfo, 1);
1060 }
1061
1062 /* Build a reference to an object specified by the C++ `->' operator.
1063    Usually this just involves dereferencing the object, but if the
1064    `->' operator is overloaded, then such overloads must be
1065    performed until an object which does not have the `->' operator
1066    overloaded is found.  An error is reported when circular pointer
1067    delegation is detected.  */
1068
1069 tree
1070 build_x_arrow (tree expr)
1071 {
1072   tree orig_expr = expr;
1073   tree types_memoized = NULL_TREE;
1074   tree type = TREE_TYPE (expr);
1075   tree last_rval = NULL_TREE;
1076
1077   if (type == error_mark_node)
1078     return error_mark_node;
1079
1080   if (processing_template_decl)
1081     {
1082       if (type_dependent_expression_p (expr))
1083         return build_min_nt (ARROW_EXPR, expr);
1084       expr = build_non_dependent_expr (expr);
1085     }
1086
1087   if (TREE_CODE (type) == REFERENCE_TYPE)
1088     {
1089       expr = convert_from_reference (expr);
1090       type = TREE_TYPE (expr);
1091     }
1092
1093   if (IS_AGGR_TYPE (type))
1094     {
1095       while ((expr = build_new_op (COMPONENT_REF, LOOKUP_NORMAL, expr,
1096                                    NULL_TREE, NULL_TREE,
1097                                    /*overloaded_p=*/NULL)))
1098         {
1099           if (expr == error_mark_node)
1100             return error_mark_node;
1101
1102           if (value_member (TREE_TYPE (expr), types_memoized))
1103             {
1104               error ("circular pointer delegation detected");
1105               return error_mark_node;
1106             }
1107           else
1108             {
1109               types_memoized = tree_cons (NULL_TREE, TREE_TYPE (expr),
1110                                           types_memoized);
1111             }
1112           last_rval = expr;
1113         }     
1114
1115       if (last_rval == NULL_TREE)
1116         {
1117           error ("base operand of `->' has non-pointer type `%T'", type);
1118           return error_mark_node;
1119         }
1120
1121       if (TREE_CODE (TREE_TYPE (last_rval)) == REFERENCE_TYPE)
1122         last_rval = convert_from_reference (last_rval);
1123     }
1124   else
1125     last_rval = decay_conversion (expr);
1126
1127   if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE)
1128     {
1129       if (processing_template_decl)
1130         {
1131           expr = build_min_non_dep (ARROW_EXPR, last_rval, orig_expr);
1132           /* It will be dereferenced.  */
1133           TREE_TYPE (expr) = TREE_TYPE (TREE_TYPE (last_rval));
1134           return expr;
1135         }
1136
1137       return build_indirect_ref (last_rval, NULL);
1138     }
1139
1140   if (types_memoized)
1141     error ("result of `operator->()' yields non-pointer result");
1142   else
1143     error ("base operand of `->' is not a pointer");
1144   return error_mark_node;
1145 }
1146
1147 /* Return an expression for "DATUM .* COMPONENT".  DATUM has not
1148    already been checked out to be of aggregate type.  */
1149
1150 tree
1151 build_m_component_ref (tree datum, tree component)
1152 {
1153   tree ptrmem_type;
1154   tree objtype;
1155   tree type;
1156   tree binfo;
1157
1158   datum = decay_conversion (datum);
1159
1160   if (datum == error_mark_node || component == error_mark_node)
1161     return error_mark_node;
1162
1163   ptrmem_type = TREE_TYPE (component);
1164   if (!TYPE_PTR_TO_MEMBER_P (ptrmem_type))
1165     {
1166       error ("`%E' cannot be used as a member pointer, since it is of type `%T'", 
1167              component, ptrmem_type);
1168       return error_mark_node;
1169     }
1170     
1171   objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));  
1172   if (! IS_AGGR_TYPE (objtype))
1173     {
1174       error ("cannot apply member pointer `%E' to `%E', which is of non-aggregate type `%T'",
1175                 component, datum, objtype);
1176       return error_mark_node;
1177     }
1178
1179   type = TYPE_PTRMEM_POINTED_TO_TYPE (ptrmem_type);
1180   binfo = lookup_base (objtype, TYPE_PTRMEM_CLASS_TYPE (ptrmem_type),
1181                        ba_check, NULL);
1182   if (!binfo)
1183     {
1184       error ("member type `%T::' incompatible with object type `%T'",
1185              type, objtype);
1186       return error_mark_node;
1187     }
1188   else if (binfo == error_mark_node)
1189     return error_mark_node;
1190
1191   if (TYPE_PTRMEM_P (ptrmem_type))
1192     {
1193       /* Compute the type of the field, as described in [expr.ref].
1194          There's no such thing as a mutable pointer-to-member, so
1195          things are not as complex as they are for references to
1196          non-static data members.  */
1197       type = cp_build_qualified_type (type,
1198                                       (cp_type_quals (type)  
1199                                        | cp_type_quals (TREE_TYPE (datum))));
1200       /* Build an expression for "object + offset" where offset is the
1201          value stored in the pointer-to-data-member.  */
1202       datum = build (PLUS_EXPR, build_pointer_type (type),
1203                      build_base_path (PLUS_EXPR, build_address (datum), 
1204                                       binfo, 1),
1205                      build_nop (ptrdiff_type_node, component));
1206       return build_indirect_ref (datum, 0);
1207     }
1208   else
1209     return build (OFFSET_REF, type, datum, component);
1210 }
1211
1212 /* Return a tree node for the expression TYPENAME '(' PARMS ')'.  */
1213
1214 tree
1215 build_functional_cast (tree exp, tree parms)
1216 {
1217   /* This is either a call to a constructor,
1218      or a C cast in C++'s `functional' notation.  */
1219   tree type;
1220
1221   if (exp == error_mark_node || parms == error_mark_node)
1222     return error_mark_node;
1223
1224   if (TREE_CODE (exp) == TYPE_DECL)
1225     type = TREE_TYPE (exp);
1226   else
1227     type = exp;
1228
1229   if (processing_template_decl)
1230     {
1231       tree t = build_min (CAST_EXPR, type, parms);
1232       /* We don't know if it will or will not have side effects.  */
1233       TREE_SIDE_EFFECTS (t) = 1;
1234       return t;
1235     }
1236
1237   if (! IS_AGGR_TYPE (type))
1238     {
1239       /* This must build a C cast.  */
1240       if (parms == NULL_TREE)
1241         parms = integer_zero_node;
1242       else
1243         parms = build_x_compound_expr_from_list (parms, "functional cast");
1244
1245       return build_c_cast (type, parms);
1246     }
1247
1248   /* Prepare to evaluate as a call to a constructor.  If this expression
1249      is actually used, for example,
1250          
1251      return X (arg1, arg2, ...);
1252          
1253      then the slot being initialized will be filled in.  */
1254
1255   if (!complete_type_or_else (type, NULL_TREE))
1256     return error_mark_node;
1257   if (abstract_virtuals_error (NULL_TREE, type))
1258     return error_mark_node;
1259
1260   if (parms && TREE_CHAIN (parms) == NULL_TREE)
1261     return build_c_cast (type, TREE_VALUE (parms));
1262
1263   /* We need to zero-initialize POD types.  Let's do that for everything
1264      that doesn't need a constructor.  */
1265   if (parms == NULL_TREE && !TYPE_NEEDS_CONSTRUCTING (type)
1266       && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
1267     {
1268       exp = build_constructor (type, NULL_TREE);
1269       return get_target_expr (exp);
1270     }
1271
1272   exp = build_special_member_call (NULL_TREE, complete_ctor_identifier, parms,
1273                                    TYPE_BINFO (type), LOOKUP_NORMAL);
1274
1275   if (exp == error_mark_node)
1276     return error_mark_node;
1277
1278   return build_cplus_new (type, exp);
1279 }
1280 \f
1281
1282 /* Add new exception specifier SPEC, to the LIST we currently have.
1283    If it's already in LIST then do nothing.
1284    Moan if it's bad and we're allowed to. COMPLAIN < 0 means we
1285    know what we're doing.  */
1286
1287 tree
1288 add_exception_specifier (tree list, tree spec, int complain)
1289 {
1290   bool ok;
1291   tree core = spec;
1292   bool is_ptr;
1293   int diag_type = -1; /* none */
1294   
1295   if (spec == error_mark_node)
1296     return list;
1297   
1298   my_friendly_assert (spec && (!list || TREE_VALUE (list)), 19990317);
1299   
1300   /* [except.spec] 1, type in an exception specifier shall not be
1301      incomplete, or pointer or ref to incomplete other than pointer
1302      to cv void.  */
1303   is_ptr = TREE_CODE (core) == POINTER_TYPE;
1304   if (is_ptr || TREE_CODE (core) == REFERENCE_TYPE)
1305     core = TREE_TYPE (core);
1306   if (complain < 0)
1307     ok = true;
1308   else if (VOID_TYPE_P (core))
1309     ok = is_ptr;
1310   else if (TREE_CODE (core) == TEMPLATE_TYPE_PARM)
1311     ok = true;
1312   else if (processing_template_decl)
1313     ok = true;
1314   else
1315     {
1316       ok = true;
1317       /* 15.4/1 says that types in an exception specifier must be complete,
1318          but it seems more reasonable to only require this on definitions
1319          and calls.  So just give a pedwarn at this point; we will give an
1320          error later if we hit one of those two cases.  */
1321       if (!COMPLETE_TYPE_P (complete_type (core)))
1322         diag_type = 2; /* pedwarn */
1323     }
1324
1325   if (ok)
1326     {
1327       tree probe;
1328       
1329       for (probe = list; probe; probe = TREE_CHAIN (probe))
1330         if (same_type_p (TREE_VALUE (probe), spec))
1331           break;
1332       if (!probe)
1333         list = tree_cons (NULL_TREE, spec, list);
1334     }
1335   else
1336     diag_type = 0; /* error */
1337     
1338   if (diag_type >= 0 && complain)
1339     cxx_incomplete_type_diagnostic (NULL_TREE, core, diag_type);
1340
1341   return list;
1342 }
1343
1344 /* Combine the two exceptions specifier lists LIST and ADD, and return
1345    their union.  */
1346
1347 tree
1348 merge_exception_specifiers (tree list, tree add)
1349 {
1350   if (!list || !add)
1351     return NULL_TREE;
1352   else if (!TREE_VALUE (list))
1353     return add;
1354   else if (!TREE_VALUE (add))
1355     return list;
1356   else
1357     {
1358       tree orig_list = list;
1359       
1360       for (; add; add = TREE_CHAIN (add))
1361         {
1362           tree spec = TREE_VALUE (add);
1363           tree probe;
1364           
1365           for (probe = orig_list; probe; probe = TREE_CHAIN (probe))
1366             if (same_type_p (TREE_VALUE (probe), spec))
1367               break;
1368           if (!probe)
1369             {
1370               spec = build_tree_list (NULL_TREE, spec);
1371               TREE_CHAIN (spec) = list;
1372               list = spec;
1373             }
1374         }
1375     }
1376   return list;
1377 }
1378
1379 /* Subroutine of build_call.  Ensure that each of the types in the
1380    exception specification is complete.  Technically, 15.4/1 says that
1381    they need to be complete when we see a declaration of the function,
1382    but we should be able to get away with only requiring this when the
1383    function is defined or called.  See also add_exception_specifier.  */
1384
1385 void
1386 require_complete_eh_spec_types (tree fntype, tree decl)
1387 {
1388   tree raises;
1389   /* Don't complain about calls to op new.  */
1390   if (decl && DECL_ARTIFICIAL (decl))
1391     return;
1392   for (raises = TYPE_RAISES_EXCEPTIONS (fntype); raises;
1393        raises = TREE_CHAIN (raises))
1394     {
1395       tree type = TREE_VALUE (raises);
1396       if (type && !COMPLETE_TYPE_P (type))
1397         {
1398           if (decl)
1399             error
1400               ("call to function `%D' which throws incomplete type `%#T'",
1401                decl, type);
1402           else
1403             error ("call to function which throws incomplete type `%#T'",
1404                    decl);
1405         }
1406     }
1407 }