OSDN Git Service

Mon Oct 6 09:27:29 1997 Jason Merrill <jason@yorick.cygnus.com>
[pf3gnuchains/gcc-fork.git] / gcc / cp / cvt.c
1 /* Language-level data type conversion for GNU C++.
2    Copyright (C) 1987, 88, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3    Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 /* This file contains the functions for converting C expressions
24    to different data types.  The only entry point is `convert'.
25    Every language front end must have a `convert' function
26    but what kind of conversions it does will depend on the language.  */
27
28 #include "config.h"
29 #include <stdio.h>
30 #include "tree.h"
31 #include "flags.h"
32 #include "cp-tree.h"
33 #include "class.h"
34 #include "convert.h"
35
36 #ifdef HAVE_STDLIB_H
37 #include <stdlib.h>
38 #endif
39
40 extern tree static_aggregates;
41
42 static tree build_thunk PROTO((tree, tree));
43 static tree convert_fn_ptr PROTO((tree, tree));
44 static tree cp_convert_to_pointer PROTO((tree, tree));
45 static tree convert_to_pointer_force PROTO((tree, tree));
46 static tree build_up_reference PROTO((tree, tree, int, int));
47 static tree build_type_conversion_1 PROTO((tree, tree, tree, tree,
48                                            int));
49
50 /* Change of width--truncation and extension of integers or reals--
51    is represented with NOP_EXPR.  Proper functioning of many things
52    assumes that no other conversions can be NOP_EXPRs.
53
54    Conversion between integer and pointer is represented with CONVERT_EXPR.
55    Converting integer to real uses FLOAT_EXPR
56    and real to integer uses FIX_TRUNC_EXPR.
57
58    Here is a list of all the functions that assume that widening and
59    narrowing is always done with a NOP_EXPR:
60      In convert.c, convert_to_integer.
61      In c-typeck.c, build_binary_op_nodefault (boolean ops),
62         and truthvalue_conversion.
63      In expr.c: expand_expr, for operands of a MULT_EXPR.
64      In fold-const.c: fold.
65      In tree.c: get_narrower and get_unwidened.
66
67    C++: in multiple-inheritance, converting between pointers may involve
68    adjusting them by a delta stored within the class definition.  */
69 \f
70 /* Subroutines of `convert'.  */
71
72 /* Build a thunk.  What it is, is an entry point that when called will
73    adjust the this pointer (the first argument) by offset, and then
74    goto the real address of the function given by REAL_ADDR that we
75    would like called.  What we return is the address of the thunk.  */
76
77 static tree
78 build_thunk (offset, real_addr)
79      tree offset, real_addr;
80 {
81   if (TREE_CODE (real_addr) != ADDR_EXPR
82       || TREE_CODE (TREE_OPERAND (real_addr, 0)) != FUNCTION_DECL)
83     {
84       sorry ("MI pointer to member conversion too complex");
85       return error_mark_node;
86     }
87   sorry ("MI pointer to member conversion too complex");
88   return error_mark_node;
89 }
90
91 /* Convert a `pointer to member' (POINTER_TYPE to METHOD_TYPE) into
92    another `pointer to method'.  This may involved the creation of
93    a thunk to handle the this offset calculation.  */
94
95 static tree
96 convert_fn_ptr (type, expr)
97      tree type, expr;
98 {
99 #if 0                           /* We don't use thunks for pmfs.  */
100   if (flag_vtable_thunks)
101     {
102       tree intype = TREE_TYPE (expr);
103       tree binfo = get_binfo (TYPE_METHOD_BASETYPE (TREE_TYPE (intype)),
104                               TYPE_METHOD_BASETYPE (TREE_TYPE (type)), 1);
105       if (binfo == error_mark_node)
106         {
107           error ("  in pointer to member conversion");
108           return error_mark_node;
109         }
110       if (binfo == NULL_TREE)
111         {
112           /* ARM 4.8 restriction.  */
113           error ("invalid pointer to member conversion");
114           return error_mark_node;
115         }
116
117       if (BINFO_OFFSET_ZEROP (binfo))
118         return build1 (NOP_EXPR, type, expr);
119       return build1 (NOP_EXPR, type, build_thunk (BINFO_OFFSET (binfo), expr));
120     }
121   else
122 #endif
123     return build_ptrmemfunc (type, expr, 1);
124 }
125
126 /* if converting pointer to pointer
127      if dealing with classes, check for derived->base or vice versa
128      else if dealing with method pointers, delegate
129      else convert blindly
130    else if converting class, pass off to build_type_conversion
131    else try C-style pointer conversion  */
132
133 static tree
134 cp_convert_to_pointer (type, expr)
135      tree type, expr;
136 {
137   register tree intype = TREE_TYPE (expr);
138   register enum tree_code form;
139
140   if (IS_AGGR_TYPE (intype))
141     {
142       tree rval;
143
144       intype = complete_type (intype);
145       if (TYPE_SIZE (intype) == NULL_TREE)
146         {
147           cp_error ("can't convert from incomplete type `%T' to `%T'",
148                     intype, type);
149           return error_mark_node;
150         }
151
152       rval = build_type_conversion (CONVERT_EXPR, type, expr, 1);
153       if (rval)
154         {
155           if (rval == error_mark_node)
156             cp_error ("conversion of `%E' from `%T' to `%T' is ambiguous",
157                       expr, intype, type);
158           return rval;
159         }
160     }
161
162   if (TYPE_PTRMEMFUNC_P (type))
163     type = TYPE_PTRMEMFUNC_FN_TYPE (type);
164
165   /* Handle anachronistic conversions from (::*)() to cv void* or (*)().  */
166   if (TREE_CODE (type) == POINTER_TYPE
167       && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
168           || TYPE_MAIN_VARIANT (TREE_TYPE (type)) == void_type_node))
169     {
170       /* Allow an implicit this pointer for pointer to member
171          functions.  */
172       if (TYPE_PTRMEMFUNC_P (intype))
173         {
174           tree decl, basebinfo;
175           tree fntype = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (intype));
176           tree t = TYPE_METHOD_BASETYPE (fntype);
177
178           if (current_class_type == 0
179               || get_base_distance (t, current_class_type, 0, &basebinfo)
180               == -1)
181             {
182               decl = build1 (NOP_EXPR, t, error_mark_node);
183             }
184           else if (current_class_ptr == 0)
185             decl = build1 (NOP_EXPR, t, error_mark_node);
186           else
187             decl = current_class_ref;
188
189           expr = build (OFFSET_REF, fntype, decl, expr);
190         }
191
192       if (TREE_CODE (expr) == OFFSET_REF
193           && TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
194         expr = resolve_offset_ref (expr);
195       if (TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE)
196         expr = build_addr_func (expr);
197       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
198         {
199           if (TREE_CODE (TREE_TYPE (TREE_TYPE (expr))) == METHOD_TYPE)
200             if (pedantic || warn_pmf2ptr)
201               cp_pedwarn ("converting from `%T' to `%T'", TREE_TYPE (expr),
202                           type);
203           return build1 (NOP_EXPR, type, expr);
204         }
205       intype = TREE_TYPE (expr);
206     }
207
208   if (TYPE_PTRMEMFUNC_P (intype))
209     intype = TYPE_PTRMEMFUNC_FN_TYPE (intype);
210
211   form = TREE_CODE (intype);
212
213   if (form == POINTER_TYPE || form == REFERENCE_TYPE)
214     {
215       intype = TYPE_MAIN_VARIANT (intype);
216
217       if (TYPE_MAIN_VARIANT (type) != intype
218           && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
219           && IS_AGGR_TYPE (TREE_TYPE (type))
220           && IS_AGGR_TYPE (TREE_TYPE (intype))
221           && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
222         {
223           enum tree_code code = PLUS_EXPR;
224           tree binfo = get_binfo (TREE_TYPE (type), TREE_TYPE (intype), 1);
225           if (binfo == error_mark_node)
226             return error_mark_node;
227           if (binfo == NULL_TREE)
228             {
229               binfo = get_binfo (TREE_TYPE (intype), TREE_TYPE (type), 1);
230               if (binfo == error_mark_node)
231                 return error_mark_node;
232               code = MINUS_EXPR;
233             }
234           if (binfo)
235             {
236               if (TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (type))
237                   || TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (intype))
238                   || ! BINFO_OFFSET_ZEROP (binfo))
239                 {
240                   /* Need to get the path we took.  */
241                   tree path;
242
243                   if (code == PLUS_EXPR)
244                     get_base_distance (TREE_TYPE (type), TREE_TYPE (intype), 0, &path);
245                   else
246                     get_base_distance (TREE_TYPE (intype), TREE_TYPE (type), 0, &path);
247                   return build_vbase_path (code, type, expr, path, 0);
248                 }
249             }
250         }
251       if (TREE_CODE (TREE_TYPE (intype)) == METHOD_TYPE
252           && TREE_CODE (type) == POINTER_TYPE
253           && TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)
254         return convert_fn_ptr (type, expr);
255
256       if (TREE_CODE (TREE_TYPE (type)) == OFFSET_TYPE
257           && TREE_CODE (TREE_TYPE (intype)) == OFFSET_TYPE)
258         {
259           tree b1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (type));
260           tree b2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (intype));
261           tree binfo = get_binfo (b1, b2, 1);
262           if (binfo == NULL_TREE)
263             binfo = get_binfo (b2, b1, 1);
264           if (binfo == error_mark_node)
265             return error_mark_node;
266         }
267
268       if (TREE_CODE (TREE_TYPE (intype)) == METHOD_TYPE
269           || (TREE_CODE (type) == POINTER_TYPE
270               && TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE))
271         {
272           cp_error ("cannot convert `%E' from type `%T' to type `%T'",
273                     expr, intype, type);
274           return error_mark_node;
275         }
276
277       return build1 (NOP_EXPR, type, expr);
278     }
279
280   my_friendly_assert (form != OFFSET_TYPE, 186);
281
282   if (TYPE_LANG_SPECIFIC (intype)
283       && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype)))
284     return convert_to_pointer (type, build_optr_ref (expr));
285
286   if (integer_zerop (expr))
287     {
288       if (TREE_CODE (TREE_TYPE (type)) == METHOD_TYPE)
289         return build_ptrmemfunc (type, expr, 0);
290       expr = build_int_2 (0, 0);
291       TREE_TYPE (expr) = type;
292       return expr;
293     }
294
295   if (INTEGRAL_CODE_P (form))
296     {
297       if (type_precision (intype) == POINTER_SIZE)
298         return build1 (CONVERT_EXPR, type, expr);
299       expr = cp_convert (type_for_size (POINTER_SIZE, 0), expr);
300       /* Modes may be different but sizes should be the same.  */
301       if (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
302           != GET_MODE_SIZE (TYPE_MODE (type)))
303         /* There is supposed to be some integral type
304            that is the same width as a pointer.  */
305         abort ();
306       return convert_to_pointer (type, expr);
307     }
308
309   cp_error ("cannot convert `%E' from type `%T' to type `%T'",
310             expr, intype, type);
311   return error_mark_node;
312 }
313
314 /* Like convert, except permit conversions to take place which
315    are not normally allowed due to access restrictions
316    (such as conversion from sub-type to private super-type).  */
317
318 static tree
319 convert_to_pointer_force (type, expr)
320      tree type, expr;
321 {
322   register tree intype = TREE_TYPE (expr);
323   register enum tree_code form = TREE_CODE (intype);
324   
325   if (integer_zerop (expr))
326     {
327       expr = build_int_2 (0, 0);
328       TREE_TYPE (expr) = type;
329       return expr;
330     }
331
332   /* Convert signature pointer/reference to `void *' first.  */
333   if (form == RECORD_TYPE
334       && (IS_SIGNATURE_POINTER (intype) || IS_SIGNATURE_REFERENCE (intype)))
335     {
336       expr = build_optr_ref (expr);
337       intype = TREE_TYPE (expr);
338       form = TREE_CODE (intype);
339     }
340
341   if (form == POINTER_TYPE)
342     {
343       intype = TYPE_MAIN_VARIANT (intype);
344
345       if (TYPE_MAIN_VARIANT (type) != intype
346           && TREE_CODE (TREE_TYPE (type)) == RECORD_TYPE
347           && IS_AGGR_TYPE (TREE_TYPE (type))
348           && IS_AGGR_TYPE (TREE_TYPE (intype))
349           && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE)
350         {
351           enum tree_code code = PLUS_EXPR;
352           tree path;
353           int distance = get_base_distance (TREE_TYPE (type),
354                                             TREE_TYPE (intype), 0, &path);
355           if (distance == -2)
356             {
357             ambig:
358               cp_error ("type `%T' is ambiguous baseclass of `%s'",
359                         TREE_TYPE (type),
360                         TYPE_NAME_STRING (TREE_TYPE (intype)));
361               return error_mark_node;
362             }
363           if (distance == -1)
364             {
365               distance = get_base_distance (TREE_TYPE (intype),
366                                             TREE_TYPE (type), 0, &path);
367               if (distance == -2)
368                 goto ambig;
369               if (distance < 0)
370                 /* Doesn't need any special help from us.  */
371                 return build1 (NOP_EXPR, type, expr);
372
373               code = MINUS_EXPR;
374             }
375           return build_vbase_path (code, type, expr, path, 0);
376         }
377     }
378
379   return cp_convert_to_pointer (type, expr);
380 }
381
382 /* We are passing something to a function which requires a reference.
383    The type we are interested in is in TYPE. The initial
384    value we have to begin with is in ARG.
385
386    FLAGS controls how we manage access checking.
387    DIRECT_BIND in FLAGS controls how any temporaries are generated.  */
388
389 static tree
390 build_up_reference (type, arg, flags, checkconst)
391      tree type, arg;
392      int flags, checkconst;
393 {
394   tree rval;
395   tree argtype = TREE_TYPE (arg);
396   tree target_type = TREE_TYPE (type);
397
398   my_friendly_assert (TREE_CODE (type) == REFERENCE_TYPE, 187);
399
400   if ((flags & DIRECT_BIND) && ! real_lvalue_p (arg))
401     {
402       tree targ = arg;
403       if (toplevel_bindings_p ())
404         arg = get_temp_name (argtype, 1);
405       else
406         {
407           arg = pushdecl (build_decl (VAR_DECL, NULL_TREE, argtype));
408           DECL_ARTIFICIAL (arg) = 1;
409         }
410       DECL_INITIAL (arg) = targ;
411       cp_finish_decl (arg, targ, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
412     }
413   else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
414     {
415       tree slot = build_decl (VAR_DECL, NULL_TREE, argtype);
416       arg = build (TARGET_EXPR, argtype, slot, arg, NULL_TREE, NULL_TREE);
417     }
418
419   /* If we had a way to wrap this up, and say, if we ever needed it's
420      address, transform all occurrences of the register, into a memory
421      reference we could win better.  */
422   rval = build_unary_op (ADDR_EXPR, arg, 1);
423   if ((flags & LOOKUP_PROTECT)
424       && TYPE_MAIN_VARIANT (argtype) != TYPE_MAIN_VARIANT (target_type)
425       && IS_AGGR_TYPE (argtype)
426       && IS_AGGR_TYPE (target_type))
427     {
428       /* We go through get_binfo for the access control.  */
429       tree binfo = get_binfo (target_type, argtype, 1);
430       if (binfo == error_mark_node)
431         return error_mark_node;
432       if (binfo == NULL_TREE)
433         return error_not_base_type (target_type, argtype);
434       rval = convert_pointer_to_real (binfo, rval);
435     }
436   else
437     rval
438       = convert_to_pointer_force (build_pointer_type (target_type), rval);
439   rval = build1 (NOP_EXPR, type, rval);
440   TREE_CONSTANT (rval) = TREE_CONSTANT (TREE_OPERAND (rval, 0));
441   return rval;
442 }
443
444 /* For C++: Only need to do one-level references, but cannot
445    get tripped up on signed/unsigned differences.
446
447    DECL is either NULL_TREE or the _DECL node for a reference that is being
448    initialized.  It can be error_mark_node if we don't know the _DECL but
449    we know it's an initialization.  */
450
451 tree
452 convert_to_reference (reftype, expr, convtype, flags, decl)
453      tree reftype, expr;
454      int convtype, flags;
455      tree decl;
456 {
457   register tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
458   register tree intype = TREE_TYPE (expr);
459   tree rval = NULL_TREE;
460   tree rval_as_conversion = NULL_TREE;
461   int i;
462
463   if (TREE_CODE (intype) == REFERENCE_TYPE)
464     my_friendly_abort (364);
465
466   intype = TYPE_MAIN_VARIANT (intype);
467
468   i = comp_target_types (type, intype, 0);
469
470   if (i <= 0 && (convtype & CONV_IMPLICIT) && IS_AGGR_TYPE (intype)
471       && ! (flags & LOOKUP_NO_CONVERSION))
472     {
473       /* Look for a user-defined conversion to lvalue that we can use.  */
474
475       if (flag_ansi_overloading)
476         rval_as_conversion
477           = build_type_conversion (CONVERT_EXPR, reftype, expr, 1);
478       else
479         rval_as_conversion = build_type_conversion (CONVERT_EXPR, type, expr, 1);
480
481       if (rval_as_conversion && rval_as_conversion != error_mark_node
482           && real_lvalue_p (rval_as_conversion))
483         {
484           expr = rval_as_conversion;
485           rval_as_conversion = NULL_TREE;
486           intype = type;
487           i = 1;
488         }
489     }
490
491   if (((convtype & CONV_STATIC) && i == -1)
492       || ((convtype & CONV_IMPLICIT) && i == 1))
493     {
494       if (flags & LOOKUP_COMPLAIN)
495         {
496           tree ttl = TREE_TYPE (reftype);
497           tree ttr;
498           
499           {
500             int r = TREE_READONLY (expr);
501             int v = TREE_THIS_VOLATILE (expr);
502             ttr = cp_build_type_variant (TREE_TYPE (expr), r, v);
503           }
504
505           if (! real_lvalue_p (expr) && ! TYPE_READONLY (ttl))
506             {
507               if (decl)
508                 /* Ensure semantics of [dcl.init.ref] */
509                 cp_pedwarn ("initialization of non-const reference `%#T' from rvalue `%T'",
510                             reftype, intype);
511               else
512                 cp_pedwarn ("conversion to non-const `%T' from rvalue `%T'",
513                             reftype, intype);
514             }
515           else if (! (convtype & CONV_CONST))
516             {
517               if (! TYPE_READONLY (ttl) && TYPE_READONLY (ttr))
518                 cp_pedwarn ("conversion from `%T' to `%T' discards const",
519                             ttr, reftype);
520               else if (! TYPE_VOLATILE (ttl) && TYPE_VOLATILE (ttr))
521                 cp_pedwarn ("conversion from `%T' to `%T' discards volatile",
522                             ttr, reftype);
523             }
524         }
525
526       return build_up_reference (reftype, expr, flags,
527                                  ! (convtype & CONV_CONST));
528     }
529   else if ((convtype & CONV_REINTERPRET) && lvalue_p (expr))
530     {
531       /* When casting an lvalue to a reference type, just convert into
532          a pointer to the new type and deference it.  This is allowed
533          by San Diego WP section 5.2.9 paragraph 12, though perhaps it
534          should be done directly (jason).  (int &)ri ---> *(int*)&ri */
535
536       /* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
537          meant.  */
538       if (TREE_CODE (intype) == POINTER_TYPE
539           && (comptypes (TREE_TYPE (intype), type, -1)))
540         cp_warning ("casting `%T' to `%T' does not dereference pointer",
541                     intype, reftype);
542           
543       rval = build_unary_op (ADDR_EXPR, expr, 0);
544       if (rval != error_mark_node)
545         rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), rval, 0);
546       if (rval != error_mark_node)
547         rval = build1 (NOP_EXPR, reftype, rval);
548     }
549   else if (flag_ansi_overloading)
550     {
551       rval = convert_for_initialization (NULL_TREE, type, expr, flags,
552                                          "converting", 0, 0);
553       if (rval == error_mark_node)
554         return error_mark_node;
555       rval = build_up_reference (reftype, rval, flags, 1);
556
557       if (rval && ! TYPE_READONLY (TREE_TYPE (reftype)))
558         cp_pedwarn ("initializing non-const `%T' with `%T' will use a temporary",
559                     reftype, intype);
560     }
561   else
562     {
563       tree rval_as_ctor = NULL_TREE;
564       
565       if (rval_as_conversion)
566         {
567           if (rval_as_conversion == error_mark_node)
568             {
569               cp_error ("conversion from `%T' to `%T' is ambiguous",
570                         intype, reftype);
571               return error_mark_node;
572             }
573           rval_as_conversion = build_up_reference (reftype, rval_as_conversion,
574                                                    flags, 1);
575         }
576       
577       /* Definitely need to go through a constructor here.  */
578       if (TYPE_HAS_CONSTRUCTOR (type)
579           && ! CLASSTYPE_ABSTRACT_VIRTUALS (type)
580           && (rval = build_method_call
581               (NULL_TREE, ctor_identifier,
582                build_tree_list (NULL_TREE, expr), TYPE_BINFO (type),
583                LOOKUP_NO_CONVERSION|LOOKUP_SPECULATIVELY
584                | LOOKUP_ONLYCONVERTING)))
585         {
586           tree init;
587
588           if (toplevel_bindings_p ())
589             {
590               tree t = get_temp_name (type, toplevel_bindings_p ());
591               init = build_method_call (t, ctor_identifier,
592                                         build_tree_list (NULL_TREE, expr),
593                                         TYPE_BINFO (type),
594                                         LOOKUP_NORMAL|LOOKUP_NO_CONVERSION
595                                         | LOOKUP_ONLYCONVERTING);
596
597               if (init == error_mark_node)
598                 return error_mark_node;
599
600               make_decl_rtl (t, NULL_PTR, 1);
601               static_aggregates = perm_tree_cons (expr, t, static_aggregates);
602               rval = build_unary_op (ADDR_EXPR, t, 0);
603             }
604           else
605             {
606               init = build_method_call (NULL_TREE, ctor_identifier,
607                                         build_tree_list (NULL_TREE, expr),
608                                         TYPE_BINFO (type),
609                                         LOOKUP_NORMAL|LOOKUP_NO_CONVERSION
610                                         |LOOKUP_ONLYCONVERTING);
611
612               if (init == error_mark_node)
613                 return error_mark_node;
614
615               rval = build_cplus_new (type, init);
616               rval = build_up_reference (reftype, rval, flags, 1);
617             }
618           rval_as_ctor = rval;
619         }
620
621       if (rval_as_ctor && rval_as_conversion)
622         {
623           cp_error ("ambiguous conversion from `%T' to `%T'; both user-defined conversion and constructor apply",
624                     intype, reftype);
625           return error_mark_node;
626         }
627       else if (rval_as_ctor)
628         rval = rval_as_ctor;
629       else if (rval_as_conversion)
630         rval = rval_as_conversion;
631       else if (! IS_AGGR_TYPE (type) && ! IS_AGGR_TYPE (intype))
632         {
633           rval = cp_convert (type, expr);
634           if (rval == error_mark_node)
635             return error_mark_node;
636           
637           rval = build_up_reference (reftype, rval, flags, 1);
638         }
639
640       if (rval && ! TYPE_READONLY (TREE_TYPE (reftype)))
641         cp_pedwarn ("initializing non-const `%T' with `%T' will use a temporary",
642                     reftype, intype);
643     }
644
645   if (rval)
646     {
647       /* If we found a way to convert earlier, then use it.  */
648       return rval;
649     }
650
651   my_friendly_assert (TREE_CODE (intype) != OFFSET_TYPE, 189);
652
653   if (flags & LOOKUP_COMPLAIN)
654     cp_error ("cannot convert type `%T' to type `%T'", intype, reftype);
655
656   if (flags & LOOKUP_SPECULATIVELY)
657     return NULL_TREE;
658
659   return error_mark_node;
660 }
661
662 /* We are using a reference VAL for its value. Bash that reference all the
663    way down to its lowest form.  */
664
665 tree
666 convert_from_reference (val)
667      tree val;
668 {
669   tree type = TREE_TYPE (val);
670
671   if (TREE_CODE (type) == OFFSET_TYPE)
672     type = TREE_TYPE (type);
673   if (TREE_CODE (type) == REFERENCE_TYPE)
674     return build_indirect_ref (val, NULL_PTR);
675   return val;
676 }
677 \f
678 /* See if there is a constructor of type TYPE which will convert
679    EXPR.  The reference manual seems to suggest (8.5.6) that we need
680    not worry about finding constructors for base classes, then converting
681    to the derived class.
682
683    MSGP is a pointer to a message that would be an appropriate error
684    string.  If MSGP is NULL, then we are not interested in reporting
685    errors.  */
686
687 tree
688 convert_to_aggr (type, expr, msgp, protect)
689      tree type, expr;
690      char **msgp;
691      int protect;
692 {
693   tree basetype = type;
694   tree name = TYPE_IDENTIFIER (basetype);
695   tree function, fndecl, fntype, parmtypes, parmlist, result;
696 #if 0
697   /* See code below that used this.  */
698   tree method_name;
699 #endif
700   tree access;
701   int can_be_private, can_be_protected;
702
703   if (! TYPE_HAS_CONSTRUCTOR (basetype))
704     {
705       if (msgp)
706         *msgp = "type `%s' does not have a constructor";
707       return error_mark_node;
708     }
709
710   access = access_public_node;
711   can_be_private = 0;
712   can_be_protected = IDENTIFIER_CLASS_VALUE (name) || name == current_class_name;
713
714   parmlist = build_tree_list (NULL_TREE, expr);
715   parmtypes = tree_cons (NULL_TREE, TREE_TYPE (expr), void_list_node);
716
717   if (TYPE_USES_VIRTUAL_BASECLASSES (basetype))
718     {
719       parmtypes = tree_cons (NULL_TREE, integer_type_node, parmtypes);
720       parmlist = tree_cons (NULL_TREE, integer_one_node, parmlist);
721     }
722
723   /* The type of the first argument will be filled in inside the loop.  */
724   parmlist = tree_cons (NULL_TREE, integer_zero_node, parmlist);
725   parmtypes = tree_cons (NULL_TREE, build_pointer_type (basetype), parmtypes);
726
727   /* No exact conversion was found.  See if an approximate
728      one will do.  */
729   fndecl = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (basetype), 0);
730
731   {
732     int saw_private = 0;
733     int saw_protected = 0;
734     struct candidate *candidates
735       = (struct candidate *) alloca ((decl_list_length (fndecl)+1) * sizeof (struct candidate));
736     struct candidate *cp = candidates;
737
738     while (fndecl)
739       {
740         function = fndecl;
741         cp->h_len = 2;
742         cp->harshness = (struct harshness_code *)
743           alloca (3 * sizeof (struct harshness_code));
744
745         compute_conversion_costs (fndecl, parmlist, cp, 2);
746         if ((cp->h.code & EVIL_CODE) == 0)
747           {
748             cp->u.field = fndecl;
749             if (protect)
750               {
751                 if (TREE_PRIVATE (fndecl))
752                   access = access_private_node;
753                 else if (TREE_PROTECTED (fndecl))
754                   access = access_protected_node;
755                 else
756                   access = access_public_node;
757               }
758             else
759               access = access_public_node;
760
761             if (access == access_private_node
762                 ? (basetype == current_class_type
763                    || is_friend (basetype, cp->function)
764                    || purpose_member (basetype, DECL_ACCESS (fndecl)))
765                 : access == access_protected_node
766                 ? (can_be_protected
767                    || purpose_member (basetype, DECL_ACCESS (fndecl)))
768                 : 1)
769               {
770                 if (cp->h.code <= TRIVIAL_CODE)
771                   goto found_and_ok;
772                 cp++;
773               }
774             else
775               {
776                 if (access == access_private_node)
777                   saw_private = 1;
778                 else
779                   saw_protected = 1;
780               }
781           }
782         fndecl = DECL_CHAIN (fndecl);
783       }
784     if (cp - candidates)
785       {
786         /* Rank from worst to best.  Then cp will point to best one.
787            Private fields have their bits flipped.  For unsigned
788            numbers, this should make them look very large.
789            If the best alternate has a (signed) negative value,
790            then all we ever saw were private members.  */
791         if (cp - candidates > 1)
792           qsort (candidates,    /* char *base */
793                  cp - candidates, /* int nel */
794                  sizeof (struct candidate), /* int width */
795                  (int (*) PROTO((const void *, const void *))) rank_for_overload); /* int (*compar)() */
796
797         --cp;
798         if (cp->h.code & EVIL_CODE)
799           {
800             if (msgp)
801               *msgp = "ambiguous type conversion possible for `%s'";
802             return error_mark_node;
803           }
804
805         function = cp->function;
806         fndecl = cp->u.field;
807         goto found_and_ok;
808       }
809     else if (msgp)
810       {
811         if (saw_private)
812           if (saw_protected)
813             *msgp = "only private and protected conversions apply";
814           else
815             *msgp = "only private conversions apply";
816         else if (saw_protected)
817           *msgp = "only protected conversions apply";
818         else
819           *msgp = "no appropriate conversion to type `%s'";
820       }
821     return error_mark_node;
822   }
823   /* NOTREACHED */
824
825  found:
826   if (access == access_private_node)
827     if (! can_be_private)
828       {
829         if (msgp)
830           *msgp = TREE_PRIVATE (fndecl)
831             ? "conversion to type `%s' is private"
832             : "conversion to type `%s' is from private base class";
833         return error_mark_node;
834       }
835   if (access == access_protected_node)
836     if (! can_be_protected)
837       {
838         if (msgp)
839           *msgp = TREE_PRIVATE (fndecl)
840             ? "conversion to type `%s' is protected"
841             : "conversion to type `%s' is from protected base class";
842         return error_mark_node;
843       }
844   function = fndecl;
845  found_and_ok:
846
847   /* It will convert, but we don't do anything about it yet.  */
848   if (msgp == 0)
849     return NULL_TREE;
850
851   fntype = TREE_TYPE (function);
852
853   parmlist = convert_arguments (NULL_TREE, TYPE_ARG_TYPES (fntype),
854                                 parmlist, NULL_TREE, LOOKUP_NORMAL);
855
856   result = build_call (function, TREE_TYPE (fntype), parmlist);
857   return result;
858 }
859
860 /* Call this when we know (for any reason) that expr is not, in fact,
861    zero.  This routine is like convert_pointer_to, but it pays
862    attention to which specific instance of what type we want to
863    convert to.  This routine should eventually become
864    convert_to_pointer after all references to convert_to_pointer
865    are removed.  */
866
867 tree
868 convert_pointer_to_real (binfo, expr)
869      tree binfo, expr;
870 {
871   register tree intype = TREE_TYPE (expr);
872   tree ptr_type;
873   tree type, rval;
874
875   if (TREE_CODE (binfo) == TREE_VEC)
876     type = BINFO_TYPE (binfo);
877   else if (IS_AGGR_TYPE (binfo))
878     {
879       type = binfo;
880     }
881   else
882     {
883       type = binfo;
884       binfo = NULL_TREE;
885     }
886
887   ptr_type = cp_build_type_variant (type, TYPE_READONLY (TREE_TYPE (intype)),
888                                     TYPE_VOLATILE (TREE_TYPE (intype)));
889   ptr_type = build_pointer_type (ptr_type);
890   if (ptr_type == TYPE_MAIN_VARIANT (intype))
891     return expr;
892
893   if (intype == error_mark_node)
894     return error_mark_node;
895
896   my_friendly_assert (!integer_zerop (expr), 191);
897
898   if (TREE_CODE (type) == RECORD_TYPE
899       && TREE_CODE (TREE_TYPE (intype)) == RECORD_TYPE
900       && type != TYPE_MAIN_VARIANT (TREE_TYPE (intype)))
901     {
902       tree path;
903       int distance
904         = get_base_distance (binfo, TYPE_MAIN_VARIANT (TREE_TYPE (intype)),
905                              0, &path);
906
907       /* This function shouldn't be called with unqualified arguments
908          but if it is, give them an error message that they can read.  */
909       if (distance < 0)
910         {
911           cp_error ("cannot convert a pointer of type `%T' to a pointer of type `%T'",
912                     TREE_TYPE (intype), type);
913
914           if (distance == -2)
915             cp_error ("because `%T' is an ambiguous base class", type);
916           return error_mark_node;
917         }
918
919       return build_vbase_path (PLUS_EXPR, ptr_type, expr, path, 1);
920     }
921   rval = build1 (NOP_EXPR, ptr_type,
922                  TREE_CODE (expr) == NOP_EXPR ? TREE_OPERAND (expr, 0) : expr);
923   TREE_CONSTANT (rval) = TREE_CONSTANT (expr);
924   return rval;
925 }
926
927 /* Call this when we know (for any reason) that expr is
928    not, in fact, zero.  This routine gets a type out of the first
929    argument and uses it to search for the type to convert to.  If there
930    is more than one instance of that type in the expr, the conversion is
931    ambiguous.  This routine should eventually go away, and all
932    callers should use convert_to_pointer_real.  */
933
934 tree
935 convert_pointer_to (binfo, expr)
936      tree binfo, expr;
937 {
938   tree type;
939
940   if (TREE_CODE (binfo) == TREE_VEC)
941     type = BINFO_TYPE (binfo);
942   else if (IS_AGGR_TYPE (binfo))
943       type = binfo;
944   else
945       type = binfo;
946   return convert_pointer_to_real (type, expr);
947 }
948 \f
949 /* C++ conversions, preference to static cast conversions.  */
950
951 tree
952 cp_convert (type, expr)
953      tree type, expr;
954 {
955   return ocp_convert (type, expr, CONV_OLD_CONVERT, LOOKUP_NORMAL);
956 }
957
958 /* Conversion...
959
960    FLAGS indicates how we should behave.  */
961
962 tree
963 ocp_convert (type, expr, convtype, flags)
964      tree type, expr;
965      int convtype, flags;
966 {
967   register tree e = expr;
968   register enum tree_code code = TREE_CODE (type);
969
970   if (e == error_mark_node
971       || TREE_TYPE (e) == error_mark_node)
972     return error_mark_node;
973
974   if (IS_AGGR_TYPE (type) && (convtype & CONV_FORCE_TEMP))
975     /* We need a new temporary; don't take this shortcut.  */;
976   else if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (e)))
977     /* Trivial conversion: cv-qualifiers do not matter on rvalues.  */
978     return fold (build1 (NOP_EXPR, type, e));
979   
980   if (code == VOID_TYPE && (convtype & CONV_STATIC))
981     return build1 (CONVERT_EXPR, type, e);
982
983 #if 0
984   /* This is incorrect.  A truncation can't be stripped this way.
985      Extensions will be stripped by the use of get_unwidened.  */
986   if (TREE_CODE (e) == NOP_EXPR)
987     return cp_convert (type, TREE_OPERAND (e, 0));
988 #endif
989
990   /* Just convert to the type of the member.  */
991   if (code == OFFSET_TYPE)
992     {
993       type = TREE_TYPE (type);
994       code = TREE_CODE (type);
995     }
996
997 #if 0
998   if (code == REFERENCE_TYPE)
999     return fold (convert_to_reference (type, e, convtype, flags, NULL_TREE));
1000   else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1001     e = convert_from_reference (e);
1002 #endif
1003
1004   if (TREE_CODE (e) == OFFSET_REF)
1005     e = resolve_offset_ref (e);
1006
1007   if (TREE_READONLY_DECL_P (e))
1008     e = decl_constant_value (e);
1009
1010   if (INTEGRAL_CODE_P (code))
1011     {
1012       tree intype = TREE_TYPE (e);
1013       /* enum = enum, enum = int, enum = float, (enum)pointer are all
1014          errors.  */
1015       if (flag_int_enum_equivalence == 0
1016           && TREE_CODE (type) == ENUMERAL_TYPE
1017           && ((ARITHMETIC_TYPE_P (intype) && ! (convtype & CONV_STATIC))
1018               || (TREE_CODE (intype) == POINTER_TYPE)))
1019         {
1020           cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type);
1021
1022           if (flag_pedantic_errors)
1023             return error_mark_node;
1024         }
1025       if (IS_AGGR_TYPE (intype))
1026         {
1027           tree rval;
1028           rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
1029           if (rval)
1030             return rval;
1031           if (flags & LOOKUP_COMPLAIN)
1032             cp_error ("`%#T' used where a `%T' was expected", intype, type);
1033           if (flags & LOOKUP_SPECULATIVELY)
1034             return NULL_TREE;
1035           return error_mark_node;
1036         }
1037       if (code == BOOLEAN_TYPE)
1038         {
1039           /* Common Ada/Pascal programmer's mistake.  We always warn
1040              about this since it is so bad.  */
1041           if (TREE_CODE (expr) == FUNCTION_DECL)
1042             cp_warning ("the address of `%D', will always be `true'", expr);
1043           return truthvalue_conversion (e);
1044         }
1045       return fold (convert_to_integer (type, e));
1046     }
1047   if (code == POINTER_TYPE || code == REFERENCE_TYPE
1048       || TYPE_PTRMEMFUNC_P (type))
1049     return fold (cp_convert_to_pointer (type, e));
1050   if (code == REAL_TYPE || code == COMPLEX_TYPE)
1051     {
1052       if (IS_AGGR_TYPE (TREE_TYPE (e)))
1053         {
1054           tree rval;
1055           rval = build_type_conversion (CONVERT_EXPR, type, e, 1);
1056           if (rval)
1057             return rval;
1058           else
1059             if (flags & LOOKUP_COMPLAIN)
1060               cp_error ("`%#T' used where a floating point value was expected",
1061                         TREE_TYPE (e));
1062         }
1063       if (code == REAL_TYPE)
1064         return fold (convert_to_real (type, e));
1065       else if (code == COMPLEX_TYPE)
1066         return fold (convert_to_complex (type, e));
1067     }
1068
1069   /* New C++ semantics:  since assignment is now based on
1070      memberwise copying,  if the rhs type is derived from the
1071      lhs type, then we may still do a conversion.  */
1072   if (IS_AGGR_TYPE_CODE (code))
1073     {
1074       tree dtype = TREE_TYPE (e);
1075       tree ctor = NULL_TREE;
1076       tree conversion = NULL_TREE;
1077
1078       dtype = TYPE_MAIN_VARIANT (dtype);
1079
1080       /* Conversion of object pointers or signature pointers/references
1081          to signature pointers/references.  */
1082
1083       if (TYPE_LANG_SPECIFIC (type)
1084           && (IS_SIGNATURE_POINTER (type) || IS_SIGNATURE_REFERENCE (type)))
1085         {
1086           tree constructor = build_signature_pointer_constructor (type, expr);
1087           tree sig_ty = SIGNATURE_TYPE (type);
1088           tree sig_ptr;
1089
1090           if (constructor == error_mark_node)
1091             return error_mark_node;
1092
1093           sig_ptr = get_temp_name (type, 1);
1094           DECL_INITIAL (sig_ptr) = constructor;
1095           CLEAR_SIGNATURE (sig_ty);
1096           cp_finish_decl (sig_ptr, constructor, NULL_TREE, 0, 0);
1097           SET_SIGNATURE (sig_ty);
1098           TREE_READONLY (sig_ptr) = 1;
1099
1100           return sig_ptr;
1101         }
1102
1103       /* Conversion between aggregate types.  New C++ semantics allow
1104          objects of derived type to be cast to objects of base type.
1105          Old semantics only allowed this between pointers.
1106
1107          There may be some ambiguity between using a constructor
1108          vs. using a type conversion operator when both apply.  */
1109
1110       if (flag_ansi_overloading)
1111         {
1112           ctor = e;
1113           
1114           if ((flags & LOOKUP_ONLYCONVERTING)
1115               && ! (IS_AGGR_TYPE (dtype) && DERIVED_FROM_P (type, dtype)))
1116             {
1117               ctor = build_user_type_conversion (type, ctor, flags);
1118               flags |= LOOKUP_NO_CONVERSION;
1119             }
1120           if (ctor)
1121             ctor = build_method_call (NULL_TREE, ctor_identifier,
1122                                       build_tree_list (NULL_TREE, ctor),
1123                                       TYPE_BINFO (type), flags);
1124           if (ctor)
1125             return build_cplus_new (type, ctor);
1126         }
1127       else
1128         {
1129           if (IS_AGGR_TYPE (dtype) && ! DERIVED_FROM_P (type, dtype)
1130               && TYPE_HAS_CONVERSION (dtype))
1131             conversion = build_type_conversion (CONVERT_EXPR, type, e, 1);
1132
1133           if (conversion == error_mark_node)
1134             {
1135               if (flags & LOOKUP_COMPLAIN)
1136                 error ("ambiguous pointer conversion");
1137               return conversion;
1138             }
1139
1140           if (TYPE_HAS_CONSTRUCTOR (complete_type (type)))
1141             ctor = build_method_call (NULL_TREE, ctor_identifier,
1142                                       build_tree_list (NULL_TREE, e),
1143                                       TYPE_BINFO (type),
1144                                       (flags & LOOKUP_NORMAL)
1145                                       | LOOKUP_SPECULATIVELY
1146                                       | (flags & LOOKUP_ONLYCONVERTING)
1147                                       | (flags & LOOKUP_NO_CONVERSION)
1148                                       | (conversion ? LOOKUP_NO_CONVERSION : 0));
1149
1150           if (ctor == error_mark_node)
1151             {
1152               if (flags & LOOKUP_COMPLAIN)
1153                 cp_error ("in conversion to type `%T'", type);
1154               if (flags & LOOKUP_SPECULATIVELY)
1155                 return NULL_TREE;
1156               return error_mark_node;
1157             }
1158       
1159           if (conversion && ctor)
1160             {
1161               if (flags & LOOKUP_COMPLAIN)
1162                 error ("both constructor and type conversion operator apply");
1163               if (flags & LOOKUP_SPECULATIVELY)
1164                 return NULL_TREE;
1165               return error_mark_node;
1166             }
1167           else if (conversion)
1168             return conversion;
1169           else if (ctor)
1170             {
1171               ctor = build_cplus_new (type, ctor);
1172               return ctor;
1173             }
1174         }
1175     }
1176
1177   /* If TYPE or TREE_TYPE (E) is not on the permanent_obstack,
1178      then the it won't be hashed and hence compare as not equal,
1179      even when it is.  */
1180   if (code == ARRAY_TYPE
1181       && TREE_TYPE (TREE_TYPE (e)) == TREE_TYPE (type)
1182       && index_type_equal (TYPE_DOMAIN (TREE_TYPE (e)), TYPE_DOMAIN (type)))
1183     return e;
1184
1185   if (flags & LOOKUP_COMPLAIN)
1186     cp_error ("conversion from `%T' to non-scalar type `%T' requested",
1187               TREE_TYPE (expr), type);
1188   if (flags & LOOKUP_SPECULATIVELY)
1189     return NULL_TREE;
1190   return error_mark_node;
1191 }
1192
1193 /* Create an expression whose value is that of EXPR,
1194    converted to type TYPE.  The TREE_TYPE of the value
1195    is always TYPE.  This function implements all reasonable
1196    conversions; callers should filter out those that are
1197    not permitted by the language being compiled.
1198
1199    Most of this routine is from build_reinterpret_cast.
1200
1201    The backend cannot call cp_convert (what was convert) because
1202    conversions to/from basetypes may involve memory references
1203    (vbases) and adding or subtracting small values (multiple
1204    inheritance), but it calls convert from the constant folding code
1205    on subtrees of already build trees after it has ripped them apart.
1206
1207    Also, if we ever support range variables, we'll probably also have to
1208    do a little bit more work.  */
1209
1210 tree
1211 convert (type, expr)
1212      tree type, expr;
1213 {
1214   tree intype;
1215
1216   if (type == error_mark_node || expr == error_mark_node)
1217     return error_mark_node;
1218
1219   intype = TREE_TYPE (expr);
1220
1221   if (POINTER_TYPE_P (type) && POINTER_TYPE_P (intype))
1222     {
1223       if (TREE_READONLY_DECL_P (expr))
1224         expr = decl_constant_value (expr);
1225       return fold (build1 (NOP_EXPR, type, expr));
1226     }
1227
1228   return ocp_convert (type, expr, CONV_OLD_CONVERT,
1229                       LOOKUP_NORMAL|LOOKUP_NO_CONVERSION);
1230 }
1231
1232 /* Like cp_convert, except permit conversions to take place which
1233    are not normally allowed due to access restrictions
1234    (such as conversion from sub-type to private super-type).  */
1235
1236 tree
1237 convert_force (type, expr, convtype)
1238      tree type;
1239      tree expr;
1240      int convtype;
1241 {
1242   register tree e = expr;
1243   register enum tree_code code = TREE_CODE (type);
1244
1245   if (code == REFERENCE_TYPE)
1246     return fold (convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
1247                                        NULL_TREE));
1248   else if (TREE_CODE (TREE_TYPE (e)) == REFERENCE_TYPE)
1249     e = convert_from_reference (e);
1250
1251   if (code == POINTER_TYPE)
1252     return fold (convert_to_pointer_force (type, e));
1253
1254   /* From typeck.c convert_for_assignment */
1255   if (((TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE && TREE_CODE (e) == ADDR_EXPR
1256         && TREE_CODE (TREE_TYPE (e)) == POINTER_TYPE
1257         && TREE_CODE (TREE_TYPE (TREE_TYPE (e))) == METHOD_TYPE)
1258        || integer_zerop (e)
1259        || TYPE_PTRMEMFUNC_P (TREE_TYPE (e)))
1260       && TYPE_PTRMEMFUNC_P (type))
1261     {
1262       /* compatible pointer to member functions.  */
1263       return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
1264     }
1265
1266   return ocp_convert (type, e, CONV_C_CAST|convtype, LOOKUP_NORMAL);
1267 }
1268
1269 /* Subroutine of build_type_conversion.  */
1270
1271 static tree
1272 build_type_conversion_1 (xtype, basetype, expr, typename, for_sure)
1273      tree xtype, basetype;
1274      tree expr;
1275      tree typename;
1276      int for_sure;
1277 {
1278   tree rval;
1279   int flags;
1280
1281   if (for_sure == 0)
1282     flags = LOOKUP_PROTECT|LOOKUP_ONLYCONVERTING;
1283   else
1284     flags = LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING;
1285
1286   rval = build_method_call (expr, typename, NULL_TREE, NULL_TREE, flags);
1287   if (rval == error_mark_node)
1288     {
1289       if (for_sure == 0)
1290         return NULL_TREE;
1291       return error_mark_node;
1292     }
1293
1294   if (IS_AGGR_TYPE (TREE_TYPE (rval)))
1295     return rval;
1296
1297   if (warn_cast_qual
1298       && TREE_TYPE (xtype)
1299       && (TREE_READONLY (TREE_TYPE (TREE_TYPE (rval)))
1300           > TREE_READONLY (TREE_TYPE (xtype))))
1301     warning ("user-defined conversion casting away `const'");
1302   return cp_convert (xtype, rval);
1303 }
1304
1305 /* Convert an aggregate EXPR to type XTYPE.  If a conversion
1306    exists, return the attempted conversion.  This may
1307    return ERROR_MARK_NODE if the conversion is not
1308    allowed (references private members, etc).
1309    If no conversion exists, NULL_TREE is returned.
1310
1311    If (FOR_SURE & 1) is non-zero, then we allow this type conversion
1312    to take place immediately.  Otherwise, we build a SAVE_EXPR
1313    which can be evaluated if the results are ever needed.
1314
1315    Changes to this functions should be mirrored in user_harshness.
1316
1317    FIXME: Ambiguity checking is wrong.  Should choose one by the implicit
1318    object parameter, or by the second standard conversion sequence if
1319    that doesn't do it.  This will probably wait for an overloading rewrite.
1320    (jason 8/9/95)  */
1321
1322 tree
1323 build_type_conversion (code, xtype, expr, for_sure)
1324      enum tree_code code;
1325      tree xtype, expr;
1326      int for_sure;
1327 {
1328   /* C++: check to see if we can convert this aggregate type
1329      into the required type.  */
1330   tree basetype;
1331   tree conv;
1332   tree winner = NULL_TREE;
1333
1334   if (flag_ansi_overloading)
1335     return build_user_type_conversion
1336       (xtype, expr, for_sure ? LOOKUP_NORMAL : 0);
1337
1338   if (expr == error_mark_node)
1339     return error_mark_node;
1340
1341   basetype = TREE_TYPE (expr);
1342   if (TREE_CODE (basetype) == REFERENCE_TYPE)
1343     basetype = TREE_TYPE (basetype);
1344
1345   basetype = TYPE_MAIN_VARIANT (basetype);
1346   if (! TYPE_LANG_SPECIFIC (basetype) || ! TYPE_HAS_CONVERSION (basetype))
1347     return NULL_TREE;
1348
1349   /* Do we have an exact match?  */
1350   {
1351     tree typename = build_typename_overload (xtype);
1352     if (lookup_fnfields (TYPE_BINFO (basetype), typename, 0))
1353       return build_type_conversion_1 (xtype, basetype, expr, typename,
1354                                       for_sure);
1355   }
1356
1357   /* Nope; try looking for others.  */
1358   for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
1359     {
1360       tree cand = TREE_VALUE (conv);
1361
1362       if (winner && winner == cand)
1363         continue;
1364
1365       if (can_convert (xtype, TREE_TYPE (TREE_TYPE (cand))))
1366         {
1367           if (winner)
1368             {
1369               if (for_sure)
1370                 {
1371                   cp_error ("ambiguous conversion from `%T' to `%T'", basetype,
1372                             xtype);
1373                   cp_error ("  candidate conversions include `%D' and `%D'",
1374                             winner, cand);
1375                 }
1376               return NULL_TREE;
1377             }
1378           else
1379             winner = cand;
1380         }
1381     }
1382
1383   if (winner)
1384     return build_type_conversion_1 (xtype, basetype, expr,
1385                                     DECL_NAME (winner), for_sure);
1386
1387   return NULL_TREE;
1388 }
1389
1390 /* Convert the given EXPR to one of a group of types suitable for use in an
1391    expression.  DESIRES is a combination of various WANT_* flags (q.v.)
1392    which indicates which types are suitable.  If COMPLAIN is 1, complain
1393    about ambiguity; otherwise, the caller will deal with it.  */
1394
1395 tree
1396 build_expr_type_conversion (desires, expr, complain)
1397      int desires;
1398      tree expr;
1399      int complain;
1400 {
1401   tree basetype = TREE_TYPE (expr);
1402   tree conv;
1403   tree winner = NULL_TREE;
1404
1405   if (TREE_CODE (basetype) == OFFSET_TYPE)
1406     expr = resolve_offset_ref (expr);
1407   expr = convert_from_reference (expr);
1408   basetype = TREE_TYPE (expr);
1409
1410   if (! IS_AGGR_TYPE (basetype))
1411     switch (TREE_CODE (basetype))
1412       {
1413       case INTEGER_TYPE:
1414         if ((desires & WANT_NULL) && TREE_CODE (expr) == INTEGER_CST
1415             && integer_zerop (expr))
1416           return expr;
1417         /* else fall through...  */
1418
1419       case BOOLEAN_TYPE:
1420         return (desires & WANT_INT) ? expr : NULL_TREE;
1421       case ENUMERAL_TYPE:
1422         return (desires & WANT_ENUM) ? expr : NULL_TREE;
1423       case REAL_TYPE:
1424         return (desires & WANT_FLOAT) ? expr : NULL_TREE;
1425       case POINTER_TYPE:
1426         return (desires & WANT_POINTER) ? expr : NULL_TREE;
1427         
1428       case FUNCTION_TYPE:
1429       case ARRAY_TYPE:
1430         return (desires & WANT_POINTER) ? default_conversion (expr)
1431                                         : NULL_TREE;
1432       default:
1433         return NULL_TREE;
1434       }
1435
1436   if (! TYPE_HAS_CONVERSION (basetype))
1437     return NULL_TREE;
1438
1439   for (conv = lookup_conversions (basetype); conv; conv = TREE_CHAIN (conv))
1440     {
1441       int win = 0;
1442       tree candidate;
1443       tree cand = TREE_VALUE (conv);
1444
1445       if (winner && winner == cand)
1446         continue;
1447
1448       candidate = TREE_TYPE (TREE_TYPE (cand));
1449       if (TREE_CODE (candidate) == REFERENCE_TYPE)
1450         candidate = TREE_TYPE (candidate);
1451
1452       switch (TREE_CODE (candidate))
1453         {
1454         case BOOLEAN_TYPE:
1455         case INTEGER_TYPE:
1456           win = (desires & WANT_INT); break;
1457         case ENUMERAL_TYPE:
1458           win = (desires & WANT_ENUM); break;
1459         case REAL_TYPE:
1460           win = (desires & WANT_FLOAT); break;
1461         case POINTER_TYPE:
1462           win = (desires & WANT_POINTER); break;
1463         }
1464
1465       if (win)
1466         {
1467           if (winner)
1468             {
1469               if (complain)
1470                 {
1471                   cp_error ("ambiguous default type conversion from `%T'",
1472                             basetype);
1473                   cp_error ("  candidate conversions include `%D' and `%D'",
1474                             winner, cand);
1475                 }
1476               return error_mark_node;
1477             }
1478           else
1479             winner = cand;
1480         }
1481     }
1482
1483   if (winner)
1484     {
1485       tree type = TREE_TYPE (TREE_TYPE (winner));
1486       if (TREE_CODE (type) == REFERENCE_TYPE)
1487         type = TREE_TYPE (type);
1488       return build_type_conversion_1 (type, basetype, expr,
1489                                       DECL_NAME (winner), 1);
1490     }
1491
1492   return NULL_TREE;
1493 }
1494
1495 /* Must convert two aggregate types to non-aggregate type.
1496    Attempts to find a non-ambiguous, "best" type conversion.
1497
1498    Return 1 on success, 0 on failure.
1499
1500    @@ What are the real semantics of this supposed to be??? */
1501
1502 int
1503 build_default_binary_type_conversion (code, arg1, arg2)
1504      enum tree_code code;
1505      tree *arg1, *arg2;
1506 {
1507   switch (code)
1508     {
1509     case MULT_EXPR:
1510     case TRUNC_DIV_EXPR:
1511     case CEIL_DIV_EXPR:
1512     case FLOOR_DIV_EXPR:
1513     case ROUND_DIV_EXPR:
1514     case EXACT_DIV_EXPR:
1515       *arg1 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg1, 0);
1516       *arg2 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg2, 0);
1517       break;
1518
1519     case TRUNC_MOD_EXPR:
1520     case FLOOR_MOD_EXPR:
1521     case LSHIFT_EXPR:
1522     case RSHIFT_EXPR:
1523     case BIT_AND_EXPR:
1524     case BIT_XOR_EXPR:
1525     case BIT_IOR_EXPR:
1526       *arg1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, *arg1, 0);
1527       *arg2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, *arg2, 0);
1528       break;
1529
1530     case PLUS_EXPR:
1531       {
1532         tree a1, a2, p1, p2;
1533         int wins;
1534
1535         a1 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg1, 0);
1536         a2 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg2, 0);
1537         p1 = build_expr_type_conversion (WANT_POINTER, *arg1, 0);
1538         p2 = build_expr_type_conversion (WANT_POINTER, *arg2, 0);
1539
1540         wins = (a1 && a2) + (a1 && p2) + (p1 && a2);
1541
1542         if (wins > 1)
1543           error ("ambiguous default type conversion for `operator +'");
1544
1545         if (a1 && a2)
1546           *arg1 = a1, *arg2 = a2;
1547         else if (a1 && p2)
1548           *arg1 = a1, *arg2 = p2;
1549         else
1550           *arg1 = p1, *arg2 = a2;
1551         break;
1552       }
1553
1554     case MINUS_EXPR:
1555       {
1556         tree a1, a2, p1, p2;
1557         int wins;
1558
1559         a1 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg1, 0);
1560         a2 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg2, 0);
1561         p1 = build_expr_type_conversion (WANT_POINTER, *arg1, 0);
1562         p2 = build_expr_type_conversion (WANT_POINTER, *arg2, 0);
1563
1564         wins = (a1 && a2) + (p1 && p2) + (p1 && a2);
1565
1566         if (wins > 1)
1567           error ("ambiguous default type conversion for `operator -'");
1568
1569         if (a1 && a2)
1570           *arg1 = a1, *arg2 = a2;
1571         else if (p1 && p2)
1572           *arg1 = p1, *arg2 = p2;
1573         else
1574           *arg1 = p1, *arg2 = a2;
1575         break;
1576       }
1577
1578     case GT_EXPR:
1579     case LT_EXPR:
1580     case GE_EXPR:
1581     case LE_EXPR:
1582     case EQ_EXPR:
1583     case NE_EXPR:
1584       {
1585         tree a1, a2, p1, p2;
1586         int wins;
1587
1588         a1 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg1, 0);
1589         a2 = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, *arg2, 0);
1590         p1 = build_expr_type_conversion (WANT_POINTER | WANT_NULL, *arg1, 0);
1591         p2 = build_expr_type_conversion (WANT_POINTER | WANT_NULL, *arg2, 0);
1592
1593         wins = (a1 && a2) + (p1 && p2);
1594
1595         if (wins > 1)
1596           cp_error ("ambiguous default type conversion for `%O'", code);
1597
1598         if (a1 && a2)
1599           *arg1 = a1, *arg2 = a2;
1600         else
1601           *arg1 = p1, *arg2 = p2;
1602         break;
1603       }
1604
1605     case TRUTH_ANDIF_EXPR:
1606     case TRUTH_ORIF_EXPR:
1607       *arg1 = cp_convert (boolean_type_node, *arg1);
1608       *arg2 = cp_convert (boolean_type_node, *arg2);
1609       break;
1610
1611     default:
1612       *arg1 = NULL_TREE;
1613       *arg2 = NULL_TREE;
1614     }
1615
1616   if (*arg1 == error_mark_node || *arg2 == error_mark_node)
1617     cp_error ("ambiguous default type conversion for `%O'", code);
1618
1619   if (*arg1 && *arg2)
1620     return 1;
1621
1622   return 0;
1623 }
1624
1625 /* Implements integral promotion (4.1) and float->double promotion.  */
1626
1627 tree
1628 type_promotes_to (type)
1629      tree type;
1630 {
1631   int constp, volatilep;
1632
1633   if (type == error_mark_node)
1634     return error_mark_node;
1635
1636   constp = TYPE_READONLY (type);
1637   volatilep = TYPE_VOLATILE (type);
1638   type = TYPE_MAIN_VARIANT (type);
1639
1640   /* bool always promotes to int (not unsigned), even if it's the same
1641      size.  */
1642   if (type == boolean_type_node)
1643     type = integer_type_node;
1644
1645   /* Normally convert enums to int, but convert wide enums to something
1646      wider.  */
1647   else if (TREE_CODE (type) == ENUMERAL_TYPE
1648            || type == wchar_type_node)
1649     {
1650       int precision = MAX (TYPE_PRECISION (type),
1651                            TYPE_PRECISION (integer_type_node));
1652       tree totype = type_for_size (precision, 0);
1653       if (TREE_UNSIGNED (type)
1654           && ! int_fits_type_p (TYPE_MAX_VALUE (type), totype))
1655         type = type_for_size (precision, 1);
1656       else
1657         type = totype;
1658     }
1659   else if (C_PROMOTING_INTEGER_TYPE_P (type))
1660     {
1661       /* Retain unsignedness if really not getting bigger.  */
1662       if (TREE_UNSIGNED (type)
1663           && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
1664         type = unsigned_type_node;
1665       else
1666         type = integer_type_node;
1667     }
1668   else if (type == float_type_node)
1669     type = double_type_node;
1670
1671   return cp_build_type_variant (type, constp, volatilep);
1672 }