OSDN Git Service

40th Cygnus<->FSF merge
[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) '87, '88, '89, '92, 1993, 1994 Free Software Foundation, Inc.
4    Hacked by Michael Tiemann (tiemann@cygnus.com)
5
6 This file is part of GNU CC.
7
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING.  If not, write to
20 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
21
22
23 /* This file is part of the C++ front end.
24    It contains routines to build C++ expressions given their operands,
25    including computing the types of the result, C and C++ specific error
26    checks, and some optimization.
27
28    There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
29    and to process initializations in declarations (since they work
30    like a strange sort of assignment).  */
31
32 #include "config.h"
33 #include <stdio.h>
34 #include "tree.h"
35 #include "cp-tree.h"
36 #include "flags.h"
37
38 static tree process_init_constructor ();
39 extern void pedwarn (), error ();
40
41 extern int errorcount;
42 extern int sorrycount;
43
44 /* Print an error message stemming from an attempt to use
45    BASETYPE as a base class for TYPE.  */
46 tree
47 error_not_base_type (basetype, type)
48      tree basetype, type;
49 {
50   if (TREE_CODE (basetype) == FUNCTION_DECL)
51     basetype = DECL_CLASS_CONTEXT (basetype);
52   cp_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 (parent_or_type, type)
58      tree parent_or_type, type;
59 {
60   tree binfo;
61   if (TYPE_MAIN_VARIANT (parent_or_type) == TYPE_MAIN_VARIANT (type))
62     return TYPE_BINFO (parent_or_type);
63   if ((binfo = get_binfo (parent_or_type, TYPE_MAIN_VARIANT (type), 0)))
64     {
65       if (binfo == error_mark_node)
66         return NULL_TREE;
67       return binfo;
68     }
69   error_not_base_type (parent_or_type, type);
70   return NULL_TREE;
71 }
72
73 /* Print an error message stemming from an invalid use of an
74    aggregate type.
75
76    TYPE is the type or binfo which draws the error.
77    MSG is the message to print.
78    ARG is an optional argument which may provide more information.  */
79 void
80 error_with_aggr_type (type, msg, arg)
81      tree type;
82      char *msg;
83      HOST_WIDE_INT arg;
84 {
85   tree name;
86
87   if (TREE_CODE (type) == TREE_VEC)
88     type = BINFO_TYPE (type);
89
90   name = TYPE_NAME (type);
91   if (TREE_CODE (name) == TYPE_DECL)
92     name = DECL_NAME (name);
93   error (msg, IDENTIFIER_POINTER (name), arg);
94 }
95
96 /* According to ARM $7.1.6, "A `const' object may be initialized, but its
97    value may not be changed thereafter.  Thus, we emit hard errors for these,
98    rather than just pedwarns.  If `SOFT' is 1, then we just pedwarn.  (For
99    example, conversions to references.)  */
100 void
101 readonly_error (arg, string, soft)
102      tree arg;
103      char *string;
104      int soft;
105 {
106   char *fmt;
107   void (*fn)();
108
109   if (soft)
110     fn = pedwarn;
111   else
112     fn = error;
113
114   if (TREE_CODE (arg) == COMPONENT_REF)
115     {
116       if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
117         fmt = "%s of member `%s' in read-only structure";
118       else
119         fmt = "%s of read-only member `%s'";
120       (*fn) (fmt, string, lang_printable_name (TREE_OPERAND (arg, 1)));
121     }
122   else if (TREE_CODE (arg) == VAR_DECL)
123     {
124       if (DECL_LANG_SPECIFIC (arg)
125           && DECL_IN_AGGR_P (arg)
126           && !TREE_STATIC (arg))
127         fmt = "%s of constant field `%s'";
128       else
129         fmt = "%s of read-only variable `%s'";
130       (*fn) (fmt, string, lang_printable_name (arg));
131     }
132   else if (TREE_CODE (arg) == PARM_DECL)
133     (*fn) ("%s of read-only parameter `%s'", string,
134            lang_printable_name (arg));
135   else if (TREE_CODE (arg) == INDIRECT_REF
136            && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REFERENCE_TYPE
137            && (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL
138                || TREE_CODE (TREE_OPERAND (arg, 0)) == PARM_DECL))
139     (*fn) ("%s of read-only reference `%s'",
140            string, lang_printable_name (TREE_OPERAND (arg, 0)));
141   else if (TREE_CODE (arg) == RESULT_DECL)
142     (*fn) ("%s of read-only named return value `%s'",
143            string, lang_printable_name (arg));
144   else         
145     (*fn) ("%s of read-only location", string);
146 }
147
148 /* Print an error message for invalid use of a type which declares
149    virtual functions which are not inheritable.  */
150 void
151 abstract_virtuals_error (decl, type)
152      tree decl;
153      tree type;
154 {
155   tree u = CLASSTYPE_ABSTRACT_VIRTUALS (type);
156
157   if (decl)
158     {
159       if (TREE_CODE (decl) == RESULT_DECL)
160         return;
161
162       if (TREE_CODE (decl) == VAR_DECL)
163         cp_error ("cannot declare variable `%D' to be of type `%T'",
164                     decl, type);
165       else if (TREE_CODE (decl) == PARM_DECL)
166         cp_error ("cannot declare parameter `%D' to be of type `%T'",
167                     decl, type);
168       else if (TREE_CODE (decl) == FIELD_DECL)
169         cp_error ("cannot declare field `%D' to be of type `%T'",
170                     decl, type);
171       else if (TREE_CODE (decl) == FUNCTION_DECL
172                && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
173         cp_error ("invalid return type for method `%#D'", decl);
174       else if (TREE_CODE (decl) == FUNCTION_DECL)
175         cp_error ("invalid return type for function `%#D'", decl);
176     }
177   else cp_error ("cannot allocate an object of type `%T'", type);
178   /* Only go through this once.  */
179   if (TREE_PURPOSE (u) == NULL_TREE)
180     {
181       error ("  since the following virtual functions are abstract:");
182       TREE_PURPOSE (u) = error_mark_node;
183       while (u)
184         {
185           cp_error ("\t%#D", TREE_VALUE (u));
186           u = TREE_CHAIN (u);
187         }
188     }
189   else cp_error ("  since type `%T' has abstract virtual functions", type);
190 }
191
192 /* Print an error message for invalid use of a signature type.
193    Signatures are treated similar to abstract classes here, they
194    cannot be instantiated.  */
195 void
196 signature_error (decl, type)
197      tree decl;
198      tree type;
199 {
200   if (decl)
201     {
202       if (TREE_CODE (decl) == RESULT_DECL)
203         return;
204
205       if (TREE_CODE (decl) == VAR_DECL)
206         cp_error ("cannot declare variable `%D' to be of signature type `%T'",
207                   decl, type);
208       else if (TREE_CODE (decl) == PARM_DECL)
209         cp_error ("cannot declare parameter `%D' to be of signature type `%T'",
210                   decl, type);
211       else if (TREE_CODE (decl) == FIELD_DECL)
212         cp_error ("cannot declare field `%D' to be of signature type `%T'",
213                   decl, type);
214       else if (TREE_CODE (decl) == FUNCTION_DECL
215                && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
216         cp_error ("invalid return type for method `%#D'", decl);
217       else if (TREE_CODE (decl) == FUNCTION_DECL)
218         cp_error ("invalid return type for function `%#D'", decl);
219     }
220   else
221     cp_error ("cannot allocate an object of signature type `%T'", type);
222 }
223
224 /* Print an error message for invalid use of an incomplete type.
225    VALUE is the expression that was used (or 0 if that isn't known)
226    and TYPE is the type that was invalid.  */
227
228 void
229 incomplete_type_error (value, type)
230      tree value;
231      tree type;
232 {
233   char *errmsg;
234
235   /* Avoid duplicate error message.  */
236   if (TREE_CODE (type) == ERROR_MARK)
237     return;
238
239   if (value != 0 && (TREE_CODE (value) == VAR_DECL
240                      || TREE_CODE (value) == PARM_DECL))
241     error ("`%s' has an incomplete type",
242            IDENTIFIER_POINTER (DECL_NAME (value)));
243   else
244     {
245     retry:
246       /* We must print an error message.  Be clever about what it says.  */
247
248       switch (TREE_CODE (type))
249         {
250         case RECORD_TYPE:
251           errmsg = "invalid use of undefined type `struct %s'";
252           break;
253
254         case UNION_TYPE:
255           errmsg = "invalid use of undefined type `union %s'";
256           break;
257
258         case ENUMERAL_TYPE:
259           errmsg = "invalid use of undefined type `enum %s'";
260           break;
261
262         case VOID_TYPE:
263           error ("invalid use of void expression");
264           return;
265
266         case ARRAY_TYPE:
267           if (TYPE_DOMAIN (type))
268             {
269               type = TREE_TYPE (type);
270               goto retry;
271             }
272           error ("invalid use of array with unspecified bounds");
273           return;
274
275         case OFFSET_TYPE:
276           error ("invalid use of member type (did you forget the `&' ?)");
277           return;
278
279         default:
280           my_friendly_abort (108);
281         }
282
283       error_with_aggr_type (type, errmsg);
284     }
285 }
286
287 /* Like error(), but don't call report_error_function().  */
288 static void
289 ack (s, v, v2)
290      char *s;
291      HOST_WIDE_INT v;
292      HOST_WIDE_INT v2;
293 {
294   extern char * progname;
295   
296   if (input_filename)
297     fprintf (stderr, "%s:%d: ", input_filename, lineno);
298   else
299     fprintf (stderr, "%s: ", progname);
300
301   fprintf (stderr, s, v, v2);
302   fprintf (stderr, "\n");
303 }
304   
305 /* There are times when the compiler can get very confused, confused
306    to the point of giving up by aborting, simply because of previous
307    input errors.  It is much better to have the user go back and
308    correct those errors first, and see if it makes us happier, than it
309    is to abort on him.  This is because when one has a 10,000 line
310    program, and the compiler comes back with ``core dump'', the user
311    is left not knowing even where to begin to fix things and no place
312    to even try and work around things.
313
314    The parameter is to uniquely identify the problem to the user, so
315    that they can say, I am having problem 59, and know that fix 7 will
316    probably solve their problem.  Or, we can document what problem
317    59 is, so they can understand how to work around it, should they
318    ever run into it.
319
320    Note, there will be no more calls in the C++ front end to abort,
321    because the C++ front end is so unreliable still.  The C front end
322    can get away with calling abort, because for most of the calls to
323    abort on most machines, it, I suspect, can be proven that it is
324    impossible to ever call abort.  The same is not yet true for C++,
325    one day, maybe it will be.
326
327    We used to tell people to "fix the above error[s] and try recompiling
328    the program" via a call to fatal, but that message tended to look
329    silly.  So instead, we just do the equivalent of a call to fatal in the
330    same situation (call exit).  */
331
332 /* First used: 0 (reserved), Last used: 358.  Free:  */
333
334 static int abortcount = 0;
335
336 void
337 my_friendly_abort (i)
338      int i;
339 {
340   /* if the previous error came through here, i.e. report_error_function
341      ended up calling us again, don't just exit; we want a diagnostic of
342      some kind.  */
343   if (abortcount == 1)
344     current_function_decl = NULL_TREE;
345   else if (errorcount > 0 || sorrycount > 0)
346     {
347       if (abortcount > 1)
348         {
349           if (i == 0)
350             ack ("Internal compiler error.");
351           else
352             ack ("Internal compiler error %d.", i);
353           ack ("Please submit a full bug report to `bug-g++@prep.ai.mit.edu'.");
354         }
355       else
356         error ("confused by earlier errors, bailing out");
357       
358       exit (34);
359     }
360   ++abortcount;
361
362   if (i == 0)
363     error ("Internal compiler error.");
364   else
365     error ("Internal compiler error %d.", i);
366
367   fatal ("Please submit a full bug report to `bug-g++@prep.ai.mit.edu'.");
368 }
369
370 void
371 my_friendly_assert (cond, where)
372      int cond, where;
373 {
374   if (cond == 0)
375     my_friendly_abort (where);
376 }
377 \f
378 /* Return nonzero if VALUE is a valid constant-valued expression
379    for use in initializing a static variable; one that can be an
380    element of a "constant" initializer.
381
382    Return 1 if the value is absolute; return 2 if it is relocatable.
383    We assume that VALUE has been folded as much as possible;
384    therefore, we do not need to check for such things as
385    arithmetic-combinations of integers.  */
386
387 static int
388 initializer_constant_valid_p (value)
389      tree value;
390 {
391   switch (TREE_CODE (value))
392     {
393     case CONSTRUCTOR:
394       return TREE_STATIC (value);
395
396     case INTEGER_CST:
397     case REAL_CST:
398     case STRING_CST:
399       return 1;
400
401     case ADDR_EXPR:
402       return 2;
403
404     case CONVERT_EXPR:
405     case NOP_EXPR:
406       /* Allow conversions between types of the same kind.  */
407       if (TREE_CODE (TREE_TYPE (value))
408           == TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))))
409         return initializer_constant_valid_p (TREE_OPERAND (value, 0));
410       /* Allow (int) &foo provided int is as wide as a pointer.  */
411       if (TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
412           && TREE_CODE (TREE_TYPE (TREE_OPERAND (value, 0))) == POINTER_TYPE
413           && ! tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (value)),
414                                 TYPE_SIZE (TREE_TYPE (TREE_OPERAND (value, 0)))))
415         return initializer_constant_valid_p (TREE_OPERAND (value, 0));
416       return 0;
417
418     case PLUS_EXPR:
419       {
420         int valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0));
421         int valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1));
422         if (valid0 == 1 && valid1 == 2)
423           return 2;
424         if (valid0 == 2 && valid1 == 1)
425           return 2;
426         return 0;
427       }
428
429     case MINUS_EXPR:
430       {
431         int valid0 = initializer_constant_valid_p (TREE_OPERAND (value, 0));
432         int valid1 = initializer_constant_valid_p (TREE_OPERAND (value, 1));
433         if (valid0 == 2 && valid1 == 1)
434           return 2;
435         return 0;
436       }
437
438     default:
439       return 0;
440     }
441 }
442 \f
443 /* Perform appropriate conversions on the initial value of a variable,
444    store it in the declaration DECL,
445    and print any error messages that are appropriate.
446    If the init is invalid, store an ERROR_MARK.
447
448    C++: Note that INIT might be a TREE_LIST, which would mean that it is
449    a base class initializer for some aggregate type, hopefully compatible
450    with DECL.  If INIT is a single element, and DECL is an aggregate
451    type, we silently convert INIT into a TREE_LIST, allowing a constructor
452    to be called.
453
454    If INIT is a TREE_LIST and there is no constructor, turn INIT
455    into a CONSTRUCTOR and use standard initialization techniques.
456    Perhaps a warning should be generated?
457
458    Returns value of initializer if initialization could not be
459    performed for static variable.  In that case, caller must do
460    the storing.  */
461
462 tree
463 store_init_value (decl, init)
464      tree decl, init;
465 {
466   register tree value, type;
467
468   /* If variable's type was invalidly declared, just ignore it.  */
469
470   type = TREE_TYPE (decl);
471   if (TREE_CODE (type) == ERROR_MARK)
472     return NULL_TREE;
473
474   /* Take care of C++ business up here.  */
475   type = TYPE_MAIN_VARIANT (type);
476
477   /* implicitly tests if IS_AGGR_TYPE.  */
478   if (TYPE_NEEDS_CONSTRUCTING (type) && TREE_CODE (init) != CONSTRUCTOR)
479     my_friendly_abort (109);
480   else if (IS_AGGR_TYPE (type))
481     {
482       /* Although we are not allowed to declare variables of signature
483          type, we complain about a possible constructor call in such a
484          declaration as well.  */
485       if (TREE_CODE (init) == TREE_LIST
486           && IS_SIGNATURE (type))
487         {
488           cp_error ("constructor syntax cannot be used with signature type `%T'",
489                     type);
490           init = error_mark_node;
491         }
492       else if (TREE_CODE (init) == TREE_LIST)
493         {
494           cp_error ("constructor syntax used, but no constructor declared for type `%T'", type);
495           init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse (init));
496         }
497 #if 0
498       if (TREE_CODE (init) == CONSTRUCTOR)
499         {
500           tree field;
501           tree funcs;
502           int func;
503
504           /* Check that we're really an aggregate as ARM 8.4.1 defines it.  */
505           if (CLASSTYPE_N_BASECLASSES (type))
506             cp_error_at ("initializer list construction illegal for derived class object `%D'", decl);
507           if (CLASSTYPE_VTBL_PTR (type))
508             cp_error_at ("initializer list construction illegal for polymorphic class object `%D'", decl);
509           if (TYPE_NEEDS_CONSTRUCTING (type))
510             {
511               cp_error_at ("initializer list construction illegal for `%D'", decl);
512               error ("due to the presence of a constructor");
513             }
514           for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
515             if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
516               {
517                 cp_error_at ("initializer list construction illegal for `%D'", decl);
518                 cp_error_at ("due to non-public access of member `%D'", field);
519               }
520           funcs = TYPE_METHODS (type);
521           if (funcs)
522             for (func = 0; func < TREE_VEC_LENGTH (funcs); func++)
523               {
524                 field = TREE_VEC_ELT (funcs, func);
525                 if (field && (TREE_PRIVATE (field) || TREE_PROTECTED (field)))
526                   {
527                     cp_error_at ("initializer list construction illegal for `%D'", decl);
528                     cp_error_at ("due to non-public access of member `%D'", field);
529                   }
530               }
531         }
532 #endif
533     }
534   else if (TREE_CODE (init) == TREE_LIST
535            && TREE_TYPE (init) != unknown_type_node)
536     {
537       if (TREE_CODE (decl) == RESULT_DECL)
538         {
539           if (TREE_CHAIN (init))
540             {
541               warning ("comma expression used to initialize return value");
542               init = build_compound_expr (init);
543             }
544           else
545             init = TREE_VALUE (init);
546         }
547       else if (TREE_TYPE (init) != 0
548                && TREE_CODE (TREE_TYPE (init)) == OFFSET_TYPE)
549         {
550           /* Use the type of our variable to instantiate
551              the type of our initializer.  */
552           init = instantiate_type (type, init, 1);
553         }
554       else if (TREE_CODE (init) == TREE_LIST
555                && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
556         {
557           error ("cannot initialize arrays using this syntax");
558           return NULL_TREE;
559         }
560       else
561         {
562           /* We get here with code like `int a (2);' */
563              
564           if (TREE_CHAIN (init) != NULL_TREE)
565             {
566               pedwarn ("initializer list being treated as compound expression");
567               init = build_compound_expr (init);
568             }
569           else
570             init = TREE_VALUE (init);
571         }
572     }
573
574   /* End of special C++ code.  */
575
576   /* Digest the specified initializer into an expression.  */
577
578   value = digest_init (type, init, (tree *) 0);
579
580   /* Store the expression if valid; else report error.  */
581
582   if (TREE_CODE (value) == ERROR_MARK)
583     ;
584   else if (TREE_STATIC (decl)
585            && (! TREE_CONSTANT (value)
586                || ! initializer_constant_valid_p (value)
587 #if 0
588                /* A STATIC PUBLIC int variable doesn't have to be
589                   run time inited when doing pic.  (mrs) */
590                /* Since ctors and dtors are the only things that can
591                   reference vtables, and they are always written down
592                   the the vtable definition, we can leave the
593                   vtables in initialized data space.
594                   However, other initialized data cannot be initialized
595                   this way.  Instead a global file-level initializer
596                   must do the job.  */
597                || (flag_pic && !DECL_VIRTUAL_P (decl) && TREE_PUBLIC (decl))
598 #endif
599                ))
600
601     return value;
602   else
603     {
604       if (pedantic && TREE_CODE (value) == CONSTRUCTOR)
605         {
606           if (! TREE_CONSTANT (value) || ! TREE_STATIC (value))
607             pedwarn ("ANSI C++ forbids non-constant aggregate initializer expressions");
608         }
609     }
610   DECL_INITIAL (decl) = value;
611   return NULL_TREE;
612 }
613 \f
614 /* Digest the parser output INIT as an initializer for type TYPE.
615    Return a C expression of type TYPE to represent the initial value.
616
617    If TAIL is nonzero, it points to a variable holding a list of elements
618    of which INIT is the first.  We update the list stored there by
619    removing from the head all the elements that we use.
620    Normally this is only one; we use more than one element only if
621    TYPE is an aggregate and INIT is not a constructor.  */
622
623 tree
624 digest_init (type, init, tail)
625      tree type, init, *tail;
626 {
627   enum tree_code code = TREE_CODE (type);
628   tree element = 0;
629   tree old_tail_contents;
630   /* Nonzero if INIT is a braced grouping, which comes in as a CONSTRUCTOR
631      tree node which has no TREE_TYPE.  */
632   int raw_constructor;
633
634   /* By default, assume we use one element from a list.
635      We correct this later in the sole case where it is not true.  */
636
637   if (tail)
638     {
639       old_tail_contents = *tail;
640       *tail = TREE_CHAIN (*tail);
641     }
642
643   if (init == error_mark_node || (TREE_CODE (init) == TREE_LIST
644                                   && TREE_VALUE (init) == error_mark_node))
645     return error_mark_node;
646
647   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
648   if (TREE_CODE (init) == NON_LVALUE_EXPR)
649     init = TREE_OPERAND (init, 0);
650
651   if (init && TREE_TYPE (init) && TYPE_PTRMEMFUNC_P (type))
652     init = default_conversion (init);
653
654   if (init && TYPE_PTRMEMFUNC_P (type)
655       && ((TREE_CODE (init) == ADDR_EXPR
656            && TREE_CODE (TREE_TYPE (init)) == POINTER_TYPE
657            && TREE_CODE (TREE_TYPE (TREE_TYPE (init))) == METHOD_TYPE)
658           || TREE_CODE (init) == TREE_LIST
659           || integer_zerop (init)
660           || (TREE_TYPE (init) && TYPE_PTRMEMFUNC_P (TREE_TYPE (init)))))
661     {
662       return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), init, 0);
663     }
664
665   raw_constructor = TREE_CODE (init) == CONSTRUCTOR && TREE_TYPE (init) == 0;
666
667   if (init && raw_constructor
668       && CONSTRUCTOR_ELTS (init) != 0
669       && TREE_CHAIN (CONSTRUCTOR_ELTS (init)) == 0)
670     {
671       element = TREE_VALUE (CONSTRUCTOR_ELTS (init));
672       /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
673       if (element && TREE_CODE (element) == NON_LVALUE_EXPR)
674         element = TREE_OPERAND (element, 0);
675       if (element == error_mark_node)
676         return element;
677     }
678
679   /* Any type can be initialized from an expression of the same type,
680      optionally with braces.  */
681
682   if (init && TREE_TYPE (init)
683       && (TYPE_MAIN_VARIANT (TREE_TYPE (init)) == type
684           || (code == ARRAY_TYPE && comptypes (TREE_TYPE (init), type, 1))))
685     {
686       if (pedantic && code == ARRAY_TYPE
687           && TREE_CODE (init) != STRING_CST)
688         pedwarn ("ANSI C++ forbids initializing array from array expression");
689       if (TREE_CODE (init) == CONST_DECL)
690         init = DECL_INITIAL (init);
691       else if (TREE_READONLY_DECL_P (init))
692         init = decl_constant_value (init);
693       return init;
694     }
695
696   if (element && (TREE_TYPE (element) == type
697                   || (code == ARRAY_TYPE && TREE_TYPE (element)
698                       && comptypes (TREE_TYPE (element), type, 1))))
699     {
700       if (pedantic && code == ARRAY_TYPE)
701         pedwarn ("ANSI C++ forbids initializing array from array expression");
702       if (pedantic && (code == RECORD_TYPE || code == UNION_TYPE))
703         pedwarn ("ANSI C++ forbids single nonscalar initializer with braces");
704       if (TREE_CODE (element) == CONST_DECL)
705         element = DECL_INITIAL (element);
706       else if (TREE_READONLY_DECL_P (element))
707         element = decl_constant_value (element);
708       return element;
709     }
710
711   /* Initialization of an array of chars from a string constant
712      optionally enclosed in braces.  */
713
714   if (code == ARRAY_TYPE)
715     {
716       tree typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
717       if ((typ1 == char_type_node
718            || typ1 == signed_char_type_node
719            || typ1 == unsigned_char_type_node
720            || typ1 == unsigned_wchar_type_node
721            || typ1 == signed_wchar_type_node)
722           && ((init && TREE_CODE (init) == STRING_CST)
723               || (element && TREE_CODE (element) == STRING_CST)))
724         {
725           tree string = element ? element : init;
726
727           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string)))
728                != char_type_node)
729               && TYPE_PRECISION (typ1) == BITS_PER_UNIT)
730             {
731               error ("char-array initialized from wide string");
732               return error_mark_node;
733             }
734           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (string)))
735                == char_type_node)
736               && TYPE_PRECISION (typ1) != BITS_PER_UNIT)
737             {
738               error ("int-array initialized from non-wide string");
739               return error_mark_node;
740             }
741
742           if (pedantic
743               && typ1 != char_type_node
744               && typ1 != signed_char_type_node
745               && typ1 != unsigned_char_type_node)
746             pedwarn ("ANSI C++ forbids string initializer except for `char' elements");
747           TREE_TYPE (string) = type;
748           if (TYPE_DOMAIN (type) != 0
749               && TREE_CONSTANT (TYPE_SIZE (type)))
750             {
751               register int size
752                 = TREE_INT_CST_LOW (TYPE_SIZE (type));
753               size = (size + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
754               /* In C it is ok to subtract 1 from the length of the string
755                  because it's ok to ignore the terminating null char that is
756                  counted in the length of the constant, but in C++ this would
757                  be invalid.  */
758               if (size < TREE_STRING_LENGTH (string))
759                 pedwarn ("initializer-string for array of chars is too long");
760             }
761           return string;
762         }
763     }
764
765   /* Handle scalar types, including conversions,
766      and signature pointers and references.  */
767
768   if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE
769       || code == ENUMERAL_TYPE || code == REFERENCE_TYPE
770       || code == BOOLEAN_TYPE
771       || (code == RECORD_TYPE && ! raw_constructor
772           && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type))))
773     {
774       if (raw_constructor)
775         {
776           if (element == 0)
777             {
778               error ("initializer for scalar variable requires one element");
779               return error_mark_node;
780             }
781           init = element;
782         }
783
784       return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
785                                          "initialization", NULL_TREE, 0);
786     }
787
788   /* Come here only for records and arrays (and unions with constructors).  */
789
790   if (TYPE_SIZE (type) && ! TREE_CONSTANT (TYPE_SIZE (type)))
791     {
792       cp_error ("variable-sized object of type `%T' may not be initialized",
793                 type);
794       return error_mark_node;
795     }
796
797   if (code == ARRAY_TYPE || code == RECORD_TYPE || code == UNION_TYPE)
798     {
799       if (raw_constructor)
800         return process_init_constructor (type, init, (tree *)0);
801       else if (TYPE_NEEDS_CONSTRUCTING (type))
802         {
803           /* This can only be reached when caller is initializing
804              ARRAY_TYPE.  In that case, we don't want to convert
805              INIT to TYPE.  We will let `expand_vec_init' do it.  */
806           return init;
807         }
808       else if (tail != 0)
809         {
810           *tail = old_tail_contents;
811           return process_init_constructor (type, 0, tail);
812         }
813       else if (flag_traditional)
814         /* Traditionally one can say `char x[100] = 0;'.  */
815         return process_init_constructor (type,
816                                          build_nt (CONSTRUCTOR, 0,
817                                                    tree_cons (0, init, 0)),
818                                          0);
819       if (code != ARRAY_TYPE)
820         return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
821                                            "initialization", NULL_TREE, 0);
822     }
823
824   error ("invalid initializer");
825   return error_mark_node;
826 }
827 \f
828 /* Process a constructor for a variable of type TYPE.
829    The constructor elements may be specified either with INIT or with ELTS,
830    only one of which should be non-null.
831
832    If INIT is specified, it is a CONSTRUCTOR node which is specifically
833    and solely for initializing this datum.
834
835    If ELTS is specified, it is the address of a variable containing
836    a list of expressions.  We take as many elements as we need
837    from the head of the list and update the list.
838
839    In the resulting constructor, TREE_CONSTANT is set if all elts are
840    constant, and TREE_STATIC is set if, in addition, all elts are simple enough
841    constants that the assembler and linker can compute them.  */
842
843 static tree
844 process_init_constructor (type, init, elts)
845      tree type, init, *elts;
846 {
847   extern tree empty_init_node;
848   register tree tail;
849   /* List of the elements of the result constructor,
850      in reverse order.  */
851   register tree members = NULL;
852   tree result;
853   int allconstant = 1;
854   int allsimple = 1;
855   int erroneous = 0;
856
857   /* Make TAIL be the list of elements to use for the initialization,
858      no matter how the data was given to us.  */
859
860   if (elts)
861     {
862       if (warn_missing_braces)
863         warning ("aggregate has a partly bracketed initializer");
864       tail = *elts;
865     }
866   else
867     tail = CONSTRUCTOR_ELTS (init);
868
869   /* Gobble as many elements as needed, and make a constructor or initial value
870      for each element of this aggregate.  Chain them together in result.
871      If there are too few, use 0 for each scalar ultimate component.  */
872
873   if (TREE_CODE (type) == ARRAY_TYPE)
874     {
875       tree domain = TYPE_DOMAIN (type);
876       register long len;
877       register int i;
878
879       if (domain)
880         len = (TREE_INT_CST_LOW (TYPE_MAX_VALUE (domain))
881                - TREE_INT_CST_LOW (TYPE_MIN_VALUE (domain))
882                + 1);
883       else
884         len = -1;  /* Take as many as there are */
885
886       for (i = 0; (len < 0 || i < len) && tail != 0; i++)
887         {
888           register tree next1;
889
890           if (TREE_VALUE (tail) != 0)
891             {
892               tree tail1 = tail;
893               next1 = digest_init (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
894                                    TREE_VALUE (tail), &tail1);
895               my_friendly_assert (tail1 == 0
896                                   || TREE_CODE (tail1) == TREE_LIST, 319);
897               if (tail == tail1 && len < 0)
898                 {
899                   error ("non-empty initializer for array of empty elements");
900                   /* Just ignore what we were supposed to use.  */
901                   tail1 = 0;
902                 }
903               tail = tail1;
904             }
905           else
906             {
907               next1 = error_mark_node;
908               tail = TREE_CHAIN (tail);
909             }
910
911           if (next1 == error_mark_node)
912             erroneous = 1;
913           else if (!TREE_CONSTANT (next1))
914             allconstant = 0;
915           else if (! initializer_constant_valid_p (next1))
916             allsimple = 0;
917           members = tree_cons (NULL_TREE, next1, members);
918         }
919     }
920   if (TREE_CODE (type) == RECORD_TYPE && init != empty_init_node)
921     {
922       register tree field;
923
924       if (tail)
925         {
926           if (TYPE_USES_VIRTUAL_BASECLASSES (type))
927             {
928               sorry ("initializer list for object of class with virtual baseclasses");
929               return error_mark_node;
930             }
931
932           if (TYPE_BINFO_BASETYPES (type))
933             {
934               sorry ("initializer list for object of class with baseclasses");
935               return error_mark_node;
936             }
937
938           if (TYPE_VIRTUAL_P (type))
939             {
940               sorry ("initializer list for object using virtual functions");
941               return error_mark_node;
942             }
943         }
944
945       for (field = TYPE_FIELDS (type); field && tail;
946            field = TREE_CHAIN (field))
947         {
948           register tree next1;
949
950           if (! DECL_NAME (field))
951             {
952               members = tree_cons (field, integer_zero_node, members);
953               continue;
954             }
955
956           if (TREE_CODE (field) != FIELD_DECL)
957             continue;
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               my_friendly_assert (tail1 == 0
966                                   || TREE_CODE (tail1) == TREE_LIST, 320);
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))
980             allsimple = 0;
981           members = tree_cons (field, next1, members);
982         }
983       for (; field; field = TREE_CHAIN (field))
984         {
985           if (TREE_CODE (field) != FIELD_DECL)
986             continue;
987
988           /* Does this field have a default initialization?  */
989           if (DECL_INITIAL (field))
990             {
991               register tree next1 = DECL_INITIAL (field);
992               if (TREE_CODE (next1) == ERROR_MARK)
993                 erroneous = 1;
994               else if (!TREE_CONSTANT (next1))
995                 allconstant = 0;
996               else if (! initializer_constant_valid_p (next1))
997                 allsimple = 0;
998               members = tree_cons (field, next1, members);
999             }
1000           else if (TREE_READONLY (field))
1001             error ("uninitialized const member `%s'",
1002                    IDENTIFIER_POINTER (DECL_NAME (field)));
1003           else if (TYPE_LANG_SPECIFIC (TREE_TYPE (field))
1004                    && CLASSTYPE_READONLY_FIELDS_NEED_INIT (TREE_TYPE (field)))
1005             error ("member `%s' with uninitialized const fields",
1006                    IDENTIFIER_POINTER (DECL_NAME (field)));
1007           else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
1008             error ("member `%s' is uninitialized reference",
1009                    IDENTIFIER_POINTER (DECL_NAME (field)));
1010         }
1011     }
1012
1013   if (TREE_CODE (type) == UNION_TYPE && init != empty_init_node)
1014     {
1015       register tree field = TYPE_FIELDS (type);
1016       register tree next1;
1017
1018       /* Find the first named field.  ANSI decided in September 1990
1019          that only named fields count here.  */
1020       while (field && DECL_NAME (field) == 0)
1021         field = TREE_CHAIN (field);
1022
1023       /* If this element specifies a field, initialize via that field.  */
1024       if (TREE_PURPOSE (tail) != NULL_TREE)
1025         {
1026           int win = 0;
1027
1028           if (TREE_CODE (TREE_PURPOSE (tail)) == FIELD_DECL)
1029             /* Handle the case of a call by build_c_cast.  */
1030             field = TREE_PURPOSE (tail), win = 1;
1031           else if (TREE_CODE (TREE_PURPOSE (tail)) != IDENTIFIER_NODE)
1032             error ("index value instead of field name in union initializer");
1033           else
1034             {
1035               tree temp;
1036               for (temp = TYPE_FIELDS (type);
1037                    temp;
1038                    temp = TREE_CHAIN (temp))
1039                 if (DECL_NAME (temp) == TREE_PURPOSE (tail))
1040                   break;
1041               if (temp)
1042                 field = temp, win = 1;
1043               else
1044                 error ("no field `%s' in union being initialized",
1045                        IDENTIFIER_POINTER (TREE_PURPOSE (tail)));
1046             }
1047           if (!win)
1048             TREE_VALUE (tail) = error_mark_node;
1049         }
1050       else if (field == 0)
1051         {
1052           cp_error ("union `%T' with no named members cannot be initialized",
1053                     type);
1054           TREE_VALUE (tail) = error_mark_node;
1055         }
1056
1057       if (TREE_VALUE (tail) != 0)
1058         {
1059           tree tail1 = tail;
1060
1061           next1 = digest_init (TREE_TYPE (field),
1062                                TREE_VALUE (tail), &tail1);
1063           if (tail1 != 0 && TREE_CODE (tail1) != TREE_LIST)
1064             my_friendly_abort (357);
1065           tail = tail1;
1066         }
1067       else
1068         {
1069           next1 = error_mark_node;
1070           tail = TREE_CHAIN (tail);
1071         }
1072
1073       if (next1 == error_mark_node)
1074         erroneous = 1;
1075       else if (!TREE_CONSTANT (next1))
1076         allconstant = 0;
1077       else if (initializer_constant_valid_p (next1) == 0)
1078         allsimple = 0;
1079       members = tree_cons (field, next1, members);
1080     }
1081
1082   /* If arguments were specified as a list, just remove the ones we used.  */
1083   if (elts)
1084     *elts = tail;
1085   /* If arguments were specified as a constructor,
1086      complain unless we used all the elements of the constructor.  */
1087   else if (tail)
1088     pedwarn ("excess elements in aggregate initializer");
1089
1090   if (erroneous)
1091     return error_mark_node;
1092
1093   result = build (CONSTRUCTOR, type, NULL_TREE, nreverse (members));
1094   if (init)
1095     TREE_HAS_CONSTRUCTOR (result) = TREE_HAS_CONSTRUCTOR (init);
1096   if (allconstant) TREE_CONSTANT (result) = 1;
1097   if (allconstant && allsimple) TREE_STATIC (result) = 1;
1098   return result;
1099 }
1100 \f
1101 /* Given a structure or union value DATUM, construct and return
1102    the structure or union component which results from narrowing
1103    that value by the types specified in TYPES.  For example, given the
1104    hierarchy
1105
1106    class L { int ii; };
1107    class A : L { ... };
1108    class B : L { ... };
1109    class C : A, B { ... };
1110
1111    and the declaration
1112
1113    C x;
1114
1115    then the expression
1116
1117    x::C::A::L::ii refers to the ii member of the L part of
1118    of A part of the C object named by X.  In this case,
1119    DATUM would be x, and TYPES would be a SCOPE_REF consisting of
1120
1121         SCOPE_REF
1122                 SCOPE_REF
1123                         C       A
1124                 L
1125
1126    The last entry in the SCOPE_REF is always an IDENTIFIER_NODE.
1127
1128 */
1129
1130 tree
1131 build_scoped_ref (datum, types)
1132      tree datum;
1133      tree types;
1134 {
1135   tree ref;
1136   tree type = TREE_TYPE (datum);
1137
1138   if (datum == error_mark_node)
1139     return error_mark_node;
1140
1141   if (TREE_CODE (type) == REFERENCE_TYPE)
1142     type = TREE_TYPE (type);
1143
1144   type = TYPE_MAIN_VARIANT (type);
1145
1146   if (TREE_CODE (types) == SCOPE_REF)
1147     {
1148       /* We have some work to do.  */
1149       struct type_chain { tree type; struct type_chain *next; } *chain = 0, *head = 0, scratch;
1150       ref = build_unary_op (ADDR_EXPR, datum, 0);
1151       while (TREE_CODE (types) == SCOPE_REF)
1152         {
1153           tree t = TREE_OPERAND (types, 1);
1154           if (is_aggr_typedef (t, 1))
1155             {
1156               head = (struct type_chain *)alloca (sizeof (struct type_chain));
1157               head->type = IDENTIFIER_TYPE_VALUE (t);
1158               head->next = chain;
1159               chain = head;
1160               types = TREE_OPERAND (types, 0);
1161             }
1162           else return error_mark_node;
1163         }
1164       if (! is_aggr_typedef (types, 1))
1165         return error_mark_node;
1166
1167       head = &scratch;
1168       head->type = IDENTIFIER_TYPE_VALUE (types);
1169       head->next = chain;
1170       chain = head;
1171       while (chain)
1172         {
1173           tree binfo = chain->type;
1174           type = TREE_TYPE (TREE_TYPE (ref));
1175           if (binfo != TYPE_BINFO (type))
1176             {
1177               binfo = get_binfo (binfo, type, 1);
1178               if (binfo == error_mark_node)
1179                 return error_mark_node;
1180               if (binfo == 0)
1181                 return error_not_base_type (chain->type, type);
1182               ref = convert_pointer_to (binfo, ref);
1183             }
1184           chain = chain->next;
1185         }
1186       return build_indirect_ref (ref, "(compiler error in build_scoped_ref)");
1187     }
1188
1189   /* This is an easy conversion.  */
1190   if (is_aggr_typedef (types, 1))
1191     {
1192       tree binfo = TYPE_BINFO (IDENTIFIER_TYPE_VALUE (types));
1193       if (binfo != TYPE_BINFO (type))
1194         {
1195           binfo = get_binfo (binfo, type, 1);
1196           if (binfo == error_mark_node)
1197             return error_mark_node;
1198           if (binfo == 0)
1199             return error_not_base_type (IDENTIFIER_TYPE_VALUE (types), type);
1200         }
1201
1202       switch (TREE_CODE (datum))
1203         {
1204         case NOP_EXPR:
1205         case CONVERT_EXPR:
1206         case FLOAT_EXPR:
1207         case FIX_TRUNC_EXPR:
1208         case FIX_FLOOR_EXPR:
1209         case FIX_ROUND_EXPR:
1210         case FIX_CEIL_EXPR:
1211           ref = convert_pointer_to (binfo,
1212                                     build_unary_op (ADDR_EXPR, TREE_OPERAND (datum, 0), 0));
1213           break;
1214         default:
1215           ref = convert_pointer_to (binfo,
1216                                     build_unary_op (ADDR_EXPR, datum, 0));
1217         }
1218       return build_indirect_ref (ref, "(compiler error in build_scoped_ref)");
1219     }
1220   return error_mark_node;
1221 }
1222
1223 /* Build a reference to an object specified by the C++ `->' operator.
1224    Usually this just involves dereferencing the object, but if the
1225    `->' operator is overloaded, then such overloads must be
1226    performed until an object which does not have the `->' operator
1227    overloaded is found.  An error is reported when circular pointer
1228    delegation is detected.  */
1229 tree
1230 build_x_arrow (datum)
1231      tree datum;
1232 {
1233   tree types_memoized = NULL_TREE;
1234   register tree rval = datum;
1235   tree type = TREE_TYPE (rval);
1236   tree last_rval;
1237
1238   if (type == error_mark_node)
1239     return error_mark_node;
1240
1241   if (TREE_CODE (rval) == OFFSET_REF)
1242     {
1243       rval = resolve_offset_ref (datum);
1244       type = TREE_TYPE (rval);
1245     }
1246
1247   if (TREE_CODE (type) == REFERENCE_TYPE)
1248     {
1249       rval = convert_from_reference (rval);
1250       type = TREE_TYPE (rval);
1251     }
1252
1253   if (IS_AGGR_TYPE (type) && TYPE_OVERLOADS_ARROW (type))
1254     {
1255       while ((rval = build_opfncall (COMPONENT_REF, LOOKUP_NORMAL, rval, NULL_TREE, NULL_TREE)))
1256         {
1257           if (rval == error_mark_node)
1258             return error_mark_node;
1259
1260           if (value_member (TREE_TYPE (rval), types_memoized))
1261             {
1262               error ("circular pointer delegation detected");
1263               return error_mark_node;
1264             }
1265           else
1266             {
1267               types_memoized = tree_cons (NULL_TREE, TREE_TYPE (rval),
1268                                           types_memoized);
1269             }
1270           last_rval = rval;
1271         }     
1272       if (TREE_CODE (TREE_TYPE (last_rval)) == REFERENCE_TYPE)
1273         last_rval = convert_from_reference (last_rval);
1274     }
1275   else
1276     last_rval = default_conversion (rval);
1277
1278   /* Signature pointers are not dereferenced.  */
1279   if (TYPE_LANG_SPECIFIC (TREE_TYPE (last_rval))
1280       && IS_SIGNATURE_POINTER (TREE_TYPE (last_rval)))
1281     return last_rval;
1282
1283   if (TREE_CODE (TREE_TYPE (last_rval)) == POINTER_TYPE)
1284     return build_indirect_ref (last_rval, NULL_PTR);
1285
1286   if (types_memoized)
1287     error ("result of `operator->()' yields non-pointer result");
1288   else
1289     error ("base operand of `->' is not a pointer");
1290   return error_mark_node;
1291 }
1292
1293 /* Make an expression to refer to the COMPONENT field of
1294    structure or union value DATUM.  COMPONENT is an arbitrary
1295    expression.  DATUM has not already been checked out to be of
1296    aggregate type.
1297
1298    For C++, COMPONENT may be a TREE_LIST.  This happens when we must
1299    return an object of member type to a method of the current class,
1300    but there is not yet enough typing information to know which one.
1301    As a special case, if there is only one method by that name,
1302    it is returned.  Otherwise we return an expression which other
1303    routines will have to know how to deal with later.  */
1304 tree
1305 build_m_component_ref (datum, component)
1306      tree datum, component;
1307 {
1308   tree type;
1309   tree objtype = TREE_TYPE (datum);
1310   tree rettype;
1311
1312   if (TYPE_PTRMEMFUNC_P (TREE_TYPE (component)))
1313     {
1314       type = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (component)));
1315       rettype = type;
1316     }
1317   else
1318     {
1319       component = build_indirect_ref (component, NULL_PTR);
1320       type = TREE_TYPE (component);
1321       rettype = TREE_TYPE (TREE_TYPE (component));
1322     }
1323
1324   if (datum == error_mark_node || component == error_mark_node)
1325     return error_mark_node;
1326
1327   if (TREE_CODE (type) != OFFSET_TYPE && TREE_CODE (type) != METHOD_TYPE)
1328     {
1329       cp_error ("`%E' cannot be used as a member pointer, since it is of type `%T'", component, type);
1330       return error_mark_node;
1331     }
1332
1333   if (TREE_CODE (objtype) == REFERENCE_TYPE)
1334     objtype = TREE_TYPE (objtype);
1335
1336   if (! IS_AGGR_TYPE (objtype))
1337     {
1338       cp_error ("cannot apply member pointer `%E' to `%E'", component, datum);
1339       cp_error ("which is of non-aggregate type `%T'", objtype);
1340       return error_mark_node;
1341     }
1342   
1343   if (! comptypes (TYPE_METHOD_BASETYPE (type), objtype, 0))
1344     {
1345       cp_error ("member type `%T::' incompatible with object type `%T'",
1346                 TYPE_METHOD_BASETYPE (type), objtype);
1347       return error_mark_node;
1348     }
1349
1350   return build (OFFSET_REF, rettype, datum, component);
1351 }
1352
1353 /* Return a tree node for the expression TYPENAME '(' PARMS ')'.
1354
1355    Because we cannot tell whether this construct is really a call to a
1356    constructor or a request for a type conversion, we try both, and
1357    report any ambiguities we find.  */
1358 tree
1359 build_functional_cast (exp, parms)
1360      tree exp;
1361      tree parms;
1362 {
1363   /* This is either a call to a constructor,
1364      or a C cast in C++'s `functional' notation.  */
1365   tree type, name = NULL_TREE;
1366   tree expr_as_ctor = NULL_TREE;
1367
1368   if (exp == error_mark_node || parms == error_mark_node)
1369     return error_mark_node;
1370
1371   if (TREE_CODE (exp) == IDENTIFIER_NODE)
1372     {
1373       name = exp;
1374
1375       if (IDENTIFIER_HAS_TYPE_VALUE (exp))
1376         /* Either an enum or an aggregate type.  */
1377         type = IDENTIFIER_TYPE_VALUE (exp);
1378       else
1379         {
1380           type = lookup_name (exp, 1);
1381           if (!type || TREE_CODE (type) != TYPE_DECL)
1382             {
1383               cp_error ("`%T' fails to be a typedef or built-in type", name);
1384               return error_mark_node;
1385             }
1386           type = TREE_TYPE (type);
1387         }
1388     }
1389   else
1390     type = exp;
1391
1392   if (IS_SIGNATURE (type))
1393     {
1394       error ("signature type not allowed in cast or constructor expression");
1395       return error_mark_node;
1396     }
1397
1398   /* Prepare to evaluate as a call to a constructor.  If this expression
1399      is actually used, for example,
1400          
1401      return X (arg1, arg2, ...);
1402          
1403      then the slot being initialized will be filled in.  */
1404
1405   if (name == NULL_TREE)
1406     {
1407       name = TYPE_NAME (type);
1408       if (TREE_CODE (name) == TYPE_DECL)
1409         name = DECL_NAME (name);
1410     }
1411
1412   if (! IS_AGGR_TYPE (type))
1413     {
1414       /* this must build a C cast */
1415       if (parms == NULL_TREE)
1416         return build1 (NOP_EXPR, type, integer_zero_node);
1417       else if (TREE_CHAIN (parms) != NULL_TREE)
1418         {
1419           pedwarn ("initializer list being treated as compound expression");
1420           parms = build_compound_expr (parms);
1421         }
1422       return build_c_cast (type, parms);
1423     }
1424
1425   if (TYPE_SIZE (type) == NULL_TREE)
1426     {
1427       cp_error ("type `%T' is not yet defined", type);
1428       return error_mark_node;
1429     }
1430
1431   if (parms && TREE_CHAIN (parms) == NULL_TREE)
1432     return build_c_cast (type, parms);
1433
1434   expr_as_ctor = build_method_call (NULL_TREE, name, parms,
1435                                     NULL_TREE, LOOKUP_NORMAL);
1436
1437   if (expr_as_ctor == error_mark_node)
1438     return error_mark_node;
1439
1440   if (current_function_decl)
1441     return build_cplus_new (type, expr_as_ctor, 0);
1442
1443   {
1444     register tree parm = TREE_OPERAND (expr_as_ctor, 1);
1445
1446     /* Initializers for static variables and parameters have
1447        to handle doing the initialization and cleanup themselves.  */
1448     my_friendly_assert (TREE_CODE (expr_as_ctor) == CALL_EXPR, 322);
1449 #if 0
1450     /* The following assertion fails in cases where we are initializing
1451        a static member variable of a particular instance of a template
1452        class with a call to a constructor of the given instance, as in:
1453        
1454        TMPL<int> object = TMPL<int>();
1455        
1456        Curiously, the assertion does not fail if we do the same thing
1457        for a static member of a non-template class, as in:
1458        
1459        T object = T();
1460        
1461        I can't see why we should care here whether or not the initializer
1462        expression involves a call to `new', so for the time being, it
1463        seems best to just avoid doing this assertion.  */
1464     my_friendly_assert (TREE_CALLS_NEW (TREE_VALUE (parm)), 323);
1465 #endif
1466     TREE_VALUE (parm) = NULL_TREE;
1467     expr_as_ctor = build_indirect_ref (expr_as_ctor, NULL_PTR);
1468     TREE_HAS_CONSTRUCTOR (expr_as_ctor) = 1;
1469   }
1470   return expr_as_ctor;
1471 }
1472 \f
1473 /* Return the character string for the name that encodes the
1474    enumeral value VALUE in the domain TYPE.  */
1475 char *
1476 enum_name_string (value, type)
1477      tree value;
1478      tree type;
1479 {
1480   register tree values = TYPE_VALUES (type);
1481   register HOST_WIDE_INT intval = TREE_INT_CST_LOW (value);
1482
1483   my_friendly_assert (TREE_CODE (type) == ENUMERAL_TYPE, 324);
1484   while (values
1485          && TREE_INT_CST_LOW (TREE_VALUE (values)) != intval)
1486     values = TREE_CHAIN (values);
1487   if (values == NULL_TREE)
1488     {
1489       char *buf = (char *)oballoc (16 + TYPE_NAME_LENGTH (type));
1490
1491       /* Value must have been cast.  */
1492       sprintf (buf, "(enum %s)%d",
1493                TYPE_NAME_STRING (type), intval);
1494       return buf;
1495     }
1496   return IDENTIFIER_POINTER (TREE_PURPOSE (values));
1497 }
1498
1499 #if 0
1500 /* Print out a language-specific error message for
1501    (Pascal) case or (C) switch statements.
1502    CODE tells what sort of message to print. 
1503    TYPE is the type of the switch index expression.
1504    NEW is the new value that we were trying to add.
1505    OLD is the old value that stopped us from adding it.  */
1506 void
1507 report_case_error (code, type, new_value, old_value)
1508      int code;
1509      tree type;
1510      tree new_value, old_value;
1511 {
1512   if (code == 1)
1513     {
1514       if (new_value)
1515         error ("case label not within a switch statement");
1516       else
1517         error ("default label not within a switch statement");
1518     }
1519   else if (code == 2)
1520     {
1521       if (new_value == 0)
1522         {
1523           error ("multiple default labels in one switch");
1524           return;
1525         }
1526       if (TREE_CODE (new_value) == RANGE_EXPR)
1527         if (TREE_CODE (old_value) == RANGE_EXPR)
1528           {
1529             char *buf = (char *)alloca (4 * (8 + TYPE_NAME_LENGTH (type)));
1530             if (TREE_CODE (type) == ENUMERAL_TYPE)
1531               sprintf (buf, "overlapping ranges [%s..%s], [%s..%s] in case expression",
1532                        enum_name_string (TREE_OPERAND (new_value, 0), type),
1533                        enum_name_string (TREE_OPERAND (new_value, 1), type),
1534                        enum_name_string (TREE_OPERAND (old_value, 0), type),
1535                        enum_name_string (TREE_OPERAND (old_value, 1), type));
1536             else
1537               sprintf (buf, "overlapping ranges [%d..%d], [%d..%d] in case expression",
1538                        TREE_INT_CST_LOW (TREE_OPERAND (new_value, 0)),
1539                        TREE_INT_CST_LOW (TREE_OPERAND (new_value, 1)),
1540                        TREE_INT_CST_LOW (TREE_OPERAND (old_value, 0)),
1541                        TREE_INT_CST_LOW (TREE_OPERAND (old_value, 1)));
1542             error (buf);
1543           }
1544         else
1545           {
1546             char *buf = (char *)alloca (4 * (8 + TYPE_NAME_LENGTH (type)));
1547             if (TREE_CODE (type) == ENUMERAL_TYPE)
1548               sprintf (buf, "range [%s..%s] includes element `%s' in case expression",
1549                        enum_name_string (TREE_OPERAND (new_value, 0), type),
1550                        enum_name_string (TREE_OPERAND (new_value, 1), type),
1551                        enum_name_string (old_value, type));
1552             else
1553               sprintf (buf, "range [%d..%d] includes (%d) in case expression",
1554                        TREE_INT_CST_LOW (TREE_OPERAND (new_value, 0)),
1555                        TREE_INT_CST_LOW (TREE_OPERAND (new_value, 1)),
1556                        TREE_INT_CST_LOW (old_value));
1557             error (buf);
1558           }
1559       else if (TREE_CODE (old_value) == RANGE_EXPR)
1560         {
1561           char *buf = (char *)alloca (4 * (8 + TYPE_NAME_LENGTH (type)));
1562           if (TREE_CODE (type) == ENUMERAL_TYPE)
1563             sprintf (buf, "range [%s..%s] includes element `%s' in case expression",
1564                      enum_name_string (TREE_OPERAND (old_value, 0), type),
1565                      enum_name_string (TREE_OPERAND (old_value, 1), type),
1566                      enum_name_string (new_value, type));
1567           else
1568             sprintf (buf, "range [%d..%d] includes (%d) in case expression",
1569                      TREE_INT_CST_LOW (TREE_OPERAND (old_value, 0)),
1570                      TREE_INT_CST_LOW (TREE_OPERAND (old_value, 1)),
1571                      TREE_INT_CST_LOW (new_value));
1572           error (buf);
1573         }
1574       else
1575         {
1576           if (TREE_CODE (type) == ENUMERAL_TYPE)
1577             error ("duplicate label `%s' in switch statement",
1578                    enum_name_string (new_value, type));
1579           else
1580             error ("duplicate label (%d) in switch statement",
1581                    TREE_INT_CST_LOW (new_value));
1582         }
1583     }
1584   else if (code == 3)
1585     {
1586       if (TREE_CODE (type) == ENUMERAL_TYPE)
1587         warning ("case value out of range for enum %s",
1588                  TYPE_NAME_STRING (type));
1589       else
1590         warning ("case value out of range");
1591     }
1592   else if (code == 4)
1593     {
1594       if (TREE_CODE (type) == ENUMERAL_TYPE)
1595         error ("range values `%s' and `%s' reversed",
1596                enum_name_string (new_value, type),
1597                enum_name_string (old_value, type));
1598       else
1599         error ("range values reversed");
1600     }
1601 }
1602 #endif