OSDN Git Service

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